ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDE0NzFkYjEuLjllZjRlNjcgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtNTYsNyArNTYsNyBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmNyZWNvdmVyeSBsaWJndWl0d3JwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnogbGliYyBsaWJzdGxwb3J0IGxpYmN1dGlscyBsaWJzdGRjKysgbGliZXh0NF91dGlscyBsaWJ0YXIgbGliYmxraWQgbGlibWludWl0d3JwIGxpYm1pbmFkYmQgbGlibXRkdXRpbHMgbGlibWluemlwIGxpYmFvc3ByZWNvdmVyeQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ6IGxpYmMgbGlic3RscG9ydCBsaWJjdXRpbHMgbGlic3RkYysrIGxpYnRhciBsaWJibGtpZCBsaWJtaW51aXR3cnAgbGlibWluYWRiZCBsaWJtdGR1dGlscyBsaWJtaW56aXAgbGliYW9zcHJlY292ZXJ5CiAKIGlmbmVxICgkKHdpbGRjYXJkIHN5c3RlbS9jb3JlL2xpYnNwYXJzZS9BbmRyb2lkLm1rKSwpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnNwYXJzZQpAQCAtNjUsMTQgKzY1LDI0IEBACiBpZmVxICgkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQ0KSwgdHJ1ZSkKICAgICBMT0NBTF9DRkxBR1MgKz0gLURVU0VfRVhUNAogICAgIExPQ0FMX0NfSU5DTFVERVMgKz0gc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzCi0gICAgI0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliZXh0NF91dGlscworICAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZXh0NF91dGlscwogZW5kaWYKLQorTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9saWJzZWxpbnV4L2luY2x1ZGUKIGlmZXEgKCQoSEFWRV9TRUxJTlVYKSwgdHJ1ZSkKICAgI0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvbGlic2VsaW51eC9pbmNsdWRlCiAgICNMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnNlbGludXgKICAgI0xPQ0FMX0NGTEFHUyArPSAtREhBVkVfU0VMSU5VWCAtZwogZW5kaWYgIyBIQVZFX1NFTElOVVgKK2lmbmVxICgkKHdpbGRjYXJkIGV4dGVybmFsL2xpYnNlbGludXgvQW5kcm9pZC5tayksKQorICAgIExPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvbGlic2VsaW51eC9pbmNsdWRlCisgICAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzZWxpbnV4CisgICAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9TRUxJTlVYIC1nCisgICAgaWZuZXEgKCQoVEFSR0VUX1VTRVJJTUFHRVNfVVNFX0VYVDQpLCB0cnVlKQorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURVU0VfRVhUNAorICAgICAgICBMT0NBTF9DX0lOQ0xVREVTICs9IHN5c3RlbS9leHRyYXMvZXh0NF91dGlscworICAgICAgICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmV4dDRfdXRpbHMKKyAgICBlbmRpZgorZW5kaWYKIAogIyBUaGlzIGJpbmFyeSBpcyBpbiB0aGUgcmVjb3ZlcnkgcmFtZGlzaywgd2hpY2ggaXMgb3RoZXJ3aXNlIGEgY29weSBvZiByb290LgogIyBJdCBnZXRzIGNvcGllZCB0aGVyZSBpbiBjb25maWcvTWFrZWZpbGUuICBMT0NBTF9NT0RVTEVfVEFHUyBzdXBwcmVzc2VzCkBAIC04OSw2ICs5OSw5IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9IHN5c3RlbS9leHRyYXMvZXh0NF91dGlscwogCiAjVFdSUCBCdWlsZCBGbGFncworaWZuZXEgKCQoVFdfTk9fU0NSRUVOX1RJTUVPVVQpLCkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURUV19OT19TQ1JFRU5fVElNRU9VVAorZW5kaWYKIGlmZXEgKCQoQk9BUkRfSEFTX05PX1JFQUxfU0RDQVJEKSwgdHJ1ZSkKICAgICBMT0NBTF9DRkxBR1MgKz0gLURCT0FSRF9IQVNfTk9fUkVBTF9TRENBUkQKIGVuZGlmCkBAIC0yOTMsOCArMzA2LDcgQEAKICAgICAkKExPQ0FMX1BBVEgpL2FwcGx5cGF0Y2gvQW5kcm9pZC5tawogCiAjaW5jbHVkZXMgZm9yIFRXUlAKLWluY2x1ZGUgJChjb21tYW5kc19yZWNvdmVyeV9sb2NhbF9wYXRoKS9saWJqcGVndHdycC9BbmRyb2lkLm1rIFwKLSAgICAkKGNvbW1hbmRzX3JlY292ZXJ5X2xvY2FsX3BhdGgpL2luamVjdHR3cnAvQW5kcm9pZC5tayBcCitpbmNsdWRlICQoY29tbWFuZHNfcmVjb3ZlcnlfbG9jYWxfcGF0aCkvaW5qZWN0dHdycC9BbmRyb2lkLm1rIFwKICAgICAkKGNvbW1hbmRzX3JlY292ZXJ5X2xvY2FsX3BhdGgpL2h0Y2R1bWxvY2svQW5kcm9pZC5tayBcCiAgICAgJChjb21tYW5kc19yZWNvdmVyeV9sb2NhbF9wYXRoKS9ndWkvQW5kcm9pZC5tayBcCiAgICAgJChjb21tYW5kc19yZWNvdmVyeV9sb2NhbF9wYXRoKS9tbWN1dGlscy9BbmRyb2lkLm1rIFwKZGlmZiAtLWdpdCBhL2NyeXB0by9mc19tZ3IvZnNfbWdyLmMgYi9jcnlwdG8vZnNfbWdyL2ZzX21nci5jCmluZGV4IGJlYmIyNTIuLjAyZjNhYzUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9mc19tZ3IvZnNfbWdyLmMKKysrIGIvY3J5cHRvL2ZzX21nci9mc19tZ3IuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgKiB0aGVuIHJldHVybiBhbiBlbXB0eSBidWZmZXIuICBUaGlzIGVmZmVjdGl2ZWx5IGlnbm9yZXMgbGluZXMgdGhhdCBhcmUgdG9vIGxvbmcuCiAgKiBPbiBFT0YsIHJldHVybiBudWxsLgogICovCi1zdGF0aWMgY2hhciAqZ2V0bGluZShjaGFyICpidWYsIGludCBzaXplLCBGSUxFICpmaWxlKQorc3RhdGljIGNoYXIgKmZzX21ncl9nZXRsaW5lKGNoYXIgKmJ1ZiwgaW50IHNpemUsIEZJTEUgKmZpbGUpCiB7CiAgICAgaW50IGNudCA9IDA7CiAgICAgaW50IGVvZiA9IDA7CkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICB9CiAKICAgICBlbnRyaWVzID0gMDsKLSAgICB3aGlsZSAoZ2V0bGluZShsaW5lLCBzaXplb2YobGluZSksIGZzdGFiX2ZpbGUpKSB7CisgICAgd2hpbGUgKGZzX21ncl9nZXRsaW5lKGxpbmUsIHNpemVvZihsaW5lKSwgZnN0YWJfZmlsZSkpIHsKICAgICAgICAgLyogaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgbmV3bGluZSwgc2hvcnRlbiB0aGUgc3RyaW5nIGJ5IDEgYnl0ZSAqLwogICAgICAgICBsZW4gPSBzdHJsZW4obGluZSk7CiAgICAgICAgIGlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpIHsKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgIGZzZWVrKGZzdGFiX2ZpbGUsIDAsIFNFRUtfU0VUKTsKIAogICAgIGNudCA9IDA7Ci0gICAgd2hpbGUgKGdldGxpbmUobGluZSwgc2l6ZW9mKGxpbmUpLCBmc3RhYl9maWxlKSkgeworICAgIHdoaWxlIChmc19tZ3JfZ2V0bGluZShsaW5lLCBzaXplb2YobGluZSksIGZzdGFiX2ZpbGUpKSB7CiAgICAgICAgIC8qIGlmIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIG5ld2xpbmUsIHNob3J0ZW4gdGhlIHN0cmluZyBieSAxIGJ5dGUgKi8KICAgICAgICAgbGVuID0gc3RybGVuKGxpbmUpOwogICAgICAgICBpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vaWNzL2NyeXB0ZnMuYyBiL2NyeXB0by9pY3MvY3J5cHRmcy5jCmluZGV4IGQ5OTQ0NDkuLjE5MzMzOWUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9pY3MvY3J5cHRmcy5jCisrKyBiL2NyeXB0by9pY3MvY3J5cHRmcy5jCkBAIC03NSw2ICs3NSw3IEBACiBzdGF0aWMgaW50ICB1c2luZ19zYW1zdW5nX2VuY3J5cHRpb24gPSAwOwogLy9zdGF0aWMgZWRrX3Qgc2F2ZWRfbWFzdGVyX2tleTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNhdmVkX21hc3Rlcl9rZXlbS0VZX0xFTl9CWVRFU19TQU1TVU5HXTsKK2Vka19wYXlsb2FkX3QgZWRrX3BheWxvYWQ7CiAjZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgc2F2ZWRfbWFzdGVyX2tleVtLRVlfTEVOX0JZVEVTXTsKICNlbmRpZgpAQCAtMTg3LDggKzE4OCwxNSBAQAogCX0gZWxzZSB7CiAJCXByaW50ZigiVXNpbmcgU2Ftc3VuZyBlbmNyeXB0aW9uLlxuIik7CiAJCXVzaW5nX3NhbXN1bmdfZW5jcnlwdGlvbiA9IDE7Ci0JCW1lbWNweShrZXksICZjcnlwdF9mdHItPmVka19wYXlsb2FkLCBzaXplb2YoZWRrX3BheWxvYWRfdCkpOwotCisgICAgICAgIGlmICggKGNudCA9IHJlYWQoZmQsICZlZGtfcGF5bG9hZCwgc2l6ZW9mKGVka19wYXlsb2FkX3QpKSkgIT0gc2l6ZW9mKGVka19wYXlsb2FkX3QpKSB7CisgICAgICAgICAgICBwcmludGYoIkNhbm5vdCByZWFkIEVESyBwYXlsb2FkIGZyb20gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICB9CisgICAgICAgIGlmIChsc2VlazY0KGZkLCBzaXplb2YoX19sZTMyKSwgU0VFS19DVVIpID09IC0xKSB7CisgICAgICAgICAgICBwcmludGYoIkNhbm5vdCBzZWVrIHBhc3QgdW5rbm93biBkYXRhIGZyb20gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICB9CisgICAgICAgIG1lbWNweShrZXksICZlZGtfcGF5bG9hZCwgc2l6ZW9mKGVka19wYXlsb2FkX3QpKTsKIAl9CiAjZWxzZQogICAgIHByaW50ZigiQmFkIG1hZ2ljIGZvciByZWFsIGJsb2NrIGRldmljZSAlc1xuIiwgZm5hbWUpOwpAQCAtMjE3LDcgKzIyNSw3IEBACiAgICAgfQogICB9CiAKLSAgaWYgKGNyeXB0X2Z0ci0+a2V5c2l6ZSAhPSBzaXplb2Yoc2F2ZWRfbWFzdGVyX2tleSkpIHsKKyAgaWYgKGNyeXB0X2Z0ci0+a2V5c2l6ZSA+IHNpemVvZihzYXZlZF9tYXN0ZXJfa2V5KSkgewogICAgIHByaW50ZigiS2V5c2l6ZSBvZiAlZCBiaXRzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYWwgYmxvY2sgZGV2aWNlICVzXG4iLAogICAgICAgICAgIGNyeXB0X2Z0ci0+a2V5c2l6ZSAqIDgsIGZuYW1lKTsKICAgICBnb3RvIGVycm91dDsKZGlmZiAtLWdpdCBhL2NyeXB0by9pY3MvY3J5cHRmcy5oIGIvY3J5cHRvL2ljcy9jcnlwdGZzLmgKaW5kZXggZTJmYjdhNy4uZWVlNDNiMyAxMDA2NDQKLS0tIGEvY3J5cHRvL2ljcy9jcnlwdGZzLmgKKysrIGIvY3J5cHRvL2ljcy9jcnlwdGZzLmgKQEAgLTY4LDEwICs2OCw2IEBACiAgIGNoYXIgY3J5cHRvX3R5cGVfbmFtZVtNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU5dOyAvKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uCiAJCQkJCQkJICAgICAgIG5lZWRlZCB0byBkZWNyeXB0IHRoaXMKIAkJCQkJCQkgICAgICAgcGFydGl0aW9uLCBudWxsIHRlcm1pbmF0ZWQgKi8KLSNpZmRlZiBUV19JTkNMVURFX0NSWVBUT19TQU1TVU5HCi0gICAgZWRrX3BheWxvYWRfdCBlZGtfcGF5bG9hZDsKLSAgX19sZTMyIHVua25vd25fZW5kOwotI2VuZGlmCiB9OwogCiAjcHJhZ21hIHBhY2soKQpkaWZmIC0tZ2l0IGEvZGF0YS5jcHAgYi9kYXRhLmNwcAppbmRleCA2NWY3MDZlLi5iZTc2NTkyIDEwMDY0NAotLS0gYS9kYXRhLmNwcAorKysgYi9kYXRhLmNwcApAQCAtNDAsMjIgKzQwLDI0IEBACiAjaW5jbHVkZSAiZGF0YS5ocHAiCiAjaW5jbHVkZSAicGFydGl0aW9ucy5ocHAiCiAjaW5jbHVkZSAidHdycC1mdW5jdGlvbnMuaHBwIgorI2lmbmRlZiBUV19OT19TQ1JFRU5fVElNRU9VVAogI2luY2x1ZGUgImd1aS9ibGFua3RpbWVyLmhwcCIKKyNlbmRpZgogCiAjaWZkZWYgVFdfVVNFX01PREVMX0hBUkRXQVJFX0lEX0ZPUl9ERVZJQ0VfSUQKLSAgICAjaW5jbHVkZSAiY3V0aWxzL3Byb3BlcnRpZXMuaCIKKwkjaW5jbHVkZSAiY3V0aWxzL3Byb3BlcnRpZXMuaCIKICNlbmRpZgogCiBleHRlcm4gIkMiCiB7Ci0gICAgI2luY2x1ZGUgInR3Y29tbW9uLmgiCi0gICAgI2luY2x1ZGUgImRhdGEuaCIKKwkjaW5jbHVkZSAidHdjb21tb24uaCIKKwkjaW5jbHVkZSAiZGF0YS5oIgogCSNpbmNsdWRlICJndWkvcGFnZXMuaCIKIAogCXZvaWQgZ3VpX25vdGlmeVZhckNoYW5nZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CiB9CiAKLSNkZWZpbmUgRklMRV9WRVJTSU9OICAgIDB4MDAwMTAwMDEKKyNkZWZpbmUgRklMRV9WRVJTSU9OIDB4MDAwMTAwMDEKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAtNjMsNyArNjUsOSBAQAogbWFwPHN0cmluZywgc3RyaW5nPiAgICAgICAgICAgICAgICAgICAgIERhdGFNYW5hZ2VyOjptQ29uc3RWYWx1ZXM7CiBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YU1hbmFnZXI6Om1CYWNraW5nRmlsZTsKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTWFuYWdlcjo6bUluaXRpYWxpemVkID0gMDsKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKIGV4dGVybiBibGFua3RpbWVyIGJsYW5rVGltZXI7CisjZW5kaWYKIAogLy8gRGV2aWNlIElEIGZ1bmN0aW9ucwogdm9pZCBEYXRhTWFuYWdlcjo6c2FuaXRpemVfZGV2aWNlX2lkKGNoYXIqIGRldmljZV9pZCkgewpAQCAtODEsMTIgKzg1LDEyIEBACiAJcmV0dXJuOwogfQogCi0jZGVmaW5lIENNRExJTkVfU0VSSUFMTk8gICAgICAgICJhbmRyb2lkYm9vdC5zZXJpYWxubz0iCi0jZGVmaW5lIENNRExJTkVfU0VSSUFMTk9fTEVOICAgIChzdHJsZW4oQ01ETElORV9TRVJJQUxOTykpCi0jZGVmaW5lIENQVUlORk9fU0VSSUFMTk8gICAgICAgICJTZXJpYWwiCi0jZGVmaW5lIENQVUlORk9fU0VSSUFMTk9fTEVOICAgIChzdHJsZW4oQ1BVSU5GT19TRVJJQUxOTykpCi0jZGVmaW5lIENQVUlORk9fSEFSRFdBUkUgICAgICAgICJIYXJkd2FyZSIKLSNkZWZpbmUgQ1BVSU5GT19IQVJEV0FSRV9MRU4gICAgKHN0cmxlbihDUFVJTkZPX0hBUkRXQVJFKSkKKyNkZWZpbmUgQ01ETElORV9TRVJJQUxOTwkJImFuZHJvaWRib290LnNlcmlhbG5vPSIKKyNkZWZpbmUgQ01ETElORV9TRVJJQUxOT19MRU4JKHN0cmxlbihDTURMSU5FX1NFUklBTE5PKSkKKyNkZWZpbmUgQ1BVSU5GT19TRVJJQUxOTwkJIlNlcmlhbCIKKyNkZWZpbmUgQ1BVSU5GT19TRVJJQUxOT19MRU4JKHN0cmxlbihDUFVJTkZPX1NFUklBTE5PKSkKKyNkZWZpbmUgQ1BVSU5GT19IQVJEV0FSRQkJIkhhcmR3YXJlIgorI2RlZmluZSBDUFVJTkZPX0hBUkRXQVJFX0xFTgkoc3RybGVuKENQVUlORk9fSEFSRFdBUkUpKQogCiB2b2lkIERhdGFNYW5hZ2VyOjpnZXRfZGV2aWNlX2lkKHZvaWQpIHsKIAlGSUxFICpmcDsKQEAgLTk0LDggKzk4LDggQEAKIAljaGFyIGhhcmR3YXJlX2lkWzMyXSwgZGV2aWNlX2lkWzY0XTsKIAljaGFyKiB0b2tlbjsKIAotICAgIC8vIEFzc2lnbiBhIGJsYW5rIGRldmljZV9pZCB0byBzdGFydCB3aXRoCi0gICAgZGV2aWNlX2lkWzBdID0gMDsKKwkvLyBBc3NpZ24gYSBibGFuayBkZXZpY2VfaWQgdG8gc3RhcnQgd2l0aAorCWRldmljZV9pZFswXSA9IDA7CiAKICNpZmRlZiBUV19VU0VfTU9ERUxfSEFSRFdBUkVfSURfRk9SX0RFVklDRV9JRAogCS8vIE5vdyB3ZSdsbCB1c2UgcHJvZHVjdF9tb2RlbF9oYXJkd2FyZWlkIGFzIGRldmljZSBpZApAQCAtMTIxLDM3ICsxMjUsMzcgQEAKICNlbmRpZgogCiAjaWZuZGVmIFRXX0ZPUkNFX0NQVUlORk9fRk9SX0RFVklDRV9JRAotICAgIC8vIEZpcnN0LCB0cnkgdGhlIGNtZGxpbmUgdG8gc2VlIGlmIHRoZSBzZXJpYWwgbnVtYmVyIHdhcyBzdXBwbGllZAorCS8vIEZpcnN0LCB0cnkgdGhlIGNtZGxpbmUgdG8gc2VlIGlmIHRoZSBzZXJpYWwgbnVtYmVyIHdhcyBzdXBwbGllZAogCWZwID0gZm9wZW4oIi9wcm9jL2NtZGxpbmUiLCAicnQiKTsKIAlpZiAoZnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8vIEZpcnN0IHN0ZXAsIHJlYWQgdGhlIGxpbmUuIEZvciBjbWRsaW5lLCBpdCdzIG9uZSBsb25nIGxpbmUKLSAgICAgICAgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCk7Ci0gICAgICAgIGZjbG9zZShmcCk7CisJeworCQkvLyBGaXJzdCBzdGVwLCByZWFkIHRoZSBsaW5lLiBGb3IgY21kbGluZSwgaXQncyBvbmUgbG9uZyBsaW5lCisJCWZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApOworCQlmY2xvc2UoZnApOwogCi0gICAgICAgIC8vIE5vdywgbGV0J3MgdG9rZW5pemUgdGhlIHN0cmluZwotICAgICAgICB0b2tlbiA9IHN0cnRvayhsaW5lLCAiICIpOworCQkvLyBOb3csIGxldCdzIHRva2VuaXplIHRoZSBzdHJpbmcKKwkJdG9rZW4gPSBzdHJ0b2sobGluZSwgIiAiKTsKIAotICAgICAgICAvLyBMZXQncyB3YWxrIHRocm91Z2ggdGhlIGxpbmUsIGxvb2tpbmcgZm9yIHRoZSBDTURMSU5FX1NFUklBTE5PIHRva2VuCi0gICAgICAgIHdoaWxlICh0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB2ZXJpZnkgdGhlIGxlbmd0aCBvZiB0b2tlbiwgYmVjYXVzZSBpZiBpdCdzIHRvbyBzaG9ydCwgaXQgd2lsbCBtaXNtYXRjaCBDTURMSU5FX1NFUklBTE5PIGF0IHRoZSBOVUxMCi0gICAgICAgICAgICBpZiAobWVtY21wKHRva2VuLCBDTURMSU5FX1NFUklBTE5PLCBDTURMSU5FX1NFUklBTE5PX0xFTikgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgc2VyaWFsIG51bWJlciEKLSAgICAgICAgICAgICAgICBzdHJjcHkoZGV2aWNlX2lkLCB0b2tlbiArIENNRExJTkVfU0VSSUFMTk9fTEVOKTsKKwkJLy8gTGV0J3Mgd2FsayB0aHJvdWdoIHRoZSBsaW5lLCBsb29raW5nIGZvciB0aGUgQ01ETElORV9TRVJJQUxOTyB0b2tlbgorCQl3aGlsZSAodG9rZW4pCisJCXsKKwkJCS8vIFdlIGRvbid0IG5lZWQgdG8gdmVyaWZ5IHRoZSBsZW5ndGggb2YgdG9rZW4sIGJlY2F1c2UgaWYgaXQncyB0b28gc2hvcnQsIGl0IHdpbGwgbWlzbWF0Y2ggQ01ETElORV9TRVJJQUxOTyBhdCB0aGUgTlVMTAorCQkJaWYgKG1lbWNtcCh0b2tlbiwgQ01ETElORV9TRVJJQUxOTywgQ01ETElORV9TRVJJQUxOT19MRU4pID09IDApCisJCQl7CisJCQkJLy8gV2UgZm91bmQgdGhlIHNlcmlhbCBudW1iZXIhCisJCQkJc3RyY3B5KGRldmljZV9pZCwgdG9rZW4gKyBDTURMSU5FX1NFUklBTE5PX0xFTik7CiAJCQkJc2FuaXRpemVfZGV2aWNlX2lkKChjaGFyICopZGV2aWNlX2lkKTsKIAkJCQltQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcigiZGV2aWNlX2lkIiwgZGV2aWNlX2lkKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG9rZW4gPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgfQotICAgIH0KKwkJCQlyZXR1cm47CisJCQl9CisJCQl0b2tlbiA9IHN0cnRvayhOVUxMLCAiICIpOworCQl9CisJfQogI2VuZGlmCiAJLy8gTm93IHdlJ2xsIHRyeSBjcHVpbmZvIGZvciBhIHNlcmlhbCBudW1iZXIKIAlmcCA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwgInJ0Iik7CiAJaWYgKGZwICE9IE5VTEwpCi0gICAgeworCXsKIAkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApICE9IE5VTEwpIHsgLy8gRmlyc3Qgc3RlcCwgcmVhZCB0aGUgbGluZS4KIAkJCWlmIChtZW1jbXAobGluZSwgQ1BVSU5GT19TRVJJQUxOTywgQ1BVSU5GT19TRVJJQUxOT19MRU4pID09IDApICAvLyBjaGVjayB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGZvciAiU2VyaWFsIgogCQkJewpAQCAtMTU5LDcgKzE2Myw3IEBACiAJCQkJdG9rZW4gPSBsaW5lICsgQ1BVSU5GT19TRVJJQUxOT19MRU47IC8vIHNraXAgcGFzdCAiU2VyaWFsIgogCQkJCXdoaWxlICgoKnRva2VuID4gMCAmJiAqdG9rZW4gPD0gMzIgKSB8fCAqdG9rZW4gPT0gJzonKSB0b2tlbisrOyAvLyBza2lwIG92ZXIgYWxsIHNwYWNlcyBhbmQgdGhlIGNvbG9uCiAJCQkJaWYgKCp0b2tlbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuWzMwXSA9IDA7CisJCQkJCXRva2VuWzMwXSA9IDA7CiAJCQkJCWlmICh0b2tlbltzdHJsZW4odG9rZW4pLTFdID09IDEwKSB7IC8vIGNoZWNraW5nIGZvciBlbmRsaW5lIGNoYXJzIGFuZCBkcm9wcGluZyB0aGVtIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGlmIG5lZWRlZAogCQkJCQkJbWVtc2V0KGRldmljZV9pZCwgMCwgc2l6ZW9mKGRldmljZV9pZCkpOwogCQkJCQkJc3RybmNweShkZXZpY2VfaWQsIHRva2VuLCBzdHJsZW4odG9rZW4pIC0gMSk7CkBAIC0xNzcsOSArMTgxLDkgQEAKIAkJCQl0b2tlbiA9IGxpbmUgKyBDUFVJTkZPX0hBUkRXQVJFX0xFTjsgLy8gc2tpcCBwYXN0ICJIYXJkd2FyZSIKIAkJCQl3aGlsZSAoKCp0b2tlbiA+IDAgJiYgKnRva2VuIDw9IDMyICkgfHwgKnRva2VuID09ICc6JykgIHRva2VuKys7IC8vIHNraXAgb3ZlciBhbGwgc3BhY2VzIGFuZCB0aGUgY29sb24KIAkJCQlpZiAoKnRva2VuICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bMzBdID0gMDsKKwkJCQkJdG9rZW5bMzBdID0gMDsKIAkJCQkJaWYgKHRva2VuW3N0cmxlbih0b2tlbiktMV0gPT0gMTApIHsgLy8gY2hlY2tpbmcgZm9yIGVuZGxpbmUgY2hhcnMgYW5kIGRyb3BwaW5nIHRoZW0gZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoaGFyZHdhcmVfaWQsIDAsIHNpemVvZihoYXJkd2FyZV9pZCkpOworCQkJCQkJbWVtc2V0KGhhcmR3YXJlX2lkLCAwLCBzaXplb2YoaGFyZHdhcmVfaWQpKTsKIAkJCQkJCXN0cm5jcHkoaGFyZHdhcmVfaWQsIHRva2VuLCBzdHJsZW4odG9rZW4pIC0gMSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlzdHJjcHkoaGFyZHdhcmVfaWQsIHRva2VuKTsKQEAgLTE4OSw3ICsxOTMsNyBAQAogCQkJfQogCQl9CiAJCWZjbG9zZShmcCk7Ci0gICAgfQorCX0KIAogCWlmIChoYXJkd2FyZV9pZFswXSAhPSAwKSB7CiAJCUxPR0lORk8oIlxudXNpbmcgaGFyZHdhcmUgaWQgZm9yIGRldmljZSBpZDogJyVzJ1xuIiwgaGFyZHdhcmVfaWQpOwpAQCAtMTk5LDc2ICsyMDMsNzggQEAKIAkJcmV0dXJuOwogCX0KIAotICAgIHN0cmNweShkZXZpY2VfaWQsICJzZXJpYWxubyIpOworCXN0cmNweShkZXZpY2VfaWQsICJzZXJpYWxubyIpOwogCUxPR0VSUigiPT4gZGV2aWNlIGlkIG5vdCBmb3VuZCwgdXNpbmcgJyVzJy4iLCBkZXZpY2VfaWQpOwogCW1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKCJkZXZpY2VfaWQiLCBkZXZpY2VfaWQpKTsKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiBpbnQgRGF0YU1hbmFnZXI6OlJlc2V0RGVmYXVsdHMoKQogewotICAgIG1WYWx1ZXMuY2xlYXIoKTsKLSAgICBtQ29uc3RWYWx1ZXMuY2xlYXIoKTsKLSAgICBTZXREZWZhdWx0VmFsdWVzKCk7Ci0gICAgcmV0dXJuIDA7CisJbVZhbHVlcy5jbGVhcigpOworCW1Db25zdFZhbHVlcy5jbGVhcigpOworCVNldERlZmF1bHRWYWx1ZXMoKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IERhdGFNYW5hZ2VyOjpMb2FkVmFsdWVzKGNvbnN0IHN0cmluZyBmaWxlbmFtZSkKIHsKLSAgICBzdHJpbmcgc3RyLCBkZXZfaWQ7CisJc3RyaW5nIHN0ciwgZGV2X2lkOwogCiAJaWYgKCFtSW5pdGlhbGl6ZWQpCi0gICAgICAgIFNldERlZmF1bHRWYWx1ZXMoKTsKKwkJU2V0RGVmYXVsdFZhbHVlcygpOwogCi0gICAgR2V0VmFsdWUoImRldmljZV9pZCIsIGRldl9pZCk7CisJR2V0VmFsdWUoImRldmljZV9pZCIsIGRldl9pZCk7CiAJLy8gU2F2ZSBvZmYgdGhlIGJhY2tpbmcgZmlsZSBmb3Igc2V0IG9wZXJhdGlvbnMKLSAgICBtQmFja2luZ0ZpbGUgPSBmaWxlbmFtZTsKKwltQmFja2luZ0ZpbGUgPSBmaWxlbmFtZTsKIAotICAgIC8vIFJlYWQgaW4gdGhlIGZpbGUsIGlmIHBvc3NpYmxlCi0gICAgRklMRSogaW4gPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAicmIiKTsKLSAgICBpZiAoIWluKSB7CisJLy8gUmVhZCBpbiB0aGUgZmlsZSwgaWYgcG9zc2libGUKKwlGSUxFKiBpbiA9IGZvcGVuKGZpbGVuYW1lLmNfc3RyKCksICJyYiIpOworCWlmICghaW4pIHsKIAkJTE9HSU5GTygiU2V0dGluZ3MgZmlsZSAnJXMnIG5vdCBmb3VuZC5cbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQlMT0dJTkZPKCJMb2FkaW5nIHNldHRpbmdzIGZyb20gJyVzJy5cbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwogCX0KIAotICAgIGludCBmaWxlX3ZlcnNpb247Ci0gICAgaWYgKGZyZWFkKCZmaWxlX3ZlcnNpb24sIDEsIHNpemVvZihpbnQpLCBpbikgIT0gc2l6ZW9mKGludCkpICAgIGdvdG8gZXJyb3I7Ci0gICAgaWYgKGZpbGVfdmVyc2lvbiAhPSBGSUxFX1ZFUlNJT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisJaW50IGZpbGVfdmVyc2lvbjsKKwlpZiAoZnJlYWQoJmZpbGVfdmVyc2lvbiwgMSwgc2l6ZW9mKGludCksIGluKSAhPSBzaXplb2YoaW50KSkJZ290byBlcnJvcjsKKwlpZiAoZmlsZV92ZXJzaW9uICE9IEZJTEVfVkVSU0lPTikJCQkJCQkJCWdvdG8gZXJyb3I7CiAKLSAgICB3aGlsZSAoIWZlb2YoaW4pKQotICAgIHsKLSAgICAgICAgc3RyaW5nIE5hbWU7Ci0gICAgICAgIHN0cmluZyBWYWx1ZTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwotICAgICAgICBjaGFyIGFycmF5WzUxMl07CisJd2hpbGUgKCFmZW9mKGluKSkKKwl7CisJCXN0cmluZyBOYW1lOworCQlzdHJpbmcgVmFsdWU7CisJCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwkJY2hhciBhcnJheVs1MTJdOwogCi0gICAgICAgIGlmIChmcmVhZCgmbGVuZ3RoLCAxLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCBpbikgIT0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkgICAgZ290byBlcnJvcjsKLSAgICAgICAgaWYgKGxlbmd0aCA+PSA1MTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICBpZiAoZnJlYWQoYXJyYXksIDEsIGxlbmd0aCwgaW4pICE9IGxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIE5hbWUgPSBhcnJheTsKKwkJaWYgKGZyZWFkKCZsZW5ndGgsIDEsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIGluKSAhPSBzaXplb2YodW5zaWduZWQgc2hvcnQpKQlnb3RvIGVycm9yOworCQlpZiAobGVuZ3RoID49IDUxMikJCQkJCQkJCQkJCQkJCQkJZ290byBlcnJvcjsKKwkJaWYgKGZyZWFkKGFycmF5LCAxLCBsZW5ndGgsIGluKSAhPSBsZW5ndGgpCQkJCQkJCQkJCWdvdG8gZXJyb3I7CisJCU5hbWUgPSBhcnJheTsKIAotICAgICAgICBpZiAoZnJlYWQoJmxlbmd0aCwgMSwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgaW4pICE9IHNpemVvZih1bnNpZ25lZCBzaG9ydCkpICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIGlmIChsZW5ndGggPj0gNTEyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgaWYgKGZyZWFkKGFycmF5LCAxLCBsZW5ndGgsIGluKSAhPSBsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICBWYWx1ZSA9IGFycmF5OworCQlpZiAoZnJlYWQoJmxlbmd0aCwgMSwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgaW4pICE9IHNpemVvZih1bnNpZ25lZCBzaG9ydCkpCWdvdG8gZXJyb3I7CisJCWlmIChsZW5ndGggPj0gNTEyKQkJCQkJCQkJCQkJCQkJCQlnb3RvIGVycm9yOworCQlpZiAoZnJlYWQoYXJyYXksIDEsIGxlbmd0aCwgaW4pICE9IGxlbmd0aCkJCQkJCQkJCQkJZ290byBlcnJvcjsKKwkJVmFsdWUgPSBhcnJheTsKIAotICAgICAgICBtYXA8c3RyaW5nLCBUU3RySW50UGFpcj46Oml0ZXJhdG9yIHBvczsKKwkJbWFwPHN0cmluZywgVFN0ckludFBhaXI+OjppdGVyYXRvciBwb3M7CiAKLSAgICAgICAgcG9zID0gbVZhbHVlcy5maW5kKE5hbWUpOwotICAgICAgICBpZiAocG9zICE9IG1WYWx1ZXMuZW5kKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcy0+c2Vjb25kLmZpcnN0ID0gVmFsdWU7Ci0gICAgICAgICAgICBwb3MtPnNlY29uZC5zZWNvbmQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1WYWx1ZXMuaW5zZXJ0KFROYW1lVmFsdWVQYWlyKE5hbWUsIFRTdHJJbnRQYWlyKFZhbHVlLCAxKSkpOworCQlwb3MgPSBtVmFsdWVzLmZpbmQoTmFtZSk7CisJCWlmIChwb3MgIT0gbVZhbHVlcy5lbmQoKSkKKwkJeworCQkJcG9zLT5zZWNvbmQuZmlyc3QgPSBWYWx1ZTsKKwkJCXBvcy0+c2Vjb25kLnNlY29uZCA9IDE7CisJCX0KKwkJZWxzZQorCQkJbVZhbHVlcy5pbnNlcnQoVE5hbWVWYWx1ZVBhaXIoTmFtZSwgVFN0ckludFBhaXIoVmFsdWUsIDEpKSk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCiAJCWlmIChOYW1lID09ICJ0d19zY3JlZW5fdGltZW91dF9zZWNzIikKIAkJCWJsYW5rVGltZXIuc2V0VGltZShhdG9pKFZhbHVlLmNfc3RyKCkpKTsKLSAgICB9CisjZW5kaWYKKwl9CiBlcnJvcjoKLSAgICBmY2xvc2UoaW4pOworCWZjbG9zZShpbik7CiAJc3RyaW5nIGN1cnJlbnQgPSBHZXRDdXJyZW50U3RvcmFnZVBhdGgoKTsKIAlzdHJpbmcgc2V0dGluZ3MgPSBHZXRTZXR0aW5nc1N0b3JhZ2VQYXRoKCk7CiAJaWYgKGN1cnJlbnQgIT0gc2V0dGluZ3MgJiYgIVBhcnRpdGlvbk1hbmFnZXIuTW91bnRfQnlfUGF0aChjdXJyZW50LCBmYWxzZSkpIHsKQEAgLTI3NiwxODUgKzI4MiwxOTIgQEAKIAl9IGVsc2UgewogCQlTZXRCYWNrdXBGb2xkZXIoKTsKIAl9Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIGludCBEYXRhTWFuYWdlcjo6Rmx1c2goKQogewotICAgIHJldHVybiBTYXZlVmFsdWVzKCk7CisJcmV0dXJuIFNhdmVWYWx1ZXMoKTsKIH0KIAogaW50IERhdGFNYW5hZ2VyOjpTYXZlVmFsdWVzKCkKIHsKLSAgICBpZiAobUJhY2tpbmdGaWxlLmVtcHR5KCkpICAgICAgIHJldHVybiAtMTsKKwlpZiAobUJhY2tpbmdGaWxlLmVtcHR5KCkpCisJCXJldHVybiAtMTsKIAogCXN0cmluZyBtb3VudF9wYXRoID0gR2V0U2V0dGluZ3NTdG9yYWdlUGF0aCgpOwogCVBhcnRpdGlvbk1hbmFnZXIuTW91bnRfQnlfUGF0aChtb3VudF9wYXRoLmNfc3RyKCksIDEpOwogCiAJRklMRSogb3V0ID0gZm9wZW4obUJhY2tpbmdGaWxlLmNfc3RyKCksICJ3YiIpOwotICAgIGlmICghb3V0KSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCWlmICghb3V0KQorCQlyZXR1cm4gLTE7CiAKLSAgICBpbnQgZmlsZV92ZXJzaW9uID0gRklMRV9WRVJTSU9OOwotICAgIGZ3cml0ZSgmZmlsZV92ZXJzaW9uLCAxLCBzaXplb2YoaW50KSwgb3V0KTsKKwlpbnQgZmlsZV92ZXJzaW9uID0gRklMRV9WRVJTSU9OOworCWZ3cml0ZSgmZmlsZV92ZXJzaW9uLCAxLCBzaXplb2YoaW50KSwgb3V0KTsKIAotICAgIG1hcDxzdHJpbmcsIFRTdHJJbnRQYWlyPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBtVmFsdWVzLmJlZ2luKCk7IGl0ZXIgIT0gbVZhbHVlcy5lbmQoKTsgKytpdGVyKQotICAgIHsKLSAgICAgICAgLy8gU2F2ZSBvbmx5IHRoZSBwZXJzaXN0ZWQgZGF0YQotICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNlY29uZCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGggPSAodW5zaWduZWQgc2hvcnQpIGl0ZXItPmZpcnN0Lmxlbmd0aCgpICsgMTsKLSAgICAgICAgICAgIGZ3cml0ZSgmbGVuZ3RoLCAxLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCBvdXQpOwotICAgICAgICAgICAgZndyaXRlKGl0ZXItPmZpcnN0LmNfc3RyKCksIDEsIGxlbmd0aCwgb3V0KTsKLSAgICAgICAgICAgIGxlbmd0aCA9ICh1bnNpZ25lZCBzaG9ydCkgaXRlci0+c2Vjb25kLmZpcnN0Lmxlbmd0aCgpICsgMTsKLSAgICAgICAgICAgIGZ3cml0ZSgmbGVuZ3RoLCAxLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCBvdXQpOwotICAgICAgICAgICAgZndyaXRlKGl0ZXItPnNlY29uZC5maXJzdC5jX3N0cigpLCAxLCBsZW5ndGgsIG91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKG91dCk7Ci0gICAgcmV0dXJuIDA7CisJbWFwPHN0cmluZywgVFN0ckludFBhaXI+OjppdGVyYXRvciBpdGVyOworCWZvciAoaXRlciA9IG1WYWx1ZXMuYmVnaW4oKTsgaXRlciAhPSBtVmFsdWVzLmVuZCgpOyArK2l0ZXIpCisJeworCQkvLyBTYXZlIG9ubHkgdGhlIHBlcnNpc3RlZCBkYXRhCisJCWlmIChpdGVyLT5zZWNvbmQuc2Vjb25kICE9IDApCisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IGxlbmd0aCA9ICh1bnNpZ25lZCBzaG9ydCkgaXRlci0+Zmlyc3QubGVuZ3RoKCkgKyAxOworCQkJZndyaXRlKCZsZW5ndGgsIDEsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIG91dCk7CisJCQlmd3JpdGUoaXRlci0+Zmlyc3QuY19zdHIoKSwgMSwgbGVuZ3RoLCBvdXQpOworCQkJbGVuZ3RoID0gKHVuc2lnbmVkIHNob3J0KSBpdGVyLT5zZWNvbmQuZmlyc3QubGVuZ3RoKCkgKyAxOworCQkJZndyaXRlKCZsZW5ndGgsIDEsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIG91dCk7CisJCQlmd3JpdGUoaXRlci0+c2Vjb25kLmZpcnN0LmNfc3RyKCksIDEsIGxlbmd0aCwgb3V0KTsKKwkJfQorCX0KKwlmY2xvc2Uob3V0KTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgc3RyaW5nJiB2YWx1ZSkKIHsKLSAgICBzdHJpbmcgbG9jYWxTdHIgPSB2YXJOYW1lOworCXN0cmluZyBsb2NhbFN0ciA9IHZhck5hbWU7CiAKLSAgICBpZiAoIW1Jbml0aWFsaXplZCkKLSAgICAgICAgU2V0RGVmYXVsdFZhbHVlcygpOworCWlmICghbUluaXRpYWxpemVkKQorCQlTZXREZWZhdWx0VmFsdWVzKCk7CiAKLSAgICAvLyBTdHJpcCBvZmYgbGVhZGluZyBhbmQgdHJhaWxpbmcgJyUnIGlmIHByb3ZpZGVkCi0gICAgaWYgKGxvY2FsU3RyLmxlbmd0aCgpID4gMiAmJiBsb2NhbFN0clswXSA9PSAnJScgJiYgbG9jYWxTdHJbbG9jYWxTdHIubGVuZ3RoKCktMV0gPT0gJyUnKQotICAgIHsKLSAgICAgICAgbG9jYWxTdHIuZXJhc2UoMCwgMSk7Ci0gICAgICAgIGxvY2FsU3RyLmVyYXNlKGxvY2FsU3RyLmxlbmd0aCgpIC0gMSwgMSk7Ci0gICAgfQorCS8vIFN0cmlwIG9mZiBsZWFkaW5nIGFuZCB0cmFpbGluZyAnJScgaWYgcHJvdmlkZWQKKwlpZiAobG9jYWxTdHIubGVuZ3RoKCkgPiAyICYmIGxvY2FsU3RyWzBdID09ICclJyAmJiBsb2NhbFN0cltsb2NhbFN0ci5sZW5ndGgoKS0xXSA9PSAnJScpCisJeworCQlsb2NhbFN0ci5lcmFzZSgwLCAxKTsKKwkJbG9jYWxTdHIuZXJhc2UobG9jYWxTdHIubGVuZ3RoKCkgLSAxLCAxKTsKKwl9CiAKLSAgICAvLyBIYW5kbGUgbWFnaWMgdmFsdWVzCi0gICAgaWYgKEdldE1hZ2ljVmFsdWUobG9jYWxTdHIsIHZhbHVlKSA9PSAwKSAgICAgcmV0dXJuIDA7CisJLy8gSGFuZGxlIG1hZ2ljIHZhbHVlcworCWlmIChHZXRNYWdpY1ZhbHVlKGxvY2FsU3RyLCB2YWx1ZSkgPT0gMCkKKwkJcmV0dXJuIDA7CiAKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBjb25zdFBvczsKLSAgICBjb25zdFBvcyA9IG1Db25zdFZhbHVlcy5maW5kKGxvY2FsU3RyKTsKLSAgICBpZiAoY29uc3RQb3MgIT0gbUNvbnN0VmFsdWVzLmVuZCgpKQotICAgIHsKLSAgICAgICAgdmFsdWUgPSBjb25zdFBvcy0+c2Vjb25kOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgY29uc3RQb3M7CisJY29uc3RQb3MgPSBtQ29uc3RWYWx1ZXMuZmluZChsb2NhbFN0cik7CisJaWYgKGNvbnN0UG9zICE9IG1Db25zdFZhbHVlcy5lbmQoKSkKKwl7CisJCXZhbHVlID0gY29uc3RQb3MtPnNlY29uZDsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgbWFwPHN0cmluZywgVFN0ckludFBhaXI+OjppdGVyYXRvciBwb3M7Ci0gICAgcG9zID0gbVZhbHVlcy5maW5kKGxvY2FsU3RyKTsKLSAgICBpZiAocG9zID09IG1WYWx1ZXMuZW5kKCkpCi0gICAgICAgIHJldHVybiAtMTsKKwltYXA8c3RyaW5nLCBUU3RySW50UGFpcj46Oml0ZXJhdG9yIHBvczsKKwlwb3MgPSBtVmFsdWVzLmZpbmQobG9jYWxTdHIpOworCWlmIChwb3MgPT0gbVZhbHVlcy5lbmQoKSkKKwkJcmV0dXJuIC0xOwogCi0gICAgdmFsdWUgPSBwb3MtPnNlY29uZC5maXJzdDsKLSAgICByZXR1cm4gMDsKKwl2YWx1ZSA9IHBvcy0+c2Vjb25kLmZpcnN0OworCXJldHVybiAwOwogfQogCiBpbnQgRGF0YU1hbmFnZXI6OkdldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBpbnQmIHZhbHVlKQogewotICAgIHN0cmluZyBkYXRhOworCXN0cmluZyBkYXRhOwogCi0gICAgaWYgKEdldFZhbHVlKHZhck5hbWUsZGF0YSkgIT0gMCkKLSAgICAgICAgcmV0dXJuIC0xOworCWlmIChHZXRWYWx1ZSh2YXJOYW1lLGRhdGEpICE9IDApCisJCXJldHVybiAtMTsKIAotICAgIHZhbHVlID0gYXRvaShkYXRhLmNfc3RyKCkpOwotICAgIHJldHVybiAwOworCXZhbHVlID0gYXRvaShkYXRhLmNfc3RyKCkpOworCXJldHVybiAwOwogfQogCiBpbnQgRGF0YU1hbmFnZXI6OkdldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBmbG9hdCYgdmFsdWUpCiB7Ci0gICAgc3RyaW5nIGRhdGE7CisJc3RyaW5nIGRhdGE7CiAKLSAgICBpZiAoR2V0VmFsdWUodmFyTmFtZSxkYXRhKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7CisJaWYgKEdldFZhbHVlKHZhck5hbWUsZGF0YSkgIT0gMCkKKwkJcmV0dXJuIC0xOwogCi0gICAgdmFsdWUgPSBhdG9mKGRhdGEuY19zdHIoKSk7Ci0gICAgcmV0dXJuIDA7CisJdmFsdWUgPSBhdG9mKGRhdGEuY19zdHIoKSk7CisJcmV0dXJuIDA7CiB9CiAKIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhTWFuYWdlcjo6R2V0VmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyYgdmFsdWUpCiB7Ci0gICAgc3RyaW5nIGRhdGE7CisJc3RyaW5nIGRhdGE7CiAKLSAgICBpZiAoR2V0VmFsdWUodmFyTmFtZSxkYXRhKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7CisJaWYgKEdldFZhbHVlKHZhck5hbWUsZGF0YSkgIT0gMCkKKwkJcmV0dXJuIC0xOwogCi0gICAgdmFsdWUgPSBzdHJ0b3VsbChkYXRhLmNfc3RyKCksIE5VTEwsIDEwKTsKLSAgICByZXR1cm4gMDsKKwl2YWx1ZSA9IHN0cnRvdWxsKGRhdGEuY19zdHIoKSwgTlVMTCwgMTApOworCXJldHVybiAwOwogfQogCiAvLyBUaGlzIGlzIGEgZGFuZ2Vyb3VzIGZ1bmN0aW9uLiBJdCB3aWxsIGNyZWF0ZSB0aGUgdmFsdWUgaWYgaXQgZG9lc24ndCBleGlzdCBzbyBpdCBoYXMgYSB2YWxpZCBjX3N0cgogc3RyaW5nJiBEYXRhTWFuYWdlcjo6R2V0VmFsdWVSZWYoY29uc3Qgc3RyaW5nIHZhck5hbWUpCiB7Ci0gICAgaWYgKCFtSW5pdGlhbGl6ZWQpCi0gICAgICAgIFNldERlZmF1bHRWYWx1ZXMoKTsKKwlpZiAoIW1Jbml0aWFsaXplZCkKKwkJU2V0RGVmYXVsdFZhbHVlcygpOwogCi0gICAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgY29uc3RQb3M7Ci0gICAgY29uc3RQb3MgPSBtQ29uc3RWYWx1ZXMuZmluZCh2YXJOYW1lKTsKLSAgICBpZiAoY29uc3RQb3MgIT0gbUNvbnN0VmFsdWVzLmVuZCgpKQotICAgICAgICByZXR1cm4gY29uc3RQb3MtPnNlY29uZDsKKwltYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBjb25zdFBvczsKKwljb25zdFBvcyA9IG1Db25zdFZhbHVlcy5maW5kKHZhck5hbWUpOworCWlmIChjb25zdFBvcyAhPSBtQ29uc3RWYWx1ZXMuZW5kKCkpCisJCXJldHVybiBjb25zdFBvcy0+c2Vjb25kOwogCi0gICAgbWFwPHN0cmluZywgVFN0ckludFBhaXI+OjppdGVyYXRvciBwb3M7Ci0gICAgcG9zID0gbVZhbHVlcy5maW5kKHZhck5hbWUpOwotICAgIGlmIChwb3MgPT0gbVZhbHVlcy5lbmQoKSkKLSAgICAgICAgcG9zID0gKG1WYWx1ZXMuaW5zZXJ0KFROYW1lVmFsdWVQYWlyKHZhck5hbWUsIFRTdHJJbnRQYWlyKCIiLCAwKSkpKS5maXJzdDsKKwltYXA8c3RyaW5nLCBUU3RySW50UGFpcj46Oml0ZXJhdG9yIHBvczsKKwlwb3MgPSBtVmFsdWVzLmZpbmQodmFyTmFtZSk7CisJaWYgKHBvcyA9PSBtVmFsdWVzLmVuZCgpKQorCQlwb3MgPSAobVZhbHVlcy5pbnNlcnQoVE5hbWVWYWx1ZVBhaXIodmFyTmFtZSwgVFN0ckludFBhaXIoIiIsIDApKSkpLmZpcnN0OwogCi0gICAgcmV0dXJuIHBvcy0+c2Vjb25kLmZpcnN0OworCXJldHVybiBwb3MtPnNlY29uZC5maXJzdDsKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGRvZXNuJ3QgZXhpc3QKIHN0cmluZyBEYXRhTWFuYWdlcjo6R2V0U3RyVmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUpCiB7Ci0gICAgc3RyaW5nIHJldFZhbDsKKwlzdHJpbmcgcmV0VmFsOwogCi0gICAgR2V0VmFsdWUodmFyTmFtZSwgcmV0VmFsKTsKLSAgICByZXR1cm4gcmV0VmFsOworCUdldFZhbHVlKHZhck5hbWUsIHJldFZhbCk7CisJcmV0dXJuIHJldFZhbDsKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwIGlmIHRoZSB2YWx1ZSBkb2Vzbid0IGV4aXN0CiBpbnQgRGF0YU1hbmFnZXI6OkdldEludFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lKQogewotICAgIHN0cmluZyByZXRWYWw7CisJc3RyaW5nIHJldFZhbDsKIAotICAgIEdldFZhbHVlKHZhck5hbWUsIHJldFZhbCk7Ci0gICAgcmV0dXJuIGF0b2kocmV0VmFsLmNfc3RyKCkpOworCUdldFZhbHVlKHZhck5hbWUsIHJldFZhbCk7CisJcmV0dXJuIGF0b2kocmV0VmFsLmNfc3RyKCkpOwogfQogCiBpbnQgRGF0YU1hbmFnZXI6OlNldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBzdHJpbmcgdmFsdWUsIGludCBwZXJzaXN0IC8qID0gMCAqLykKIHsKLSAgICBpZiAoIW1Jbml0aWFsaXplZCkKLSAgICAgICAgU2V0RGVmYXVsdFZhbHVlcygpOworCWlmICghbUluaXRpYWxpemVkKQorCQlTZXREZWZhdWx0VmFsdWVzKCk7CiAKLSAgICAvLyBEb24ndCBhbGxvdyBlbXB0eSB2YWx1ZXMgb3IgbnVtZXJpY2FsIHN0YXJ0aW5nIHZhbHVlcwotICAgIGlmICh2YXJOYW1lLmVtcHR5KCkgfHwgKHZhck5hbWVbMF0gPj0gJzAnICYmIHZhck5hbWVbMF0gPD0gJzknKSkKLSAgICAgICAgcmV0dXJuIC0xOworCS8vIERvbid0IGFsbG93IGVtcHR5IHZhbHVlcyBvciBudW1lcmljYWwgc3RhcnRpbmcgdmFsdWVzCisJaWYgKHZhck5hbWUuZW1wdHkoKSB8fCAodmFyTmFtZVswXSA+PSAnMCcgJiYgdmFyTmFtZVswXSA8PSAnOScpKQorCQlyZXR1cm4gLTE7CiAKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBjb25zdENoazsKLSAgICBjb25zdENoayA9IG1Db25zdFZhbHVlcy5maW5kKHZhck5hbWUpOwotICAgIGlmIChjb25zdENoayAhPSBtQ29uc3RWYWx1ZXMuZW5kKCkpCi0gICAgICAgIHJldHVybiAtMTsKKwltYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBjb25zdENoazsKKwljb25zdENoayA9IG1Db25zdFZhbHVlcy5maW5kKHZhck5hbWUpOworCWlmIChjb25zdENoayAhPSBtQ29uc3RWYWx1ZXMuZW5kKCkpCisJCXJldHVybiAtMTsKIAotICAgIG1hcDxzdHJpbmcsIFRTdHJJbnRQYWlyPjo6aXRlcmF0b3IgcG9zOwotICAgIHBvcyA9IG1WYWx1ZXMuZmluZCh2YXJOYW1lKTsKLSAgICBpZiAocG9zID09IG1WYWx1ZXMuZW5kKCkpCi0gICAgICAgIHBvcyA9IChtVmFsdWVzLmluc2VydChUTmFtZVZhbHVlUGFpcih2YXJOYW1lLCBUU3RySW50UGFpcih2YWx1ZSwgcGVyc2lzdCkpKSkuZmlyc3Q7Ci0gICAgZWxzZQotICAgICAgICBwb3MtPnNlY29uZC5maXJzdCA9IHZhbHVlOworCW1hcDxzdHJpbmcsIFRTdHJJbnRQYWlyPjo6aXRlcmF0b3IgcG9zOworCXBvcyA9IG1WYWx1ZXMuZmluZCh2YXJOYW1lKTsKKwlpZiAocG9zID09IG1WYWx1ZXMuZW5kKCkpCisJCXBvcyA9IChtVmFsdWVzLmluc2VydChUTmFtZVZhbHVlUGFpcih2YXJOYW1lLCBUU3RySW50UGFpcih2YWx1ZSwgcGVyc2lzdCkpKSkuZmlyc3Q7CisJZWxzZQorCQlwb3MtPnNlY29uZC5maXJzdCA9IHZhbHVlOwogCi0gICAgaWYgKHBvcy0+c2Vjb25kLnNlY29uZCAhPSAwKQotICAgICAgICBTYXZlVmFsdWVzKCk7CisJaWYgKHBvcy0+c2Vjb25kLnNlY29uZCAhPSAwKQorCQlTYXZlVmFsdWVzKCk7CisKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKIAlpZiAodmFyTmFtZSA9PSAidHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIpIHsKIAkJYmxhbmtUaW1lci5zZXRUaW1lKGF0b2kodmFsdWUuY19zdHIoKSkpOwotCX0gZWxzZSBpZiAodmFyTmFtZSA9PSAidHdfc3RvcmFnZV9wYXRoIikgeworCX0gZWxzZQorI2VuZGlmCisJaWYgKHZhck5hbWUgPT0gInR3X3N0b3JhZ2VfcGF0aCIpIHsKIAkJU2V0QmFja3VwRm9sZGVyKCk7CiAJfQogCWd1aV9ub3RpZnlWYXJDaGFuZ2UodmFyTmFtZS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogaW50IERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgaW50IHZhbHVlLCBpbnQgcGVyc2lzdCAvKiA9IDAgKi8pCiB7CiAJb3N0cmluZ3N0cmVhbSB2YWxTdHI7Ci0gICAgdmFsU3RyIDw8IHZhbHVlOworCXZhbFN0ciA8PCB2YWx1ZTsKIAlpZiAodmFyTmFtZSA9PSAidHdfdXNlX2V4dGVybmFsX3N0b3JhZ2UiKSB7CiAJCXN0cmluZyBzdHI7CiAKQEAgLTQ3MSwyOCArNDg0LDI5IEBACiAKIAkJU2V0VmFsdWUoInR3X3N0b3JhZ2VfcGF0aCIsIHN0cik7CiAJfQotICAgIHJldHVybiBTZXRWYWx1ZSh2YXJOYW1lLCB2YWxTdHIuc3RyKCksIHBlcnNpc3QpOworCXJldHVybiBTZXRWYWx1ZSh2YXJOYW1lLCB2YWxTdHIuc3RyKCksIHBlcnNpc3QpOwogfQogCiBpbnQgRGF0YU1hbmFnZXI6OlNldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBmbG9hdCB2YWx1ZSwgaW50IHBlcnNpc3QgLyogPSAwICovKQogewogCW9zdHJpbmdzdHJlYW0gdmFsU3RyOwotICAgIHZhbFN0ciA8PCB2YWx1ZTsKLSAgICByZXR1cm4gU2V0VmFsdWUodmFyTmFtZSwgdmFsU3RyLnN0cigpLCBwZXJzaXN0KTs7CisJdmFsU3RyIDw8IHZhbHVlOworCXJldHVybiBTZXRWYWx1ZSh2YXJOYW1lLCB2YWxTdHIuc3RyKCksIHBlcnNpc3QpOzsKIH0KIAogaW50IERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlLCBpbnQgcGVyc2lzdCAvKiA9IDAgKi8pCiB7CiAJb3N0cmluZ3N0cmVhbSB2YWxTdHI7Ci0gICAgdmFsU3RyIDw8IHZhbHVlOwotICAgIHJldHVybiBTZXRWYWx1ZSh2YXJOYW1lLCB2YWxTdHIuc3RyKCksIHBlcnNpc3QpOzsKKwl2YWxTdHIgPDwgdmFsdWU7CisJcmV0dXJuIFNldFZhbHVlKHZhck5hbWUsIHZhbFN0ci5zdHIoKSwgcGVyc2lzdCk7CiB9CiAKIGludCBEYXRhTWFuYWdlcjo6U2V0UHJvZ3Jlc3MoZmxvYXQgRnJhY3Rpb24pIHsKIAlyZXR1cm4gU2V0VmFsdWUoInVpX3Byb2dyZXNzIiwgKGZsb2F0KSAoRnJhY3Rpb24gKiAxMDAuMCkpOwogfQogCi1pbnQgRGF0YU1hbmFnZXI6OlNob3dQcm9ncmVzcyhmbG9hdCBQb3J0aW9uLCBmbG9hdCBTZWNvbmRzKSB7CitpbnQgRGF0YU1hbmFnZXI6OlNob3dQcm9ncmVzcyhmbG9hdCBQb3J0aW9uLCBmbG9hdCBTZWNvbmRzKQorewogCWZsb2F0IFN0YXJ0aW5nX1BvcnRpb247CiAJR2V0VmFsdWUoInVpX3Byb2dyZXNzX3BvcnRpb24iLCBTdGFydGluZ19Qb3J0aW9uKTsKIAlpZiAoU2V0VmFsdWUoInVpX3Byb2dyZXNzX3BvcnRpb24iLCAoZmxvYXQpKFBvcnRpb24gKiAxMDAuMCkgKyBTdGFydGluZ19Qb3J0aW9uKSAhPSAwKQpAQCAtNTA0LDE3ICs1MTgsMTYgQEAKIAogdm9pZCBEYXRhTWFuYWdlcjo6RHVtcFZhbHVlcygpCiB7Ci0gICAgbWFwPHN0cmluZywgVFN0ckludFBhaXI+OjppdGVyYXRvciBpdGVyOwotICAgIGd1aV9wcmludCgiRGF0YSBNYW5hZ2VyIGR1bXAgLSBWYWx1ZXMgd2l0aCBsZWFkaW5nIFggYXJlIHBlcnNpc3RlZC5cbiIpOwotICAgIGZvciAoaXRlciA9IG1WYWx1ZXMuYmVnaW4oKTsgaXRlciAhPSBtVmFsdWVzLmVuZCgpOyArK2l0ZXIpCi0gICAgewotICAgICAgICBndWlfcHJpbnQoIiVjICVzPSVzXG4iLCBpdGVyLT5zZWNvbmQuc2Vjb25kID8gJ1gnIDogJyAnLCBpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQuZmlyc3QuY19zdHIoKSk7Ci0gICAgfQorCW1hcDxzdHJpbmcsIFRTdHJJbnRQYWlyPjo6aXRlcmF0b3IgaXRlcjsKKwlndWlfcHJpbnQoIkRhdGEgTWFuYWdlciBkdW1wIC0gVmFsdWVzIHdpdGggbGVhZGluZyBYIGFyZSBwZXJzaXN0ZWQuXG4iKTsKKwlmb3IgKGl0ZXIgPSBtVmFsdWVzLmJlZ2luKCk7IGl0ZXIgIT0gbVZhbHVlcy5lbmQoKTsgKytpdGVyKQorCQlndWlfcHJpbnQoIiVjICVzPSVzXG4iLCBpdGVyLT5zZWNvbmQuc2Vjb25kID8gJ1gnIDogJyAnLCBpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQuZmlyc3QuY19zdHIoKSk7CiB9CiAKLXZvaWQgRGF0YU1hbmFnZXI6OnVwZGF0ZV90el9lbnZpcm9ubWVudF92YXJpYWJsZXModm9pZCkgewordm9pZCBEYXRhTWFuYWdlcjo6dXBkYXRlX3R6X2Vudmlyb25tZW50X3ZhcmlhYmxlcyh2b2lkKQorewogCXNldGVudigiVFoiLCBEYXRhTWFuYWdlcl9HZXRTdHJWYWx1ZShUV19USU1FX1pPTkVfVkFSKSwgMSk7Ci0gICAgdHpzZXQoKTsKKwl0enNldCgpOwogfQogCiB2b2lkIERhdGFNYW5hZ2VyOjpTZXRCYWNrdXBGb2xkZXIoKQpAQCAtNTI2LDcgKzUzOSw3IEBACiAJc3RyaW5nIGRldl9pZDsKIAlHZXRWYWx1ZSgiZGV2aWNlX2lkIiwgZGV2X2lkKTsKIAotICAgIHN0ciArPSBkZXZfaWQ7CisJc3RyICs9IGRldl9pZDsKIAlMT0dJTkZPKCJCYWNrdXAgZm9sZGVyIHNldCB0byAnJXMnXG4iLCBzdHIuY19zdHIoKSk7CiAJU2V0VmFsdWUoVFdfQkFDS1VQU19GT0xERVJfVkFSLCBzdHIsIDApOwogCWlmIChwYXJ0aXRpb24gIT0gTlVMTCkgewpAQCAtNTU4LDE2ICs1NzEsMTYgQEAKIAogdm9pZCBEYXRhTWFuYWdlcjo6U2V0RGVmYXVsdFZhbHVlcygpCiB7Ci0gICAgc3RyaW5nIHN0ciwgcGF0aDsKKwlzdHJpbmcgc3RyLCBwYXRoOwogCi0gICAgZ2V0X2RldmljZV9pZCgpOworCWdldF9kZXZpY2VfaWQoKTsKIAotICAgIG1Jbml0aWFsaXplZCA9IDE7CisJbUluaXRpYWxpemVkID0gMTsKIAotICAgIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKCJ0cnVlIiwgIjEiKSk7Ci0gICAgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoImZhbHNlIiwgIjAiKSk7CisJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoInRydWUiLCAiMSIpKTsKKwltQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcigiZmFsc2UiLCAiMCIpKTsKIAotICAgIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1ZFUlNJT05fVkFSLCBUV19WRVJTSU9OX1NUUikpOworCW1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1ZFUlNJT05fVkFSLCBUV19WRVJTSU9OX1NUUikpOwogCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcigidHdfc3RvcmFnZV9wYXRoIiwgbWFrZV9wYWlyKCIvIiwgMSkpKTsKIAogI2lmZGVmIFRXX0ZPUkNFX0NQVUlORk9fRk9SX0RFVklDRV9JRApAQCAtNTc2LDkgKzU4OSw5IEBACiAKICNpZmRlZiBCT0FSRF9IQVNfTk9fUkVBTF9TRENBUkQKIAlwcmludGYoIkJPQVJEX0hBU19OT19SRUFMX1NEQ0FSRCA6PSB0cnVlXG4iKTsKLSAgICBtQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19BTExPV19QQVJUSVRJT05fU0RDQVJELCAiMCIpKTsKKwltQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19BTExPV19QQVJUSVRJT05fU0RDQVJELCAiMCIpKTsKICNlbHNlCi0gICAgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQUxMT1dfUEFSVElUSU9OX1NEQ0FSRCwgIjEiKSk7CisJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQUxMT1dfUEFSVElUSU9OX1NEQ0FSRCwgIjEiKSk7CiAjZW5kaWYKIAogI2lmZGVmIFRXX0lOQ0xVREVfRFVNTE9DSwpAQCAtNzIwLDQ1ICs3MzMsNDUgQEAKIAlzdHJpbmcgZGV2X2lkOwogCUdldFZhbHVlKCJkZXZpY2VfaWQiLCBkZXZfaWQpOwogCi0gICAgc3RyICs9IGRldl9pZDsKKwlzdHIgKz0gZGV2X2lkOwogCVNldFZhbHVlKFRXX0JBQ0tVUFNfRk9MREVSX1ZBUiwgc3RyLCAwKTsKIAogI2lmZGVmIFNQMV9ESVNQTEFZX05BTUUKIAlwcmludGYoIlNQMV9ESVNQTEFZX05BTUUgOj0gJXNcbiIsIEVYUEFORChTUDFfRElTUExBWV9OQU1FKSk7Ci0gICAgaWYgKHN0cmxlbihFWFBBTkQoU1AxX0RJU1BMQVlfTkFNRSkpKSAgICBtQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TUDFfUEFSVElUSU9OX05BTUVfVkFSLCBFWFBBTkQoU1AxX0RJU1BMQVlfTkFNRSkpKTsKKwlpZiAoc3RybGVuKEVYUEFORChTUDFfRElTUExBWV9OQU1FKSkpIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NQMV9QQVJUSVRJT05fTkFNRV9WQVIsIEVYUEFORChTUDFfRElTUExBWV9OQU1FKSkpOwogI2Vsc2UKIAkjaWZkZWYgU1AxX05BTUUKIAkJcHJpbnRmKCJTUDFfTkFNRSA6PSAlc1xuIiwgRVhQQU5EKFNQMV9OQU1FKSk7Ci0JCWlmIChzdHJsZW4oRVhQQU5EKFNQMV9OQU1FKSkpICAgIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NQMV9QQVJUSVRJT05fTkFNRV9WQVIsIEVYUEFORChTUDFfTkFNRSkpKTsKKwkJaWYgKHN0cmxlbihFWFBBTkQoU1AxX05BTUUpKSkgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU1AxX1BBUlRJVElPTl9OQU1FX1ZBUiwgRVhQQU5EKFNQMV9OQU1FKSkpOwogCSNlbmRpZgogI2VuZGlmCiAjaWZkZWYgU1AyX0RJU1BMQVlfTkFNRQogCXByaW50ZigiU1AyX0RJU1BMQVlfTkFNRSA6PSAlc1xuIiwgRVhQQU5EKFNQMl9ESVNQTEFZX05BTUUpKTsKLSAgICBpZiAoc3RybGVuKEVYUEFORChTUDJfRElTUExBWV9OQU1FKSkpICAgIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NQMl9QQVJUSVRJT05fTkFNRV9WQVIsIEVYUEFORChTUDJfRElTUExBWV9OQU1FKSkpOworCWlmIChzdHJsZW4oRVhQQU5EKFNQMl9ESVNQTEFZX05BTUUpKSkgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU1AyX1BBUlRJVElPTl9OQU1FX1ZBUiwgRVhQQU5EKFNQMl9ESVNQTEFZX05BTUUpKSk7CiAjZWxzZQogCSNpZmRlZiBTUDJfTkFNRQogCQlwcmludGYoIlNQMl9OQU1FIDo9ICVzXG4iLCBFWFBBTkQoU1AyX05BTUUpKTsKLQkJaWYgKHN0cmxlbihFWFBBTkQoU1AyX05BTUUpKSkgICAgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU1AyX1BBUlRJVElPTl9OQU1FX1ZBUiwgRVhQQU5EKFNQMl9OQU1FKSkpOworCQlpZiAoc3RybGVuKEVYUEFORChTUDJfTkFNRSkpKSBtQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TUDJfUEFSVElUSU9OX05BTUVfVkFSLCBFWFBBTkQoU1AyX05BTUUpKSk7CiAJI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBTUDNfRElTUExBWV9OQU1FCiAJcHJpbnRmKCJTUDNfRElTUExBWV9OQU1FIDo9ICVzXG4iLCBFWFBBTkQoU1AzX0RJU1BMQVlfTkFNRSkpOwotICAgIGlmIChzdHJsZW4oRVhQQU5EKFNQM19ESVNQTEFZX05BTUUpKSkgICAgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU1AzX1BBUlRJVElPTl9OQU1FX1ZBUiwgRVhQQU5EKFNQM19ESVNQTEFZX05BTUUpKSk7CisJaWYgKHN0cmxlbihFWFBBTkQoU1AzX0RJU1BMQVlfTkFNRSkpKSBtQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TUDNfUEFSVElUSU9OX05BTUVfVkFSLCBFWFBBTkQoU1AzX0RJU1BMQVlfTkFNRSkpKTsKICNlbHNlCiAJI2lmZGVmIFNQM19OQU1FCiAJCXByaW50ZigiU1AzX05BTUUgOj0gJXNcbiIsIEVYUEFORChTUDNfTkFNRSkpOwotCQlpZiAoc3RybGVuKEVYUEFORChTUDNfTkFNRSkpKSAgICBtQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TUDNfUEFSVElUSU9OX05BTUVfVkFSLCBFWFBBTkQoU1AzX05BTUUpKSk7CisJCWlmIChzdHJsZW4oRVhQQU5EKFNQM19OQU1FKSkpIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NQM19QQVJUSVRJT05fTkFNRV9WQVIsIEVYUEFORChTUDNfTkFNRSkpKTsKIAkjZW5kaWYKICNlbmRpZgogCi0gICAgbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX1NZU1RFTSwgIjEiKSk7CisJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX1NZU1RFTSwgIjEiKSk7CiAjaWZkZWYgVFdfTk9fUkVCT09UX1JFQ09WRVJZCiAJcHJpbnRmKCJUV19OT19SRUJPT1RfUkVDT1ZFUlkgOj0gdHJ1ZVxuIik7CiAJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX1JFQ09WRVJZLCAiMCIpKTsKICNlbHNlCiAJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX1JFQ09WRVJZLCAiMSIpKTsKICNlbmRpZgotICAgIG1Db25zdFZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1JFQk9PVF9QT1dFUk9GRiwgIjEiKSk7CisJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX1BPV0VST0ZGLCAiMSIpKTsKICNpZmRlZiBUV19OT19SRUJPT1RfQk9PVExPQURFUgogCXByaW50ZigiVFdfTk9fUkVCT09UX0JPT1RMT0FERVIgOj0gdHJ1ZVxuIik7CiAJbUNvbnN0VmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX0JPT1RMT0FERVIsICIwIikpOwpAQCAtODQzLDE1ICs4NTYsMTUgQEAKIAltQ29uc3RWYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19NSU5fU1lTVEVNX1ZBUiwgVFdfTUlOX1NZU1RFTV9TSVpFKSk7CiAJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9OQU1FLCBtYWtlX3BhaXIoIihDdXJyZW50IERhdGUpIiwgMCkpKTsKIAltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX1NZU1RFTV9WQVIsIG1ha2VfcGFpcigiMSIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9EQVRBX1ZBUiwgbWFrZV9wYWlyKCIxIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX0JPT1RfVkFSLCBtYWtlX3BhaXIoIjEiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfUkVDT1ZFUllfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfQ0FDSEVfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfU1AxX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX1NQMl9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9TUDNfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfQU5EU0VDX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX1NERVhUX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX0RBVEFfVkFSLCBtYWtlX3BhaXIoIjEiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfQk9PVF9WQVIsIG1ha2VfcGFpcigiMSIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9SRUNPVkVSWV9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9DQUNIRV9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9TUDFfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfU1AyX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX1NQM19WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9BTkRTRUNfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfU0RFWFRfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwogCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfU1lTVEVNX1NJWkUsIG1ha2VfcGFpcigiMCIsIDApKSk7CiAJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9EQVRBX1NJWkUsIG1ha2VfcGFpcigiMCIsIDApKSk7CiAJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9CT09UX1NJWkUsIG1ha2VfcGFpcigiMCIsIDApKSk7CkBAIC04NjQsMzMgKzg3NywzMyBAQAogCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfU1AzX1NJWkUsIG1ha2VfcGFpcigiMCIsIDApKSk7CiAJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NUT1JBR0VfRlJFRV9TSVpFLCBtYWtlX3BhaXIoIjAiLCAwKSkpOwogCi0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1JFQk9PVF9BRlRFUl9GTEFTSF9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NJR05FRF9aSVBfVkVSSUZZX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfRk9SQ0VfTUQ1X0NIRUNLX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQ09MT1JfVEhFTUVfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19VU0VfQ09NUFJFU1NJT05fVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TSE9XX1NQQU1fVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19USU1FX1pPTkVfVkFSLCBtYWtlX3BhaXIoIkNTVDZDRFQiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TT1JUX0ZJTEVTX0JZX0RBVEVfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19HVUlfU09SVF9PUkRFUiwgbWFrZV9wYWlyKCIxIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUk1fUkZfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TS0lQX01ENV9DSEVDS19WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NLSVBfTUQ1X0dFTkVSQVRFX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU0RFWFRfU0laRSwgbWFrZV9wYWlyKCI1MTIiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TV0FQX1NJWkUsIG1ha2VfcGFpcigiMzIiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TRFBBUlRfRklMRV9TWVNURU0sIG1ha2VfcGFpcigiZXh0MyIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1RJTUVfWk9ORV9HVUlTRUwsIG1ha2VfcGFpcigiQ1NUNjtDRFQiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19USU1FX1pPTkVfR1VJT0ZGU0VULCBtYWtlX3BhaXIoIjAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19USU1FX1pPTkVfR1VJRFNULCBtYWtlX3BhaXIoIjEiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19BQ1RJT05fQlVTWSwgbWFrZV9wYWlyKCIwIiwgMCkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX0FWR19JTUdfUkFURSwgbWFrZV9wYWlyKCIxNTAwMDAwMCIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9BVkdfRklMRV9SQVRFLCBtYWtlX3BhaXIoIjMwMDAwMDAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfQVZHX0ZJTEVfQ09NUF9SQVRFLCBtYWtlX3BhaXIoIjIwMDAwMDAiLCAxKSkpOwotICAgIG1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19SRVNUT1JFX0FWR19JTUdfUkFURSwgbWFrZV9wYWlyKCIxNTAwMDAwMCIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1JFU1RPUkVfQVZHX0ZJTEVfUkFURSwgbWFrZV9wYWlyKCIzMDAwMDAwIiwgMSkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVTVE9SRV9BVkdfRklMRV9DT01QX1JBVEUsIG1ha2VfcGFpcigiMjAwMDAwMCIsIDEpKSk7Ci0gICAgbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKCJ0d193aXBlX2NhY2hlIiwgbWFrZV9wYWlyKCIwIiwgMCkpKTsKLSAgICBtVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X3dpcGVfZGFsdmlrIiwgbWFrZV9wYWlyKCIwIiwgMCkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVCT09UX0FGVEVSX0ZMQVNIX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU0lHTkVEX1pJUF9WRVJJRllfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19GT1JDRV9NRDVfQ0hFQ0tfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19DT0xPUl9USEVNRV9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1VTRV9DT01QUkVTU0lPTl9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NIT1dfU1BBTV9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1RJTUVfWk9ORV9WQVIsIG1ha2VfcGFpcigiQ1NUNkNEVCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NPUlRfRklMRVNfQllfREFURV9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0dVSV9TT1JUX09SREVSLCBtYWtlX3BhaXIoIjEiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19STV9SRl9WQVIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NLSVBfTUQ1X0NIRUNLX1ZBUiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfU0tJUF9NRDVfR0VORVJBVEVfVkFSLCBtYWtlX3BhaXIoIjAiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19TREVYVF9TSVpFLCBtYWtlX3BhaXIoIjUxMiIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NXQVBfU0laRSwgbWFrZV9wYWlyKCIzMiIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1NEUEFSVF9GSUxFX1NZU1RFTSwgbWFrZV9wYWlyKCJleHQzIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfVElNRV9aT05FX0dVSVNFTCwgbWFrZV9wYWlyKCJDU1Q2O0NEVCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1RJTUVfWk9ORV9HVUlPRkZTRVQsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1RJTUVfWk9ORV9HVUlEU1QsIG1ha2VfcGFpcigiMSIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0FDVElPTl9CVVNZLCBtYWtlX3BhaXIoIjAiLCAwKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19CQUNLVVBfQVZHX0lNR19SQVRFLCBtYWtlX3BhaXIoIjE1MDAwMDAwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfQkFDS1VQX0FWR19GSUxFX1JBVEUsIG1ha2VfcGFpcigiMzAwMDAwMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX0JBQ0tVUF9BVkdfRklMRV9DT01QX1JBVEUsIG1ha2VfcGFpcigiMjAwMDAwMCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKFRXX1JFU1RPUkVfQVZHX0lNR19SQVRFLCBtYWtlX3BhaXIoIjE1MDAwMDAwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoVFdfUkVTVE9SRV9BVkdfRklMRV9SQVRFLCBtYWtlX3BhaXIoIjMwMDAwMDAiLCAxKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19SRVNUT1JFX0FWR19GSUxFX0NPTVBfUkFURSwgbWFrZV9wYWlyKCIyMDAwMDAwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X3dpcGVfY2FjaGUiLCBtYWtlX3BhaXIoIjAiLCAwKSkpOworCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcigidHdfd2lwZV9kYWx2aWsiLCBtYWtlX3BhaXIoIjAiLCAwKSkpOwogCWlmIChHZXRJbnRWYWx1ZShUV19IQVNfSU5URVJOQUwpID09IDEgJiYgR2V0SW50VmFsdWUoVFdfSEFTX0RBVEFfTUVESUEpID09IDEgJiYgR2V0SW50VmFsdWUoVFdfSEFTX0VYVEVSTkFMKSA9PSAwKQogCQlTZXRWYWx1ZShUV19IQVNfVVNCX1NUT1JBR0UsIDAsIDApOwogCWVsc2UKQEAgLTkwOCw3ICs5MjEsMTMgQEAKIAltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X2JhY2tncm91bmRfdGhyZWFkX3J1bm5pbmciLCBtYWtlX3BhaXIoIjAiLCAwKSkpOwogCW1WYWx1ZXMuaW5zZXJ0KG1ha2VfcGFpcihUV19SRVNUT1JFX0ZJTEVfREFURSwgbWFrZV9wYWlyKCIwIiwgMCkpKTsKIAltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X21pbGl0YXJ5X3RpbWUiLCBtYWtlX3BhaXIoIjAiLCAxKSkpOworI2lmZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKCJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiwgbWFrZV9wYWlyKCIwIiwgMSkpKTsKKwltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X25vX3NjcmVlbl90aW1lb3V0IiwgbWFrZV9wYWlyKCIxIiwgMSkpKTsKKyNlbHNlCiAJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKCJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiwgbWFrZV9wYWlyKCI2MCIsIDEpKSk7CisJbVZhbHVlcy5pbnNlcnQobWFrZV9wYWlyKCJ0d19ub19zY3JlZW5fdGltZW91dCIsIG1ha2VfcGFpcigiMCIsIDEpKSk7CisjZW5kaWYKIAltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X2d1aV9kb25lIiwgbWFrZV9wYWlyKCIwIiwgMCkpKTsKIAltVmFsdWVzLmluc2VydChtYWtlX3BhaXIoInR3X2VuY3J5cHRfYmFja3VwIiwgbWFrZV9wYWlyKCIwIiwgMCkpKTsKICNpZmRlZiBUV19CUklHSFRORVNTX1BBVEgKQEAgLTk0MCwzNSArOTU5LDM3IEBACiAvLyBNYWdpYyBWYWx1ZXMKIGludCBEYXRhTWFuYWdlcjo6R2V0TWFnaWNWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgc3RyaW5nJiB2YWx1ZSkKIHsKLSAgICAvLyBIYW5kbGUgc3BlY2lhbCBkeW5hbWljIGNhc2VzCi0gICAgaWYgKHZhck5hbWUgPT0gInR3X3RpbWUiKQotICAgIHsKLSAgICAgICAgY2hhciB0bXBbMzJdOworCS8vIEhhbmRsZSBzcGVjaWFsIGR5bmFtaWMgY2FzZXMKKwlpZiAodmFyTmFtZSA9PSAidHdfdGltZSIpCisJeworCQljaGFyIHRtcFszMl07CiAKLSAgICAgICAgc3RydWN0IHRtICpjdXJyZW50OwotICAgICAgICB0aW1lX3Qgbm93OwotCWludCB0d19taWxpdGFyeV90aW1lOwotICAgICAgICBub3cgPSB0aW1lKDApOwotICAgICAgICBjdXJyZW50ID0gbG9jYWx0aW1lKCZub3cpOwotCUdldFZhbHVlKFRXX01JTElUQVJZX1RJTUUsIHR3X21pbGl0YXJ5X3RpbWUpOyAKLSAgICAgICAgaWYgKGN1cnJlbnQtPnRtX2hvdXIgPj0gMTIpIHsKLQkJaWYgKHR3X21pbGl0YXJ5X3RpbWUgPT0gMSkKLSAgICAgICAgICAgIAkJc3ByaW50Zih0bXAsICIlZDolMDJkIiwgY3VycmVudC0+dG1faG91ciwgY3VycmVudC0+dG1fbWluKTsKLQkJZWxzZQotICAgICAgICAgICAgCQlzcHJpbnRmKHRtcCwgIiVkOiUwMmQgUE0iLCBjdXJyZW50LT50bV9ob3VyID09IDEyID8gMTIgOiBjdXJyZW50LT50bV9ob3VyIC0gMTIsIGN1cnJlbnQtPnRtX21pbik7CisJCXN0cnVjdCB0bSAqY3VycmVudDsKKwkJdGltZV90IG5vdzsKKwkJaW50IHR3X21pbGl0YXJ5X3RpbWU7CisJCW5vdyA9IHRpbWUoMCk7CisJCWN1cnJlbnQgPSBsb2NhbHRpbWUoJm5vdyk7CisJCUdldFZhbHVlKFRXX01JTElUQVJZX1RJTUUsIHR3X21pbGl0YXJ5X3RpbWUpOyAKKwkJaWYgKGN1cnJlbnQtPnRtX2hvdXIgPj0gMTIpCisJCXsKKwkJCWlmICh0d19taWxpdGFyeV90aW1lID09IDEpCisJCQkJc3ByaW50Zih0bXAsICIlZDolMDJkIiwgY3VycmVudC0+dG1faG91ciwgY3VycmVudC0+dG1fbWluKTsKKwkJCWVsc2UKKwkJCQlzcHJpbnRmKHRtcCwgIiVkOiUwMmQgUE0iLCBjdXJyZW50LT50bV9ob3VyID09IDEyID8gMTIgOiBjdXJyZW50LT50bV9ob3VyIC0gMTIsIGN1cnJlbnQtPnRtX21pbik7CiAJCX0KLSAgICAgICAgZWxzZSB7Ci0JCWlmICh0d19taWxpdGFyeV90aW1lID09IDEpIAotCQkgICAgc3ByaW50Zih0bXAsICIlZDolMDJkIiwgY3VycmVudC0+dG1faG91ciwgY3VycmVudC0+dG1fbWluKTsKIAkJZWxzZQotCQkgICAgc3ByaW50Zih0bXAsICIlZDolMDJkIEFNIiwgY3VycmVudC0+dG1faG91ciA9PSAwID8gMTIgOiBjdXJyZW50LT50bV9ob3VyLCBjdXJyZW50LT50bV9taW4pOworCQl7CisJCQlpZiAodHdfbWlsaXRhcnlfdGltZSA9PSAxKSAKKwkJCQlzcHJpbnRmKHRtcCwgIiVkOiUwMmQiLCBjdXJyZW50LT50bV9ob3VyLCBjdXJyZW50LT50bV9taW4pOworCQkJZWxzZQorCQkJCXNwcmludGYodG1wLCAiJWQ6JTAyZCBBTSIsIGN1cnJlbnQtPnRtX2hvdXIgPT0gMCA/IDEyIDogY3VycmVudC0+dG1faG91ciwgY3VycmVudC0+dG1fbWluKTsKKwkJfQorCQl2YWx1ZSA9IHRtcDsKKwkJcmV0dXJuIDA7CiAJfQotICAgICAgICB2YWx1ZSA9IHRtcDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YXJOYW1lID09ICJ0d19iYXR0ZXJ5IikKLSAgICB7Ci0gICAgICAgIGNoYXIgdG1wWzE2XTsKKwllbHNlIGlmICh2YXJOYW1lID09ICJ0d19iYXR0ZXJ5IikKKwl7CisJCWNoYXIgdG1wWzE2XTsKIAkJc3RhdGljIGNoYXIgY2hhcmdpbmcgPSAnICc7CiAJCXN0YXRpYyBpbnQgbGFzdFZhbCA9IC0xOwogCQlzdGF0aWMgdGltZV90IG5leHRTZWNDaGVjayA9IDA7CkBAIC05ODksOCArMTAxMCw4IEBACiAJCQkJZmdldHMoY2FwX3MsIDQsIGNhcCk7CiAJCQkJZmNsb3NlKGNhcCk7CiAJCQkJbGFzdFZhbCA9IGF0b2koY2FwX3MpOwotCQkJCWlmIChsYXN0VmFsID4gMTAwKSAgbGFzdFZhbCA9IDEwMTsKLQkJCQlpZiAobGFzdFZhbCA8IDApICAgIGxhc3RWYWwgPSAwOworCQkJCWlmIChsYXN0VmFsID4gMTAwKQlsYXN0VmFsID0gMTAxOworCQkJCWlmIChsYXN0VmFsIDwgMCkJbGFzdFZhbCA9IDA7CiAJCQl9CiAjaWZkZWYgVFdfQ1VTVE9NX0JBVFRFUllfUEFUSAogCQkJc3RyaW5nIHN0YXR1c19maWxlID0gRVhQQU5EKFRXX0NVU1RPTV9CQVRURVJZX1BBVEgpOwpAQCAtMTAxMSwxMyArMTAzMiwxNCBAQAogCQl9CiAKIAkJc3ByaW50Zih0bXAsICIlaSUlJWMiLCBsYXN0VmFsLCBjaGFyZ2luZyk7Ci0gICAgICAgIHZhbHVlID0gdG1wOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOworCQl2YWx1ZSA9IHRtcDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKIH0KIAotdm9pZCBEYXRhTWFuYWdlcjo6T3V0cHV0X1ZlcnNpb24odm9pZCkgewordm9pZCBEYXRhTWFuYWdlcjo6T3V0cHV0X1ZlcnNpb24odm9pZCkKK3sKIAlzdHJpbmcgUGF0aDsKIAljaGFyIHZlcnNpb25bMjU1XTsKIApAQCAtMTEzMSw4OSArMTE1Myw4OSBAQAogCXJldHVybiBHZXRWYWx1ZVJlZigidHdfc2V0dGluZ3NfcGF0aCIpOwogfQogCi1leHRlcm4gIkMiIGludCBEYXRhTWFuYWdlcl9SZXNldERlZmF1bHRzKCkKK2V4dGVybiAiQyIgaW50IERhdGFNYW5hZ2VyX1Jlc2V0RGVmYXVsdHModm9pZCkKIHsKLSAgICByZXR1cm4gRGF0YU1hbmFnZXI6OlJlc2V0RGVmYXVsdHMoKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OlJlc2V0RGVmYXVsdHMoKTsKIH0KIAotZXh0ZXJuICJDIiB2b2lkIERhdGFNYW5hZ2VyX0xvYWREZWZhdWx0cygpCitleHRlcm4gIkMiIHZvaWQgRGF0YU1hbmFnZXJfTG9hZERlZmF1bHRzKHZvaWQpCiB7Ci0gICAgcmV0dXJuIERhdGFNYW5hZ2VyOjpTZXREZWZhdWx0VmFsdWVzKCk7CisJcmV0dXJuIERhdGFNYW5hZ2VyOjpTZXREZWZhdWx0VmFsdWVzKCk7CiB9CiAKIGV4dGVybiAiQyIgaW50IERhdGFNYW5hZ2VyX0xvYWRWYWx1ZXMoY29uc3QgY2hhciogZmlsZW5hbWUpCiB7Ci0gICAgcmV0dXJuIERhdGFNYW5hZ2VyOjpMb2FkVmFsdWVzKGZpbGVuYW1lKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OkxvYWRWYWx1ZXMoZmlsZW5hbWUpOwogfQogCi1leHRlcm4gIkMiIGludCBEYXRhTWFuYWdlcl9GbHVzaCgpCitleHRlcm4gIkMiIGludCBEYXRhTWFuYWdlcl9GbHVzaCh2b2lkKQogewotICAgIHJldHVybiBEYXRhTWFuYWdlcjo6Rmx1c2goKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OkZsdXNoKCk7CiB9CiAKIGV4dGVybiAiQyIgaW50IERhdGFNYW5hZ2VyX0dldFZhbHVlKGNvbnN0IGNoYXIqIHZhck5hbWUsIGNoYXIqIHZhbHVlKQogewotICAgIGludCByZXQ7Ci0gICAgc3RyaW5nIHN0cjsKKwlpbnQgcmV0OworCXN0cmluZyBzdHI7CiAKLSAgICByZXQgPSBEYXRhTWFuYWdlcjo6R2V0VmFsdWUodmFyTmFtZSwgc3RyKTsKLSAgICBpZiAocmV0ID09IDApCi0gICAgICAgIHN0cmNweSh2YWx1ZSwgc3RyLmNfc3RyKCkpOwotICAgIHJldHVybiByZXQ7CisJcmV0ID0gRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhck5hbWUsIHN0cik7CisJaWYgKHJldCA9PSAwKQorCQlzdHJjcHkodmFsdWUsIHN0ci5jX3N0cigpKTsKKwlyZXR1cm4gcmV0OwogfQogCiBleHRlcm4gIkMiIGNvbnN0IGNoYXIqIERhdGFNYW5hZ2VyX0dldFN0clZhbHVlKGNvbnN0IGNoYXIqIHZhck5hbWUpCiB7Ci0gICAgc3RyaW5nJiBzdHIgPSBEYXRhTWFuYWdlcjo6R2V0VmFsdWVSZWYodmFyTmFtZSk7Ci0gICAgcmV0dXJuIHN0ci5jX3N0cigpOworCXN0cmluZyYgc3RyID0gRGF0YU1hbmFnZXI6OkdldFZhbHVlUmVmKHZhck5hbWUpOworCXJldHVybiBzdHIuY19zdHIoKTsKIH0KIAogZXh0ZXJuICJDIiBjb25zdCBjaGFyKiBEYXRhTWFuYWdlcl9HZXRDdXJyZW50U3RvcmFnZVBhdGgodm9pZCkKIHsKLSAgICBzdHJpbmcmIHN0ciA9IERhdGFNYW5hZ2VyOjpDR2V0Q3VycmVudFN0b3JhZ2VQYXRoKCk7Ci0gICAgcmV0dXJuIHN0ci5jX3N0cigpOworCXN0cmluZyYgc3RyID0gRGF0YU1hbmFnZXI6OkNHZXRDdXJyZW50U3RvcmFnZVBhdGgoKTsKKwlyZXR1cm4gc3RyLmNfc3RyKCk7CiB9CiAKIGV4dGVybiAiQyIgY29uc3QgY2hhciogRGF0YU1hbmFnZXJfR2V0U2V0dGluZ3NTdG9yYWdlUGF0aCh2b2lkKQogewotICAgIHN0cmluZyYgc3RyID0gRGF0YU1hbmFnZXI6OkNHZXRTZXR0aW5nc1N0b3JhZ2VQYXRoKCk7Ci0gICAgcmV0dXJuIHN0ci5jX3N0cigpOworCXN0cmluZyYgc3RyID0gRGF0YU1hbmFnZXI6OkNHZXRTZXR0aW5nc1N0b3JhZ2VQYXRoKCk7CisJcmV0dXJuIHN0ci5jX3N0cigpOwogfQogCiBleHRlcm4gIkMiIGludCBEYXRhTWFuYWdlcl9HZXRJbnRWYWx1ZShjb25zdCBjaGFyKiB2YXJOYW1lKQogewotICAgIHJldHVybiBEYXRhTWFuYWdlcjo6R2V0SW50VmFsdWUodmFyTmFtZSk7CisJcmV0dXJuIERhdGFNYW5hZ2VyOjpHZXRJbnRWYWx1ZSh2YXJOYW1lKTsKIH0KIAogZXh0ZXJuICJDIiBpbnQgRGF0YU1hbmFnZXJfU2V0U3RyVmFsdWUoY29uc3QgY2hhciogdmFyTmFtZSwgY2hhciogdmFsdWUpCiB7Ci0gICAgcmV0dXJuIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZSh2YXJOYW1lLCB2YWx1ZSwgMCk7CisJcmV0dXJuIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZSh2YXJOYW1lLCB2YWx1ZSwgMCk7CiB9CiAKIGV4dGVybiAiQyIgaW50IERhdGFNYW5hZ2VyX1NldEludFZhbHVlKGNvbnN0IGNoYXIqIHZhck5hbWUsIGludCB2YWx1ZSkKIHsKLSAgICByZXR1cm4gRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIHZhbHVlLCAwKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIHZhbHVlLCAwKTsKIH0KIAogZXh0ZXJuICJDIiBpbnQgRGF0YU1hbmFnZXJfU2V0RmxvYXRWYWx1ZShjb25zdCBjaGFyKiB2YXJOYW1lLCBmbG9hdCB2YWx1ZSkKIHsKLSAgICByZXR1cm4gRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIHZhbHVlLCAwKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIHZhbHVlLCAwKTsKIH0KIAogZXh0ZXJuICJDIiBpbnQgRGF0YU1hbmFnZXJfVG9nZ2xlSW50VmFsdWUoY29uc3QgY2hhciogdmFyTmFtZSkKIHsKLSAgICBpZiAoRGF0YU1hbmFnZXI6OkdldEludFZhbHVlKHZhck5hbWUpKQotICAgICAgICByZXR1cm4gRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIDApOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZSh2YXJOYW1lLCAxKTsKKwlpZiAoRGF0YU1hbmFnZXI6OkdldEludFZhbHVlKHZhck5hbWUpKQorCQlyZXR1cm4gRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIDApOworCWVsc2UKKwkJcmV0dXJuIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZSh2YXJOYW1lLCAxKTsKIH0KIAotZXh0ZXJuICJDIiB2b2lkIERhdGFNYW5hZ2VyX0R1bXBWYWx1ZXMoKQorZXh0ZXJuICJDIiB2b2lkIERhdGFNYW5hZ2VyX0R1bXBWYWx1ZXModm9pZCkKIHsKLSAgICByZXR1cm4gRGF0YU1hbmFnZXI6OkR1bXBWYWx1ZXMoKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OkR1bXBWYWx1ZXMoKTsKIH0KIAotZXh0ZXJuICJDIiB2b2lkIERhdGFNYW5hZ2VyX1JlYWRTZXR0aW5nc0ZpbGUoKQorZXh0ZXJuICJDIiB2b2lkIERhdGFNYW5hZ2VyX1JlYWRTZXR0aW5nc0ZpbGUodm9pZCkKIHsKLSAgICByZXR1cm4gRGF0YU1hbmFnZXI6OlJlYWRTZXR0aW5nc0ZpbGUoKTsKKwlyZXR1cm4gRGF0YU1hbmFnZXI6OlJlYWRTZXR0aW5nc0ZpbGUoKTsKIH0KZGlmZiAtLWdpdCBhL2RhdGEuaCBiL2RhdGEuaAppbmRleCAzMTM3ZjhmLi5mOTYzOWM2IDEwMDY0NAotLS0gYS9kYXRhLmgKKysrIGIvZGF0YS5oCkBAIC0xNywxMyArMTcsMTMgQEAKICNpZm5kZWYgX0RBVEFfSEVBREVSCiAjZGVmaW5lIF9EQVRBX0hFQURFUgogCi1pbnQgRGF0YU1hbmFnZXJfUmVzZXREZWZhdWx0cygpOwotdm9pZCBEYXRhTWFuYWdlcl9Mb2FkRGVmYXVsdHMoKTsKK2ludCBEYXRhTWFuYWdlcl9SZXNldERlZmF1bHRzKHZvaWQpOwordm9pZCBEYXRhTWFuYWdlcl9Mb2FkRGVmYXVsdHModm9pZCk7CiBpbnQgRGF0YU1hbmFnZXJfTG9hZFZhbHVlcyhjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ci1pbnQgRGF0YU1hbmFnZXJfRmx1c2goKTsKK2ludCBEYXRhTWFuYWdlcl9GbHVzaCh2b2lkKTsKIGNvbnN0IGNoYXIqIERhdGFNYW5hZ2VyX0dldFN0clZhbHVlKGNvbnN0IGNoYXIqIHZhck5hbWUpOwotY29uc3QgY2hhciogRGF0YU1hbmFnZXJfR2V0Q3VycmVudFN0b3JhZ2VQYXRoKCk7Ci1jb25zdCBjaGFyKiBEYXRhTWFuYWdlcl9HZXRTZXR0aW5nc1N0b3JhZ2VQYXRoKCk7Citjb25zdCBjaGFyKiBEYXRhTWFuYWdlcl9HZXRDdXJyZW50U3RvcmFnZVBhdGgodm9pZCk7Citjb25zdCBjaGFyKiBEYXRhTWFuYWdlcl9HZXRTZXR0aW5nc1N0b3JhZ2VQYXRoKHZvaWQpOwogaW50IERhdGFNYW5hZ2VyX0dldEludFZhbHVlKGNvbnN0IGNoYXIqIHZhck5hbWUpOwogCiBpbnQgRGF0YU1hbmFnZXJfU2V0U3RyVmFsdWUoY29uc3QgY2hhciogdmFyTmFtZSwgY2hhciogdmFsdWUpOwpAQCAtMzIsOCArMzIsOCBAQAogCiBpbnQgRGF0YU1hbmFnZXJfVG9nZ2xlSW50VmFsdWUoY29uc3QgY2hhciogdmFyTmFtZSk7CiAKLXZvaWQgRGF0YU1hbmFnZXJfRHVtcFZhbHVlcygpOwotdm9pZCBEYXRhTWFuYWdlcl9SZWFkU2V0dGluZ3NGaWxlKCk7Cit2b2lkIERhdGFNYW5hZ2VyX0R1bXBWYWx1ZXModm9pZCk7Cit2b2lkIERhdGFNYW5hZ2VyX1JlYWRTZXR0aW5nc0ZpbGUodm9pZCk7CiAKICNlbmRpZiAgLy8gX0RBVEFfSEVBREVSCiAKZGlmZiAtLWdpdCBhL2RhdGEuaHBwIGIvZGF0YS5ocHAKaW5kZXggZmY1MDM3My4uZWYyMDFkNyAxMDA2NDQKLS0tIGEvZGF0YS5ocHAKKysrIGIvZGF0YS5ocHAKQEAgLTUsNyArNSw3IEBACiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDMyICsyNiwzMiBAQAogY2xhc3MgRGF0YU1hbmFnZXIKIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgaW50IFJlc2V0RGVmYXVsdHMoKTsKLSAgICBzdGF0aWMgaW50IExvYWRWYWx1ZXMoY29uc3Qgc3RyaW5nIGZpbGVuYW1lKTsKLSAgICBzdGF0aWMgaW50IEZsdXNoKCk7CisJc3RhdGljIGludCBSZXNldERlZmF1bHRzKCk7CisJc3RhdGljIGludCBMb2FkVmFsdWVzKGNvbnN0IHN0cmluZyBmaWxlbmFtZSk7CisJc3RhdGljIGludCBGbHVzaCgpOwogCi0gICAgLy8gQ29yZSBnZXQgcm91dGluZXMKLSAgICBzdGF0aWMgaW50IEdldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBzdHJpbmcmIHZhbHVlKTsKLSAgICBzdGF0aWMgaW50IEdldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBpbnQmIHZhbHVlKTsKKwkvLyBDb3JlIGdldCByb3V0aW5lcworCXN0YXRpYyBpbnQgR2V0VmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUsIHN0cmluZyYgdmFsdWUpOworCXN0YXRpYyBpbnQgR2V0VmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUsIGludCYgdmFsdWUpOwogCXN0YXRpYyBpbnQgR2V0VmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUsIGZsb2F0JiB2YWx1ZSk7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBHZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgdW5zaWduZWQgbG9uZyBsb25nJiB2YWx1ZSk7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBHZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgdW5zaWduZWQgbG9uZyBsb25nJiB2YWx1ZSk7CiAKLSAgICAvLyBUaGlzIGlzIGEgZGFuZ2Vyb3VzIGZ1bmN0aW9uLiBJdCB3aWxsIGNyZWF0ZSB0aGUgdmFsdWUgaWYgaXQgZG9lc24ndCBleGlzdCBzbyBpdCBoYXMgYSB2YWxpZCBjX3N0cgotICAgIHN0YXRpYyBzdHJpbmcmIEdldFZhbHVlUmVmKGNvbnN0IHN0cmluZyB2YXJOYW1lKTsKKwkvLyBUaGlzIGlzIGEgZGFuZ2Vyb3VzIGZ1bmN0aW9uLiBJdCB3aWxsIGNyZWF0ZSB0aGUgdmFsdWUgaWYgaXQgZG9lc24ndCBleGlzdCBzbyBpdCBoYXMgYSB2YWxpZCBjX3N0cgorCXN0YXRpYyBzdHJpbmcmIEdldFZhbHVlUmVmKGNvbnN0IHN0cmluZyB2YXJOYW1lKTsKIAotICAgIC8vIEhlbHBlciBmdW5jdGlvbnMKLSAgICBzdGF0aWMgc3RyaW5nIEdldFN0clZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lKTsKLSAgICBzdGF0aWMgaW50IEdldEludFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lKTsKKwkvLyBIZWxwZXIgZnVuY3Rpb25zCisJc3RhdGljIHN0cmluZyBHZXRTdHJWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSk7CisJc3RhdGljIGludCBHZXRJbnRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSk7CiAKLSAgICAvLyBDb3JlIHNldCByb3V0aW5lcwotICAgIHN0YXRpYyBpbnQgU2V0VmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUsIHN0cmluZyB2YWx1ZSwgaW50IHBlcnNpc3QgPSAwKTsKLSAgICBzdGF0aWMgaW50IFNldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBpbnQgdmFsdWUsIGludCBwZXJzaXN0ID0gMCk7Ci0gICAgc3RhdGljIGludCBTZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgZmxvYXQgdmFsdWUsIGludCBwZXJzaXN0ID0gMCk7Ci0gICAgc3RhdGljIGludCBTZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlLCBpbnQgcGVyc2lzdCA9IDApOworCS8vIENvcmUgc2V0IHJvdXRpbmVzCisJc3RhdGljIGludCBTZXRWYWx1ZShjb25zdCBzdHJpbmcgdmFyTmFtZSwgc3RyaW5nIHZhbHVlLCBpbnQgcGVyc2lzdCA9IDApOworCXN0YXRpYyBpbnQgU2V0VmFsdWUoY29uc3Qgc3RyaW5nIHZhck5hbWUsIGludCB2YWx1ZSwgaW50IHBlcnNpc3QgPSAwKTsKKwlzdGF0aWMgaW50IFNldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCBmbG9hdCB2YWx1ZSwgaW50IHBlcnNpc3QgPSAwKTsKKwlzdGF0aWMgaW50IFNldFZhbHVlKGNvbnN0IHN0cmluZyB2YXJOYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUsIGludCBwZXJzaXN0ID0gMCk7CiAJc3RhdGljIGludCBTZXRQcm9ncmVzcyhmbG9hdCBGcmFjdGlvbik7CiAJc3RhdGljIGludCBTaG93UHJvZ3Jlc3MoZmxvYXQgUG9ydGlvbiwgZmxvYXQgU2Vjb25kcyk7CiAKLSAgICBzdGF0aWMgdm9pZCBEdW1wVmFsdWVzKCk7CisJc3RhdGljIHZvaWQgRHVtcFZhbHVlcygpOwogCXN0YXRpYyB2b2lkIHVwZGF0ZV90el9lbnZpcm9ubWVudF92YXJpYWJsZXMoKTsKIAlzdGF0aWMgdm9pZCBTZXRCYWNrdXBGb2xkZXIoKTsKIAlzdGF0aWMgdm9pZCBTZXREZWZhdWx0VmFsdWVzKCk7CkBAIC02NCwyMCArNjQsMjAgQEAKIAlzdGF0aWMgc3RyaW5nJiBDR2V0U2V0dGluZ3NTdG9yYWdlUGF0aCgpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgdHlwZWRlZiBwYWlyPHN0cmluZywgaW50PiBUU3RySW50UGFpcjsKLSAgICB0eXBlZGVmIHBhaXI8c3RyaW5nLCB1bnNpZ25lZCBsb25nIGxvbmc+IFRTdHJVTExQYWlyOwotICAgIHR5cGVkZWYgcGFpcjxzdHJpbmcsIFRTdHJJbnRQYWlyPiBUTmFtZVZhbHVlUGFpcjsKLSAgICBzdGF0aWMgbWFwPHN0cmluZywgVFN0ckludFBhaXI+IG1WYWx1ZXM7Ci0gICAgc3RhdGljIG1hcDxzdHJpbmcsIFRTdHJVTExQYWlyPiBtVUxMVmFsdWVzOwotICAgIHN0YXRpYyBzdHJpbmcgbUJhY2tpbmdGaWxlOwotICAgIHN0YXRpYyBpbnQgbUluaXRpYWxpemVkOworCXR5cGVkZWYgcGFpcjxzdHJpbmcsIGludD4gVFN0ckludFBhaXI7CisJdHlwZWRlZiBwYWlyPHN0cmluZywgdW5zaWduZWQgbG9uZyBsb25nPiBUU3RyVUxMUGFpcjsKKwl0eXBlZGVmIHBhaXI8c3RyaW5nLCBUU3RySW50UGFpcj4gVE5hbWVWYWx1ZVBhaXI7CisJc3RhdGljIG1hcDxzdHJpbmcsIFRTdHJJbnRQYWlyPiBtVmFsdWVzOworCXN0YXRpYyBtYXA8c3RyaW5nLCBUU3RyVUxMUGFpcj4gbVVMTFZhbHVlczsKKwlzdGF0aWMgc3RyaW5nIG1CYWNraW5nRmlsZTsKKwlzdGF0aWMgaW50IG1Jbml0aWFsaXplZDsKIAotICAgIHN0YXRpYyBtYXA8c3RyaW5nLCBzdHJpbmc+IG1Db25zdFZhbHVlczsKKwlzdGF0aWMgbWFwPHN0cmluZywgc3RyaW5nPiBtQ29uc3RWYWx1ZXM7CiAKIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgaW50IFNhdmVWYWx1ZXMoKTsKKwlzdGF0aWMgaW50IFNhdmVWYWx1ZXMoKTsKIAotICAgIHN0YXRpYyBpbnQgR2V0TWFnaWNWYWx1ZShzdHJpbmcgdmFyTmFtZSwgc3RyaW5nJiB2YWx1ZSk7CisJc3RhdGljIGludCBHZXRNYWdpY1ZhbHVlKHN0cmluZyB2YXJOYW1lLCBzdHJpbmcmIHZhbHVlKTsKIAogcHJpdmF0ZToKIAlzdGF0aWMgdm9pZCBzYW5pdGl6ZV9kZXZpY2VfaWQoY2hhciogZGV2aWNlX2lkKTsKZGlmZiAtLWdpdCBhL2V4ZmF0L2V4ZmF0LWZ1c2UvQW5kcm9pZC5tayBiL2V4ZmF0L2V4ZmF0LWZ1c2UvQW5kcm9pZC5tawppbmRleCA5NjI3ODM1Li5mNmVjMjBhIDEwMDY0NAotLS0gYS9leGZhdC9leGZhdC1mdXNlL0FuZHJvaWQubWsKKysrIGIvZXhmYXQvZXhmYXQtZnVzZS9BbmRyb2lkLm1rCkBAIC0xMiw3ICsxMiw3IEBACiAJCQkJCWJvb3RhYmxlL3JlY292ZXJ5L2V4ZmF0L2xpYmV4ZmF0IFwKIAkJCQkJYm9vdGFibGUvcmVjb3ZlcnkvZnVzZS9pbmNsdWRlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnogbGliYyBsaWJleGZhdCBsaWJkbCAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliZnVzZQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJmdXNldHdycAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApkaWZmIC0tZ2l0IGEvZXhmYXQvbWtmcy9BbmRyb2lkLm1rIGIvZXhmYXQvbWtmcy9BbmRyb2lkLm1rCmluZGV4IGJjY2Q3YzkuLjhjNDhjNzcgMTAwNjQ0Ci0tLSBhL2V4ZmF0L21rZnMvQW5kcm9pZC5taworKysgYi9leGZhdC9ta2ZzL0FuZHJvaWQubWsKQEAgLTExLDcgKzExLDcgQEAKIAkJCQkJYm9vdGFibGUvcmVjb3ZlcnkvZXhmYXQvbGliZXhmYXQgXAogCQkJCQlib290YWJsZS9yZWNvdmVyeS9mdXNlL2luY2x1ZGUKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieiBsaWJjIGxpYmV4ZmF0IGxpYmRsIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJmdXNlCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmZ1c2V0d3JwCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCmRpZmYgLS1naXQgYS9maXhQZXJtaXNzaW9ucy5jcHAgYi9maXhQZXJtaXNzaW9ucy5jcHAKaW5kZXggNWQ0YjBkMi4uMmZhMWI2NiAxMDA2NDQKLS0tIGEvZml4UGVybWlzc2lvbnMuY3BwCisrKyBiL2ZpeFBlcm1pc3Npb25zLmNwcApAQCAtNTksNyArNTksNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JZ3VpX3ByaW50KCJGaXhpbmcgL2RhdGEvYXBwIHBlcm1pc2lvbnMuLi5cbiIpOworCWd1aV9wcmludCgiRml4aW5nIC9kYXRhL2FwcCBwZXJtaXNzaW9ucy4uLlxuIik7CiAJaWYgKChmaXhEYXRhQXBwcygpKSAhPSAwKSB7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAkJCWNsb3NlZGlyKGQpOwogCQl9CiAJfSBlbHNlIHsKLQkJZ3VpX3ByaW50KCJGaXhpbmcgL2RhdGEvZGF0YSBwZXJtaXNpb25zLi4uXG4iKTsKKwkJZ3VpX3ByaW50KCJGaXhpbmcgL2RhdGEvZGF0YSBwZXJtaXNzaW9ucy4uLlxuIik7CiAJCWlmICgoZml4RGF0YURhdGEoIi9kYXRhL2RhdGEvIikpICE9IDApIHsKIAkJCXJldHVybiAtMTsKIAkJfQpkaWZmIC0tZ2l0IGEvZnVzZS9BbmRyb2lkLm1rIGIvZnVzZS9BbmRyb2lkLm1rCmluZGV4IDU5Y2Q5YjMuLjNiZDE2MTYgMTAwNjQ0Ci0tLSBhL2Z1c2UvQW5kcm9pZC5taworKysgYi9mdXNlL0FuZHJvaWQubWsKQEAgLTQyLDcgKzQyLDcgQEAKIAktRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKIAktREZVU0VfVVNFX1ZFUlNJT049MjYKIAotTE9DQUxfTU9EVUxFIDo9IGxpYmZ1c2UKK0xPQ0FMX01PRFVMRSA6PSBsaWJmdXNldHdycAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtNjEsNiArNjEsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGZ1c2V4bXAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZnVzZQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmdXNldHdycAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2d1aS9BbmRyb2lkLm1rIGIvZ3VpL0FuZHJvaWQubWsKaW5kZXggMzVkODc3Yi4uMThkZWNkMCAxMDA2NDQKLS0tIGEvZ3VpL0FuZHJvaWQubWsKKysrIGIvZ3VpL0FuZHJvaWQubWsKQEAgLTIyLDggKzIyLDcgQEAKICAgICBrZXlib2FyZC5jcHAgXAogICAgIGlucHV0LmNwcCBcCiAgICAgYmxhbmt0aW1lci5jcHAgXAotICAgIHBhcnRpdGlvbmxpc3QuY3BwIFwKLSAgICAuLi9taW51aXR3cnAvZ3JhcGhpY3MuYworICAgIHBhcnRpdGlvbmxpc3QuY3BwCiAKIGlmbmVxICgkKFRXUlBfQ1VTVE9NX0tFWUJPQVJEKSwpCiAgIExPQ0FMX1NSQ19GSUxFUyArPSAkKFRXUlBfQ1VTVE9NX0tFWUJPQVJEKQpAQCAtMzEsNiArMzAsNyBAQAogICBMT0NBTF9TUkNfRklMRVMgKz0gaGFyZHdhcmVrZXlib2FyZC5jcHAKIGVuZGlmCiAKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWludWl0d3JwIGxpYmMgbGlic3RkYysrCiBMT0NBTF9NT0RVTEUgOj0gbGliZ3VpdHdycAogCiAjIFVzZSB0aGlzIGZsYWcgdG8gY3JlYXRlIGEgYnVpbGQgdGhhdCBzaW11bGF0ZXMgdGhyZWFkZWQgYWN0aW9ucyBsaWtlIGluc3RhbGxpbmcgemlwcywgYmFja3VwcywgcmVzdG9yZXMsIGFuZCB3aXBlcyBmb3IgdGhlbWUgdGVzdGluZwpAQCAtNjEsNiArNjEsOSBAQAogaWZuZXEgKCQoVFdfTk9fU0NSRUVOX0JMQU5LKSwpCiAJTE9DQUxfQ0ZMQUdTICs9IC1EVFdfTk9fU0NSRUVOX0JMQU5LCiBlbmRpZgoraWZuZXEgKCQoVFdfTk9fU0NSRUVOX1RJTUVPVVQpLCkKKwlMT0NBTF9DRkxBR1MgKz0gLURUV19OT19TQ1JFRU5fVElNRU9VVAorZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyArPSBiaW9uaWMgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0ICQoY29tbWFuZHNfcmVjb3ZlcnlfbG9jYWxfcGF0aCkvZ3VpL2RldmljZXMvJChERVZJQ0VfUkVTT0xVVElPTikKIApkaWZmIC0tZ2l0IGEvZ3VpL2FjdGlvbi5jcHAgYi9ndWkvYWN0aW9uLmNwcAppbmRleCAzZTFmNzkzLi5kNjdlNjk3IDEwMDY0NAotLS0gYS9ndWkvYWN0aW9uLmNwcAorKysgYi9ndWkvYWN0aW9uLmNwcApAQCAtNDAsOCArNDAsOSBAQAogI2luY2x1ZGUgIi4uL29wZW5yZWNvdmVyeXNjcmlwdC5ocHAiCiAKICNpbmNsdWRlICIuLi9hZGJfaW5zdGFsbC5oIgorI2lmbmRlZiBUV19OT19TQ1JFRU5fVElNRU9VVAogI2luY2x1ZGUgImJsYW5rdGltZXIuaHBwIgotCisjZW5kaWYKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgIi4uL3R3Y29tbW9uLmgiCiAjaW5jbHVkZSAiLi4vbWludWl0d3JwL21pbnVpLmgiCkBAIC01OSw3NyArNjAsNzkgQEAKICNpbmNsdWRlICJyYXBpZHhtbC5ocHAiCiAjaW5jbHVkZSAib2JqZWN0cy5ocHAiCiAKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKIGV4dGVybiBibGFua3RpbWVyIGJsYW5rVGltZXI7CisjZW5kaWYKIAogdm9pZCBjdXJ0YWluQ2xvc2Uodm9pZCk7CiAKIEdVSUFjdGlvbjo6R1VJQWN0aW9uKHhtbF9ub2RlPD4qIG5vZGUpCi0gICAgOiBDb25kaXRpb25hbChub2RlKQorCTogQ29uZGl0aW9uYWwobm9kZSkKIHsKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKLSAgICB4bWxfbm9kZTw+KiBhY3Rpb25zOwotICAgIHhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfbm9kZTw+KiBhY3Rpb25zOworCXhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKIAotICAgIG1LZXkgPSAwOworCW1LZXkgPSAwOwogCi0gICAgaWYgKCFub2RlKSAgcmV0dXJuOworCWlmICghbm9kZSkgIHJldHVybjsKIAotICAgIC8vIEZpcnN0LCBnZXQgdGhlIGFjdGlvbgotICAgIGFjdGlvbnMgPSBub2RlLT5maXJzdF9ub2RlKCJhY3Rpb25zIik7Ci0gICAgaWYgKGFjdGlvbnMpICAgIGNoaWxkID0gYWN0aW9ucy0+Zmlyc3Rfbm9kZSgiYWN0aW9uIik7Ci0gICAgZWxzZSAgICAgICAgICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiYWN0aW9uIik7CisJLy8gRmlyc3QsIGdldCB0aGUgYWN0aW9uCisJYWN0aW9ucyA9IG5vZGUtPmZpcnN0X25vZGUoImFjdGlvbnMiKTsKKwlpZiAoYWN0aW9ucykJY2hpbGQgPSBhY3Rpb25zLT5maXJzdF9ub2RlKCJhY3Rpb24iKTsKKwllbHNlCQkJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJhY3Rpb24iKTsKIAotICAgIGlmICghY2hpbGQpIHJldHVybjsKKwlpZiAoIWNoaWxkKSByZXR1cm47CiAKLSAgICB3aGlsZSAoY2hpbGQpCi0gICAgewotICAgICAgICBBY3Rpb24gYWN0aW9uOworCXdoaWxlIChjaGlsZCkKKwl7CisJCUFjdGlvbiBhY3Rpb247CiAKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZ1bmN0aW9uIik7Ci0gICAgICAgIGlmICghYXR0cikgIHJldHVybjsKLSAgICAKLSAgICAgICAgYWN0aW9uLm1GdW5jdGlvbiA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGFjdGlvbi5tQXJnID0gY2hpbGQtPnZhbHVlKCk7Ci0gICAgICAgIG1BY3Rpb25zLnB1c2hfYmFjayhhY3Rpb24pOworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiZnVuY3Rpb24iKTsKKwkJaWYgKCFhdHRyKSAgcmV0dXJuOworCQorCQlhY3Rpb24ubUZ1bmN0aW9uID0gYXR0ci0+dmFsdWUoKTsKKwkJYWN0aW9uLm1BcmcgPSBjaGlsZC0+dmFsdWUoKTsKKwkJbUFjdGlvbnMucHVzaF9iYWNrKGFjdGlvbik7CiAKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dF9zaWJsaW5nKCJhY3Rpb24iKTsKLSAgICB9CisJCWNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygiYWN0aW9uIik7CisJfQogCi0gICAgLy8gTm93LCBsZXQncyBnZXQgZWl0aGVyIHRoZSBrZXkgb3IgcmVnaW9uCi0gICAgY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJ0b3VjaCIpOwotICAgIGlmIChjaGlsZCkKLSAgICB7Ci0gICAgICAgIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJrZXkiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgCi0gICAgICAgICAgICBtS2V5ID0gZ2V0S2V5QnlOYW1lKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgieCIpOwotICAgICAgICAgICAgaWYgKCFhdHRyKSAgcmV0dXJuOwotICAgICAgICAgICAgbUFjdGlvblggPSBhdG9sKGF0dHItPnZhbHVlKCkpOwotICAgICAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInkiKTsKLSAgICAgICAgICAgIGlmICghYXR0cikgIHJldHVybjsKLSAgICAgICAgICAgIG1BY3Rpb25ZID0gYXRvbChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgICAgIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ3Iik7Ci0gICAgICAgICAgICBpZiAoIWF0dHIpICByZXR1cm47Ci0gICAgICAgICAgICBtQWN0aW9uVyA9IGF0b2woYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiaCIpOwotICAgICAgICAgICAgaWYgKCFhdHRyKSAgcmV0dXJuOwotICAgICAgICAgICAgbUFjdGlvbkggPSBhdG9sKGF0dHItPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQorCS8vIE5vdywgbGV0J3MgZ2V0IGVpdGhlciB0aGUga2V5IG9yIHJlZ2lvbgorCWNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgidG91Y2giKTsKKwlpZiAoY2hpbGQpCisJeworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgia2V5Iik7CisJCWlmIChhdHRyKQorCQl7CisJCQlzdGQ6OnN0cmluZyBrZXkgPSBhdHRyLT52YWx1ZSgpOworCQorCQkJbUtleSA9IGdldEtleUJ5TmFtZShrZXkpOworCQl9CisJCWVsc2UKKwkJeworCQkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIngiKTsKKwkJCWlmICghYXR0cikgIHJldHVybjsKKwkJCW1BY3Rpb25YID0gYXRvbChhdHRyLT52YWx1ZSgpKTsKKwkJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ5Iik7CisJCQlpZiAoIWF0dHIpICByZXR1cm47CisJCQltQWN0aW9uWSA9IGF0b2woYXR0ci0+dmFsdWUoKSk7CisJCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgidyIpOworCQkJaWYgKCFhdHRyKSAgcmV0dXJuOworCQkJbUFjdGlvblcgPSBhdG9sKGF0dHItPnZhbHVlKCkpOworCQkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImgiKTsKKwkJCWlmICghYXR0cikgIHJldHVybjsKKwkJCW1BY3Rpb25IID0gYXRvbChhdHRyLT52YWx1ZSgpKTsKKwkJfQorCX0KIH0KIAogaW50IEdVSUFjdGlvbjo6Tm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSkKIHsKLSAgICBpZiAoc3RhdGUgPT0gVE9VQ0hfUkVMRUFTRSkKLSAgICAgICAgZG9BY3Rpb25zKCk7CisJaWYgKHN0YXRlID09IFRPVUNIX1JFTEVBU0UpCisJCWRvQWN0aW9ucygpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIGludCBHVUlBY3Rpb246Ok5vdGlmeUtleShpbnQga2V5KQpAQCAtMTQzLDE3ICsxNDYsMTcgQEAKIAogaW50IEdVSUFjdGlvbjo6Tm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKQogewotICAgIGlmICh2YXJOYW1lLmVtcHR5KCkgJiYgIWlzQ29uZGl0aW9uVmFsaWQoKSAmJiAhbUtleSAmJiAhbUFjdGlvblcpCi0gICAgICAgIGRvQWN0aW9ucygpOworCWlmICh2YXJOYW1lLmVtcHR5KCkgJiYgIWlzQ29uZGl0aW9uVmFsaWQoKSAmJiAhbUtleSAmJiAhbUFjdGlvblcpCisJCWRvQWN0aW9ucygpOwogCi0gICAgLy8gVGhpcyBoYW5kbGVzIG5vdGlmeWluZyB0aGUgY29uZGl0aW9uIHN5c3RlbSBvZiBwYWdlIHN0YXJ0Ci0gICAgaWYgKHZhck5hbWUuZW1wdHkoKSAmJiBpc0NvbmRpdGlvblZhbGlkKCkpCi0gICAgICAgIE5vdGlmeVBhZ2VTZXQoKTsKKwkvLyBUaGlzIGhhbmRsZXMgbm90aWZ5aW5nIHRoZSBjb25kaXRpb24gc3lzdGVtIG9mIHBhZ2Ugc3RhcnQKKwlpZiAodmFyTmFtZS5lbXB0eSgpICYmIGlzQ29uZGl0aW9uVmFsaWQoKSkKKwkJTm90aWZ5UGFnZVNldCgpOwogCi0gICAgaWYgKCh2YXJOYW1lLmVtcHR5KCkgfHwgSXNDb25kaXRpb25WYXJpYWJsZSh2YXJOYW1lKSkgJiYgaXNDb25kaXRpb25WYWxpZCgpICYmIGlzQ29uZGl0aW9uVHJ1ZSgpKQotICAgICAgICBkb0FjdGlvbnMoKTsKKwlpZiAoKHZhck5hbWUuZW1wdHkoKSB8fCBJc0NvbmRpdGlvblZhcmlhYmxlKHZhck5hbWUpKSAmJiBpc0NvbmRpdGlvblZhbGlkKCkgJiYgaXNDb25kaXRpb25UcnVlKCkpCisJCWRvQWN0aW9ucygpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgR1VJQWN0aW9uOjpzaW11bGF0ZV9wcm9ncmVzc19iYXIodm9pZCkKQEAgLTE2OCw1NCArMTcxLDU0IEBACiAKIGludCBHVUlBY3Rpb246OmZsYXNoX3ppcChzdGQ6OnN0cmluZyBmaWxlbmFtZSwgc3RkOjpzdHJpbmcgcGFnZU5hbWUsIGNvbnN0IGludCBzaW11bGF0ZSwgaW50KiB3aXBlX2NhY2hlKQogewotICAgIGludCByZXRfdmFsID0gMDsKKwlpbnQgcmV0X3ZhbCA9IDA7CiAKIAlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInVpX3Byb2dyZXNzIiwgMCk7CiAKLSAgICBpZiAoZmlsZW5hbWUuZW1wdHkoKSkKLSAgICB7Ci0gICAgICAgIExPR0VSUigiTm8gZmlsZSBzcGVjaWZpZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwlpZiAoZmlsZW5hbWUuZW1wdHkoKSkKKwl7CisJCUxPR0VSUigiTm8gZmlsZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGp1bXAgdG8gdGhpcyBwYWdlIGZpcnN0LCBsaWtlIGEgbG9hZGluZyBwYWdlCi0gICAgZ3VpX2NoYW5nZVBhZ2UocGFnZU5hbWUpOworCS8vIFdlJ3JlIGdvaW5nIHRvIGp1bXAgdG8gdGhpcyBwYWdlIGZpcnN0LCBsaWtlIGEgbG9hZGluZyBwYWdlCisJZ3VpX2NoYW5nZVBhZ2UocGFnZU5hbWUpOwogCi0gICAgaW50IGZkID0gLTE7Ci0gICAgWmlwQXJjaGl2ZSB6aXA7CisJaW50IGZkID0gLTE7CisJWmlwQXJjaGl2ZSB6aXA7CiAKLSAgICBpZiAoIVBhcnRpdGlvbk1hbmFnZXIuTW91bnRfQnlfUGF0aChmaWxlbmFtZSwgdHJ1ZSkpCisJaWYgKCFQYXJ0aXRpb25NYW5hZ2VyLk1vdW50X0J5X1BhdGgoZmlsZW5hbWUsIHRydWUpKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAobXpPcGVuWmlwQXJjaGl2ZShmaWxlbmFtZS5jX3N0cigpLCAmemlwKSkKLSAgICB7Ci0gICAgICAgIExPR0VSUigiVW5hYmxlIHRvIG9wZW4gemlwIGZpbGUuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwl7CisJCUxPR0VSUigiVW5hYmxlIHRvIG9wZW4gemlwIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIC8vIENoZWNrIHRoZSB6aXAgdG8gc2VlIGlmIGl0IGhhcyBhIGN1c3RvbSBpbnN0YWxsZXIgdGhlbWUKKwkvLyBDaGVjayB0aGUgemlwIHRvIHNlZSBpZiBpdCBoYXMgYSBjdXN0b20gaW5zdGFsbGVyIHRoZW1lCiAJY29uc3QgWmlwRW50cnkqIHR3cnAgPSBtekZpbmRaaXBFbnRyeSgmemlwLCAiTUVUQS1JTkYvdGVhbXdpbi90d3JwLnppcCIpOwotICAgIGlmICh0d3JwICE9IE5VTEwpCi0gICAgewotICAgICAgICB1bmxpbmsoIi90bXAvdHdycC56aXAiKTsKLSAgICAgICAgZmQgPSBjcmVhdCgiL3RtcC90d3JwLnppcCIsIDA2NjYpOwotICAgIH0KLSAgICBpZiAoZmQgPj0gMCAmJiB0d3JwICE9IE5VTEwgJiYgCi0gICAgICAgIG16RXh0cmFjdFppcEVudHJ5VG9GaWxlKCZ6aXAsIHR3cnAsIGZkKSAmJiAKLSAgICAgICAgIVBhZ2VNYW5hZ2VyOjpMb2FkUGFja2FnZSgiaW5zdGFsbCIsICIvdG1wL3R3cnAuemlwIiwgIm1haW4iKSkKLSAgICB7Ci0gICAgICAgIG16Q2xvc2VaaXBBcmNoaXZlKCZ6aXApOworCWlmICh0d3JwICE9IE5VTEwpCisJeworCQl1bmxpbmsoIi90bXAvdHdycC56aXAiKTsKKwkJZmQgPSBjcmVhdCgiL3RtcC90d3JwLnppcCIsIDA2NjYpOworCX0KKwlpZiAoZmQgPj0gMCAmJiB0d3JwICE9IE5VTEwgJiYKKwkJbXpFeHRyYWN0WmlwRW50cnlUb0ZpbGUoJnppcCwgdHdycCwgZmQpICYmCisJCSFQYWdlTWFuYWdlcjo6TG9hZFBhY2thZ2UoImluc3RhbGwiLCAiL3RtcC90d3JwLnppcCIsICJtYWluIikpCisJeworCQltekNsb3NlWmlwQXJjaGl2ZSgmemlwKTsKIAkJUGFnZU1hbmFnZXI6OlNlbGVjdFBhY2thZ2UoImluc3RhbGwiKTsKLSAgICAgICAgZ3VpX2NoYW5nZVBhZ2UoIm1haW4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IHVzZSB0aGUgZGVmYXVsdCBwYWdlCi0gICAgICAgIG16Q2xvc2VaaXBBcmNoaXZlKCZ6aXApOworCQlndWlfY2hhbmdlUGFnZSgibWFpbiIpOworCX0KKwllbHNlCisJeworCQkvLyBJbiB0aGlzIGNhc2UsIHdlIGp1c3QgdXNlIHRoZSBkZWZhdWx0IHBhZ2UKKwkJbXpDbG9zZVppcEFyY2hpdmUoJnppcCk7CiAJCWd1aV9jaGFuZ2VQYWdlKHBhZ2VOYW1lKTsKLSAgICB9Ci0gICAgaWYgKGZkID49IDApCi0gICAgICAgIGNsb3NlKGZkKTsKKwl9CisJaWYgKGZkID49IDApCisJCWNsb3NlKGZkKTsKIAogCWlmIChzaW11bGF0ZSkgewogCQlzaW11bGF0ZV9wcm9ncmVzc19iYXIoKTsKQEAgLTIzNywyMCArMjQwLDIwIEBACiAJCX0KIAl9CiAKLSAgICAvLyBEb25lCi0gICAgRGF0YU1hbmFnZXI6OlNldFZhbHVlKCJ1aV9wcm9ncmVzcyIsIDEwMCk7Ci0gICAgRGF0YU1hbmFnZXI6OlNldFZhbHVlKCJ1aV9wcm9ncmVzcyIsIDApOwotICAgIHJldHVybiByZXRfdmFsOworCS8vIERvbmUKKwlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInVpX3Byb2dyZXNzIiwgMTAwKTsKKwlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInVpX3Byb2dyZXNzIiwgMCk7CisJcmV0dXJuIHJldF92YWw7CiB9CiAKIGludCBHVUlBY3Rpb246OmRvQWN0aW9ucygpCiB7Ci0JaWYgKG1BY3Rpb25zLnNpemUoKSA8IDEpICAgIHJldHVybiAtMTsKLSAgICBpZiAobUFjdGlvbnMuc2l6ZSgpID09IDEpCisJaWYgKG1BY3Rpb25zLnNpemUoKSA8IDEpCXJldHVybiAtMTsKKwlpZiAobUFjdGlvbnMuc2l6ZSgpID09IDEpCiAJCXJldHVybiBkb0FjdGlvbihtQWN0aW9ucy5hdCgwKSwgMCk7CiAKLSAgICAvLyBGb3IgbXVsdGktYWN0aW9uLCB3ZSBhbHdheXMgdXNlIGEgdGhyZWFkCi0gICAgcHRocmVhZF90IHQ7CisJLy8gRm9yIG11bHRpLWFjdGlvbiwgd2UgYWx3YXlzIHVzZSBhIHRocmVhZAorCXB0aHJlYWRfdCB0OwogCXB0aHJlYWRfYXR0cl90IHRhdHRyOwogCiAJaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZ0YXR0cikpIHsKQEAgLTI3MSw3ICsyNzQsNyBAQAogCX0KIAkqLwogCWludCByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmdCwgJnRhdHRyLCB0aHJlYWRfc3RhcnQsIHRoaXMpOwotICAgIGlmIChyZXQpIHsKKwlpZiAocmV0KSB7CiAJCUxPR0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBtb3JlIHRocmVhZHMgZm9yIGFjdGlvbnMuLi4gY29udGludWluZyBpbiBzYW1lIHRocmVhZCEgJWlcbiIsIHJldCk7CiAJCXRocmVhZF9zdGFydCh0aGlzKTsKIAl9IGVsc2UgewpAQCAtMjg0LDMwICsyODcsMzAgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiB2b2lkKiBHVUlBY3Rpb246OnRocmVhZF9zdGFydCh2b2lkICpjb29raWUpCiB7Ci0gICAgR1VJQWN0aW9uKiBvdXJUaGlzID0gKEdVSUFjdGlvbiopIGNvb2tpZTsKKwlHVUlBY3Rpb24qIG91clRoaXMgPSAoR1VJQWN0aW9uKikgY29va2llOwogCiAJRGF0YU1hbmFnZXI6OlNldFZhbHVlKFRXX0FDVElPTl9CVVNZLCAxKTsKIAotICAgIGlmIChvdXJUaGlzLT5tQWN0aW9ucy5zaXplKCkgPiAxKQotICAgIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8QWN0aW9uPjo6aXRlcmF0b3IgaXRlcjsKLSAgICAgICAgZm9yIChpdGVyID0gb3VyVGhpcy0+bUFjdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBvdXJUaGlzLT5tQWN0aW9ucy5lbmQoKTsgaXRlcisrKQotICAgICAgICAgICAgb3VyVGhpcy0+ZG9BY3Rpb24oKml0ZXIsIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvdXJUaGlzLT5kb0FjdGlvbihvdXJUaGlzLT5tQWN0aW9ucy5hdCgwKSwgMSk7Ci0gICAgfQorCWlmIChvdXJUaGlzLT5tQWN0aW9ucy5zaXplKCkgPiAxKQorCXsKKwkJc3RkOjp2ZWN0b3I8QWN0aW9uPjo6aXRlcmF0b3IgaXRlcjsKKwkJZm9yIChpdGVyID0gb3VyVGhpcy0+bUFjdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBvdXJUaGlzLT5tQWN0aW9ucy5lbmQoKTsgaXRlcisrKQorCQkJb3VyVGhpcy0+ZG9BY3Rpb24oKml0ZXIsIDEpOworCX0KKwllbHNlCisJeworCQlvdXJUaGlzLT5kb0FjdGlvbihvdXJUaGlzLT5tQWN0aW9ucy5hdCgwKSwgMSk7CisJfQogCWludCBjaGVjayA9IDA7CiAJRGF0YU1hbmFnZXI6OkdldFZhbHVlKCJ0d19iYWNrZ3JvdW5kX3RocmVhZF9ydW5uaW5nIiwgY2hlY2spOwogCWlmIChjaGVjayA9PSAwKQogCQlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoVFdfQUNUSU9OX0JVU1ksIDApOwotICAgIHJldHVybiBOVUxMOworCXJldHVybiBOVUxMOwogfQogCiB2b2lkIEdVSUFjdGlvbjo6b3BlcmF0aW9uX3N0YXJ0KGNvbnN0IHN0cmluZyBvcGVyYXRpb25fbmFtZSkKQEAgLTMzOSw3ICszNDIsOSBAQAogCX0KIAlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X29wZXJhdGlvbl9zdGF0ZSIsIDEpOwogCURhdGFNYW5hZ2VyOjpTZXRWYWx1ZShUV19BQ1RJT05fQlVTWSwgMCk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCiAJYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworI2VuZGlmCiB9CiAKIGludCBHVUlBY3Rpb246OmRvQWN0aW9uKEFjdGlvbiBhY3Rpb24sIGludCBpc1RocmVhZGVkIC8qID0gMCAqLykKQEAgLTM1Nyw3ICszNjIsNyBAQAogCiAJaWYgKGZ1bmN0aW9uID09ICJyZWJvb3QiKQogCXsKLQkgICAgICAgIC8vY3VydGFpbkNsb3NlKCk7IHRoaXMgc29tZXRpbWVzIGNhdXNlcyBhIGNyYXNoCisJCQkvL2N1cnRhaW5DbG9zZSgpOyB0aGlzIHNvbWV0aW1lcyBjYXVzZXMgYSBjcmFzaAogCiAJCXN5bmMoKTsKIAkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKCJ0d19ndWlfZG9uZSIsIDEpOwpAQCAtMzY1LDI1ICszNzAsMjUgQEAKIAogCQlyZXR1cm4gMDsKIAl9Ci0gICAgaWYgKGZ1bmN0aW9uID09ICJob21lIikKLSAgICB7Ci0gICAgICAgIFBhZ2VNYW5hZ2VyOjpTZWxlY3RQYWNrYWdlKCJUV1JQIik7Ci0gICAgICAgIGd1aV9jaGFuZ2VQYWdlKCJtYWluIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChmdW5jdGlvbiA9PSAia2V5IikKLSAgICB7Ci0gICAgICAgIFBhZ2VNYW5hZ2VyOjpOb3RpZnlLZXkoZ2V0S2V5QnlOYW1lKGFyZykpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoZnVuY3Rpb24gPT0gInBhZ2UiKSB7Ci0JCXN0ZDo6c3RyaW5nIHBhZ2VfbmFtZSA9IGd1aV9wYXJzZV90ZXh0KGFyZyk7Ci0gICAgICAgIHJldHVybiBndWlfY2hhbmdlUGFnZShwYWdlX25hbWUpOworCWlmIChmdW5jdGlvbiA9PSAiaG9tZSIpCisJeworCQlQYWdlTWFuYWdlcjo6U2VsZWN0UGFja2FnZSgiVFdSUCIpOworCQlndWlfY2hhbmdlUGFnZSgibWFpbiIpOworCQlyZXR1cm4gMDsKIAl9CiAKLSAgICBpZiAoZnVuY3Rpb24gPT0gInJlbG9hZCIpIHsKKwlpZiAoZnVuY3Rpb24gPT0gImtleSIpCisJeworCQlQYWdlTWFuYWdlcjo6Tm90aWZ5S2V5KGdldEtleUJ5TmFtZShhcmcpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZ1bmN0aW9uID09ICJwYWdlIikgeworCQlzdGQ6OnN0cmluZyBwYWdlX25hbWUgPSBndWlfcGFyc2VfdGV4dChhcmcpOworCQlyZXR1cm4gZ3VpX2NoYW5nZVBhZ2UocGFnZV9uYW1lKTsKKwl9CisKKwlpZiAoZnVuY3Rpb24gPT0gInJlbG9hZCIpIHsKIAkJaW50IGNoZWNrID0gMCwgcmV0X3ZhbCA9IDA7CiAJCXN0ZDo6c3RyaW5nIHRoZW1lX3BhdGg7CiAKQEAgLTQwNSw4NSArNDEwLDg1IEBACiAJCQkJcmV0X3ZhbCA9IDE7CiAJCQl9CiAJCX0KLSAgICAgICAgb3BlcmF0aW9uX2VuZChyZXRfdmFsLCBzaW11bGF0ZSk7CisJCW9wZXJhdGlvbl9lbmQocmV0X3ZhbCwgc2ltdWxhdGUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLSAgICBpZiAoZnVuY3Rpb24gPT0gInJlYWRCYWNrdXAiKQotICAgIHsKKwlpZiAoZnVuY3Rpb24gPT0gInJlYWRCYWNrdXAiKQorCXsKIAkJc3RyaW5nIFJlc3RvcmVfTmFtZTsKIAkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKCJ0d19yZXN0b3JlIiwgUmVzdG9yZV9OYW1lKTsKIAkJUGFydGl0aW9uTWFuYWdlci5TZXRfUmVzdG9yZV9GaWxlcyhSZXN0b3JlX05hbWUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJCXJldHVybiAwOworCX0KIAotICAgIGlmIChmdW5jdGlvbiA9PSAic2V0IikKLSAgICB7Ci0gICAgICAgIGlmIChhcmcuZmluZCgnPScpICE9IHN0cmluZzo6bnBvcykKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHZhck5hbWUgPSBhcmcuc3Vic3RyKDAsIGFyZy5maW5kKCc9JykpOwotICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gYXJnLnN1YnN0cihhcmcuZmluZCgnPScpICsgMSwgc3RyaW5nOjpucG9zKTsKKwlpZiAoZnVuY3Rpb24gPT0gInNldCIpCisJeworCQlpZiAoYXJnLmZpbmQoJz0nKSAhPSBzdHJpbmc6Om5wb3MpCisJCXsKKwkJCXN0cmluZyB2YXJOYW1lID0gYXJnLnN1YnN0cigwLCBhcmcuZmluZCgnPScpKTsKKwkJCXN0cmluZyB2YWx1ZSA9IGFyZy5zdWJzdHIoYXJnLmZpbmQoJz0nKSArIDEsIHN0cmluZzo6bnBvcyk7CiAKLSAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOwotICAgICAgICAgICAgRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUoYXJnLCAiMSIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGZ1bmN0aW9uID09ICJjbGVhciIpCi0gICAgewotICAgICAgICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUoYXJnLCAiMCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJCQlEYXRhTWFuYWdlcjo6R2V0VmFsdWUodmFsdWUsIHZhbHVlKTsKKwkJCURhdGFNYW5hZ2VyOjpTZXRWYWx1ZSh2YXJOYW1lLCB2YWx1ZSk7CisJCX0KKwkJZWxzZQorCQkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKGFyZywgIjEiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmdW5jdGlvbiA9PSAiY2xlYXIiKQorCXsKKwkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKGFyZywgIjAiKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgaWYgKGZ1bmN0aW9uID09ICJtb3VudCIpCi0gICAgewotICAgICAgICBpZiAoYXJnID09ICJ1c2IiKQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUoVFdfQUNUSU9OX0JVU1ksIDEpOworCWlmIChmdW5jdGlvbiA9PSAibW91bnQiKQorCXsKKwkJaWYgKGFyZyA9PSAidXNiIikKKwkJeworCQkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKFRXX0FDVElPTl9CVVNZLCAxKTsKIAkJCWlmICghc2ltdWxhdGUpCiAJCQkJUGFydGl0aW9uTWFuYWdlci51c2Jfc3RvcmFnZV9lbmFibGUoKTsKIAkJCWVsc2UKIAkJCQlndWlfcHJpbnQoIlNpbXVsYXRpbmcgYWN0aW9ucy4uLlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXNpbXVsYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgY21kOworCQl9CisJCWVsc2UgaWYgKCFzaW11bGF0ZSkKKwkJeworCQkJc3RyaW5nIGNtZDsKIAkJCWlmIChhcmcgPT0gIkVYVEVSTkFMIikKIAkJCQlQYXJ0aXRpb25NYW5hZ2VyLk1vdW50X0J5X1BhdGgoRGF0YU1hbmFnZXI6OkdldFN0clZhbHVlKFRXX0VYVEVSTkFMX01PVU5UKSwgdHJ1ZSk7CiAJCQllbHNlIGlmIChhcmcgPT0gIklOVEVSTkFMIikKIAkJCQlQYXJ0aXRpb25NYW5hZ2VyLk1vdW50X0J5X1BhdGgoRGF0YU1hbmFnZXI6OkdldFN0clZhbHVlKFRXX0lOVEVSTkFMX01PVU5UKSwgdHJ1ZSk7CiAJCQllbHNlCiAJCQkJUGFydGl0aW9uTWFuYWdlci5Nb3VudF9CeV9QYXRoKGFyZywgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZQorCQl9IGVsc2UKIAkJCWd1aV9wcmludCgiU2ltdWxhdGluZyBhY3Rpb25zLi4uXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCQlyZXR1cm4gMDsKKwl9CiAKLSAgICBpZiAoZnVuY3Rpb24gPT0gInVtb3VudCIgfHwgZnVuY3Rpb24gPT0gInVubW91bnQiKQotICAgIHsKLSAgICAgICAgaWYgKGFyZyA9PSAidXNiIikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzaW11bGF0ZSkKKwlpZiAoZnVuY3Rpb24gPT0gInVtb3VudCIgfHwgZnVuY3Rpb24gPT0gInVubW91bnQiKQorCXsKKwkJaWYgKGFyZyA9PSAidXNiIikKKwkJeworCQkJaWYgKCFzaW11bGF0ZSkKIAkJCQlQYXJ0aXRpb25NYW5hZ2VyLnVzYl9zdG9yYWdlX2Rpc2FibGUoKTsKIAkJCWVsc2UKIAkJCQlndWlfcHJpbnQoIlNpbXVsYXRpbmcgYWN0aW9ucy4uLlxuIik7CiAJCQlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoVFdfQUNUSU9OX0JVU1ksIDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzaW11bGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGNtZDsKKwkJfQorCQllbHNlIGlmICghc2ltdWxhdGUpCisJCXsKKwkJCXN0cmluZyBjbWQ7CiAJCQlpZiAoYXJnID09ICJFWFRFUk5BTCIpCiAJCQkJUGFydGl0aW9uTWFuYWdlci5Vbk1vdW50X0J5X1BhdGgoRGF0YU1hbmFnZXI6OkdldFN0clZhbHVlKFRXX0VYVEVSTkFMX01PVU5UKSwgdHJ1ZSk7CiAJCQllbHNlIGlmIChhcmcgPT0gIklOVEVSTkFMIikKIAkJCQlQYXJ0aXRpb25NYW5hZ2VyLlVuTW91bnRfQnlfUGF0aChEYXRhTWFuYWdlcjo6R2V0U3RyVmFsdWUoVFdfSU5URVJOQUxfTU9VTlQpLCB0cnVlKTsKIAkJCWVsc2UKIAkJCQlQYXJ0aXRpb25NYW5hZ2VyLlVuTW91bnRfQnlfUGF0aChhcmcsIHRydWUpOwotICAgICAgICB9IGVsc2UKKwkJfSBlbHNlCiAJCQlndWlfcHJpbnQoIlNpbXVsYXRpbmcgYWN0aW9ucy4uLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwkJcmV0dXJuIDA7CisJfQogCQogCWlmIChmdW5jdGlvbiA9PSAicmVzdG9yZWRlZmF1bHRzZXR0aW5ncyIpCiAJewpAQCAtNTE5LDIwICs1MjQsMjAgQEAKIAlpZiAoZnVuY3Rpb24gPT0gImNvbXB1dGUiIHx8IGZ1bmN0aW9uID09ICJhZGRzdWJ0cmFjdCIpCiAJewogCQlpZiAoYXJnLmZpbmQoIisiKSAhPSBzdHJpbmc6Om5wb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB2YXJOYW1lID0gYXJnLnN1YnN0cigwLCBhcmcuZmluZCgnKycpKTsKLSAgICAgICAgICAgIHN0cmluZyBzdHJpbmdfdG9fYWRkID0gYXJnLnN1YnN0cihhcmcuZmluZCgnKycpICsgMSwgc3RyaW5nOjpucG9zKTsKKwkJeworCQkJc3RyaW5nIHZhck5hbWUgPSBhcmcuc3Vic3RyKDAsIGFyZy5maW5kKCcrJykpOworCQkJc3RyaW5nIHN0cmluZ190b19hZGQgPSBhcmcuc3Vic3RyKGFyZy5maW5kKCcrJykgKyAxLCBzdHJpbmc6Om5wb3MpOwogCQkJaW50IGFtb3VudF90b19hZGQgPSBhdG9pKHN0cmluZ190b19hZGQuY19zdHIoKSk7CiAJCQlpbnQgdmFsdWU7CiAKIAkJCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YXJOYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUodmFyTmFtZSwgdmFsdWUgKyBhbW91bnRfdG9fYWRkKTsKKwkJCURhdGFNYW5hZ2VyOjpTZXRWYWx1ZSh2YXJOYW1lLCB2YWx1ZSArIGFtb3VudF90b19hZGQpOwogCQkJcmV0dXJuIDA7Ci0gICAgICAgIH0KKwkJfQogCQlpZiAoYXJnLmZpbmQoIi0iKSAhPSBzdHJpbmc6Om5wb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB2YXJOYW1lID0gYXJnLnN1YnN0cigwLCBhcmcuZmluZCgnLScpKTsKLSAgICAgICAgICAgIHN0cmluZyBzdHJpbmdfdG9fc3VidHJhY3QgPSBhcmcuc3Vic3RyKGFyZy5maW5kKCctJykgKyAxLCBzdHJpbmc6Om5wb3MpOworCQl7CisJCQlzdHJpbmcgdmFyTmFtZSA9IGFyZy5zdWJzdHIoMCwgYXJnLmZpbmQoJy0nKSk7CisJCQlzdHJpbmcgc3RyaW5nX3RvX3N1YnRyYWN0ID0gYXJnLnN1YnN0cihhcmcuZmluZCgnLScpICsgMSwgc3RyaW5nOjpucG9zKTsKIAkJCWludCBhbW91bnRfdG9fc3VidHJhY3QgPSBhdG9pKHN0cmluZ190b19zdWJ0cmFjdC5jX3N0cigpKTsKIAkJCWludCB2YWx1ZTsKIApAQCAtNTQwLDkgKzU0NSw5IEBACiAJCQl2YWx1ZSAtPSBhbW91bnRfdG9fc3VidHJhY3Q7CiAJCQlpZiAodmFsdWUgPD0gMCkKIAkJCQl2YWx1ZSA9IDA7Ci0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUodmFyTmFtZSwgdmFsdWUpOworCQkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKHZhck5hbWUsIHZhbHVlKTsKIAkJCXJldHVybiAwOwotICAgICAgICB9CisJCX0KIAkJaWYgKGFyZy5maW5kKCIqIikgIT0gc3RyaW5nOjpucG9zKQogCQl7CiAJCQlzdHJpbmcgdmFyTmFtZSA9IGFyZy5zdWJzdHIoMCwgYXJnLmZpbmQoJyonKSk7CkBAIC02NTMsMTEgKzY1OCwxMSBAQAogCX0KIAkKIAlpZiAoZnVuY3Rpb24gPT0gIm92ZXJsYXkiKQotICAgICAgICByZXR1cm4gZ3VpX2NoYW5nZU92ZXJsYXkoYXJnKTsKKwkJcmV0dXJuIGd1aV9jaGFuZ2VPdmVybGF5KGFyZyk7CiAKIAlpZiAoZnVuY3Rpb24gPT0gInF1ZXVlemlwIikKLSAgICB7Ci0gICAgICAgIGlmICh6aXBfcXVldWVfaW5kZXggPj0gMTApIHsKKwl7CisJCWlmICh6aXBfcXVldWVfaW5kZXggPj0gMTApIHsKIAkJCWd1aV9wcmludCgiTWF4aW11bSB6aXAgcXVldWUgcmVhY2hlZCFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTY3MCw4ICs2NzUsOCBAQAogCX0KIAogCWlmIChmdW5jdGlvbiA9PSAiY2FuY2VsemlwIikKLSAgICB7Ci0gICAgICAgIGlmICh6aXBfcXVldWVfaW5kZXggPD0gMCkgeworCXsKKwkJaWYgKHppcF9xdWV1ZV9pbmRleCA8PSAwKSB7CiAJCQlndWlfcHJpbnQoIk1pbmltdW0gemlwIHF1ZXVlIHJlYWNoZWQhXG4iKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewpAQCAtNjk2LDkgKzcwMSw5IEBACiAJCXJldHVybiAwOwogCX0KIAotICAgIGlmIChpc1RocmVhZGVkKQotICAgIHsKLSAgICAgICAgaWYgKGZ1bmN0aW9uID09ICJmaWxlZXhpc3RzIikKKwlpZiAoaXNUaHJlYWRlZCkKKwl7CisJCWlmIChmdW5jdGlvbiA9PSAiZmlsZWV4aXN0cyIpCiAJCXsKIAkJCXN0cnVjdCBzdGF0IHN0OwogCQkJc3RyaW5nIG5ld3BhdGggPSBhcmcgKyAiLy4iOwpAQCAtNzEyLDEzICs3MTcsMTMgQEAKIAkJfQogCiAJCWlmIChmdW5jdGlvbiA9PSAiZmxhc2giKQotICAgICAgICB7CisJCXsKIAkJCWludCBpLCByZXRfdmFsID0gMCwgd2lwZV9jYWNoZSA9IDA7CiAKIAkJCWZvciAoaT0wOyBpPHppcF9xdWV1ZV9pbmRleDsgaSsrKSB7CiAJCQkJb3BlcmF0aW9uX3N0YXJ0KCJGbGFzaGluZyIpOwotCQkgICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZSgidHdfZmlsZW5hbWUiLCB6aXBfcXVldWVbaV0pOwotCQkgICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShUV19aSVBfSU5ERVgsIChpICsgMSkpOworCQkJCURhdGFNYW5hZ2VyOjpTZXRWYWx1ZSgidHdfZmlsZW5hbWUiLCB6aXBfcXVldWVbaV0pOworCQkJCURhdGFNYW5hZ2VyOjpTZXRWYWx1ZShUV19aSVBfSU5ERVgsIChpICsgMSkpOwogCiAJCQkJcmV0X3ZhbCA9IGZsYXNoX3ppcCh6aXBfcXVldWVbaV0sIGFyZywgc2ltdWxhdGUsICZ3aXBlX2NhY2hlKTsKIAkJCQlpZiAocmV0X3ZhbCAhPSAwKSB7CkBAIC03NTEsMTIgKzc1NiwxMiBAQAogCQkJfQogCQkJUGFydGl0aW9uTWFuYWdlci5VcGRhdGVfU3lzdGVtX0RldGFpbHMoKTsKIAkJCW9wZXJhdGlvbl9lbmQocmV0X3ZhbCwgc2ltdWxhdGUpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZ1bmN0aW9uID09ICJ3aXBlIikKLSAgICAgICAgewotICAgICAgICAgICAgb3BlcmF0aW9uX3N0YXJ0KCJGb3JtYXQiKTsKLSAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZSgidHdfcGFydGl0aW9uIiwgYXJnKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChmdW5jdGlvbiA9PSAid2lwZSIpCisJCXsKKwkJCW9wZXJhdGlvbl9zdGFydCgiRm9ybWF0Iik7CisJCQlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X3BhcnRpdGlvbiIsIGFyZyk7CiAKIAkJCWludCByZXRfdmFsID0gZmFsc2U7CiAKQEAgLTg2Myw5ICs4NjgsOSBAQAogCQkJCXJldF92YWwgPSAwOyAvLyAwIGlzIHN1Y2Nlc3MKIAkJCWVsc2UKIAkJCQlyZXRfdmFsID0gMTsgLy8gMSBpcyBmYWlsdXJlCi0gICAgICAgICAgICBvcGVyYXRpb25fZW5kKHJldF92YWwsIHNpbXVsYXRlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJCQlvcGVyYXRpb25fZW5kKHJldF92YWwsIHNpbXVsYXRlKTsKKwkJCXJldHVybiAwOworCQl9CiAJCWlmIChmdW5jdGlvbiA9PSAicmVmcmVzaHNpemVzIikKIAkJewogCQkJb3BlcmF0aW9uX3N0YXJ0KCJSZWZyZXNoaW5nIFNpemVzIik7CkBAIC04NzYsOSArODgxLDkgQEAKIAkJCW9wZXJhdGlvbl9lbmQoMCwgc2ltdWxhdGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLSAgICAgICAgaWYgKGZ1bmN0aW9uID09ICJuYW5kcm9pZCIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbl9zdGFydCgiTmFuZHJvaWQiKTsKKwkJaWYgKGZ1bmN0aW9uID09ICJuYW5kcm9pZCIpCisJCXsKKwkJCW9wZXJhdGlvbl9zdGFydCgiTmFuZHJvaWQiKTsKIAkJCWludCByZXQgPSAwOwogCiAJCQlpZiAoc2ltdWxhdGUpIHsKQEAgLTkxMCwxMyArOTE1LDEzIEBACiAJCQkJcmV0ID0gMTsgLy8gMSBmb3IgZmFpbHVyZQogCQkJZWxzZQogCQkJCXJldCA9IDA7IC8vIDAgZm9yIHN1Y2Nlc3MKLSAgICAgICAgICAgIG9wZXJhdGlvbl9lbmQocmV0LCBzaW11bGF0ZSk7CisJCQlvcGVyYXRpb25fZW5kKHJldCwgc2ltdWxhdGUpOwogCQkJcmV0dXJuIDA7Ci0gICAgICAgIH0KKwkJfQogCQlpZiAoZnVuY3Rpb24gPT0gImZpeHBlcm1pc3Npb25zIikKIAkJewogCQkJb3BlcmF0aW9uX3N0YXJ0KCJGaXggUGVybWlzc2lvbnMiKTsKLSAgICAgICAgICAgIExPR0lORk8oImZpeCBwZXJtaXNzaW9ucyBzdGFydGVkIVxuIik7CisJCQlMT0dJTkZPKCJmaXggcGVybWlzc2lvbnMgc3RhcnRlZCFcbiIpOwogCQkJaWYgKHNpbXVsYXRlKSB7CiAJCQkJc2ltdWxhdGVfcHJvZ3Jlc3NfYmFyKCk7CiAJCQl9IGVsc2UgewpAQCAtOTI3LDkgKzkzMiw5IEBACiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQotICAgICAgICBpZiAoZnVuY3Rpb24gPT0gImRkIikKLSAgICAgICAgewotICAgICAgICAgICAgb3BlcmF0aW9uX3N0YXJ0KCJpbWFnaW5nIik7CisJCWlmIChmdW5jdGlvbiA9PSAiZGQiKQorCQl7CisJCQlvcGVyYXRpb25fc3RhcnQoImltYWdpbmciKTsKIAogCQkJaWYgKHNpbXVsYXRlKSB7CiAJCQkJc2ltdWxhdGVfcHJvZ3Jlc3NfYmFyKCk7CkBAIC05MzgsOSArOTQzLDkgQEAKIAkJCQlzdHJpbmcgY21kID0gImRkICIgKyBhcmc7CiAJCQkJVFdGdW5jOjpFeGVjX0NtZChjbWQsIHJlc3VsdCk7CiAJCQl9Ci0gICAgICAgICAgICBvcGVyYXRpb25fZW5kKDAsIHNpbXVsYXRlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJCQlvcGVyYXRpb25fZW5kKDAsIHNpbXVsYXRlKTsKKwkJCXJldHVybiAwOworCQl9CiAJCWlmIChmdW5jdGlvbiA9PSAicGFydGl0aW9uc2QiKQogCQl7CiAJCQlvcGVyYXRpb25fc3RhcnQoIlBhcnRpdGlvbiBTRCBDYXJkIik7CkBAIC0xMjkyLDI2ICsxMjk3LDI2IEBACiAJCQlvcGVyYXRpb25fZW5kKG9wX3N0YXR1cywgc2ltdWxhdGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKwl9CisJZWxzZQorCXsKIAkJcHRocmVhZF90IHQ7CiAJCXB0aHJlYWRfY3JlYXRlKCZ0LCBOVUxMLCB0aHJlYWRfc3RhcnQsIHRoaXMpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJCXJldHVybiAwOworCX0KIAlMT0dFUlIoIlVua25vd24gYWN0aW9uICclcydcbiIsIGZ1bmN0aW9uLmNfc3RyKCkpOwotICAgIHJldHVybiAtMTsKKwlyZXR1cm4gLTE7CiB9CiAKIGludCBHVUlBY3Rpb246OmdldEtleUJ5TmFtZShzdGQ6OnN0cmluZyBrZXkpCiB7Ci0gICAgaWYgKGtleSA9PSAiaG9tZSIpICAgICAgICAgIHJldHVybiBLRVlfSE9NRTsKLSAgICBlbHNlIGlmIChrZXkgPT0gIm1lbnUiKSAgICAgcmV0dXJuIEtFWV9NRU5VOwotICAgIGVsc2UgaWYgKGtleSA9PSAiYmFjayIpICAgICByZXR1cm4gS0VZX0JBQ0s7Ci0gICAgZWxzZSBpZiAoa2V5ID09ICJzZWFyY2giKSAgIHJldHVybiBLRVlfU0VBUkNIOwotICAgIGVsc2UgaWYgKGtleSA9PSAidm9sZG93biIpICByZXR1cm4gS0VZX1ZPTFVNRURPV047Ci0gICAgZWxzZSBpZiAoa2V5ID09ICJ2b2x1cCIpICAgIHJldHVybiBLRVlfVk9MVU1FVVA7Ci0gICAgZWxzZSBpZiAoa2V5ID09ICJwb3dlciIpIHsKKwlpZiAoa2V5ID09ICJob21lIikJCQlyZXR1cm4gS0VZX0hPTUU7CisJZWxzZSBpZiAoa2V5ID09ICJtZW51IikJCXJldHVybiBLRVlfTUVOVTsKKwllbHNlIGlmIChrZXkgPT0gImJhY2siKQkgCXJldHVybiBLRVlfQkFDSzsKKwllbHNlIGlmIChrZXkgPT0gInNlYXJjaCIpCXJldHVybiBLRVlfU0VBUkNIOworCWVsc2UgaWYgKGtleSA9PSAidm9sZG93biIpCXJldHVybiBLRVlfVk9MVU1FRE9XTjsKKwllbHNlIGlmIChrZXkgPT0gInZvbHVwIikJcmV0dXJuIEtFWV9WT0xVTUVVUDsKKwllbHNlIGlmIChrZXkgPT0gInBvd2VyIikgewogCQlpbnQgcmV0X3ZhbDsKIAkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKFRXX1BPV0VSX0JVVFRPTiwgcmV0X3ZhbCk7CiAJCWlmICghcmV0X3ZhbCkKQEAgLTEzMjAsNyArMTMyNSw3IEBACiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CiAKLSAgICByZXR1cm4gYXRvbChrZXkuY19zdHIoKSk7CisJcmV0dXJuIGF0b2woa2V5LmNfc3RyKCkpOwogfQogCiB2b2lkKiBHVUlBY3Rpb246OmNvbW1hbmRfdGhyZWFkKHZvaWQgKmNvb2tpZSkKZGlmZiAtLWdpdCBhL2d1aS9hbmltYXRpb24uY3BwIGIvZ3VpL2FuaW1hdGlvbi5jcHAKaW5kZXggNzdkN2I1NC4uOGM5MjI3OCAxMDA2NDQKLS0tIGEvZ3VpL2FuaW1hdGlvbi5jcHAKKysrIGIvZ3VpL2FuaW1hdGlvbi5jcHAKQEAgLTI4LDEwOSArMjgsMTA5IEBACiAKIEdVSUFuaW1hdGlvbjo6R1VJQW5pbWF0aW9uKHhtbF9ub2RlPD4qIG5vZGUpCiB7Ci0gICAgeG1sX25vZGU8PiogY2hpbGQ7Ci0gICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOworCXhtbF9ub2RlPD4qIGNoaWxkOworCXhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKIAotICAgIG1BbmltYXRpb24gPSBOVUxMOwotICAgIG1GcmFtZSA9IDE7Ci0gICAgbUZQUyA9IDE7Ci0gICAgbUxvb3AgPSAtMTsKLSAgICBtUmVuZGVyID0gMTsKLSAgICBtVXBkYXRlQ291bnQgPSAwOworCW1BbmltYXRpb24gPSBOVUxMOworCW1GcmFtZSA9IDE7CisJbUZQUyA9IDE7CisJbUxvb3AgPSAtMTsKKwltUmVuZGVyID0gMTsKKwltVXBkYXRlQ291bnQgPSAwOwogCi0gICAgaWYgKCFub2RlKSAgcmV0dXJuOworCWlmICghbm9kZSkgIHJldHVybjsKIAotICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgicmVzb3VyY2UiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgewotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpOwotICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgICAgIG1BbmltYXRpb24gPSAoQW5pbWF0aW9uUmVzb3VyY2UqKSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwotICAgIH0KKwljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoInJlc291cmNlIik7CisJaWYgKGNoaWxkKQorCXsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKKwkJaWYgKGF0dHIpCisJCQltQW5pbWF0aW9uID0gKEFuaW1hdGlvblJlc291cmNlKikgUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKKwl9CiAKLSAgICAvLyBMb2FkIHRoZSBwbGFjZW1lbnQKLSAgICBMb2FkUGxhY2VtZW50KG5vZGUtPmZpcnN0X25vZGUoInBsYWNlbWVudCIpLCAmbVJlbmRlclgsICZtUmVuZGVyWSwgTlVMTCwgTlVMTCwgJm1QbGFjZW1lbnQpOworCS8vIExvYWQgdGhlIHBsYWNlbWVudAorCUxvYWRQbGFjZW1lbnQobm9kZS0+Zmlyc3Rfbm9kZSgicGxhY2VtZW50IiksICZtUmVuZGVyWCwgJm1SZW5kZXJZLCBOVUxMLCBOVUxMLCAmbVBsYWNlbWVudCk7CiAKLSAgICBjaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoInNwZWVkIik7Ci0gICAgaWYgKGNoaWxkKQotICAgIHsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZwcyIpOwotICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgICAgIG1GUFMgPSBhdG9pKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgicmVuZGVyIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgbVJlbmRlciA9IGF0b2koYXR0ci0+dmFsdWUoKSk7Ci0gICAgfQotICAgIGlmIChtRlBTID4gMzApICBtRlBTID0gMzA7CisJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJzcGVlZCIpOworCWlmIChjaGlsZCkKKwl7CisJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJmcHMiKTsKKwkJaWYgKGF0dHIpCisJCQltRlBTID0gYXRvaShhdHRyLT52YWx1ZSgpKTsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInJlbmRlciIpOworCQlpZiAoYXR0cikKKwkJCW1SZW5kZXIgPSBhdG9pKGF0dHItPnZhbHVlKCkpOworCX0KKwlpZiAobUZQUyA+IDMwKSAgbUZQUyA9IDMwOwogCi0gICAgY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJsb29wIik7Ci0gICAgaWYgKGNoaWxkKQotICAgIHsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZyYW1lIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgbUxvb3AgPSBhdG9pKGF0dHItPnZhbHVlKCkpIC0gMTsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInN0YXJ0Iik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgbUZyYW1lID0gYXRvaShhdHRyLT52YWx1ZSgpKTsKLSAgICB9CisJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJsb29wIik7CisJaWYgKGNoaWxkKQorCXsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZyYW1lIik7CisJCWlmIChhdHRyKQorCQkJbUxvb3AgPSBhdG9pKGF0dHItPnZhbHVlKCkpIC0gMTsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInN0YXJ0Iik7CisJCWlmIChhdHRyKQorCQkJbUZyYW1lID0gYXRvaShhdHRyLT52YWx1ZSgpKTsKKwl9CiAKLSAgICAvLyBGZXRjaCB0aGUgcmVuZGVyIHNpemVzCi0gICAgaWYgKG1BbmltYXRpb24gJiYgbUFuaW1hdGlvbi0+R2V0UmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICAgIG1SZW5kZXJXID0gZ3JfZ2V0X3dpZHRoKG1BbmltYXRpb24tPkdldFJlc291cmNlKCkpOwotICAgICAgICBtUmVuZGVySCA9IGdyX2dldF9oZWlnaHQobUFuaW1hdGlvbi0+R2V0UmVzb3VyY2UoKSk7CisJLy8gRmV0Y2ggdGhlIHJlbmRlciBzaXplcworCWlmIChtQW5pbWF0aW9uICYmIG1BbmltYXRpb24tPkdldFJlc291cmNlKCkpCisJeworCQltUmVuZGVyVyA9IGdyX2dldF93aWR0aChtQW5pbWF0aW9uLT5HZXRSZXNvdXJjZSgpKTsKKwkJbVJlbmRlckggPSBncl9nZXRfaGVpZ2h0KG1BbmltYXRpb24tPkdldFJlc291cmNlKCkpOwogCi0gICAgICAgIC8vIEFkanVzdCBmb3IgcGxhY2VtZW50Ci0gICAgICAgIGlmIChtUGxhY2VtZW50ICE9IFRPUF9MRUZUICYmIG1QbGFjZW1lbnQgIT0gQk9UVE9NX0xFRlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtUGxhY2VtZW50ID09IENFTlRFUikKLSAgICAgICAgICAgICAgICBtUmVuZGVyWCAtPSAobVJlbmRlclcgLyAyKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtUmVuZGVyWCAtPSBtUmVuZGVyVzsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBsYWNlbWVudCAhPSBUT1BfTEVGVCAmJiBtUGxhY2VtZW50ICE9IFRPUF9SSUdIVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1QbGFjZW1lbnQgPT0gQ0VOVEVSKQotICAgICAgICAgICAgICAgIG1SZW5kZXJZIC09IChtUmVuZGVySCAvIDIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1SZW5kZXJZIC09IG1SZW5kZXJIOwotICAgICAgICB9Ci0gICAgICAgIFNldFBsYWNlbWVudChUT1BfTEVGVCk7Ci0gICAgfQorCQkvLyBBZGp1c3QgZm9yIHBsYWNlbWVudAorCQlpZiAobVBsYWNlbWVudCAhPSBUT1BfTEVGVCAmJiBtUGxhY2VtZW50ICE9IEJPVFRPTV9MRUZUKQorCQl7CisJCQlpZiAobVBsYWNlbWVudCA9PSBDRU5URVIpCisJCQkJbVJlbmRlclggLT0gKG1SZW5kZXJXIC8gMik7CisJCQllbHNlCisJCQkJbVJlbmRlclggLT0gbVJlbmRlclc7CisJCX0KKwkJaWYgKG1QbGFjZW1lbnQgIT0gVE9QX0xFRlQgJiYgbVBsYWNlbWVudCAhPSBUT1BfUklHSFQpCisJCXsKKwkJCWlmIChtUGxhY2VtZW50ID09IENFTlRFUikKKwkJCQltUmVuZGVyWSAtPSAobVJlbmRlckggLyAyKTsKKwkJCWVsc2UKKwkJCQltUmVuZGVyWSAtPSBtUmVuZGVySDsKKwkJfQorCQlTZXRQbGFjZW1lbnQoVE9QX0xFRlQpOworCX0KIH0KIAogaW50IEdVSUFuaW1hdGlvbjo6UmVuZGVyKHZvaWQpCiB7Ci0gICAgaWYgKCFtQW5pbWF0aW9uIHx8ICFtQW5pbWF0aW9uLT5HZXRSZXNvdXJjZShtRnJhbWUpKSAgICAgIHJldHVybiAtMTsKKwlpZiAoIW1BbmltYXRpb24gfHwgIW1BbmltYXRpb24tPkdldFJlc291cmNlKG1GcmFtZSkpCXJldHVybiAtMTsKIAotICAgIGdyX2JsaXQobUFuaW1hdGlvbi0+R2V0UmVzb3VyY2UobUZyYW1lKSwgMCwgMCwgbVJlbmRlclcsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOwotICAgIHJldHVybiAwOworCWdyX2JsaXQobUFuaW1hdGlvbi0+R2V0UmVzb3VyY2UobUZyYW1lKSwgMCwgMCwgbVJlbmRlclcsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOworCXJldHVybiAwOwogfQogCiBpbnQgR1VJQW5pbWF0aW9uOjpVcGRhdGUodm9pZCkKIHsKLSAgICBpZiAoIW1BbmltYXRpb24pICAgICAgICByZXR1cm4gLTE7CisJaWYgKCFtQW5pbWF0aW9uKQkJcmV0dXJuIC0xOwogCi0gICAgLy8gSGFuZGxlIHRoZSAiZW5kLW9mLWFuaW1hdGlvbiIgc3RhdGUKLSAgICBpZiAobUxvb3AgPT0gLTIpICAgICAgICByZXR1cm4gMDsKKwkvLyBIYW5kbGUgdGhlICJlbmQtb2YtYW5pbWF0aW9uIiBzdGF0ZQorCWlmIChtTG9vcCA9PSAtMikJCXJldHVybiAwOwogCi0gICAgLy8gRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdGhlIG5leHQgZnJhbWUgeWV0Li4uCi0gICAgaWYgKCsrbVVwZGF0ZUNvdW50ID4gMzAgLyBtRlBTKQotICAgIHsKLSAgICAgICAgbVVwZGF0ZUNvdW50ID0gMDsKLSAgICAgICAgaWYgKCsrbUZyYW1lID49IG1BbmltYXRpb24tPkdldFJlc291cmNlQ291bnQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Mb29wIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtRnJhbWUgPSBtQW5pbWF0aW9uLT5HZXRSZXNvdXJjZUNvdW50KCkgLSAxOwotICAgICAgICAgICAgICAgIG1Mb29wID0gLTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbUZyYW1lID0gbUxvb3A7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1SZW5kZXIgPT0gMikgICByZXR1cm4gMjsKLSAgICAgICAgcmV0dXJuIChSZW5kZXIoKSA9PSAwID8gMSA6IC0xKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJLy8gRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdGhlIG5leHQgZnJhbWUgeWV0Li4uCisJaWYgKCsrbVVwZGF0ZUNvdW50ID4gMzAgLyBtRlBTKQorCXsKKwkJbVVwZGF0ZUNvdW50ID0gMDsKKwkJaWYgKCsrbUZyYW1lID49IG1BbmltYXRpb24tPkdldFJlc291cmNlQ291bnQoKSkKKwkJeworCQkJaWYgKG1Mb29wIDwgMCkKKwkJCXsKKwkJCQltRnJhbWUgPSBtQW5pbWF0aW9uLT5HZXRSZXNvdXJjZUNvdW50KCkgLSAxOworCQkJCW1Mb29wID0gLTI7CisJCQl9CisJCQllbHNlCisJCQkJbUZyYW1lID0gbUxvb3A7CisJCX0KKwkJaWYgKG1SZW5kZXIgPT0gMikJcmV0dXJuIDI7CisJCXJldHVybiAoUmVuZGVyKCkgPT0gMCA/IDEgOiAtMSk7CisJfQorCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ndWkvYmxhbmt0aW1lci5jcHAgYi9ndWkvYmxhbmt0aW1lci5jcHAKaW5kZXggMGIxZjAwOC4uYTUxM2ZmMCAxMDA2NDQKLS0tIGEvZ3VpL2JsYW5rdGltZXIuY3BwCisrKyBiL2d1aS9ibGFua3RpbWVyLmNwcApAQCAtOTgsNiArOTgsNyBAQAogCQkJc2V0Q29uQmxhbmsoMik7CiAJCQlzZXRCcmlnaHRuZXNzKDApOwogCQkJc2NyZWVub2ZmID0gdHJ1ZTsKKwkJCVRXRnVuYzo6Y2hlY2tfYW5kX3J1bl9zY3JpcHQoIi9zYmluL3Bvc3RzY3JlZW5ibGFuay5zaCIsICJibGFuayIpOwogCQkJUGFnZU1hbmFnZXI6OkNoYW5nZU92ZXJsYXkoImxvY2siKTsKIAkJfQogI2lmbmRlZiBUV19OT19TQ1JFRU5fQkxBTksKQEAgLTE0OSw2ICsxNTAsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogI2VuZGlmCisJCQlUV0Z1bmM6OmNoZWNrX2FuZF9ydW5fc2NyaXB0KCIvc2Jpbi9wb3N0c2NyZWVudW5ibGFuay5zaCIsICJ1bmJsYW5rIik7CiAJCQkvLyBObyBicmVhayBoZXJlLCB3ZSB3YW50IHRvIGtlZXAgZ29pbmcKIAkJY2FzZSAyOgogCQkJZ3VpX2ZvcmNlUmVuZGVyKCk7CmRpZmYgLS1naXQgYS9ndWkvYmxhbmt0aW1lci5ocHAgYi9ndWkvYmxhbmt0aW1lci5ocHAKaW5kZXggNjBkNWIxYi4uMDFjMWRmYiAxMDA2NDQKLS0tIGEvZ3VpL2JsYW5rdGltZXIuaHBwCisrKyBiL2d1aS9ibGFua3RpbWVyLmhwcApAQCAtMjQsMzEgKzI0LDM1IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLWNsYXNzIGJsYW5rdGltZXIgewotCXB1YmxpYzoKLQkJYmxhbmt0aW1lcih2b2lkKTsKLQkJaW50IHNldFRpbWVyVGhyZWFkKHZvaWQpOwotCQl2b2lkIHJlc2V0VGltZXJBbmRVbmJsYW5rKHZvaWQpOwotCQl2b2lkIHNldFRpbWUoaW50IG5ld3RpbWUpOwotCQlib29sIElzU2NyZWVuT2ZmKCk7CitjbGFzcyBibGFua3RpbWVyCit7CitwdWJsaWM6CisJYmxhbmt0aW1lcih2b2lkKTsKIAotCXByaXZhdGU6Ci0JCXZvaWQgc2V0Q29uQmxhbmsoaW50IGJsYW5rKTsKLQkJdm9pZCBzZXRUaW1lcih2b2lkKTsKLQkJdGltZXNwZWMgZ2V0VGltZXIodm9pZCk7Ci0JCWludCBnZXRCcmlnaHRuZXNzKHZvaWQpOwotCQlpbnQgc2V0QnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcyk7Ci0JCWludCBzZXRCbGFua1RpbWVyKHZvaWQpOwotCQlpbnQgc2V0Q2xvY2tUaW1lcih2b2lkKTsKLQkJdHlwZWRlZiBpbnQgKGJsYW5rdGltZXI6OipUaHJlYWRQdHIpKHZvaWQpOwotCQl0eXBlZGVmIHZvaWQqICgqUFRocmVhZFB0cikodm9pZCopOwotCQlwdGhyZWFkX211dGV4X3QgY29uYmxhbmttdXRleDsKLQkJcHRocmVhZF9tdXRleF90IHRpbWVybXV0ZXg7Ci0JCWludCBjb25ibGFuazsKLQkJdGltZXNwZWMgYnRpbWVyOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgc2xlZXBUaW1lcjsKLQkJaW50IG9yaWdfYnJpZ2h0bmVzczsKLQkJYm9vbCBzY3JlZW5vZmY7CisJaW50IHNldFRpbWVyVGhyZWFkKHZvaWQpOworCXZvaWQgcmVzZXRUaW1lckFuZFVuYmxhbmsodm9pZCk7CisJdm9pZCBzZXRUaW1lKGludCBuZXd0aW1lKTsKKwlib29sIElzU2NyZWVuT2ZmKCk7CisKK3ByaXZhdGU6CisJdHlwZWRlZiBpbnQgKGJsYW5rdGltZXI6OipUaHJlYWRQdHIpKHZvaWQpOworCXR5cGVkZWYgdm9pZCogKCpQVGhyZWFkUHRyKSh2b2lkKik7CisKKwl2b2lkIHNldENvbkJsYW5rKGludCBibGFuayk7CisJdm9pZCBzZXRUaW1lcih2b2lkKTsKKwl0aW1lc3BlYyBnZXRUaW1lcih2b2lkKTsKKwlpbnQgZ2V0QnJpZ2h0bmVzcyh2b2lkKTsKKwlpbnQgc2V0QnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcyk7CisJaW50IHNldEJsYW5rVGltZXIodm9pZCk7CisJaW50IHNldENsb2NrVGltZXIodm9pZCk7CisKKwlwdGhyZWFkX211dGV4X3QgY29uYmxhbmttdXRleDsKKwlwdGhyZWFkX211dGV4X3QgdGltZXJtdXRleDsKKwlpbnQgY29uYmxhbms7CisJdGltZXNwZWMgYnRpbWVyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGVlcFRpbWVyOworCWludCBvcmlnX2JyaWdodG5lc3M7CisJYm9vbCBzY3JlZW5vZmY7CiB9OwogCiBleHRlcm4gYmxhbmt0aW1lciBibGFua1RpbWVyOwpkaWZmIC0tZ2l0IGEvZ3VpL2J1dHRvbi5jcHAgYi9ndWkvYnV0dG9uLmNwcAppbmRleCBhZjdkMDdiLi45ZmM4NWEwIDEwMDY0NAotLS0gYS9ndWkvYnV0dG9uLmNwcAorKysgYi9ndWkvYnV0dG9uLmNwcApAQCAtNDIsNDIgKzQyLDQyIEBACiAjaW5jbHVkZSAib2JqZWN0cy5ocHAiCiAKIEdVSUJ1dHRvbjo6R1VJQnV0dG9uKHhtbF9ub2RlPD4qIG5vZGUpCi0gICAgOiBDb25kaXRpb25hbChub2RlKQorCTogQ29uZGl0aW9uYWwobm9kZSkKIHsKLSAgICB4bWxfYXR0cmlidXRlPD4qIGF0dHI7Ci0gICAgeG1sX25vZGU8PiogY2hpbGQ7CisJeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOworCXhtbF9ub2RlPD4qIGNoaWxkOwogCi0gICAgbUJ1dHRvbkltZyA9IE5VTEw7Ci0gICAgbUJ1dHRvbkljb24gPSBOVUxMOwotICAgIG1CdXR0b25MYWJlbCA9IE5VTEw7Ci0gICAgbUFjdGlvbiA9IE5VTEw7Ci0gICAgbVJlbmRlcmVkID0gZmFsc2U7CisJbUJ1dHRvbkltZyA9IE5VTEw7CisJbUJ1dHRvbkljb24gPSBOVUxMOworCW1CdXR0b25MYWJlbCA9IE5VTEw7CisJbUFjdGlvbiA9IE5VTEw7CisJbVJlbmRlcmVkID0gZmFsc2U7CiAJaGFzSGlnaGxpZ2h0Q29sb3IgPSBmYWxzZTsKIAlyZW5kZXJIaWdobGlnaHQgPSBmYWxzZTsKIAloYXNGaWxsID0gZmFsc2U7CiAKLSAgICBpZiAoIW5vZGUpICByZXR1cm47CisJaWYgKCFub2RlKSAgcmV0dXJuOwogCi0gICAgLy8gVGhyZWUgb2YgdGhlIGZvdXIgY2FuIGJlIGxvYWRlZCBkaXJlY3RseSBmcm9tIHRoZSBub2RlCi0gICAgbUJ1dHRvbkltZyA9IG5ldyBHVUlJbWFnZShub2RlKTsKLSAgICBtQnV0dG9uTGFiZWwgPSBuZXcgR1VJVGV4dChub2RlKTsKLSAgICBtQWN0aW9uID0gbmV3IEdVSUFjdGlvbihub2RlKTsKKwkvLyBUaHJlZSBvZiB0aGUgZm91ciBjYW4gYmUgbG9hZGVkIGRpcmVjdGx5IGZyb20gdGhlIG5vZGUKKwltQnV0dG9uSW1nID0gbmV3IEdVSUltYWdlKG5vZGUpOworCW1CdXR0b25MYWJlbCA9IG5ldyBHVUlUZXh0KG5vZGUpOworCW1BY3Rpb24gPSBuZXcgR1VJQWN0aW9uKG5vZGUpOwogCi0gICAgaWYgKG1CdXR0b25JbWctPlJlbmRlcigpIDwgMCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSBtQnV0dG9uSW1nOwotICAgICAgICBtQnV0dG9uSW1nID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1CdXR0b25MYWJlbC0+UmVuZGVyKCkgPCAwKQotICAgIHsKLSAgICAgICAgZGVsZXRlIG1CdXR0b25MYWJlbDsKLSAgICAgICAgbUJ1dHRvbkxhYmVsID0gTlVMTDsKLSAgICB9CisJaWYgKG1CdXR0b25JbWctPlJlbmRlcigpIDwgMCkKKwl7CisJCWRlbGV0ZSBtQnV0dG9uSW1nOworCQltQnV0dG9uSW1nID0gTlVMTDsKKwl9CisJaWYgKG1CdXR0b25MYWJlbC0+UmVuZGVyKCkgPCAwKQorCXsKKwkJZGVsZXRlIG1CdXR0b25MYWJlbDsKKwkJbUJ1dHRvbkxhYmVsID0gTlVMTDsKKwl9CiAJLy8gTG9hZCBmaWxsIGlmIGl0IGV4aXN0cwogCW1lbXNldCgmbUZpbGxDb2xvciwgMCwgc2l6ZW9mKENPTE9SKSk7CiAJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJmaWxsIik7Ci0gICAgaWYgKGNoaWxkKQotICAgIHsKKwlpZiAoY2hpbGQpCisJewogCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiY29sb3IiKTsKIAkJaWYgKGF0dHIpIHsKIAkJCWhhc0ZpbGwgPSB0cnVlOwpAQCAtODksMTQgKzg5LDE0IEBACiAJCUxPR0VSUigiTm8gaW1hZ2UgcmVzb3VyY2Ugb3IgZmlsbCBzcGVjaWZpZWQgZm9yIGJ1dHRvbi5cbiIpOwogCX0KIAotICAgIC8vIFRoZSBpY29uIGlzIGEgc3BlY2lhbCBjYXNlCi0gICAgY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJpY29uIik7Ci0gICAgaWYgKGNoaWxkKQotICAgIHsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInJlc291cmNlIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgbUJ1dHRvbkljb24gPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwotICAgIH0KKwkvLyBUaGUgaWNvbiBpcyBhIHNwZWNpYWwgY2FzZQorCWNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiaWNvbiIpOworCWlmIChjaGlsZCkKKwl7CisJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJyZXNvdXJjZSIpOworCQlpZiAoYXR0cikKKwkJCW1CdXR0b25JY29uID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKKwl9CiAKIAltZW1zZXQoJm1IaWdobGlnaHRDb2xvciwgMCwgc2l6ZW9mKENPTE9SKSk7CiAJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJoaWdobGlnaHQiKTsKQEAgLTEwOSw0MyArMTA5LDQzIEBACiAJCX0KIAl9CiAKLSAgICBpbnQgeCwgeSwgdywgaDsKLSAgICBpZiAobUJ1dHRvbkltZykgeworCWludCB4LCB5LCB3LCBoOworCWlmIChtQnV0dG9uSW1nKSB7CiAJCW1CdXR0b25JbWctPkdldFJlbmRlclBvcyh4LCB5LCB3LCBoKTsKIAl9IGVsc2UgaWYgKGhhc0ZpbGwpIHsKIAkJTG9hZFBsYWNlbWVudChub2RlLT5maXJzdF9ub2RlKCJwbGFjZW1lbnQiKSwgJngsICZ5LCAmdywgJmgpOwogCX0KIAlTZXRSZW5kZXJQb3MoeCwgeSwgdywgaCk7Ci0gICAgcmV0dXJuOworCXJldHVybjsKIH0KIAogR1VJQnV0dG9uOjp+R1VJQnV0dG9uKCkKIHsKLSAgICBpZiAobUJ1dHRvbkltZykgICAgIGRlbGV0ZSBtQnV0dG9uSW1nOwotICAgIGlmIChtQnV0dG9uTGFiZWwpICAgZGVsZXRlIG1CdXR0b25MYWJlbDsKLSAgICBpZiAobUFjdGlvbikgICAgICAgIGRlbGV0ZSBtQWN0aW9uOwotCWlmIChtQnV0dG9uSWNvbikgICAgZGVsZXRlIG1CdXR0b25JY29uOworCWlmIChtQnV0dG9uSW1nKQkgCWRlbGV0ZSBtQnV0dG9uSW1nOworCWlmIChtQnV0dG9uTGFiZWwpICAgZGVsZXRlIG1CdXR0b25MYWJlbDsKKwlpZiAobUFjdGlvbikJCWRlbGV0ZSBtQWN0aW9uOworCWlmIChtQnV0dG9uSWNvbikJZGVsZXRlIG1CdXR0b25JY29uOwogfQogCiBpbnQgR1VJQnV0dG9uOjpSZW5kZXIodm9pZCkKIHsKLSAgICBpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKQotICAgIHsKLSAgICAgICAgbVJlbmRlcmVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKQorCXsKKwkJbVJlbmRlcmVkID0gZmFsc2U7CisJCXJldHVybiAwOworCX0KIAotICAgIGludCByZXQgPSAwOworCWludCByZXQgPSAwOwogCi0gICAgaWYgKG1CdXR0b25JbWcpICAgICByZXQgPSBtQnV0dG9uSW1nLT5SZW5kZXIoKTsKLSAgICBpZiAocmV0IDwgMCkgICAgICAgIHJldHVybiByZXQ7CisJaWYgKG1CdXR0b25JbWcpCSByZXQgPSBtQnV0dG9uSW1nLT5SZW5kZXIoKTsKKwlpZiAocmV0IDwgMCkJCXJldHVybiByZXQ7CiAJaWYgKGhhc0ZpbGwpIHsKIAkJZ3JfY29sb3IobUZpbGxDb2xvci5yZWQsIG1GaWxsQ29sb3IuZ3JlZW4sIG1GaWxsQ29sb3IuYmx1ZSwgbUZpbGxDb2xvci5hbHBoYSk7CiAJCWdyX2ZpbGwobVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckgpOwogCX0KLSAgICBpZiAobUJ1dHRvbkljb24gJiYgbUJ1dHRvbkljb24tPkdldFJlc291cmNlKCkpCi0gICAgICAgIGdyX2JsaXQobUJ1dHRvbkljb24tPkdldFJlc291cmNlKCksIDAsIDAsIG1JY29uVywgbUljb25ILCBtSWNvblgsIG1JY29uWSk7Ci0gICAgaWYgKG1CdXR0b25MYWJlbCkgeworCWlmIChtQnV0dG9uSWNvbiAmJiBtQnV0dG9uSWNvbi0+R2V0UmVzb3VyY2UoKSkKKwkJZ3JfYmxpdChtQnV0dG9uSWNvbi0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbUljb25XLCBtSWNvbkgsIG1JY29uWCwgbUljb25ZKTsKKwlpZiAobUJ1dHRvbkxhYmVsKSB7CiAJCWludCB3LCBoOwogCQltQnV0dG9uTGFiZWwtPkdldEN1cnJlbnRCb3VuZHModywgaCk7CiAJCWlmICh3ICE9IG1UZXh0VykgewpAQCAtMTYzLDEwOSArMTYzLDEwOSBAQAogCQkJbUJ1dHRvbkxhYmVsLT5TZXRSZW5kZXJQb3MobVRleHRYLCBtVGV4dFkpOwogCQl9CiAJCXJldCA9IG1CdXR0b25MYWJlbC0+UmVuZGVyKCk7Ci0JCWlmIChyZXQgPCAwKSAgICAgICAgcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IDApCQlyZXR1cm4gcmV0OwogCX0KIAlpZiAocmVuZGVySGlnaGxpZ2h0ICYmIGhhc0hpZ2hsaWdodENvbG9yKSB7CiAJCWdyX2NvbG9yKG1IaWdobGlnaHRDb2xvci5yZWQsIG1IaWdobGlnaHRDb2xvci5ncmVlbiwgbUhpZ2hsaWdodENvbG9yLmJsdWUsIG1IaWdobGlnaHRDb2xvci5hbHBoYSk7CiAJCWdyX2ZpbGwobVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckgpOwogCX0KLSAgICBtUmVuZGVyZWQgPSB0cnVlOwotICAgIHJldHVybiByZXQ7CisJbVJlbmRlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgR1VJQnV0dG9uOjpVcGRhdGUodm9pZCkKIHsKLSAgICBpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKSAgICAgcmV0dXJuIChtUmVuZGVyZWQgPyAyIDogMCk7Ci0gICAgaWYgKCFtUmVuZGVyZWQpICAgICAgICAgICAgIHJldHVybiAyOworCWlmICghaXNDb25kaXRpb25UcnVlKCkpCXJldHVybiAobVJlbmRlcmVkID8gMiA6IDApOworCWlmICghbVJlbmRlcmVkKQkJCXJldHVybiAyOwogCi0gICAgaW50IHJldCA9IDAsIHJldDIgPSAwOworCWludCByZXQgPSAwLCByZXQyID0gMDsKIAotICAgIGlmIChtQnV0dG9uSW1nKSAgICAgICAgICAgICByZXQgPSBtQnV0dG9uSW1nLT5VcGRhdGUoKTsKLSAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICByZXR1cm4gcmV0OworCWlmIChtQnV0dG9uSW1nKQkJCXJldCA9IG1CdXR0b25JbWctPlVwZGF0ZSgpOworCWlmIChyZXQgPCAwKQkJCXJldHVybiByZXQ7CiAKLSAgICBpZiAocmV0ID09IDApCi0gICAgewotICAgICAgICBpZiAobUJ1dHRvbkxhYmVsKSB7CisJaWYgKHJldCA9PSAwKQorCXsKKwkJaWYgKG1CdXR0b25MYWJlbCkgewogCQkJcmV0MiA9IG1CdXR0b25MYWJlbC0+VXBkYXRlKCk7Ci0JCQlpZiAocmV0MiA8IDApICAgICAgIHJldHVybiByZXQyOwotCQkJaWYgKHJldDIgPiByZXQpICAgICByZXQgPSByZXQyOworCQkJaWYgKHJldDIgPCAwKQlyZXR1cm4gcmV0MjsKKwkJCWlmIChyZXQyID4gcmV0KQlyZXQgPSByZXQyOwogCQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJldCA9PSAxKQotICAgIHsKLSAgICAgICAgLy8gVGhlIGJ1dHRvbiByZS1yZW5kZXJlZCwgc28gZXZlcnlvbmUgZWxzZSBpcyBhIHJlbmRlcgotICAgICAgICBpZiAobUJ1dHRvbkljb24gJiYgbUJ1dHRvbkljb24tPkdldFJlc291cmNlKCkpCi0gICAgICAgICAgICBncl9ibGl0KG1CdXR0b25JY29uLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtSWNvblcsIG1JY29uSCwgbUljb25YLCBtSWNvblkpOwotICAgICAgICBpZiAobUJ1dHRvbkxhYmVsKSAgIHJldCA9IG1CdXR0b25MYWJlbC0+UmVuZGVyKCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgcmV0ID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gQXBhcmVudGx5LCB0aGUgYnV0dG9uIG5lZWRzIGEgYmFja2dyb3VuZCB1cGRhdGUKLSAgICAgICAgcmV0ID0gMjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKwl9CisJZWxzZSBpZiAocmV0ID09IDEpCisJeworCQkvLyBUaGUgYnV0dG9uIHJlLXJlbmRlcmVkLCBzbyBldmVyeW9uZSBlbHNlIGlzIGEgcmVuZGVyCisJCWlmIChtQnV0dG9uSWNvbiAmJiBtQnV0dG9uSWNvbi0+R2V0UmVzb3VyY2UoKSkKKwkJCWdyX2JsaXQobUJ1dHRvbkljb24tPkdldFJlc291cmNlKCksIDAsIDAsIG1JY29uVywgbUljb25ILCBtSWNvblgsIG1JY29uWSk7CisJCWlmIChtQnV0dG9uTGFiZWwpICAgcmV0ID0gbUJ1dHRvbkxhYmVsLT5SZW5kZXIoKTsKKwkJaWYgKHJldCA8IDApCQlyZXR1cm4gcmV0OworCQlyZXQgPSAxOworCX0KKwllbHNlCisJeworCQkvLyBBcGFyZW50bHksIHRoZSBidXR0b24gbmVlZHMgYSBiYWNrZ3JvdW5kIHVwZGF0ZQorCQlyZXQgPSAyOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgR1VJQnV0dG9uOjpTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCiB7Ci0gICAgbVJlbmRlclggPSB4OwotICAgIG1SZW5kZXJZID0geTsKLSAgICBpZiAodyB8fCBoKQotICAgIHsKLSAgICAgICAgbVJlbmRlclcgPSB3OwotICAgICAgICBtUmVuZGVySCA9IGg7Ci0gICAgfQorCW1SZW5kZXJYID0geDsKKwltUmVuZGVyWSA9IHk7CisJaWYgKHcgfHwgaCkKKwl7CisJCW1SZW5kZXJXID0gdzsKKwkJbVJlbmRlckggPSBoOworCX0KIAotICAgIG1JY29uVyA9IDA7ICAgICBtSWNvbkggPSAwOwotICAgIGlmIChtQnV0dG9uSWNvbiAmJiBtQnV0dG9uSWNvbi0+R2V0UmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICAgIG1JY29uVyA9IGdyX2dldF93aWR0aChtQnV0dG9uSWNvbi0+R2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIG1JY29uSCA9IGdyX2dldF9oZWlnaHQobUJ1dHRvbkljb24tPkdldFJlc291cmNlKCkpOwotICAgIH0KKwltSWNvblcgPSAwOwkgbUljb25IID0gMDsKKwlpZiAobUJ1dHRvbkljb24gJiYgbUJ1dHRvbkljb24tPkdldFJlc291cmNlKCkpCisJeworCQltSWNvblcgPSBncl9nZXRfd2lkdGgobUJ1dHRvbkljb24tPkdldFJlc291cmNlKCkpOworCQltSWNvbkggPSBncl9nZXRfaGVpZ2h0KG1CdXR0b25JY29uLT5HZXRSZXNvdXJjZSgpKTsKKwl9CiAKLSAgICBtVGV4dEggPSAwOwotICAgIG1UZXh0VyA9IDA7Ci0gICAgbUljb25YID0gbVJlbmRlclggKyAoKG1SZW5kZXJXIC0gbUljb25XKSAvIDIpOwotICAgIGlmIChtQnV0dG9uTGFiZWwpICAgbUJ1dHRvbkxhYmVsLT5HZXRDdXJyZW50Qm91bmRzKG1UZXh0VywgbVRleHRIKTsKLSAgICBpZiAobVRleHRXKQotICAgIHsKLSAgICAgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIHdlJ2xsIGFsbG93IGxhcmdlIHRleHQgd2hpY2ggYXV0b21hdGljYWxseSBtb3ZlcyBpdCB0byB0aGUgcmlnaHQuCi0gICAgICAgIGlmIChtVGV4dFcgPiBtUmVuZGVyVykKLSAgICAgICAgewotICAgICAgICAgICAgbVRleHRYID0gbVJlbmRlclcgKyBtUmVuZGVyWCArIDU7Ci0gICAgICAgICAgICBtUmVuZGVyVyArPSBtVGV4dFcgKyA1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbVRleHRYID0gbVJlbmRlclggKyAoKG1SZW5kZXJXIC0gbVRleHRXKSAvIDIpOwotICAgICAgICB9Ci0gICAgfQorCW1UZXh0SCA9IDA7CisJbVRleHRXID0gMDsKKwltSWNvblggPSBtUmVuZGVyWCArICgobVJlbmRlclcgLSBtSWNvblcpIC8gMik7CisJaWYgKG1CdXR0b25MYWJlbCkgICBtQnV0dG9uTGFiZWwtPkdldEN1cnJlbnRCb3VuZHMobVRleHRXLCBtVGV4dEgpOworCWlmIChtVGV4dFcpCisJeworCQkvLyBBcyBhIHNwZWNpYWwgY2FzZSwgd2UnbGwgYWxsb3cgbGFyZ2UgdGV4dCB3aGljaCBhdXRvbWF0aWNhbGx5IG1vdmVzIGl0IHRvIHRoZSByaWdodC4KKwkJaWYgKG1UZXh0VyA+IG1SZW5kZXJXKQorCQl7CisJCQltVGV4dFggPSBtUmVuZGVyVyArIG1SZW5kZXJYICsgNTsKKwkJCW1SZW5kZXJXICs9IG1UZXh0VyArIDU7CisJCX0KKwkJZWxzZQorCQl7CisJCQltVGV4dFggPSBtUmVuZGVyWCArICgobVJlbmRlclcgLSBtVGV4dFcpIC8gMik7CisJCX0KKwl9CiAKLSAgICBpZiAobUljb25IID09IDAgfHwgbVRleHRIID09IDAgfHwgbUljb25IICsgbVRleHRIID4gbVJlbmRlckgpCi0gICAgewotICAgICAgICBtSWNvblkgPSBtUmVuZGVyWSArIChtUmVuZGVySCAvIDIpIC0gKG1JY29uSCAvIDIpOwotICAgICAgICBtVGV4dFkgPSBtUmVuZGVyWSArIChtUmVuZGVySCAvIDIpIC0gKG1UZXh0SCAvIDIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgZGl2aXNvciA9IG1SZW5kZXJIIC0gKG1JY29uSCArIG1UZXh0SCk7Ci0gICAgICAgIG1JY29uWSA9IG1SZW5kZXJZICsgKGRpdmlzb3IgLyAzKTsKLSAgICAgICAgbVRleHRZID0gbVJlbmRlclkgKyAoZGl2aXNvciAqIDIgLyAzKSArIG1JY29uSDsKLSAgICB9CisJaWYgKG1JY29uSCA9PSAwIHx8IG1UZXh0SCA9PSAwIHx8IG1JY29uSCArIG1UZXh0SCA+IG1SZW5kZXJIKQorCXsKKwkJbUljb25ZID0gbVJlbmRlclkgKyAobVJlbmRlckggLyAyKSAtIChtSWNvbkggLyAyKTsKKwkJbVRleHRZID0gbVJlbmRlclkgKyAobVJlbmRlckggLyAyKSAtIChtVGV4dEggLyAyKTsKKwl9CisJZWxzZQorCXsKKwkJaW50IGRpdmlzb3IgPSBtUmVuZGVySCAtIChtSWNvbkggKyBtVGV4dEgpOworCQltSWNvblkgPSBtUmVuZGVyWSArIChkaXZpc29yIC8gMyk7CisJCW1UZXh0WSA9IG1SZW5kZXJZICsgKGRpdmlzb3IgKiAyIC8gMykgKyBtSWNvbkg7CisJfQogCi0gICAgaWYgKG1CdXR0b25MYWJlbCkgICBtQnV0dG9uTGFiZWwtPlNldFJlbmRlclBvcyhtVGV4dFgsIG1UZXh0WSk7Ci0gICAgaWYgKG1BY3Rpb24pICAgICAgICBtQWN0aW9uLT5TZXRBY3Rpb25Qb3MobVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckgpOwotICAgIFNldEFjdGlvblBvcyhtUmVuZGVyWCwgbVJlbmRlclksIG1SZW5kZXJXLCBtUmVuZGVySCk7Ci0gICAgcmV0dXJuIDA7CisJaWYgKG1CdXR0b25MYWJlbCkgICBtQnV0dG9uTGFiZWwtPlNldFJlbmRlclBvcyhtVGV4dFgsIG1UZXh0WSk7CisJaWYgKG1BY3Rpb24pCQltQWN0aW9uLT5TZXRBY3Rpb25Qb3MobVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckgpOworCVNldEFjdGlvblBvcyhtUmVuZGVyWCwgbVJlbmRlclksIG1SZW5kZXJXLCBtUmVuZGVySCk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBHVUlCdXR0b246Ok5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpCiB7CiAJc3RhdGljIGludCBsYXN0X3N0YXRlID0gMDsKIAotCWlmICghaXNDb25kaXRpb25UcnVlKCkpICAgICByZXR1cm4gLTE7CisJaWYgKCFpc0NvbmRpdGlvblRydWUoKSkJIHJldHVybiAtMTsKIAlpZiAoeCA8IG1SZW5kZXJYIHx8IHggLSBtUmVuZGVyWCA+IG1SZW5kZXJXIHx8IHkgPCBtUmVuZGVyWSB8fCB5IC0gbVJlbmRlclkgPiBtUmVuZGVySCB8fCBzdGF0ZSA9PSBUT1VDSF9SRUxFQVNFKSB7CiAJCWlmIChsYXN0X3N0YXRlID09IDEpIHsKIAkJCWxhc3Rfc3RhdGUgPSAwOwpAQCAtMjg5LDYgKzI4OSw1IEBACiAJfQogCWlmICh4IDwgbVJlbmRlclggfHwgeCAtIG1SZW5kZXJYID4gbVJlbmRlclcgfHwgeSA8IG1SZW5kZXJZIHx8IHkgLSBtUmVuZGVyWSA+IG1SZW5kZXJIKQogCQlyZXR1cm4gMDsKLSAgICByZXR1cm4gKG1BY3Rpb24gPyBtQWN0aW9uLT5Ob3RpZnlUb3VjaChzdGF0ZSwgeCwgeSkgOiAxKTsKKwlyZXR1cm4gKG1BY3Rpb24gPyBtQWN0aW9uLT5Ob3RpZnlUb3VjaChzdGF0ZSwgeCwgeSkgOiAxKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3VpL2NoZWNrYm94LmNwcCBiL2d1aS9jaGVja2JveC5jcHAKaW5kZXggMDc3ZDVlMi4uYjZkNWU2MyAxMDA2NDQKLS0tIGEvZ3VpL2NoZWNrYm94LmNwcAorKysgYi9ndWkvY2hlY2tib3guY3BwCkBAIC0yNiw2MyArMjYsNjQgQEAKICNpbmNsdWRlICJvYmplY3RzLmhwcCIKIAogR1VJQ2hlY2tib3g6OkdVSUNoZWNrYm94KHhtbF9ub2RlPD4qIG5vZGUpCi0gICAgOiBDb25kaXRpb25hbChub2RlKQorCTogQ29uZGl0aW9uYWwobm9kZSkKIHsKLSAgICB4bWxfYXR0cmlidXRlPD4qIGF0dHI7Ci0gICAgeG1sX25vZGU8PiogY2hpbGQ7CisJeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOworCXhtbF9ub2RlPD4qIGNoaWxkOwogCi0gICAgbUNoZWNrZWQgPSBOVUxMOwotICAgIG1VbmNoZWNrZWQgPSBOVUxMOwotICAgIG1MYWJlbCA9IE5VTEw7Ci0gICAgbVJlbmRlcmVkID0gZmFsc2U7CisJbUNoZWNrZWQgPSBOVUxMOworCW1VbmNoZWNrZWQgPSBOVUxMOworCW1MYWJlbCA9IE5VTEw7CisJbVJlbmRlcmVkID0gZmFsc2U7CiAKLSAgICBtTGFzdFN0YXRlID0gMDsKKwltTGFzdFN0YXRlID0gMDsKIAotICAgIGlmICghbm9kZSkgIHJldHVybjsKKwlpZiAoIW5vZGUpCisJCXJldHVybjsKIAotICAgIC8vIFRoZSBsYWJlbCBjYW4gYmUgbG9hZGVkIGRpcmVjdGx5Ci0gICAgbUxhYmVsID0gbmV3IEdVSVRleHQobm9kZSk7CisJLy8gVGhlIGxhYmVsIGNhbiBiZSBsb2FkZWQgZGlyZWN0bHkKKwltTGFiZWwgPSBuZXcgR1VJVGV4dChub2RlKTsKIAotICAgIC8vIFJlYWQgdGhlIGNoZWNrIHN0YXRlcwotICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiaW1hZ2UiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgewotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiY2hlY2tlZCIpOwotICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgICAgIG1DaGVja2VkID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInVuY2hlY2tlZCIpOwotICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgICAgIG1VbmNoZWNrZWQgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwotICAgIH0KKwkvLyBSZWFkIHRoZSBjaGVjayBzdGF0ZXMKKwljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImltYWdlIik7CisJaWYgKGNoaWxkKQorCXsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImNoZWNrZWQiKTsKKwkJaWYgKGF0dHIpCisJCQltQ2hlY2tlZCA9IFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2UoYXR0ci0+dmFsdWUoKSk7CisJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ1bmNoZWNrZWQiKTsKKwkJaWYgKGF0dHIpCisJCQltVW5jaGVja2VkID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKKwl9CiAKLSAgICAvLyBHZXQgdGhlIHZhcmlhYmxlIGRhdGEKLSAgICBjaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImRhdGEiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgewotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgidmFyaWFibGUiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICBtVmFyTmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJkZWZhdWx0Iik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgRGF0YU1hbmFnZXI6OlNldFZhbHVlKG1WYXJOYW1lLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9CisJLy8gR2V0IHRoZSB2YXJpYWJsZSBkYXRhCisJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJkYXRhIik7CisJaWYgKGNoaWxkKQorCXsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInZhcmlhYmxlIik7CisJCWlmIChhdHRyKQorCQkJbVZhck5hbWUgPSBhdHRyLT52YWx1ZSgpOworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiZGVmYXVsdCIpOworCQlpZiAoYXR0cikKKwkJCURhdGFNYW5hZ2VyOjpTZXRWYWx1ZShtVmFyTmFtZSwgYXR0ci0+dmFsdWUoKSk7CisJfQogCi0gICAgbUNoZWNrVyA9IDA7ICAgIG1DaGVja0ggPSAwOwotICAgIGlmIChtQ2hlY2tlZCAmJiBtQ2hlY2tlZC0+R2V0UmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICAgIG1DaGVja1cgPSBncl9nZXRfd2lkdGgobUNoZWNrZWQtPkdldFJlc291cmNlKCkpOwotICAgICAgICBtQ2hlY2tIID0gZ3JfZ2V0X2hlaWdodChtQ2hlY2tlZC0+R2V0UmVzb3VyY2UoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1VbmNoZWNrZWQgJiYgbVVuY2hlY2tlZC0+R2V0UmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICAgIG1DaGVja1cgPSBncl9nZXRfd2lkdGgobVVuY2hlY2tlZC0+R2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIG1DaGVja0ggPSBncl9nZXRfaGVpZ2h0KG1VbmNoZWNrZWQtPkdldFJlc291cmNlKCkpOwotICAgIH0KKwltQ2hlY2tXID0gMDsJbUNoZWNrSCA9IDA7CisJaWYgKG1DaGVja2VkICYmIG1DaGVja2VkLT5HZXRSZXNvdXJjZSgpKQorCXsKKwkJbUNoZWNrVyA9IGdyX2dldF93aWR0aChtQ2hlY2tlZC0+R2V0UmVzb3VyY2UoKSk7CisJCW1DaGVja0ggPSBncl9nZXRfaGVpZ2h0KG1DaGVja2VkLT5HZXRSZXNvdXJjZSgpKTsKKwl9CisJZWxzZSBpZiAobVVuY2hlY2tlZCAmJiBtVW5jaGVja2VkLT5HZXRSZXNvdXJjZSgpKQorCXsKKwkJbUNoZWNrVyA9IGdyX2dldF93aWR0aChtVW5jaGVja2VkLT5HZXRSZXNvdXJjZSgpKTsKKwkJbUNoZWNrSCA9IGdyX2dldF9oZWlnaHQobVVuY2hlY2tlZC0+R2V0UmVzb3VyY2UoKSk7CisJfQogCi0gICAgaW50IHgsIHksIHcsIGg7Ci0gICAgbUxhYmVsLT5HZXRSZW5kZXJQb3MoeCwgeSwgdywgaCk7Ci0gICAgU2V0UmVuZGVyUG9zKHgsIHksIDAsIDApOwotICAgIHJldHVybjsKKwlpbnQgeCwgeSwgdywgaDsKKwltTGFiZWwtPkdldFJlbmRlclBvcyh4LCB5LCB3LCBoKTsKKwlTZXRSZW5kZXJQb3MoeCwgeSwgMCwgMCk7CisJcmV0dXJuOwogfQogCiBHVUlDaGVja2JveDo6fkdVSUNoZWNrYm94KCkKQEAgLTkxLDc4ICs5Miw4MSBAQAogCiBpbnQgR1VJQ2hlY2tib3g6OlJlbmRlcih2b2lkKQogewotICAgIGlmICghaXNDb25kaXRpb25UcnVlKCkpCi0gICAgewotICAgICAgICBtUmVuZGVyZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCWlmICghaXNDb25kaXRpb25UcnVlKCkpCisJeworCQltUmVuZGVyZWQgPSBmYWxzZTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgaW50IHJldCA9IDA7Ci0gICAgaW50IGxhc3RTdGF0ZSA9IDA7Ci0gICAgRGF0YU1hbmFnZXI6OkdldFZhbHVlKG1WYXJOYW1lLCBsYXN0U3RhdGUpOworCWludCByZXQgPSAwOworCWludCBsYXN0U3RhdGUgPSAwOworCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZShtVmFyTmFtZSwgbGFzdFN0YXRlKTsKIAotICAgIGlmIChsYXN0U3RhdGUpCi0gICAgewotICAgICAgICBpZiAobUNoZWNrZWQgJiYgbUNoZWNrZWQtPkdldFJlc291cmNlKCkpCi0gICAgICAgICAgICBncl9ibGl0KG1DaGVja2VkLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtQ2hlY2tXLCBtQ2hlY2tILCBtUmVuZGVyWCwgbVJlbmRlclkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobVVuY2hlY2tlZCAmJiBtVW5jaGVja2VkLT5HZXRSZXNvdXJjZSgpKQotICAgICAgICAgICAgZ3JfYmxpdChtVW5jaGVja2VkLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtQ2hlY2tXLCBtQ2hlY2tILCBtUmVuZGVyWCwgbVJlbmRlclkpOwotICAgIH0KLSAgICBpZiAobUxhYmVsKSAgICAgcmV0ID0gbUxhYmVsLT5SZW5kZXIoKTsKLSAgICBtTGFzdFN0YXRlID0gbGFzdFN0YXRlOwotICAgIG1SZW5kZXJlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHJldDsKKwlpZiAobGFzdFN0YXRlKQorCXsKKwkJaWYgKG1DaGVja2VkICYmIG1DaGVja2VkLT5HZXRSZXNvdXJjZSgpKQorCQkJZ3JfYmxpdChtQ2hlY2tlZC0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbUNoZWNrVywgbUNoZWNrSCwgbVJlbmRlclgsIG1SZW5kZXJZKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG1VbmNoZWNrZWQgJiYgbVVuY2hlY2tlZC0+R2V0UmVzb3VyY2UoKSkKKwkJCWdyX2JsaXQobVVuY2hlY2tlZC0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbUNoZWNrVywgbUNoZWNrSCwgbVJlbmRlclgsIG1SZW5kZXJZKTsKKwl9CisJaWYgKG1MYWJlbCkKKwkJcmV0ID0gbUxhYmVsLT5SZW5kZXIoKTsKKwltTGFzdFN0YXRlID0gbGFzdFN0YXRlOworCW1SZW5kZXJlZCA9IHRydWU7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IEdVSUNoZWNrYm94OjpVcGRhdGUodm9pZCkKIHsKLSAgICBpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKSAgICAgcmV0dXJuIChtUmVuZGVyZWQgPyAyIDogMCk7Ci0gICAgaWYgKCFtUmVuZGVyZWQpICAgICAgICAgICAgIHJldHVybiAyOworCWlmICghaXNDb25kaXRpb25UcnVlKCkpCXJldHVybiAobVJlbmRlcmVkID8gMiA6IDApOworCWlmICghbVJlbmRlcmVkKQkJCXJldHVybiAyOwogCi0gICAgaW50IGxhc3RTdGF0ZSA9IDA7Ci0gICAgRGF0YU1hbmFnZXI6OkdldFZhbHVlKG1WYXJOYW1lLCBsYXN0U3RhdGUpOworCWludCBsYXN0U3RhdGUgPSAwOworCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZShtVmFyTmFtZSwgbGFzdFN0YXRlKTsKIAotICAgIGlmIChsYXN0U3RhdGUgIT0gbUxhc3RTdGF0ZSkKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgcmV0dXJuIDA7CisJaWYgKGxhc3RTdGF0ZSAhPSBtTGFzdFN0YXRlKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gMDsKIH0KIAogaW50IEdVSUNoZWNrYm94OjpTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCiB7Ci0gICAgbVJlbmRlclggPSB4OwotICAgIG1SZW5kZXJZID0geTsKKwltUmVuZGVyWCA9IHg7CisJbVJlbmRlclkgPSB5OwogCi0gICAgaWYgKHcgfHwgaCkgICAgIHJldHVybiAtMTsKKwlpZiAodyB8fCBoKQorCQlyZXR1cm4gLTE7CiAKLSAgICBpbnQgdGV4dFcsIHRleHRIOwotICAgIG1MYWJlbC0+R2V0Q3VycmVudEJvdW5kcyh0ZXh0VywgdGV4dEgpOworCWludCB0ZXh0VywgdGV4dEg7CisJbUxhYmVsLT5HZXRDdXJyZW50Qm91bmRzKHRleHRXLCB0ZXh0SCk7CiAKLSAgICB3ID0gdGV4dFcgKyBtQ2hlY2tXICsgNTsKLSAgICBtUmVuZGVyVyA9IHc7Ci0gICAgbVJlbmRlckggPSBtQ2hlY2tIOworCXcgPSB0ZXh0VyArIG1DaGVja1cgKyA1OworCW1SZW5kZXJXID0gdzsKKwltUmVuZGVySCA9IG1DaGVja0g7CiAKLSAgICBtVGV4dFggPSBtUmVuZGVyWCArIG1DaGVja1cgKyA1OwotICAgIG1UZXh0WSA9IG1SZW5kZXJZICsgKChtQ2hlY2tIIC8gMikgLSAodGV4dEggLyAyKSk7CisJbVRleHRYID0gbVJlbmRlclggKyBtQ2hlY2tXICsgNTsKKwltVGV4dFkgPSBtUmVuZGVyWSArICgobUNoZWNrSCAvIDIpIC0gKHRleHRIIC8gMikpOwogCi0gICAgbUxhYmVsLT5TZXRSZW5kZXJQb3MobVRleHRYLCBtVGV4dFksIDAsIDApOwotICAgIFNldEFjdGlvblBvcyhtUmVuZGVyWCwgbVJlbmRlclksIG1SZW5kZXJXLCBtUmVuZGVySCk7Ci0gICAgcmV0dXJuIDA7CisJbUxhYmVsLT5TZXRSZW5kZXJQb3MobVRleHRYLCBtVGV4dFksIDAsIDApOworCVNldEFjdGlvblBvcyhtUmVuZGVyWCwgbVJlbmRlclksIG1SZW5kZXJXLCBtUmVuZGVySCk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBHVUlDaGVja2JveDo6Tm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSkKIHsKLSAgICBpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKSAgICAgcmV0dXJuIC0xOworCWlmICghaXNDb25kaXRpb25UcnVlKCkpCisJCXJldHVybiAtMTsKIAotICAgIGlmIChzdGF0ZSA9PSBUT1VDSF9SRUxFQVNFKQotICAgIHsKLSAgICAgICAgaW50IGxhc3RTdGF0ZTsKLSAgICAgICAgRGF0YU1hbmFnZXI6OkdldFZhbHVlKG1WYXJOYW1lLCBsYXN0U3RhdGUpOwotICAgICAgICBsYXN0U3RhdGUgPSAobGFzdFN0YXRlID09IDApID8gMSA6IDA7Ci0gICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShtVmFyTmFtZSwgbGFzdFN0YXRlKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJaWYgKHN0YXRlID09IFRPVUNIX1JFTEVBU0UpCisJeworCQlpbnQgbGFzdFN0YXRlOworCQlEYXRhTWFuYWdlcjo6R2V0VmFsdWUobVZhck5hbWUsIGxhc3RTdGF0ZSk7CisJCWxhc3RTdGF0ZSA9IChsYXN0U3RhdGUgPT0gMCkgPyAxIDogMDsKKwkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKG1WYXJOYW1lLCBsYXN0U3RhdGUpOworCX0KKwlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3VpL2NvbmRpdGlvbmFsLmNwcCBiL2d1aS9jb25kaXRpb25hbC5jcHAKaW5kZXggYjNhYmEyZC4uNWVhOGQxNyAxMDA2NDQKLS0tIGEvZ3VpL2NvbmRpdGlvbmFsLmNwcAorKysgYi9ndWkvY29uZGl0aW9uYWwuY3BwCkBAIC0yOSwxNTMgKzI5LDE1NiBAQAogCiBDb25kaXRpb25hbDo6Q29uZGl0aW9uYWwoeG1sX25vZGU8Piogbm9kZSkKIHsKLSAgICAvLyBCcmVhayBvdXQgZWFybHksIGl0J3MgdG9vIGhhcmQgdG8gY2hlY2sgaWYgdmFsaWQgZXZlcnkgc3RlcAotICAgIGlmICghbm9kZSkgICAgICAgICAgcmV0dXJuOworCS8vIEJyZWFrIG91dCBlYXJseSwgaXQncyB0b28gaGFyZCB0byBjaGVjayBpZiB2YWxpZCBldmVyeSBzdGVwCisJaWYgKCFub2RlKQkJcmV0dXJuOwogCi0gICAgLy8gRmlyc3QsIGdldCB0aGUgYWN0aW9uCi0gICAgeG1sX25vZGU8PiogY29uZGl0aW9uID0gbm9kZS0+Zmlyc3Rfbm9kZSgiY29uZGl0aW9ucyIpOwotICAgIGlmIChjb25kaXRpb24pICBjb25kaXRpb24gPSBjb25kaXRpb24tPmZpcnN0X25vZGUoImNvbmRpdGlvbiIpOwotICAgIGVsc2UgICAgICAgICAgICBjb25kaXRpb24gPSBub2RlLT5maXJzdF9ub2RlKCJjb25kaXRpb24iKTsKKwkvLyBGaXJzdCwgZ2V0IHRoZSBhY3Rpb24KKwl4bWxfbm9kZTw+KiBjb25kaXRpb24gPSBub2RlLT5maXJzdF9ub2RlKCJjb25kaXRpb25zIik7CisJaWYgKGNvbmRpdGlvbikgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi0+Zmlyc3Rfbm9kZSgiY29uZGl0aW9uIik7CisJZWxzZQkJCWNvbmRpdGlvbiA9IG5vZGUtPmZpcnN0X25vZGUoImNvbmRpdGlvbiIpOwogCi0gICAgaWYgKCFjb25kaXRpb24pICAgICByZXR1cm47CisJaWYgKCFjb25kaXRpb24pCXJldHVybjsKIAotICAgIHdoaWxlIChjb25kaXRpb24pCi0gICAgewotICAgICAgICBDb25kaXRpb24gY29uZDsKKwl3aGlsZSAoY29uZGl0aW9uKQorCXsKKwkJQ29uZGl0aW9uIGNvbmQ7CiAKLSAgICAgICAgY29uZC5tQ29tcGFyZU9wID0gIj0iOworCQljb25kLm1Db21wYXJlT3AgPSAiPSI7CiAKLSAgICAgICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOwotICAgICAgICBhdHRyID0gY29uZGl0aW9uLT5maXJzdF9hdHRyaWJ1dGUoInZhcjEiKTsKLSAgICAgICAgaWYgKGF0dHIpICAgY29uZC5tVmFyMSA9IGF0dHItPnZhbHVlKCk7CisJCXhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKKwkJYXR0ciA9IGNvbmRpdGlvbi0+Zmlyc3RfYXR0cmlidXRlKCJ2YXIxIik7CisJCWlmIChhdHRyKSAgIGNvbmQubVZhcjEgPSBhdHRyLT52YWx1ZSgpOwogCi0gICAgICAgIGF0dHIgPSBjb25kaXRpb24tPmZpcnN0X2F0dHJpYnV0ZSgib3AiKTsKLSAgICAgICAgaWYgKGF0dHIpICAgY29uZC5tQ29tcGFyZU9wID0gYXR0ci0+dmFsdWUoKTsKKwkJYXR0ciA9IGNvbmRpdGlvbi0+Zmlyc3RfYXR0cmlidXRlKCJvcCIpOworCQlpZiAoYXR0cikgICBjb25kLm1Db21wYXJlT3AgPSBhdHRyLT52YWx1ZSgpOwogCi0gICAgICAgIGF0dHIgPSBjb25kaXRpb24tPmZpcnN0X2F0dHJpYnV0ZSgidmFyMiIpOwotICAgICAgICBpZiAoYXR0cikgICBjb25kLm1WYXIyID0gYXR0ci0+dmFsdWUoKTsKLSAgICAKLSAgICAgICAgbUNvbmRpdGlvbnMucHVzaF9iYWNrKGNvbmQpOworCQlhdHRyID0gY29uZGl0aW9uLT5maXJzdF9hdHRyaWJ1dGUoInZhcjIiKTsKKwkJaWYgKGF0dHIpICAgY29uZC5tVmFyMiA9IGF0dHItPnZhbHVlKCk7CisJCisJCW1Db25kaXRpb25zLnB1c2hfYmFjayhjb25kKTsKIAotICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24tPm5leHRfc2libGluZygiY29uZGl0aW9uIik7Ci0gICAgfQorCQljb25kaXRpb24gPSBjb25kaXRpb24tPm5leHRfc2libGluZygiY29uZGl0aW9uIik7CisJfQogfQogCiBib29sIENvbmRpdGlvbmFsOjpJc0NvbmRpdGlvblZhcmlhYmxlKHN0ZDo6c3RyaW5nIHZhcikKIHsKLSAgICBzdGQ6OnZlY3RvcjxDb25kaXRpb24+OjppdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IG1Db25kaXRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gbUNvbmRpdGlvbnMuZW5kKCk7IGl0ZXIrKykKLSAgICB7Ci0gICAgICAgIGlmIChpdGVyLT5tVmFyMSA9PSB2YXIpICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworCXN0ZDo6dmVjdG9yPENvbmRpdGlvbj46Oml0ZXJhdG9yIGl0ZXI7CisJZm9yIChpdGVyID0gbUNvbmRpdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBtQ29uZGl0aW9ucy5lbmQoKTsgaXRlcisrKQorCXsKKwkJaWYgKGl0ZXItPm1WYXIxID09IHZhcikKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CiB9CiAKIGJvb2wgQ29uZGl0aW9uYWw6OmlzQ29uZGl0aW9uVHJ1ZSgpCiB7Ci0gICAgc3RkOjp2ZWN0b3I8Q29uZGl0aW9uPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBtQ29uZGl0aW9ucy5iZWdpbigpOyBpdGVyICE9IG1Db25kaXRpb25zLmVuZCgpOyBpdGVyKyspCi0gICAgewotICAgICAgICBpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgmKCppdGVyKSkpICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOworCXN0ZDo6dmVjdG9yPENvbmRpdGlvbj46Oml0ZXJhdG9yIGl0ZXI7CisJZm9yIChpdGVyID0gbUNvbmRpdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBtQ29uZGl0aW9ucy5lbmQoKTsgaXRlcisrKQorCXsKKwkJaWYgKCFpc0NvbmRpdGlvblRydWUoJigqaXRlcikpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDb25kaXRpb25hbDo6aXNDb25kaXRpb25UcnVlKENvbmRpdGlvbiogY29uZGl0aW9uKQogewotICAgIC8vIFRoaXMgaXMgdXNlZCB0byBob2xkIHRoZSBwcm9wZXIgdmFsdWUgb2YgInRydWUiIGJhc2VkIG9uIHRoZSAnIScgTk9UIGZsYWcKLSAgICBib29sIGJUcnVlID0gdHJ1ZTsKKwkvLyBUaGlzIGlzIHVzZWQgdG8gaG9sZCB0aGUgcHJvcGVyIHZhbHVlIG9mICJ0cnVlIiBiYXNlZCBvbiB0aGUgJyEnIE5PVCBmbGFnCisJYm9vbCBiVHJ1ZSA9IHRydWU7CiAKLSAgICBpZiAoY29uZGl0aW9uLT5tVmFyMS5lbXB0eSgpKSAgICAgIHJldHVybiBiVHJ1ZTsKKwlpZiAoY29uZGl0aW9uLT5tVmFyMS5lbXB0eSgpKQorCQlyZXR1cm4gYlRydWU7CiAKLSAgICBpZiAoIWNvbmRpdGlvbi0+bUNvbXBhcmVPcC5lbXB0eSgpICYmIGNvbmRpdGlvbi0+bUNvbXBhcmVPcFswXSA9PSAnIScpCi0gICAgICAgIGJUcnVlID0gZmFsc2U7CisJaWYgKCFjb25kaXRpb24tPm1Db21wYXJlT3AuZW1wdHkoKSAmJiBjb25kaXRpb24tPm1Db21wYXJlT3BbMF0gPT0gJyEnKQorCQliVHJ1ZSA9IGZhbHNlOwogCi0gICAgaWYgKGNvbmRpdGlvbi0+bVZhcjIuZW1wdHkoKSAmJiBjb25kaXRpb24tPm1Db21wYXJlT3AgIT0gIm1vZGlmaWVkIikKLSAgICB7Ci0gICAgICAgIGlmICghRGF0YU1hbmFnZXI6OkdldFN0clZhbHVlKGNvbmRpdGlvbi0+bVZhcjEpLmVtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gYlRydWU7CisJaWYgKGNvbmRpdGlvbi0+bVZhcjIuZW1wdHkoKSAmJiBjb25kaXRpb24tPm1Db21wYXJlT3AgIT0gIm1vZGlmaWVkIikKKwl7CisJCWlmICghRGF0YU1hbmFnZXI6OkdldFN0clZhbHVlKGNvbmRpdGlvbi0+bVZhcjEpLmVtcHR5KCkpCisJCQlyZXR1cm4gYlRydWU7CiAKLSAgICAgICAgcmV0dXJuICFiVHJ1ZTsKLSAgICB9CisJCXJldHVybiAhYlRydWU7CisJfQogCi0gICAgc3RyaW5nIHZhcjEsIHZhcjI7Ci0gICAgaWYgKERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShjb25kaXRpb24tPm1WYXIxLCB2YXIxKSkKLSAgICAgICAgdmFyMSA9IGNvbmRpdGlvbi0+bVZhcjE7Ci0gICAgaWYgKERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShjb25kaXRpb24tPm1WYXIyLCB2YXIyKSkKLSAgICAgICAgdmFyMiA9IGNvbmRpdGlvbi0+bVZhcjI7CisJc3RyaW5nIHZhcjEsIHZhcjI7CisJaWYgKERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShjb25kaXRpb24tPm1WYXIxLCB2YXIxKSkKKwkJdmFyMSA9IGNvbmRpdGlvbi0+bVZhcjE7CisJaWYgKERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShjb25kaXRpb24tPm1WYXIyLCB2YXIyKSkKKwkJdmFyMiA9IGNvbmRpdGlvbi0+bVZhcjI7CiAKLSAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCB3ZSBzdGF0IHRoZSBmaWxlIGFuZCB0aGF0IGRldGVybWluZXMgb3VyIHJlc3VsdAotICAgIGlmICh2YXIxID09ICJmaWxlZXhpc3RzIikKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgICBpZiAoc3RhdCh2YXIyLmNfc3RyKCksICZzdCkgPT0gMCkKLSAgICAgICAgICAgIHZhcjIgPSB2YXIxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YXIyID0gIkZBSUxFRCI7Ci0gICAgfQotICAgIGlmICh2YXIxID09ICJtb3VudGVkIikKLSAgICB7Ci0gICAgICAgIGlmIChpc01vdW50ZWQoY29uZGl0aW9uLT5tVmFyMikpCi0gICAgICAgICAgICB2YXIyID0gdmFyMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFyMiA9ICJGQUlMRUQiOwotICAgIH0KKwkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCB3ZSBzdGF0IHRoZSBmaWxlIGFuZCB0aGF0IGRldGVybWluZXMgb3VyIHJlc3VsdAorCWlmICh2YXIxID09ICJmaWxlZXhpc3RzIikKKwl7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpZiAoc3RhdCh2YXIyLmNfc3RyKCksICZzdCkgPT0gMCkKKwkJCXZhcjIgPSB2YXIxOworCQllbHNlCisJCQl2YXIyID0gIkZBSUxFRCI7CisJfQorCWlmICh2YXIxID09ICJtb3VudGVkIikKKwl7CisJCWlmIChpc01vdW50ZWQoY29uZGl0aW9uLT5tVmFyMikpCisJCQl2YXIyID0gdmFyMTsKKwkJZWxzZQorCQkJdmFyMiA9ICJGQUlMRUQiOworCX0KIAotICAgIGlmIChjb25kaXRpb24tPm1Db21wYXJlT3AuZmluZCgnPScpICE9IHN0cmluZzo6bnBvcyAmJiB2YXIxID09IHZhcjIpCi0gICAgICAgIHJldHVybiBiVHJ1ZTsKKwlpZiAoY29uZGl0aW9uLT5tQ29tcGFyZU9wLmZpbmQoJz0nKSAhPSBzdHJpbmc6Om5wb3MgJiYgdmFyMSA9PSB2YXIyKQorCQlyZXR1cm4gYlRydWU7CiAKLSAgICBpZiAoY29uZGl0aW9uLT5tQ29tcGFyZU9wLmZpbmQoJz4nKSAhPSBzdHJpbmc6Om5wb3MgJiYgKGF0b2YodmFyMS5jX3N0cigpKSA+IGF0b2YodmFyMi5jX3N0cigpKSkpCi0gICAgICAgIHJldHVybiBiVHJ1ZTsKKwlpZiAoY29uZGl0aW9uLT5tQ29tcGFyZU9wLmZpbmQoJz4nKSAhPSBzdHJpbmc6Om5wb3MgJiYgKGF0b2YodmFyMS5jX3N0cigpKSA+IGF0b2YodmFyMi5jX3N0cigpKSkpCisJCXJldHVybiBiVHJ1ZTsKIAotICAgIGlmIChjb25kaXRpb24tPm1Db21wYXJlT3AuZmluZCgnPCcpICE9IHN0cmluZzo6bnBvcyAmJiAoYXRvZih2YXIxLmNfc3RyKCkpIDwgYXRvZih2YXIyLmNfc3RyKCkpKSkKLSAgICAgICAgcmV0dXJuIGJUcnVlOworCWlmIChjb25kaXRpb24tPm1Db21wYXJlT3AuZmluZCgnPCcpICE9IHN0cmluZzo6bnBvcyAmJiAoYXRvZih2YXIxLmNfc3RyKCkpIDwgYXRvZih2YXIyLmNfc3RyKCkpKSkKKwkJcmV0dXJuIGJUcnVlOwogCi0gICAgaWYgKGNvbmRpdGlvbi0+bUNvbXBhcmVPcCA9PSAibW9kaWZpZWQiKQotICAgIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gYWxsb3cgYXJlYXMgdG8gcmVzZXQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgaWYgKHZhcjEuZW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZGl0aW9uLT5tTGFzdFZhbCA9IHZhcjE7Ci0gICAgICAgICAgICByZXR1cm4gIWJUcnVlOwotICAgICAgICB9CisJaWYgKGNvbmRpdGlvbi0+bUNvbXBhcmVPcCA9PSAibW9kaWZpZWQiKQorCXsKKwkJLy8gVGhpcyBpcyBhIGhhY2sgdG8gYWxsb3cgYXJlYXMgdG8gcmVzZXQgdGhlIGRlZmF1bHQgdmFsdWUKKwkJaWYgKHZhcjEuZW1wdHkoKSkKKwkJeworCQkJY29uZGl0aW9uLT5tTGFzdFZhbCA9IHZhcjE7CisJCQlyZXR1cm4gIWJUcnVlOworCQl9CiAKLSAgICAgICAgaWYgKHZhcjEgIT0gY29uZGl0aW9uLT5tTGFzdFZhbCkKLSAgICAgICAgICAgIHJldHVybiBiVHJ1ZTsKLSAgICB9CisJCWlmICh2YXIxICE9IGNvbmRpdGlvbi0+bUxhc3RWYWwpCisJCQlyZXR1cm4gYlRydWU7CisJfQogCi0gICAgcmV0dXJuICFiVHJ1ZTsKKwlyZXR1cm4gIWJUcnVlOwogfQogCiBib29sIENvbmRpdGlvbmFsOjppc0NvbmRpdGlvblZhbGlkKCkKIHsKLSAgICByZXR1cm4gIW1Db25kaXRpb25zLmVtcHR5KCk7CisJcmV0dXJuICFtQ29uZGl0aW9ucy5lbXB0eSgpOwogfQogCiB2b2lkIENvbmRpdGlvbmFsOjpOb3RpZnlQYWdlU2V0KCkKIHsKLSAgICBzdGQ6OnZlY3RvcjxDb25kaXRpb24+OjppdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IG1Db25kaXRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gbUNvbmRpdGlvbnMuZW5kKCk7IGl0ZXIrKykKLSAgICB7Ci0gICAgICAgIGlmIChpdGVyLT5tQ29tcGFyZU9wID09ICJtb2RpZmllZCIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB2YWw7Ci0gICAgCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCB2YWwgd2lsbCBub3QgYmUgc2V0LCB3aGljaCBpcyBwZXJmZWN0Ci0gICAgICAgICAgICBpZiAoRGF0YU1hbmFnZXI6OkdldFZhbHVlKGl0ZXItPm1WYXIxLCB2YWwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShpdGVyLT5tVmFyMSwgIiIpOwotICAgICAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShpdGVyLT5tVmFyMSwgdmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZXItPm1MYXN0VmFsID0gdmFsOwotICAgICAgICB9Ci0gICAgfQorCXN0ZDo6dmVjdG9yPENvbmRpdGlvbj46Oml0ZXJhdG9yIGl0ZXI7CisJZm9yIChpdGVyID0gbUNvbmRpdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBtQ29uZGl0aW9ucy5lbmQoKTsgaXRlcisrKQorCXsKKwkJaWYgKGl0ZXItPm1Db21wYXJlT3AgPT0gIm1vZGlmaWVkIikKKwkJeworCQkJc3RyaW5nIHZhbDsKKwkKKwkJCS8vIElmIHRoaXMgZmFpbHMsIHZhbCB3aWxsIG5vdCBiZSBzZXQsIHdoaWNoIGlzIHBlcmZlY3QKKwkJCWlmIChEYXRhTWFuYWdlcjo6R2V0VmFsdWUoaXRlci0+bVZhcjEsIHZhbCkpCisJCQl7CisJCQkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKGl0ZXItPm1WYXIxLCAiIik7CisJCQkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKGl0ZXItPm1WYXIxLCB2YWwpOworCQkJfQorCQkJaXRlci0+bUxhc3RWYWwgPSB2YWw7CisJCX0KKwl9CiB9CiAKIGJvb2wgQ29uZGl0aW9uYWw6OmlzTW91bnRlZChzdHJpbmcgdm9sKQogewogCUZJTEUgKmZwOwotICAgIGNoYXIgdG1wT3V0cHV0WzI1NV07CisJY2hhciB0bXBPdXRwdXRbMjU1XTsKIAogCWlmIChzdHJjbXAodm9sLmNfc3RyKCksICJFWFRFUk5BTCIpID09IDApCiAJCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZShUV19FWFRFUk5BTF9NT1VOVCwgdm9sKTsKQEAgLTE4NCwxOSArMTg3LDE4IEBACiAJZnAgPSBmb3BlbigiL3Byb2MvbW91bnRzIiwgInJ0Iik7CiAJd2hpbGUgKGZnZXRzKHRtcE91dHB1dCwyNTUsZnApICE9IE5VTEwpCiAJewotICAgICAgICBjaGFyKiBtbnQgPSB0bXBPdXRwdXQ7Ci0gICAgICAgIHdoaWxlICgqbW50ID4gMzIpICAgICAgICAgICAgICAgbW50Kys7Ci0gICAgICAgIHdoaWxlICgqbW50ID4gMCAmJiAqbW50IDw9IDMyKSAgbW50Kys7Ci0gICAgICAgIGNoYXIqIHBvcyA9IG1udDsKLQkgICAgd2hpbGUgKCpwb3MgPiAzMikgICBwb3MrKzsKLSAgICAgICAgKnBvcyA9IDA7Ci0JICAgIGlmICh2b2wgPT0gbW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBmY2xvc2UoZnApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm4gZmFsc2U7CisJCWNoYXIqIG1udCA9IHRtcE91dHB1dDsKKwkJd2hpbGUgKCptbnQgPiAzMikJCQltbnQrKzsKKwkJd2hpbGUgKCptbnQgPiAwICYmICptbnQgPD0gMzIpCW1udCsrOworCQljaGFyKiBwb3MgPSBtbnQ7CisJCXdoaWxlICgqcG9zID4gMzIpICAgcG9zKys7CisJCSpwb3MgPSAwOworCQlpZiAodm9sID09IG1udCkKKwkJeworCQkJZmNsb3NlKGZwKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWZjbG9zZShmcCk7CisJcmV0dXJuIGZhbHNlOwogfQotCmRpZmYgLS1naXQgYS9ndWkvY29uc29sZS5jcHAgYi9ndWkvY29uc29sZS5jcHAKaW5kZXggZWUzYjVlNS4uNTE3YTdjMiAxMDA2NDQKLS0tIGEvZ3VpL2NvbnNvbGUuY3BwCisrKyBiL2d1aS9jb25zb2xlLmNwcApAQCAtMzAsMzczICszMCwzNzQgQEAKIAogZXh0ZXJuICJDIiB2b2lkIGd1aV9wcmludChjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgICBjaGFyIGJ1Zls1MTJdOyAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBsaW1pdCBhIHNpbmdsZSByZXF1ZXN0IHRvIDUxMiBieXRlcworCWNoYXIgYnVmWzUxMl07CQkvLyBXZSdyZSBnb2luZyB0byBsaW1pdCBhIHNpbmdsZSByZXF1ZXN0IHRvIDUxMiBieXRlcwogCi0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICB2c25wcmludGYoYnVmLCA1MTIsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2c25wcmludGYoYnVmLCA1MTIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CiAKIAlmcHV0cyhidWYsIHN0ZG91dCk7CiAKLSAgICBjaGFyICpzdGFydCwgKm5leHQ7CisJY2hhciAqc3RhcnQsICpuZXh0OwogCiAJaWYgKGJ1ZlswXSA9PSAnXG4nICYmIHN0cmxlbihidWYpIDwgMikgewogCQkvLyBUaGlzIHByZXZlbnRzIHRoZSBkb3VibGUgbGluZXMgYnVnIHNlZW4gaW4gdGhlIGNvbnNvbGUgZHVyaW5nIHppcCBpbnN0YWxscwogCQlyZXR1cm47CiAJfQogCi0gICAgZm9yIChzdGFydCA9IG5leHQgPSBidWY7ICpuZXh0ICE9ICdcMCc7IG5leHQrKykKLSAgICB7Ci0gICAgICAgIGlmICgqbmV4dCA9PSAnXG4nKQotICAgICAgICB7Ci0gICAgICAgICAgICAqbmV4dCA9ICdcMCc7Ci0gICAgICAgICAgICBuZXh0Kys7CisJZm9yIChzdGFydCA9IG5leHQgPSBidWY7ICpuZXh0ICE9ICdcMCc7IG5leHQrKykKKwl7CisJCWlmICgqbmV4dCA9PSAnXG4nKQorCQl7CisJCQkqbmV4dCA9ICdcMCc7CisJCQluZXh0Kys7CiAKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmUgPSBzdGFydDsKLSAgICAgICAgICAgIGdDb25zb2xlLnB1c2hfYmFjayhsaW5lKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV4dDsKKwkJCXN0ZDo6c3RyaW5nIGxpbmUgPSBzdGFydDsKKwkJCWdDb25zb2xlLnB1c2hfYmFjayhsaW5lKTsKKwkJCXN0YXJ0ID0gbmV4dDsKIAogCQkJLy8gSGFuZGxlIHRoZSBub3JtYWwgXG5cMCBjYXNlCi0gICAgICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykKKwkJCWlmICgqbmV4dCA9PSAnXDAnKQogCQkJCXJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBsaW5lID0gc3RhcnQ7Ci0gICAgZ0NvbnNvbGUucHVzaF9iYWNrKGxpbmUpOwotICAgIHJldHVybjsKKwkJfQorCX0KKwlzdGQ6OnN0cmluZyBsaW5lID0gc3RhcnQ7CisJZ0NvbnNvbGUucHVzaF9iYWNrKGxpbmUpOworCXJldHVybjsKIH0KIAogZXh0ZXJuICJDIiB2b2lkIGd1aV9wcmludF9vdmVyd3JpdGUoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgY2hhciBidWZbNTEyXTsgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gbGltaXQgYSBzaW5nbGUgcmVxdWVzdCB0byA1MTIgYnl0ZXMKKwljaGFyIGJ1Zls1MTJdOwkJLy8gV2UncmUgZ29pbmcgdG8gbGltaXQgYSBzaW5nbGUgcmVxdWVzdCB0byA1MTIgYnl0ZXMKIAotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgdnNucHJpbnRmKGJ1ZiwgNTEyLCBmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdnNucHJpbnRmKGJ1ZiwgNTEyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOwogCiAJZnB1dHMoYnVmLCBzdGRvdXQpOwogCi0gICAgLy8gUG9wIHRoZSBsYXN0IGxpbmUsIGFuZCB3ZSBjYW4gY29udGludWUKLSAgICBpZiAoIWdDb25zb2xlLmVtcHR5KCkpICAgZ0NvbnNvbGUucG9wX2JhY2soKTsKKwkvLyBQb3AgdGhlIGxhc3QgbGluZSwgYW5kIHdlIGNhbiBjb250aW51ZQorCWlmICghZ0NvbnNvbGUuZW1wdHkoKSkgICBnQ29uc29sZS5wb3BfYmFjaygpOwogCi0gICAgY2hhciAqc3RhcnQsICpuZXh0OwotICAgIGZvciAoc3RhcnQgPSBuZXh0ID0gYnVmOyAqbmV4dCAhPSAnXDAnOyBuZXh0KyspCi0gICAgewotICAgICAgICBpZiAoKm5leHQgPT0gJ1xuJykKLSAgICAgICAgewotICAgICAgICAgICAgKm5leHQgPSAnXDAnOwotICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdGQ6OnN0cmluZyBsaW5lID0gc3RhcnQ7Ci0gICAgICAgICAgICBnQ29uc29sZS5wdXNoX2JhY2sobGluZSk7Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQ7CisJY2hhciAqc3RhcnQsICpuZXh0OworCWZvciAoc3RhcnQgPSBuZXh0ID0gYnVmOyAqbmV4dCAhPSAnXDAnOyBuZXh0KyspCisJeworCQlpZiAoKm5leHQgPT0gJ1xuJykKKwkJeworCQkJKm5leHQgPSAnXDAnOworCQkJbmV4dCsrOworCQkJCisJCQlzdGQ6OnN0cmluZyBsaW5lID0gc3RhcnQ7CisJCQlnQ29uc29sZS5wdXNoX2JhY2sobGluZSk7CisJCQlzdGFydCA9IG5leHQ7CiAKLSAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgbm9ybWFsIFxuXDAgY2FzZQotICAgICAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpCisJCQkvLyBIYW5kbGUgdGhlIG5vcm1hbCBcblwwIGNhc2UKKwkJCWlmICgqbmV4dCA9PSAnXDAnKQogCQkJCXJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBsaW5lID0gc3RhcnQ7Ci0gICAgZ0NvbnNvbGUucHVzaF9iYWNrKGxpbmUpOwotICAgIHJldHVybjsKKwkJfQorCX0KKwlzdGQ6OnN0cmluZyBsaW5lID0gc3RhcnQ7CisJZ0NvbnNvbGUucHVzaF9iYWNrKGxpbmUpOworCXJldHVybjsKIH0KIAogR1VJQ29uc29sZTo6R1VJQ29uc29sZSh4bWxfbm9kZTw+KiBub2RlKQogewotICAgIHhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfYXR0cmlidXRlPD4qIGF0dHI7CisJeG1sX25vZGU8PiogY2hpbGQ7CiAKLSAgICBtRm9udCA9IE5VTEw7Ci0gICAgbUN1cnJlbnRMaW5lID0gLTE7Ci0gICAgbWVtc2V0KCZtRm9yZWdyb3VuZENvbG9yLCAyNTUsIHNpemVvZihDT0xPUikpOwotICAgIG1lbXNldCgmbUJhY2tncm91bmRDb2xvciwgMCwgc2l6ZW9mKENPTE9SKSk7Ci0gICAgbUJhY2tncm91bmRDb2xvci5hbHBoYSA9IDI1NTsKLSAgICBtZW1zZXQoJm1TY3JvbGxDb2xvciwgMHgwOCwgc2l6ZW9mKENPTE9SKSk7Ci0gICAgbVNjcm9sbENvbG9yLmFscGhhID0gMjU1OwotICAgIG1MYXN0Q291bnQgPSAwOwotICAgIG1TbGlkZW91dCA9IDA7Ci0gICAgbVNsaWRlb3V0U3RhdGUgPSBoaWRkZW47CisJbUZvbnQgPSBOVUxMOworCW1DdXJyZW50TGluZSA9IC0xOworCW1lbXNldCgmbUZvcmVncm91bmRDb2xvciwgMjU1LCBzaXplb2YoQ09MT1IpKTsKKwltZW1zZXQoJm1CYWNrZ3JvdW5kQ29sb3IsIDAsIHNpemVvZihDT0xPUikpOworCW1CYWNrZ3JvdW5kQ29sb3IuYWxwaGEgPSAyNTU7CisJbWVtc2V0KCZtU2Nyb2xsQ29sb3IsIDB4MDgsIHNpemVvZihDT0xPUikpOworCW1TY3JvbGxDb2xvci5hbHBoYSA9IDI1NTsKKwltTGFzdENvdW50ID0gMDsKKwltU2xpZGVvdXQgPSAwOworCW1TbGlkZW91dFN0YXRlID0gaGlkZGVuOwogCi0gICAgbVJlbmRlclggPSAwOyBtUmVuZGVyWSA9IDA7IG1SZW5kZXJXID0gZ3JfZmJfd2lkdGgoKTsgbVJlbmRlckggPSBncl9mYl9oZWlnaHQoKTsKKwltUmVuZGVyWCA9IDA7IG1SZW5kZXJZID0gMDsgbVJlbmRlclcgPSBncl9mYl93aWR0aCgpOyBtUmVuZGVySCA9IGdyX2ZiX2hlaWdodCgpOwogCi0gICAgaWYgKCFub2RlKQotICAgIHsKLSAgICAgICAgbVNsaWRlb3V0WCA9IDA7IG1TbGlkZW91dFkgPSAwOyBtU2xpZGVvdXRXID0gMDsgbVNsaWRlb3V0SCA9IDA7Ci0gICAgICAgIG1Db25zb2xlWCA9IDA7ICBtQ29uc29sZVkgPSAwOyAgbUNvbnNvbGVXID0gZ3JfZmJfd2lkdGgoKTsgIG1Db25zb2xlSCA9IGdyX2ZiX2hlaWdodCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImZvbnQiKTsKLSAgICAgICAgaWYgKGNoaWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgicmVzb3VyY2UiKTsKLSAgICAgICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgICAgIG1Gb250ID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgfQorCWlmICghbm9kZSkKKwl7CisJCW1TbGlkZW91dFggPSAwOyBtU2xpZGVvdXRZID0gMDsgbVNsaWRlb3V0VyA9IDA7IG1TbGlkZW91dEggPSAwOworCQltQ29uc29sZVggPSAwOyAgbUNvbnNvbGVZID0gMDsgIG1Db25zb2xlVyA9IGdyX2ZiX3dpZHRoKCk7ICBtQ29uc29sZUggPSBncl9mYl9oZWlnaHQoKTsKKwl9CisJZWxzZQorCXsKKwkJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJmb250Iik7CisJCWlmIChjaGlsZCkKKwkJeworCQkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInJlc291cmNlIik7CisJCQlpZiAoYXR0cikKKwkJCQltRm9udCA9IFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2UoYXR0ci0+dmFsdWUoKSk7CisJCX0KIAotICAgICAgICBjaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImNvbG9yIik7Ci0gICAgICAgIGlmIChjaGlsZCkKLSAgICAgICAgewotICAgICAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZvcmVncm91bmQiKTsKLSAgICAgICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICBDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1Gb3JlZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImJhY2tncm91bmQiKTsKLSAgICAgICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICBDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1CYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInNjcm9sbCIpOwotICAgICAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICAgICAgICAgIENvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbVNjcm9sbENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImNvbG9yIik7CisJCWlmIChjaGlsZCkKKwkJeworCQkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZvcmVncm91bmQiKTsKKwkJCWlmIChhdHRyKQorCQkJeworCQkJCXN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKKwkJCQlDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1Gb3JlZ3JvdW5kQ29sb3IpOworCQkJfQorCQkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImJhY2tncm91bmQiKTsKKwkJCWlmIChhdHRyKQorCQkJeworCQkJCXN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKKwkJCQlDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1CYWNrZ3JvdW5kQ29sb3IpOworCQkJfQorCQkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInNjcm9sbCIpOworCQkJaWYgKGF0dHIpCisJCQl7CisJCQkJc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOworCQkJCUNvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbVNjcm9sbENvbG9yKTsKKwkJCX0KKwkJfQogCi0gICAgICAgIC8vIExvYWQgdGhlIHBsYWNlbWVudAotICAgICAgICBMb2FkUGxhY2VtZW50KG5vZGUtPmZpcnN0X25vZGUoInBsYWNlbWVudCIpLCAmbUNvbnNvbGVYLCAmbUNvbnNvbGVZLCAmbUNvbnNvbGVXLCAmbUNvbnNvbGVIKTsKKwkJLy8gTG9hZCB0aGUgcGxhY2VtZW50CisJCUxvYWRQbGFjZW1lbnQobm9kZS0+Zmlyc3Rfbm9kZSgicGxhY2VtZW50IiksICZtQ29uc29sZVgsICZtQ29uc29sZVksICZtQ29uc29sZVcsICZtQ29uc29sZUgpOwogCi0gICAgICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgic2xpZGVvdXQiKTsKLSAgICAgICAgaWYgKGNoaWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICBtU2xpZGVvdXQgPSAxOwotICAgICAgICAgICAgTG9hZFBsYWNlbWVudChjaGlsZCwgJm1TbGlkZW91dFgsICZtU2xpZGVvdXRZKTsKKwkJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJzbGlkZW91dCIpOworCQlpZiAoY2hpbGQpCisJCXsKKwkJCW1TbGlkZW91dCA9IDE7CisJCQlMb2FkUGxhY2VtZW50KGNoaWxkLCAmbVNsaWRlb3V0WCwgJm1TbGlkZW91dFkpOwogCi0gICAgICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgicmVzb3VyY2UiKTsKLSAgICAgICAgICAgIGlmIChhdHRyKSAgIG1TbGlkZW91dEltYWdlID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKKwkJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJyZXNvdXJjZSIpOworCQkJaWYgKGF0dHIpICAgbVNsaWRlb3V0SW1hZ2UgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwogCi0gICAgICAgICAgICBpZiAobVNsaWRlb3V0SW1hZ2UgJiYgbVNsaWRlb3V0SW1hZ2UtPkdldFJlc291cmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbVNsaWRlb3V0VyA9IGdyX2dldF93aWR0aChtU2xpZGVvdXRJbWFnZS0+R2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgbVNsaWRlb3V0SCA9IGdyX2dldF9oZWlnaHQobVNsaWRlb3V0SW1hZ2UtPkdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCQkJaWYgKG1TbGlkZW91dEltYWdlICYmIG1TbGlkZW91dEltYWdlLT5HZXRSZXNvdXJjZSgpKQorCQkJeworCQkJCW1TbGlkZW91dFcgPSBncl9nZXRfd2lkdGgobVNsaWRlb3V0SW1hZ2UtPkdldFJlc291cmNlKCkpOworCQkJCW1TbGlkZW91dEggPSBncl9nZXRfaGVpZ2h0KG1TbGlkZW91dEltYWdlLT5HZXRSZXNvdXJjZSgpKTsKKwkJCX0KKwkJfQorCX0KIAotICAgIGdyX2dldEZvbnREZXRhaWxzKG1Gb250LCAmbUZvbnRIZWlnaHQsIE5VTEwpOwotICAgIFNldEFjdGlvblBvcyhtUmVuZGVyWCwgbVJlbmRlclksIG1SZW5kZXJXLCBtUmVuZGVySCk7Ci0gICAgU2V0UmVuZGVyUG9zKG1Db25zb2xlWCwgbUNvbnNvbGVZKTsKLSAgICByZXR1cm47CisJZ3JfZ2V0Rm9udERldGFpbHMobUZvbnQsICZtRm9udEhlaWdodCwgTlVMTCk7CisJU2V0QWN0aW9uUG9zKG1SZW5kZXJYLCBtUmVuZGVyWSwgbVJlbmRlclcsIG1SZW5kZXJIKTsKKwlTZXRSZW5kZXJQb3MobUNvbnNvbGVYLCBtQ29uc29sZVkpOworCXJldHVybjsKIH0KIAogaW50IEdVSUNvbnNvbGU6OlJlbmRlclNsaWRlb3V0KHZvaWQpCiB7Ci0gICAgaWYgKCFtU2xpZGVvdXRJbWFnZSB8fCAhbVNsaWRlb3V0SW1hZ2UtPkdldFJlc291cmNlKCkpICAgICAgcmV0dXJuIC0xOworCWlmICghbVNsaWRlb3V0SW1hZ2UgfHwgIW1TbGlkZW91dEltYWdlLT5HZXRSZXNvdXJjZSgpKQorCQlyZXR1cm4gLTE7CiAKLSAgICBncl9ibGl0KG1TbGlkZW91dEltYWdlLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtU2xpZGVvdXRXLCBtU2xpZGVvdXRILCBtU2xpZGVvdXRYLCBtU2xpZGVvdXRZKTsKLSAgICByZXR1cm4gMDsKKwlncl9ibGl0KG1TbGlkZW91dEltYWdlLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtU2xpZGVvdXRXLCBtU2xpZGVvdXRILCBtU2xpZGVvdXRYLCBtU2xpZGVvdXRZKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IEdVSUNvbnNvbGU6OlJlbmRlckNvbnNvbGUodm9pZCkKIHsKLSAgICB2b2lkKiBmb250UmVzb3VyY2UgPSBOVUxMOwotICAgIGlmIChtRm9udCkgIGZvbnRSZXNvdXJjZSA9IG1Gb250LT5HZXRSZXNvdXJjZSgpOworCXZvaWQqIGZvbnRSZXNvdXJjZSA9IE5VTEw7CisJaWYgKG1Gb250KQorCQlmb250UmVzb3VyY2UgPSBtRm9udC0+R2V0UmVzb3VyY2UoKTsKIAotICAgIC8vIFdlIGZpbGwgdGhlIGJhY2tncm91bmQKLSAgICBncl9jb2xvcihtQmFja2dyb3VuZENvbG9yLnJlZCwgbUJhY2tncm91bmRDb2xvci5ncmVlbiwgbUJhY2tncm91bmRDb2xvci5ibHVlLCAyNTUpOwotICAgIGdyX2ZpbGwobUNvbnNvbGVYLCBtQ29uc29sZVksIG1Db25zb2xlVywgbUNvbnNvbGVIKTsKKwkvLyBXZSBmaWxsIHRoZSBiYWNrZ3JvdW5kCisJZ3JfY29sb3IobUJhY2tncm91bmRDb2xvci5yZWQsIG1CYWNrZ3JvdW5kQ29sb3IuZ3JlZW4sIG1CYWNrZ3JvdW5kQ29sb3IuYmx1ZSwgMjU1KTsKKwlncl9maWxsKG1Db25zb2xlWCwgbUNvbnNvbGVZLCBtQ29uc29sZVcsIG1Db25zb2xlSCk7CiAKLSAgICBncl9jb2xvcihtU2Nyb2xsQ29sb3IucmVkLCBtU2Nyb2xsQ29sb3IuZ3JlZW4sIG1TY3JvbGxDb2xvci5ibHVlLCBtU2Nyb2xsQ29sb3IuYWxwaGEpOwotICAgIGdyX2ZpbGwobUNvbnNvbGVYICsgKG1Db25zb2xlVyAqIDkgLyAxMCksIG1Db25zb2xlWSwgKG1Db25zb2xlVyAvIDEwKSwgbUNvbnNvbGVIKTsKKwlncl9jb2xvcihtU2Nyb2xsQ29sb3IucmVkLCBtU2Nyb2xsQ29sb3IuZ3JlZW4sIG1TY3JvbGxDb2xvci5ibHVlLCBtU2Nyb2xsQ29sb3IuYWxwaGEpOworCWdyX2ZpbGwobUNvbnNvbGVYICsgKG1Db25zb2xlVyAqIDkgLyAxMCksIG1Db25zb2xlWSwgKG1Db25zb2xlVyAvIDEwKSwgbUNvbnNvbGVIKTsKIAotICAgIC8vIFJlbmRlciB0aGUgbGluZXMKLSAgICBncl9jb2xvcihtRm9yZWdyb3VuZENvbG9yLnJlZCwgbUZvcmVncm91bmRDb2xvci5ncmVlbiwgbUZvcmVncm91bmRDb2xvci5ibHVlLCBtRm9yZWdyb3VuZENvbG9yLmFscGhhKTsKKwkvLyBSZW5kZXIgdGhlIGxpbmVzCisJZ3JfY29sb3IobUZvcmVncm91bmRDb2xvci5yZWQsIG1Gb3JlZ3JvdW5kQ29sb3IuZ3JlZW4sIG1Gb3JlZ3JvdW5kQ29sb3IuYmx1ZSwgbUZvcmVncm91bmRDb2xvci5hbHBoYSk7CiAKLSAgICAvLyBEb24ndCB0cnkgdG8gY29udGludWUgdG8gcmVuZGVyIHdpdGhvdXQgZGF0YQotICAgIG1MYXN0Q291bnQgPSBnQ29uc29sZS5zaXplKCk7Ci0gICAgaWYgKG1MYXN0Q291bnQgPT0gMCkgICAgICAgIHJldHVybiAobVNsaWRlb3V0ID8gUmVuZGVyU2xpZGVvdXQoKSA6IDApOworCS8vIERvbid0IHRyeSB0byBjb250aW51ZSB0byByZW5kZXIgd2l0aG91dCBkYXRhCisJbUxhc3RDb3VudCA9IGdDb25zb2xlLnNpemUoKTsKKwlpZiAobUxhc3RDb3VudCA9PSAwKQorCQlyZXR1cm4gKG1TbGlkZW91dCA/IFJlbmRlclNsaWRlb3V0KCkgOiAwKTsKIAotICAgIC8vIEZpbmQgdGhlIHN0YXJ0IHBvaW50Ci0gICAgaW50IHN0YXJ0OwotICAgIGludCBjdXJMaW5lID0gbUN1cnJlbnRMaW5lOyAgICAvLyBUaHJlYWQtc2FmaW5nIChBbm90aGVyIHRocmVhZCB1cGRhdGVzIHRoaXMgdmFsdWUpCi0gICAgaWYgKGN1ckxpbmUgPT0gLTEpCi0gICAgewotICAgICAgICBzdGFydCA9IG1MYXN0Q291bnQgLSBtTWF4Um93czsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGN1ckxpbmUgPiAoaW50KSBtTGFzdENvdW50KSAgIGN1ckxpbmUgPSAoaW50KSBtTGFzdENvdW50OwotICAgICAgICBpZiAoKGludCkgbU1heFJvd3MgPiBjdXJMaW5lKSAgICAgY3VyTGluZSA9IChpbnQpIG1NYXhSb3dzOwotICAgICAgICBzdGFydCA9IGN1ckxpbmUgLSBtTWF4Um93czsKLSAgICB9CisJLy8gRmluZCB0aGUgc3RhcnQgcG9pbnQKKwlpbnQgc3RhcnQ7CisJaW50IGN1ckxpbmUgPSBtQ3VycmVudExpbmU7IC8vIFRocmVhZC1zYWZpbmcgKEFub3RoZXIgdGhyZWFkIHVwZGF0ZXMgdGhpcyB2YWx1ZSkKKwlpZiAoY3VyTGluZSA9PSAtMSkKKwl7CisJCXN0YXJ0ID0gbUxhc3RDb3VudCAtIG1NYXhSb3dzOworCX0KKwllbHNlCisJeworCQlpZiAoY3VyTGluZSA+IChpbnQpIG1MYXN0Q291bnQpCisJCQljdXJMaW5lID0gKGludCkgbUxhc3RDb3VudDsKKwkJaWYgKChpbnQpIG1NYXhSb3dzID4gY3VyTGluZSkKKwkJCWN1ckxpbmUgPSAoaW50KSBtTWF4Um93czsKKwkJc3RhcnQgPSBjdXJMaW5lIC0gbU1heFJvd3M7CisJfQogCi0gICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgZm9yIChsaW5lID0gMDsgbGluZSA8IG1NYXhSb3dzOyBsaW5lKyspCi0gICAgewotICAgICAgICBpZiAoKHN0YXJ0ICsgKGludCkgbGluZSkgPj0gMCAmJiAoc3RhcnQgKyAoaW50KSBsaW5lKSA8IChpbnQpIG1MYXN0Q291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdyX3RleHRFeFcobUNvbnNvbGVYLCBtU3RhcnRZICsgKGxpbmUgKiBtRm9udEhlaWdodCksIGdDb25zb2xlW3N0YXJ0ICsgbGluZV0uY19zdHIoKSwgZm9udFJlc291cmNlLCBtQ29uc29sZVcgKyBtQ29uc29sZVgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAobVNsaWRlb3V0ID8gUmVuZGVyU2xpZGVvdXQoKSA6IDApOworCXVuc2lnbmVkIGludCBsaW5lOworCWZvciAobGluZSA9IDA7IGxpbmUgPCBtTWF4Um93czsgbGluZSsrKQorCXsKKwkJaWYgKChzdGFydCArIChpbnQpIGxpbmUpID49IDAgJiYgKHN0YXJ0ICsgKGludCkgbGluZSkgPCAoaW50KSBtTGFzdENvdW50KQorCQkJZ3JfdGV4dEV4VyhtQ29uc29sZVgsIG1TdGFydFkgKyAobGluZSAqIG1Gb250SGVpZ2h0KSwgZ0NvbnNvbGVbc3RhcnQgKyBsaW5lXS5jX3N0cigpLCBmb250UmVzb3VyY2UsIG1Db25zb2xlVyArIG1Db25zb2xlWCk7CisJfQorCXJldHVybiAobVNsaWRlb3V0ID8gUmVuZGVyU2xpZGVvdXQoKSA6IDApOwogfQogCiBpbnQgR1VJQ29uc29sZTo6UmVuZGVyKHZvaWQpCiB7Ci0gICAgaWYgKG1TbGlkZW91dCAmJiBtU2xpZGVvdXRTdGF0ZSA9PSBoaWRkZW4pCi0gICAgewotICAgICAgICByZXR1cm4gUmVuZGVyU2xpZGVvdXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckNvbnNvbGUoKTsKKwlpZiAobVNsaWRlb3V0ICYmIG1TbGlkZW91dFN0YXRlID09IGhpZGRlbikKKwkJcmV0dXJuIFJlbmRlclNsaWRlb3V0KCk7CisKKwlyZXR1cm4gUmVuZGVyQ29uc29sZSgpOwogfQogCiBpbnQgR1VJQ29uc29sZTo6VXBkYXRlKHZvaWQpCiB7Ci0gICAgaWYgKG1TbGlkZW91dCAmJiBtU2xpZGVvdXRTdGF0ZSAhPSB2aXNpYmxlKQotICAgIHsKLSAgICAgICAgaWYgKG1TbGlkZW91dFN0YXRlID09IGhpZGRlbikKLSAgICAgICAgICAgIHJldHVybiAwOworCWlmIChtU2xpZGVvdXQgJiYgbVNsaWRlb3V0U3RhdGUgIT0gdmlzaWJsZSkKKwl7CisJCWlmIChtU2xpZGVvdXRTdGF0ZSA9PSBoaWRkZW4pCisJCQlyZXR1cm4gMDsKIAotICAgICAgICBpZiAobVNsaWRlb3V0U3RhdGUgPT0gcmVxdWVzdF9oaWRlKQotICAgICAgICAgICAgbVNsaWRlb3V0U3RhdGUgPSBoaWRkZW47CisJCWlmIChtU2xpZGVvdXRTdGF0ZSA9PSByZXF1ZXN0X2hpZGUpCisJCQltU2xpZGVvdXRTdGF0ZSA9IGhpZGRlbjsKIAotICAgICAgICBpZiAobVNsaWRlb3V0U3RhdGUgPT0gcmVxdWVzdF9zaG93KQotICAgICAgICAgICAgbVNsaWRlb3V0U3RhdGUgPSB2aXNpYmxlOworCQlpZiAobVNsaWRlb3V0U3RhdGUgPT0gcmVxdWVzdF9zaG93KQorCQkJbVNsaWRlb3V0U3RhdGUgPSB2aXNpYmxlOwogCi0gICAgICAgIC8vIEFueSB0aW1lIHdlIGFjdGl2YXRlIHRoZSBzbGlkZXIsIHdlIHJlc2V0IHRoZSBwb3NpdGlvbgotICAgICAgICBtQ3VycmVudExpbmUgPSAtMTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQorCQkvLyBBbnkgdGltZSB3ZSBhY3RpdmF0ZSB0aGUgc2xpZGVyLCB3ZSByZXNldCB0aGUgcG9zaXRpb24KKwkJbUN1cnJlbnRMaW5lID0gLTE7CisJCXJldHVybiAyOworCX0KIAotICAgIGlmIChtQ3VycmVudExpbmUgPT0gLTEgJiYgbUxhc3RDb3VudCAhPSBnQ29uc29sZS5zaXplKCkpCi0gICAgewotICAgICAgICAvLyBXZSBjYW4gdXNlIFJlbmRlciwgYW5kIHJldHVybiBmb3IganVzdCBhIGZsaXAKLSAgICAgICAgUmVuZGVyKCk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIGlmIChtTGFzdFRvdWNoWSA+PSAwKQotICAgIHsKLSAgICAgICAgLy8gVGhleSdyZSBzdGlsbCB0b3VjaGluZywgc28gcmUtcmVuZGVyCi0gICAgICAgIFJlbmRlcigpOwotICAgICAgICBtTGFzdFRvdWNoWSA9IC0xOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJaWYgKG1DdXJyZW50TGluZSA9PSAtMSAmJiBtTGFzdENvdW50ICE9IGdDb25zb2xlLnNpemUoKSkKKwl7CisJCS8vIFdlIGNhbiB1c2UgUmVuZGVyLCBhbmQgcmV0dXJuIGZvciBqdXN0IGEgZmxpcAorCQlSZW5kZXIoKTsKKwkJcmV0dXJuIDI7CisJfQorCWVsc2UgaWYgKG1MYXN0VG91Y2hZID49IDApCisJeworCQkvLyBUaGV5J3JlIHN0aWxsIHRvdWNoaW5nLCBzbyByZS1yZW5kZXIKKwkJUmVuZGVyKCk7CisJCW1MYXN0VG91Y2hZID0gLTE7CisJCXJldHVybiAyOworCX0KKwlyZXR1cm4gMDsKIH0KIAogaW50IEdVSUNvbnNvbGU6OlNldFJlbmRlclBvcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKIHsKLSAgICAvLyBBZGp1c3QgdGhlIHN0dWIgcG9zaXRpb24gYWNjb3JkaW5nbHkKLSAgICBtU2xpZGVvdXRYICs9ICh4IC0gbUNvbnNvbGVYKTsKLSAgICBtU2xpZGVvdXRZICs9ICh5IC0gbUNvbnNvbGVZKTsKKwkvLyBBZGp1c3QgdGhlIHN0dWIgcG9zaXRpb24gYWNjb3JkaW5nbHkKKwltU2xpZGVvdXRYICs9ICh4IC0gbUNvbnNvbGVYKTsKKwltU2xpZGVvdXRZICs9ICh5IC0gbUNvbnNvbGVZKTsKIAotICAgIG1Db25zb2xlWCA9IHg7Ci0gICAgbUNvbnNvbGVZID0geTsKLSAgICBpZiAodyB8fCBoKQotICAgIHsKLSAgICAgICAgbUNvbnNvbGVXID0gdzsKLSAgICAgICAgbUNvbnNvbGVIID0gaDsKLSAgICB9CisJbUNvbnNvbGVYID0geDsKKwltQ29uc29sZVkgPSB5OworCWlmICh3IHx8IGgpCisJeworCQltQ29uc29sZVcgPSB3OworCQltQ29uc29sZUggPSBoOworCX0KIAotICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4IHJvd3MKLSAgICBtTWF4Um93cyA9IG1Db25zb2xlSCAvIG1Gb250SGVpZ2h0OworCS8vIENhbGN1bGF0ZSB0aGUgbWF4IHJvd3MKKwltTWF4Um93cyA9IG1Db25zb2xlSCAvIG1Gb250SGVpZ2h0OwogCi0gICAgLy8gQWRqdXN0IHNvIHdlIGFsd2F5cyBmaXQgdG8gYm90dG9tCi0gICAgbVN0YXJ0WSA9IG1Db25zb2xlWSArIChtQ29uc29sZUggJSBtRm9udEhlaWdodCk7Ci0gICAgcmV0dXJuIDA7CisJLy8gQWRqdXN0IHNvIHdlIGFsd2F5cyBmaXQgdG8gYm90dG9tCisJbVN0YXJ0WSA9IG1Db25zb2xlWSArIChtQ29uc29sZUggJSBtRm9udEhlaWdodCk7CisJcmV0dXJuIDA7CiB9CiAKIC8vIElzSW5SZWdpb24gLSBDaGVja3MgaWYgdGhlIHJlcXVlc3QgaXMgaGFuZGxlZCBieSB0aGlzIG9iamVjdAogLy8gIFJldHVybiAwIGlmIHRoaXMgb2JqZWN0IGhhbmRsZXMgdGhlIHJlcXVlc3QsIDEgaWYgbm90CiBpbnQgR1VJQ29uc29sZTo6SXNJblJlZ2lvbihpbnQgeCwgaW50IHkpCiB7Ci0gICAgaWYgKG1TbGlkZW91dCkKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZXkgdGFwcGVkIHRoZSBzbGlkZW91dCBidXR0b24KLSAgICAgICAgaWYgKHggPj0gbVNsaWRlb3V0WCAmJiB4IDw9IG1TbGlkZW91dFggKyBtU2xpZGVvdXRXICYmIHkgPj0gbVNsaWRlb3V0WSAmJiB5IDwgbVNsaWRlb3V0WSArIG1TbGlkZW91dEgpCi0gICAgICAgICAgICByZXR1cm4gMTsKKwlpZiAobVNsaWRlb3V0KQorCXsKKwkJLy8gQ2hlY2sgaWYgdGhleSB0YXBwZWQgdGhlIHNsaWRlb3V0IGJ1dHRvbgorCQlpZiAoeCA+PSBtU2xpZGVvdXRYICYmIHggPD0gbVNsaWRlb3V0WCArIG1TbGlkZW91dFcgJiYgeSA+PSBtU2xpZGVvdXRZICYmIHkgPCBtU2xpZGVvdXRZICsgbVNsaWRlb3V0SCkKKwkJCXJldHVybiAxOwogCi0gICAgICAgIC8vIElmIHdlJ3JlIG9ubHkgcmVuZGVyaW5nIHRoZSBzbGlkZW91dCwgYmFpbCBub3cKLSAgICAgICAgaWYgKG1TbGlkZW91dFN0YXRlID09IGhpZGRlbikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KKwkJLy8gSWYgd2UncmUgb25seSByZW5kZXJpbmcgdGhlIHNsaWRlb3V0LCBiYWlsIG5vdworCQlpZiAobVNsaWRlb3V0U3RhdGUgPT0gaGlkZGVuKQorCQkJcmV0dXJuIDA7CisJfQogCi0gICAgcmV0dXJuICh4IDwgbUNvbnNvbGVYIHx8IHggPiBtQ29uc29sZVggKyBtQ29uc29sZVcgfHwgeSA8IG1Db25zb2xlWSB8fCB5ID4gbUNvbnNvbGVZICsgbUNvbnNvbGVIKSA/IDAgOiAxOworCXJldHVybiAoeCA8IG1Db25zb2xlWCB8fCB4ID4gbUNvbnNvbGVYICsgbUNvbnNvbGVXIHx8IHkgPCBtQ29uc29sZVkgfHwgeSA+IG1Db25zb2xlWSArIG1Db25zb2xlSCkgPyAwIDogMTsKIH0KIAogLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAogLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvcgogaW50IEdVSUNvbnNvbGU6Ok5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpCiB7Ci0gICAgaWYgKG1TbGlkZW91dCAmJiBtU2xpZGVvdXRTdGF0ZSA9PSBoaWRkZW4pCi0gICAgewotICAgICAgICBpZiAoc3RhdGUgPT0gVE9VQ0hfU1RBUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1TbGlkZW91dFN0YXRlID0gcmVxdWVzdF9zaG93OwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobVNsaWRlb3V0ICYmIG1TbGlkZW91dFN0YXRlID09IHZpc2libGUpCi0gICAgewotICAgICAgICAvLyBBcmUgd2Ugc2xpZGluZyBpdCBiYWNrIGluPwotICAgICAgICBpZiAoc3RhdGUgPT0gVE9VQ0hfU1RBUlQgJiYgeCA+IG1TbGlkZW91dFggJiYgeCA8IChtU2xpZGVvdXRYICsgbVNsaWRlb3V0VykgJiYgeSA+IG1TbGlkZW91dFkgJiYgeSA8IChtU2xpZGVvdXRZICsgbVNsaWRlb3V0SCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1TbGlkZW91dFN0YXRlID0gcmVxdWVzdF9oaWRlOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKG1TbGlkZW91dCAmJiBtU2xpZGVvdXRTdGF0ZSA9PSBoaWRkZW4pCisJeworCQlpZiAoc3RhdGUgPT0gVE9VQ0hfU1RBUlQpCisJCXsKKwkJCW1TbGlkZW91dFN0YXRlID0gcmVxdWVzdF9zaG93OworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJZWxzZSBpZiAobVNsaWRlb3V0ICYmIG1TbGlkZW91dFN0YXRlID09IHZpc2libGUpCisJeworCQkvLyBBcmUgd2Ugc2xpZGluZyBpdCBiYWNrIGluPworCQlpZiAoc3RhdGUgPT0gVE9VQ0hfU1RBUlQgJiYgeCA+IG1TbGlkZW91dFggJiYgeCA8IChtU2xpZGVvdXRYICsgbVNsaWRlb3V0VykgJiYgeSA+IG1TbGlkZW91dFkgJiYgeSA8IChtU2xpZGVvdXRZICsgbVNsaWRlb3V0SCkpCisJCXsKKwkJCW1TbGlkZW91dFN0YXRlID0gcmVxdWVzdF9oaWRlOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CiAKLSAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBsaW5lcyB0byBzY3JvbGwsIHRocm93IHRoaXMgYXdheS4KLSAgICBpZiAobUxhc3RDb3VudCA8IG1NYXhSb3dzKSAgIHJldHVybiAxOworCS8vIElmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGxpbmVzIHRvIHNjcm9sbCwgdGhyb3cgdGhpcyBhd2F5LgorCWlmIChtTGFzdENvdW50IDwgbU1heFJvd3MpICAgcmV0dXJuIDE7CiAKLSAgICAvLyBXZSBhcmUgc2Nyb2xsaW5nISEhCi0gICAgc3dpdGNoIChzdGF0ZSkKLSAgICB7Ci0gICAgY2FzZSBUT1VDSF9TVEFSVDoKLSAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgIGlmICgoeCAtIG1Db25zb2xlWCkgPiAoKDkgKiBtQ29uc29sZVcpIC8gMTApKQotICAgICAgICAgICAgbVNsaWRlTXVsdGlwbGllciA9IDEwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtU2xpZGVNdWx0aXBsaWVyID0gMTsKLSAgICAgICAgYnJlYWs7CisJLy8gV2UgYXJlIHNjcm9sbGluZyEhIQorCXN3aXRjaCAoc3RhdGUpCisJeworCWNhc2UgVE9VQ0hfU1RBUlQ6CisJCW1MYXN0VG91Y2hYID0geDsKKwkJbUxhc3RUb3VjaFkgPSB5OworCQlpZiAoKHggLSBtQ29uc29sZVgpID4gKCg5ICogbUNvbnNvbGVXKSAvIDEwKSkKKwkJCW1TbGlkZU11bHRpcGxpZXIgPSAxMDsKKwkJZWxzZQorCQkJbVNsaWRlTXVsdGlwbGllciA9IDE7CisJCWJyZWFrOwogCi0gICAgY2FzZSBUT1VDSF9EUkFHOgotICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGFwcGluZwotICAgICAgICBpZiAoeCA9PSBtTGFzdFRvdWNoWCAmJiB5ID09IG1MYXN0VG91Y2hZKSAgIGJyZWFrOwotICAgICAgICBtTGFzdFRvdWNoWCA9IC0xOworCWNhc2UgVE9VQ0hfRFJBRzoKKwkJLy8gVGhpcyBoYW5kbGVzIHRhcHBpbmcKKwkJaWYgKHggPT0gbUxhc3RUb3VjaFggJiYgeSA9PSBtTGFzdFRvdWNoWSkgICBicmVhazsKKwkJbUxhc3RUb3VjaFggPSAtMTsKIAotICAgICAgICBpZiAoeSA+IG1MYXN0VG91Y2hZICsgNSkKLSAgICAgICAgewotICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OwotICAgICAgICAgICAgaWYgKG1DdXJyZW50TGluZSA9PSAtMSkKLSAgICAgICAgICAgICAgICBtQ3VycmVudExpbmUgPSBtTGFzdENvdW50IC0gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG1DdXJyZW50TGluZSA+IG1TbGlkZU11bHRpcGxpZXIpCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRMaW5lIC09IG1TbGlkZU11bHRpcGxpZXI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRMaW5lID0gbU1heFJvd3M7CisJCWlmICh5ID4gbUxhc3RUb3VjaFkgKyA1KQorCQl7CisJCQltTGFzdFRvdWNoWSA9IHk7CisJCQlpZiAobUN1cnJlbnRMaW5lID09IC0xKQorCQkJCW1DdXJyZW50TGluZSA9IG1MYXN0Q291bnQgLSAxOworCQkJZWxzZSBpZiAobUN1cnJlbnRMaW5lID4gbVNsaWRlTXVsdGlwbGllcikKKwkJCQltQ3VycmVudExpbmUgLT0gbVNsaWRlTXVsdGlwbGllcjsKKwkJCWVsc2UKKwkJCQltQ3VycmVudExpbmUgPSBtTWF4Um93czsKIAotICAgICAgICAgICAgaWYgKG1DdXJyZW50TGluZSA8IChpbnQpIG1NYXhSb3dzKQotICAgICAgICAgICAgICAgIG1DdXJyZW50TGluZSA9IG1NYXhSb3dzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHkgPCBtTGFzdFRvdWNoWSAtIDUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudExpbmUgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudExpbmUgKz0gbVNsaWRlTXVsdGlwbGllcjsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRMaW5lID49IChpbnQpIG1MYXN0Q291bnQpCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TGluZSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCQkJaWYgKG1DdXJyZW50TGluZSA8IChpbnQpIG1NYXhSb3dzKQorCQkJCW1DdXJyZW50TGluZSA9IG1NYXhSb3dzOworCQl9CisJCWVsc2UgaWYgKHkgPCBtTGFzdFRvdWNoWSAtIDUpCisJCXsKKwkJCW1MYXN0VG91Y2hZID0geTsKKwkJCWlmIChtQ3VycmVudExpbmUgPj0gMCkKKwkJCXsKKwkJCQltQ3VycmVudExpbmUgKz0gbVNsaWRlTXVsdGlwbGllcjsKKwkJCQlpZiAobUN1cnJlbnRMaW5lID49IChpbnQpIG1MYXN0Q291bnQpCisJCQkJCW1DdXJyZW50TGluZSA9IC0xOworCQkJfQorCQl9CisJCWJyZWFrOwogCi0gICAgY2FzZSBUT1VDSF9SRUxFQVNFOgotICAgICAgICAvLyBPbiBhIHRhcCwgd2UganVtcCB0byB0aGUgdGFpbAotICAgICAgICBpZiAobUxhc3RUb3VjaFggPj0gMCkKLSAgICAgICAgICAgIG1DdXJyZW50TGluZSA9IC0xOworCWNhc2UgVE9VQ0hfUkVMRUFTRToKKwkJLy8gT24gYSB0YXAsIHdlIGp1bXAgdG8gdGhlIHRhaWwKKwkJaWYgKG1MYXN0VG91Y2hYID49IDApCisJCQltQ3VycmVudExpbmUgPSAtMTsKIAotICAgICAgICBtTGFzdFRvdWNoWSA9IC0xOworCQltTGFzdFRvdWNoWSA9IC0xOwogCWNhc2UgVE9VQ0hfUkVQRUFUOgogCWNhc2UgVE9VQ0hfSE9MRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzEwMjR4NjAwL3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy8xMDI0eDYwMC9yZXMvdWkueG1sCmluZGV4IDU5NzljNTAuLjJiN2QyMGUgMTAwNzU1Ci0tLSBhL2d1aS9kZXZpY2VzLzEwMjR4NjAwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvMTAyNHg2MDAvcmVzL3VpLnhtbApAQCAtMjU4Nyw2ICsyNTg3LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVzbGlkZXJ2YWx1ZV94JSIgeT0iJXJvdzNfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSI9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfZmFsc2UiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTYwPC9hY3Rpb24+CkBAIC0yNTk2LDYgKzI1OTcsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJXNsaWRlcnZhbHVlX3glIiB5PSIlcm93M190ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfdHJ1ZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9MDwvYWN0aW9uPgpAQCAtMjYwMyw2ICsyNjA1LDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJzbGlkZXJ2YWx1ZSI+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0ic2xpZGVydmFsdWVfeCIgeT0iJXJvdzVfdGV4dF95JSIgdz0iJXNsaWRlcnZhbHVlX3clIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb2xvcnMgbGluZT0iJXNsaWRlcnZhbHVlX2xpbmVfY2xyJSIgc2xpZGVyPSIlc2xpZGVydmFsdWVfc2xpZGVyX2NsciUiIC8+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvMTAyNHg3NjgvcmVzL3VpLnhtbAppbmRleCA4NmNmZGRhLi5iNjI1MTc0IDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy8xMDI0eDc2OC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzEwMjR4NzY4L3Jlcy91aS54bWwKQEAgLTI1ODcsNiArMjU4Nyw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlc2xpZGVydmFsdWVfeCUiIHk9IiVyb3czX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjU5Niw2ICsyNTk3LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVzbGlkZXJ2YWx1ZV94JSIgeT0iJXJvdzNfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X3RydWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTA8L2FjdGlvbj4KQEAgLTI2MDMsNiArMjYwNSw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0ic2xpZGVydmFsdWUiPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9InNsaWRlcnZhbHVlX3giIHk9IiVyb3c1X3RleHRfeSUiIHc9IiVzbGlkZXJ2YWx1ZV93JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29sb3JzIGxpbmU9IiVzbGlkZXJ2YWx1ZV9saW5lX2NsciUiIHNsaWRlcj0iJXNsaWRlcnZhbHVlX3NsaWRlcl9jbHIlIiAvPgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTA4MHgxOTIwL3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy8xMDgweDE5MjAvcmVzL3VpLnhtbAppbmRleCBlMjMwODZhLi4yOWM4YmMzIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy8xMDgweDE5MjAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy8xMDgweDE5MjAvcmVzL3VpLnhtbApAQCAtMjU5OCw2ICsyNTk4LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVjb2wxX3glIiB5PSIlcm93Ml90ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9Ij0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTx0ZXh0PkVuYWJsZSBzY3JlZW4gdGltZW91dC48L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJjaGVja2JveF9mYWxzZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9NjA8L2FjdGlvbj4KQEAgLTI2MDcsNiArMjYwOCw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlY29sMV94JSIgeT0iJXJvdzJfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X3RydWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTA8L2FjdGlvbj4KQEAgLTI2MTQsNiArMjYxNiw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0ic2xpZGVydmFsdWUiPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9ImNvbDFfeCIgeT0iJXJvdzRfdGV4dF95JSIgdz0iJXNsaWRlcnZhbHVlX3clIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb2xvcnMgbGluZT0iJXNsaWRlcnZhbHVlX2xpbmVfY2xyJSIgc2xpZGVyPSIlc2xpZGVydmFsdWVfc2xpZGVyX2NsciUiIC8+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8xMjgweDgwMC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvMTI4MHg4MDAvcmVzL3VpLnhtbAppbmRleCA0YTA2NmEzLi5iODZmOTkxIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy8xMjgweDgwMC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzEyODB4ODAwL3Jlcy91aS54bWwKQEAgLTI1ODcsNiArMjU4Nyw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlc2xpZGVydmFsdWVfeCUiIHk9IiVyb3czX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjU5Niw2ICsyNTk3LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVzbGlkZXJ2YWx1ZV94JSIgeT0iJXJvdzNfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X3RydWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTA8L2FjdGlvbj4KQEAgLTI2MDMsNiArMjYwNSw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0ic2xpZGVydmFsdWUiPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9InNsaWRlcnZhbHVlX3giIHk9IiVyb3c1X3RleHRfeSUiIHc9IiVzbGlkZXJ2YWx1ZV93JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29sb3JzIGxpbmU9IiVzbGlkZXJ2YWx1ZV9saW5lX2NsciUiIHNsaWRlcj0iJXNsaWRlcnZhbHVlX3NsaWRlcl9jbHIlIiAvPgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvMTkyMHgxMjAwL3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy8xOTIweDEyMDAvcmVzL3VpLnhtbAppbmRleCA0NThhNzIzLi4xNTcwMDVmIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy8xOTIweDEyMDAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy8xOTIweDEyMDAvcmVzL3VpLnhtbApAQCAtMjU4Nyw2ICsyNTg3LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVzbGlkZXJ2YWx1ZV94JSIgeT0iJXJvdzNfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSI9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfZmFsc2UiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTYwPC9hY3Rpb24+CkBAIC0yNTk2LDYgKzI1OTcsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJXNsaWRlcnZhbHVlX3glIiB5PSIlcm93M190ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfdHJ1ZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9MDwvYWN0aW9uPgpAQCAtMjYwMyw2ICsyNjA1LDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJzbGlkZXJ2YWx1ZSI+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0ic2xpZGVydmFsdWVfeCIgeT0iJXJvdzVfdGV4dF95JSIgdz0iJXNsaWRlcnZhbHVlX3clIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb2xvcnMgbGluZT0iJXNsaWRlcnZhbHVlX2xpbmVfY2xyJSIgc2xpZGVyPSIlc2xpZGVydmFsdWVfc2xpZGVyX2NsciUiIC8+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy8yNTYweDE2MDAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvdWkueG1sCmluZGV4IDZhNzdhNGYuLjNkNmI2NWYgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzI1NjB4MTYwMC9yZXMvdWkueG1sCkBAIC0yNTg3LDYgKzI1ODcsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJXNsaWRlcnZhbHVlX3glIiB5PSIlcm93M190ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9Ij0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTx0ZXh0PkVuYWJsZSBzY3JlZW4gdGltZW91dC48L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJjaGVja2JveF9mYWxzZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9NjA8L2FjdGlvbj4KQEAgLTI1OTYsNiArMjU5Nyw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlc2xpZGVydmFsdWVfeCUiIHk9IiVyb3czX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTx0ZXh0PkVuYWJsZSBzY3JlZW4gdGltZW91dC48L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJjaGVja2JveF90cnVlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz0wPC9hY3Rpb24+CkBAIC0yNjAzLDYgKzI2MDUsNyBAQAogCiAJCQk8b2JqZWN0IHR5cGU9InNsaWRlcnZhbHVlIj4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHBsYWNlbWVudCB4PSJzbGlkZXJ2YWx1ZV94IiB5PSIlcm93NV90ZXh0X3klIiB3PSIlc2xpZGVydmFsdWVfdyUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbG9ycyBsaW5lPSIlc2xpZGVydmFsdWVfbGluZV9jbHIlIiBzbGlkZXI9IiVzbGlkZXJ2YWx1ZV9zbGlkZXJfY2xyJSIgLz4KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzMyMHg0ODAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzMyMHg0ODAvcmVzL3VpLnhtbAppbmRleCAwNDFhMTM1Li4wNzE5YTk0IDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy8zMjB4NDgwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvMzIweDQ4MC9yZXMvdWkueG1sCkBAIC0yNTg1LDYgKzI1ODUsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJWNvbDFfeCUiIHk9IiVyb3cyX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjU5NCw2ICsyNTk1LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVjb2wxX3glIiB5PSIlcm93Ml90ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfdHJ1ZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9MDwvYWN0aW9uPgpAQCAtMjYwMSw2ICsyNjAzLDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJzbGlkZXJ2YWx1ZSI+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iY29sMV94IiB5PSIlcm93NF90ZXh0X3klIiB3PSIlc2xpZGVydmFsdWVfdyUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbG9ycyBsaW5lPSIlc2xpZGVydmFsdWVfbGluZV9jbHIlIiBzbGlkZXI9IiVzbGlkZXJ2YWx1ZV9zbGlkZXJfY2xyJSIgLz4KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzQ4MHg4MDAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzQ4MHg4MDAvcmVzL3VpLnhtbAppbmRleCAyYjQyOGI0Li5iN2I1MjdiIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy80ODB4ODAwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvNDgweDgwMC9yZXMvdWkueG1sCkBAIC0yNTg1LDYgKzI1ODUsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJWNvbDFfeCUiIHk9IiVyb3cyX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjU5NCw2ICsyNTk1LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVjb2wxX3glIiB5PSIlcm93Ml90ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfdHJ1ZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9MDwvYWN0aW9uPgpAQCAtMjYwMSw2ICsyNjAzLDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJzbGlkZXJ2YWx1ZSI+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iY29sMV94IiB5PSIlcm93NF90ZXh0X3klIiB3PSIlc2xpZGVydmFsdWVfdyUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbG9ycyBsaW5lPSIlc2xpZGVydmFsdWVfbGluZV9jbHIlIiBzbGlkZXI9IiVzbGlkZXJ2YWx1ZV9zbGlkZXJfY2xyJSIgLz4KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzQ4MHg4NTQvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzQ4MHg4NTQvcmVzL3VpLnhtbAppbmRleCBmOGQ2ZGExLi5jYjY1NzdmIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy80ODB4ODU0L3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvNDgweDg1NC9yZXMvdWkueG1sCkBAIC0yNTg0LDYgKzI1ODQsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJWNvbDFfeCUiIHk9IiVyb3cyX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjU5Myw2ICsyNTk0LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVjb2wxX3glIiB5PSIlcm93Ml90ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfdHJ1ZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9MDwvYWN0aW9uPgpAQCAtMjYwMCw2ICsyNjAyLDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJzbGlkZXJ2YWx1ZSI+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iY29sMV94IiB5PSIlcm93NF90ZXh0X3klIiB3PSIlc2xpZGVydmFsdWVfdyUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbG9ycyBsaW5lPSIlc2xpZGVydmFsdWVfbGluZV9jbHIlIiBzbGlkZXI9IiVzbGlkZXJ2YWx1ZV9zbGlkZXJfY2xyJSIgLz4KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzU0MHg5NjAvcmVzL3VpLnhtbCBiL2d1aS9kZXZpY2VzLzU0MHg5NjAvcmVzL3VpLnhtbAppbmRleCA3NDQ4ZGRmLi4wNzhmMWFlIDEwMDY0NAotLS0gYS9ndWkvZGV2aWNlcy81NDB4OTYwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvNTQweDk2MC9yZXMvdWkueG1sCkBAIC0yNTg1LDYgKzI1ODUsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJWNvbDFfeCUiIHk9IiVyb3cyX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjU5NCw2ICsyNTk1LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVjb2wxX3glIiB5PSIlcm93Ml90ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfdHJ1ZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9MDwvYWN0aW9uPgpAQCAtMjYwMSw2ICsyNjAzLDcgQEAKIAogCQkJPG9iamVjdCB0eXBlPSJzbGlkZXJ2YWx1ZSI+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTxwbGFjZW1lbnQgeD0iY29sMV94IiB5PSIlcm93NF90ZXh0X3klIiB3PSIlc2xpZGVydmFsdWVfdyUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbG9ycyBsaW5lPSIlc2xpZGVydmFsdWVfbGluZV9jbHIlIiBzbGlkZXI9IiVzbGlkZXJ2YWx1ZV9zbGlkZXJfY2xyJSIgLz4KZGlmZiAtLWdpdCBhL2d1aS9kZXZpY2VzLzcyMHgxMjgwL3Jlcy91aS54bWwgYi9ndWkvZGV2aWNlcy83MjB4MTI4MC9yZXMvdWkueG1sCmluZGV4IDIzMTljNTUuLmQyODk2Y2MgMTAwNjQ0Ci0tLSBhL2d1aS9kZXZpY2VzLzcyMHgxMjgwL3Jlcy91aS54bWwKKysrIGIvZ3VpL2RldmljZXMvNzIweDEyODAvcmVzL3VpLnhtbApAQCAtMjU5OCw2ICsyNTk4LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVjb2wxX3glIiB5PSIlcm93Ml90ZXh0X3klIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9Ij0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTx0ZXh0PkVuYWJsZSBzY3JlZW4gdGltZW91dC48L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJjaGVja2JveF9mYWxzZSIgLz4KIAkJCQk8YWN0aW9uIGZ1bmN0aW9uPSJzZXQiPnR3X3NjcmVlbl90aW1lb3V0X3NlY3M9NjA8L2FjdGlvbj4KQEAgLTI2MDcsNiArMjYwOCw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlY29sMV94JSIgeT0iJXJvdzJfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X3RydWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTA8L2FjdGlvbj4KQEAgLTI2MTQsNiArMjYxNiw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0ic2xpZGVydmFsdWUiPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9ImNvbDFfeCIgeT0iJXJvdzRfdGV4dF95JSIgdz0iJXNsaWRlcnZhbHVlX3clIiAvPgogCQkJCTxmb250IHJlc291cmNlPSJmb250IiBjb2xvcj0iJXRleHRfY29sb3IlIiAvPgogCQkJCTxjb2xvcnMgbGluZT0iJXNsaWRlcnZhbHVlX2xpbmVfY2xyJSIgc2xpZGVyPSIlc2xpZGVydmFsdWVfc2xpZGVyX2NsciUiIC8+CmRpZmYgLS1naXQgYS9ndWkvZGV2aWNlcy84MDB4MTI4MC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvODAweDEyODAvcmVzL3VpLnhtbAppbmRleCA2OTJjNzM2Li5iYTdkYmEzIDEwMDc1NQotLS0gYS9ndWkvZGV2aWNlcy84MDB4MTI4MC9yZXMvdWkueG1sCisrKyBiL2d1aS9kZXZpY2VzLzgwMHgxMjgwL3Jlcy91aS54bWwKQEAgLTI1ODYsNiArMjU4Niw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlY29sMV94JSIgeT0iJXJvdzJfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSI9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8dGV4dD5FbmFibGUgc2NyZWVuIHRpbWVvdXQuPC90ZXh0PgogCQkJCTxpbWFnZSByZXNvdXJjZT0iY2hlY2tib3hfZmFsc2UiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTYwPC9hY3Rpb24+CkBAIC0yNTk1LDYgKzI1OTYsNyBAQAogCQkJCTxwbGFjZW1lbnQgeD0iJWNvbDFfeCUiIHk9IiVyb3cyX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iIT0iIHZhcjI9IjAiIC8+CisJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19ub19zY3JlZW5fdGltZW91dCIgb3A9IiE9IiB2YXIyPSIxIiAvPgogCQkJCTx0ZXh0PkVuYWJsZSBzY3JlZW4gdGltZW91dC48L3RleHQ+CiAJCQkJPGltYWdlIHJlc291cmNlPSJjaGVja2JveF90cnVlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz0wPC9hY3Rpb24+CkBAIC0yNjAyLDYgKzI2MDQsNyBAQAogCiAJCQk8b2JqZWN0IHR5cGU9InNsaWRlcnZhbHVlIj4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHBsYWNlbWVudCB4PSJjb2wxX3giIHk9IiVyb3c0X3RleHRfeSUiIHc9IiVzbGlkZXJ2YWx1ZV93JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29sb3JzIGxpbmU9IiVzbGlkZXJ2YWx1ZV9saW5lX2NsciUiIHNsaWRlcj0iJXNsaWRlcnZhbHVlX3NsaWRlcl9jbHIlIiAvPgpkaWZmIC0tZ2l0IGEvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvdWkueG1sIGIvZ3VpL2RldmljZXMvODAweDQ4MC9yZXMvdWkueG1sCmluZGV4IDc2OGYyNDYuLmJhMjYyYmMgMTAwNzU1Ci0tLSBhL2d1aS9kZXZpY2VzLzgwMHg0ODAvcmVzL3VpLnhtbAorKysgYi9ndWkvZGV2aWNlcy84MDB4NDgwL3Jlcy91aS54bWwKQEAgLTI1OTUsNiArMjU5NSw3IEBACiAJCQkJPHBsYWNlbWVudCB4PSIlc2xpZGVydmFsdWVfeCUiIHk9IiVyb3czX3RleHRfeSUiIC8+CiAJCQkJPGZvbnQgcmVzb3VyY2U9ImZvbnQiIGNvbG9yPSIldGV4dF9jb2xvciUiIC8+CiAJCQkJPGNvbmRpdGlvbiB2YXIxPSJ0d19zY3JlZW5fdGltZW91dF9zZWNzIiBvcD0iPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X2ZhbHNlIiAvPgogCQkJCTxhY3Rpb24gZnVuY3Rpb249InNldCI+dHdfc2NyZWVuX3RpbWVvdXRfc2Vjcz02MDwvYWN0aW9uPgpAQCAtMjYwNCw2ICsyNjA1LDcgQEAKIAkJCQk8cGxhY2VtZW50IHg9IiVzbGlkZXJ2YWx1ZV94JSIgeT0iJXJvdzNfdGV4dF95JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X3NjcmVlbl90aW1lb3V0X3NlY3MiIG9wPSIhPSIgdmFyMj0iMCIgLz4KKwkJCQk8Y29uZGl0aW9uIHZhcjE9InR3X25vX3NjcmVlbl90aW1lb3V0IiBvcD0iIT0iIHZhcjI9IjEiIC8+CiAJCQkJPHRleHQ+RW5hYmxlIHNjcmVlbiB0aW1lb3V0LjwvdGV4dD4KIAkJCQk8aW1hZ2UgcmVzb3VyY2U9ImNoZWNrYm94X3RydWUiIC8+CiAJCQkJPGFjdGlvbiBmdW5jdGlvbj0ic2V0Ij50d19zY3JlZW5fdGltZW91dF9zZWNzPTA8L2FjdGlvbj4KQEAgLTI2MTEsNiArMjYxMyw3IEBACiAKIAkJCTxvYmplY3QgdHlwZT0ic2xpZGVydmFsdWUiPgogCQkJCTxjb25kaXRpb24gdmFyMT0idHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIgb3A9IiE9IiB2YXIyPSIwIiAvPgorCQkJCTxjb25kaXRpb24gdmFyMT0idHdfbm9fc2NyZWVuX3RpbWVvdXQiIG9wPSIhPSIgdmFyMj0iMSIgLz4KIAkJCQk8cGxhY2VtZW50IHg9InNsaWRlcnZhbHVlX3giIHk9IiVyb3c1X3RleHRfeSUiIHc9IiVzbGlkZXJ2YWx1ZV93JSIgLz4KIAkJCQk8Zm9udCByZXNvdXJjZT0iZm9udCIgY29sb3I9IiV0ZXh0X2NvbG9yJSIgLz4KIAkJCQk8Y29sb3JzIGxpbmU9IiVzbGlkZXJ2YWx1ZV9saW5lX2NsciUiIHNsaWRlcj0iJXNsaWRlcnZhbHVlX3NsaWRlcl9jbHIlIiAvPgpkaWZmIC0tZ2l0IGEvZ3VpL2ZpbGVzZWxlY3Rvci5jcHAgYi9ndWkvZmlsZXNlbGVjdG9yLmNwcAppbmRleCA1MzliYmEwLi4wZjhkOTAzIDEwMDY0NAotLS0gYS9ndWkvZmlsZXNlbGVjdG9yLmNwcAorKysgYi9ndWkvZmlsZXNlbGVjdG9yLmNwcApAQCAtMTk4LDEyICsxOTgsMTIgQEAKIAogCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiaGlnaGxpZ2h0Y29sb3IiKTsKIAkJbWVtc2V0KCZtRm9udEhpZ2hsaWdodENvbG9yLCAwLCBzaXplb2YoQ09MT1IpKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKKwkJaWYgKGF0dHIpCisJCXsKKwkJCXN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKIAkJCUNvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbUZvbnRIaWdobGlnaHRDb2xvcik7CiAJCQloYXNGb250SGlnaGxpZ2h0Q29sb3IgPSB0cnVlOwotICAgICAgICB9CisJCX0KIAl9CiAKIAkvLyBMb2FkIHRoZSBzZXBhcmF0b3IgaWYgaXQgZXhpc3RzCkBAIC00MDgsMTEgKzQwOCwxMCBAQAogCWlmICh1cGRhdGVGaWxlTGlzdCkgewogCQlzdHJpbmcgdmFsdWU7CiAJCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZShtUGF0aFZhciwgdmFsdWUpOwotCQlpZiAoR2V0RmlsZUxpc3QodmFsdWUpID09IDApIHsKKwkJaWYgKEdldEZpbGVMaXN0KHZhbHVlKSA9PSAwKQogCQkJdXBkYXRlRmlsZUxpc3QgPSBmYWxzZTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcmV0dXJuIDA7Ci0JCX0KIAl9CiAKIAkvLyBUaGlzIHRlbGxzIHVzIGhvdyBtYW55IGxpbmVzIHdlIGNhbiBhY3R1YWxseSByZW5kZXIKQEAgLTY1Miw3ICs2NTEsOSBAQAogaW50IEdVSUZpbGVTZWxlY3Rvcjo6R2V0U2VsZWN0aW9uKGludCB4LCBpbnQgeSkKIHsKIAkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgeSBwb3NpdGlvbgotCWlmICh5IDwgbVJlbmRlclkgfHwgeSAtIG1SZW5kZXJZIDw9IG1IZWFkZXJIIHx8IHkgLSBtUmVuZGVyWSA+IG1SZW5kZXJIKSByZXR1cm4gLTE7CisJaWYgKHkgPCBtUmVuZGVyWSB8fCB5IC0gbVJlbmRlclkgPD0gbUhlYWRlckggfHwgeSAtIG1SZW5kZXJZID4gbVJlbmRlckgpCisJCXJldHVybiAtMTsKKwogCXJldHVybiAoeSAtIG1SZW5kZXJZIC0gbUhlYWRlckgpOwogfQogCkBAIC02NzQsNyArNjc1LDYgQEAKIAkJc3RhcnRZID0gbGFzdFkgPSBsYXN0MlkgPSB5OwogCQlzY3JvbGxpbmdTcGVlZCA9IDA7CiAJCWJyZWFrOwotCiAJY2FzZSBUT1VDSF9EUkFHOgogCQkvLyBDaGVjayBpZiB3ZSBkcmFnZ2VkIG91dCBvZiB0aGUgc2VsZWN0aW9uIHdpbmRvdwogCQlpZiAoR2V0U2VsZWN0aW9uKHgsIHkpID09IC0xKSB7CmRpZmYgLS1naXQgYS9ndWkvZmlsbC5jcHAgYi9ndWkvZmlsbC5jcHAKaW5kZXggOTAxZWVlMS4uYWQxZjRlMCAxMDA2NDQKLS0tIGEvZ3VpL2ZpbGwuY3BwCisrKyBiL2d1aS9maWxsLmNwcApAQCAtMjcsMzEgKzI3LDMxIEBACiAKIEdVSUZpbGw6OkdVSUZpbGwoeG1sX25vZGU8Piogbm9kZSkKIHsKLSAgICB4bWxfYXR0cmlidXRlPD4qIGF0dHI7Ci0gICAgeG1sX25vZGU8PiogY2hpbGQ7CisJeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOworCXhtbF9ub2RlPD4qIGNoaWxkOwogCi0gICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm47CisJaWYgKCFub2RlKQorCQlyZXR1cm47CiAKLSAgICBhdHRyID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJjb2xvciIpOwotICAgIGlmICghYXR0cikgeworCWF0dHIgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoImNvbG9yIik7CisJaWYgKCFhdHRyKSB7CiAJCUxPR0VSUigiTm8gY29sb3Igc3BlY2lmaWVkIGZvciBmaWxsXG4iKTsKLSAgICAgICAgcmV0dXJuOworCQlyZXR1cm47CiAJfQogCi0gICAgc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOwotICAgIENvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbUNvbG9yKTsKKwlzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7CisJQ29udmVydFN0clRvQ29sb3IoY29sb3IsICZtQ29sb3IpOwogCi0gICAgLy8gTG9hZCB0aGUgcGxhY2VtZW50Ci0gICAgTG9hZFBsYWNlbWVudChub2RlLT5maXJzdF9ub2RlKCJwbGFjZW1lbnQiKSwgJm1SZW5kZXJYLCAmbVJlbmRlclksICZtUmVuZGVyVywgJm1SZW5kZXJIKTsKKwkvLyBMb2FkIHRoZSBwbGFjZW1lbnQKKwlMb2FkUGxhY2VtZW50KG5vZGUtPmZpcnN0X25vZGUoInBsYWNlbWVudCIpLCAmbVJlbmRlclgsICZtUmVuZGVyWSwgJm1SZW5kZXJXLCAmbVJlbmRlckgpOwogCi0gICAgcmV0dXJuOworCXJldHVybjsKIH0KIAogaW50IEdVSUZpbGw6OlJlbmRlcih2b2lkKQogewotICAgIGdyX2NvbG9yKG1Db2xvci5yZWQsIG1Db2xvci5ncmVlbiwgbUNvbG9yLmJsdWUsIG1Db2xvci5hbHBoYSk7Ci0gICAgZ3JfZmlsbChtUmVuZGVyWCwgbVJlbmRlclksIG1SZW5kZXJXLCBtUmVuZGVySCk7Ci0gICAgcmV0dXJuIDA7CisJZ3JfY29sb3IobUNvbG9yLnJlZCwgbUNvbG9yLmdyZWVuLCBtQ29sb3IuYmx1ZSwgbUNvbG9yLmFscGhhKTsKKwlncl9maWxsKG1SZW5kZXJYLCBtUmVuZGVyWSwgbVJlbmRlclcsIG1SZW5kZXJIKTsKKwlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3VpL2d1aS5jcHAgYi9ndWkvZ3VpLmNwcAppbmRleCA4NzU1Njg5Li42ZWUyOWQ1IDEwMDY0NAotLS0gYS9ndWkvZ3VpLmNwcAorKysgYi9ndWkvZ3VpLmNwcApAQCAtNDcsNyArNDcsOSBAQAogI2luY2x1ZGUgIi4uL3ZhcmlhYmxlcy5oIgogI2luY2x1ZGUgIi4uL3BhcnRpdGlvbnMuaHBwIgogI2luY2x1ZGUgIi4uL3R3cnAtZnVuY3Rpb25zLmhwcCIKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKICNpbmNsdWRlICJibGFua3RpbWVyLmhwcCIKKyNlbmRpZgogCiBjb25zdCBzdGF0aWMgaW50IENVUlRBSU5fRkFERSA9IDMyOwogCkBAIC02Miw2OTIgKzY0LDY5NCBAQAogcHRocmVhZF9tdXRleF90IGdGb3JjZVJlbmRlcm11dGV4Owogc3RhdGljIGludCBnTm9BbmltYXRpb24gPSAxOwogc3RhdGljIGludCBnR3VpSW5wdXRSdW5uaW5nID0gMDsKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKIGJsYW5rdGltZXIgYmxhbmtUaW1lcjsKKyNlbmRpZgogCiAvLyBOZWVkZWQgYnkgcGFnZXMuY3BwIHRvbwogaW50IGdHdWlSdW5uaW5nID0gMDsKIAogc3RhdGljIGludCBnUmVjb3JkZXIgPSAtMTsKIAotZXh0ZXJuICJDIiB2b2lkIGdyX3dyaXRlX2ZyYW1lX3RvX2ZpbGUgKGludCBmZCk7CitleHRlcm4gIkMiIHZvaWQgZ3Jfd3JpdGVfZnJhbWVfdG9fZmlsZShpbnQgZmQpOwogCi12b2lkCi1mbGlwICh2b2lkKQordm9pZCBmbGlwKHZvaWQpCiB7Ci0gIGlmIChnUmVjb3JkZXIgIT0gLTEpCisJaWYgKGdSZWNvcmRlciAhPSAtMSkKIAl7Ci0JICB0aW1lc3BlYyB0aW1lOwotCSAgY2xvY2tfZ2V0dGltZSAoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZSk7Ci0JICB3cml0ZSAoZ1JlY29yZGVyLCAmdGltZSwgc2l6ZW9mICh0aW1lc3BlYykpOwotCSAgZ3Jfd3JpdGVfZnJhbWVfdG9fZmlsZSAoZ1JlY29yZGVyKTsKKwkJdGltZXNwZWMgdGltZTsKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lKTsKKwkJd3JpdGUoZ1JlY29yZGVyLCAmdGltZSwgc2l6ZW9mKHRpbWVzcGVjKSk7CisJCWdyX3dyaXRlX2ZyYW1lX3RvX2ZpbGUoZ1JlY29yZGVyKTsKIAl9Ci0gIGdyX2ZsaXAgKCk7Ci0gIHJldHVybjsKKwlncl9mbGlwKCk7CiB9CiAKLXZvaWQKLXJhcGlkeG1sOjpwYXJzZV9lcnJvcl9oYW5kbGVyIChjb25zdCBjaGFyICp3aGF0LCB2b2lkICp3aGVyZSkKK3ZvaWQgcmFwaWR4bWw6OnBhcnNlX2Vycm9yX2hhbmRsZXIoY29uc3QgY2hhciAqd2hhdCwgdm9pZCAqd2hlcmUpCiB7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlBhcnNlciBlcnJvcjogJXNcbiIsIHdoYXQpOwotICBmcHJpbnRmIChzdGRlcnIsICIgIFN0YXJ0IG9mIHN0cmluZzogJXNcbiIsIChjaGFyICopIHdoZXJlKTsKLSAgTE9HRVJSKCJFcnJvciBwYXJzaW5nIFhNTCBmaWxlLlxuIik7Ci0gIC8vYWJvcnQgKCk7CisJZnByaW50ZihzdGRlcnIsICJQYXJzZXIgZXJyb3I6ICVzXG4iLCB3aGF0KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgU3RhcnQgb2Ygc3RyaW5nOiAlc1xuIiwoY2hhciAqKSB3aGVyZSk7CisJTE9HRVJSKCJFcnJvciBwYXJzaW5nIFhNTCBmaWxlLlxuIik7CisJLy9hYm9ydCgpOwogfQogCi1zdGF0aWMgdm9pZAotY3VydGFpblNldCAoKQorc3RhdGljIHZvaWQgY3VydGFpblNldCgpCiB7Ci0gIGdyX2NvbG9yICgwLCAwLCAwLCAyNTUpOwotICBncl9maWxsICgwLCAwLCBncl9mYl93aWR0aCAoKSwgZ3JfZmJfaGVpZ2h0ICgpKTsKLSAgZ3JfYmxpdCAoZ0N1cnRhaW4sIDAsIDAsIGdyX2dldF93aWR0aCAoZ0N1cnRhaW4pLCBncl9nZXRfaGVpZ2h0IChnQ3VydGFpbiksCi0JCSAgIDAsIDApOwotICBncl9mbGlwICgpOwotICByZXR1cm47CisJZ3JfY29sb3IoMCwgMCwgMCwgMjU1KTsKKwlncl9maWxsKDAsIDAsIGdyX2ZiX3dpZHRoKCksIGdyX2ZiX2hlaWdodCgpKTsKKwlncl9ibGl0KGdDdXJ0YWluLCAwLCAwLCBncl9nZXRfd2lkdGgoZ0N1cnRhaW4pLCBncl9nZXRfaGVpZ2h0KGdDdXJ0YWluKSwgMCwgMCk7CisJZ3JfZmxpcCgpOwogfQogCi1zdGF0aWMgdm9pZAotY3VydGFpblJhaXNlIChncl9zdXJmYWNlIHN1cmZhY2UpCitzdGF0aWMgdm9pZCBjdXJ0YWluUmFpc2UoZ3Jfc3VyZmFjZSBzdXJmYWNlKQogewotICBpbnQgc3kgPSAwOwotICBpbnQgaCA9IGdyX2dldF9oZWlnaHQgKGdDdXJ0YWluKSAtIDE7Ci0gIGludCB3ID0gZ3JfZ2V0X3dpZHRoIChnQ3VydGFpbik7Ci0gIGludCBmeSA9IDE7CisJaW50IHN5ID0gMDsKKwlpbnQgaCA9IGdyX2dldF9oZWlnaHQoZ0N1cnRhaW4pIC0gMTsKKwlpbnQgdyA9IGdyX2dldF93aWR0aChnQ3VydGFpbik7CisJaW50IGZ5ID0gMTsKIAotICBpbnQgbXN3ID0gZ3JfZ2V0X3dpZHRoIChzdXJmYWNlKTsKLSAgaW50IG1zaCA9IGdyX2dldF9oZWlnaHQgKHN1cmZhY2UpOwotICBpbnQgQ1VSVEFJTl9SQVRFID0gbXNoIC8gMzA7CisJaW50IG1zdyA9IGdyX2dldF93aWR0aChzdXJmYWNlKTsKKwlpbnQgbXNoID0gZ3JfZ2V0X2hlaWdodChzdXJmYWNlKTsKKwlpbnQgQ1VSVEFJTl9SQVRFID0gbXNoIC8gMzA7CiAKLSAgaWYgKGdOb0FuaW1hdGlvbiA9PSAwKQorCWlmIChnTm9BbmltYXRpb24gPT0gMCkKIAl7Ci0JICBmb3IgKDsgaCA+IDA7IGggLT0gQ1VSVEFJTl9SQVRFLCBzeSArPSBDVVJUQUlOX1JBVEUsIGZ5ICs9IENVUlRBSU5fUkFURSkKKwkJZm9yICg7IGggPiAwOyBoIC09IENVUlRBSU5fUkFURSwgc3kgKz0gQ1VSVEFJTl9SQVRFLCBmeSArPSBDVVJUQUlOX1JBVEUpCiAJCXsKLQkJICBncl9ibGl0IChzdXJmYWNlLCAwLCAwLCBtc3csIG1zaCwgMCwgMCk7Ci0JCSAgZ3JfYmxpdCAoZ0N1cnRhaW4sIDAsIHN5LCB3LCBoLCAwLCAwKTsKLQkJICBncl9mbGlwICgpOworCQkJZ3JfYmxpdChzdXJmYWNlLCAwLCAwLCBtc3csIG1zaCwgMCwgMCk7CisJCQlncl9ibGl0KGdDdXJ0YWluLCAwLCBzeSwgdywgaCwgMCwgMCk7CisJCQlncl9mbGlwKCk7CiAJCX0KIAl9Ci0gIGdyX2JsaXQgKHN1cmZhY2UsIDAsIDAsIG1zdywgbXNoLCAwLCAwKTsKLSAgZmxpcCAoKTsKLSAgcmV0dXJuOworCWdyX2JsaXQoc3VyZmFjZSwgMCwgMCwgbXN3LCBtc2gsIDAsIDApOworCWZsaXAoKTsKIH0KIAotdm9pZAotY3VydGFpbkNsb3NlICgpCit2b2lkIGN1cnRhaW5DbG9zZSgpCiB7CiAjaWYgMAotICBpbnQgdyA9IGdyX2dldF93aWR0aCAoZ0N1cnRhaW4pOwotICBpbnQgaCA9IDE7Ci0gIGludCBzeSA9IGdyX2dldF9oZWlnaHQgKGdDdXJ0YWluKSAtIDE7Ci0gIGludCBmYmggPSBncl9mYl9oZWlnaHQgKCk7Ci0gIGludCBDVVJUQUlOX1JBVEUgPSBmYmggLyAzMDsKKwlpbnQgdyA9IGdyX2dldF93aWR0aChnQ3VydGFpbik7CisJaW50IGggPSAxOworCWludCBzeSA9IGdyX2dldF9oZWlnaHQoZ0N1cnRhaW4pIC0gMTsKKwlpbnQgZmJoID0gZ3JfZmJfaGVpZ2h0KCk7CisJaW50IENVUlRBSU5fUkFURSA9IGZiaCAvIDMwOwogCi0gIGlmIChnTm9BbmltYXRpb24gPT0gMCkKKwlpZiAoZ05vQW5pbWF0aW9uID09IDApCiAJewotCSAgZm9yICg7IGggPCBmYmg7IGggKz0gQ1VSVEFJTl9SQVRFLCBzeSAtPSBDVVJUQUlOX1JBVEUpCisJCWZvciAoOyBoIDwgZmJoOyBoICs9IENVUlRBSU5fUkFURSwgc3kgLT0gQ1VSVEFJTl9SQVRFKQogCQl7Ci0JCSAgZ3JfYmxpdCAoZ0N1cnRhaW4sIDAsIHN5LCB3LCBoLCAwLCAwKTsKLQkJICBncl9mbGlwICgpOworCQkJZ3JfYmxpdChnQ3VydGFpbiwgMCwgc3ksIHcsIGgsIDAsIDApOworCQkJZ3JfZmxpcCgpOwogCQl9Ci0JICBncl9ibGl0IChnQ3VydGFpbiwgMCwgMCwgZ3JfZ2V0X3dpZHRoIChnQ3VydGFpbiksCi0JCQkgICBncl9nZXRfaGVpZ2h0IChnQ3VydGFpbiksIDAsIDApOwotCSAgZ3JfZmxpcCAoKTsKKwkJZ3JfYmxpdChnQ3VydGFpbiwgMCwgMCwgZ3JfZ2V0X3dpZHRoKGdDdXJ0YWluKSwKKwkJZ3JfZ2V0X2hlaWdodChnQ3VydGFpbiksIDAsIDApOworCQlncl9mbGlwKCk7CiAKLQkgIGlmIChnUmVjb3JkZXIgIT0gLTEpCi0JCWNsb3NlIChnUmVjb3JkZXIpOworCQlpZiAoZ1JlY29yZGVyICE9IC0xKQorCQkJY2xvc2UoZ1JlY29yZGVyKTsKIAotCSAgaW50IGZhZGU7Ci0JICBmb3IgKGZhZGUgPSAxNjsgZmFkZSA8IDI1NTsgZmFkZSArPSBDVVJUQUlOX0ZBREUpCisJCWludCBmYWRlOworCQlmb3IgKGZhZGUgPSAxNjsgZmFkZSA8IDI1NTsgZmFkZSArPSBDVVJUQUlOX0ZBREUpCiAJCXsKLQkJICBncl9ibGl0IChnQ3VydGFpbiwgMCwgMCwgZ3JfZ2V0X3dpZHRoIChnQ3VydGFpbiksCi0JCQkJICAgZ3JfZ2V0X2hlaWdodCAoZ0N1cnRhaW4pLCAwLCAwKTsKLQkJICBncl9jb2xvciAoMCwgMCwgMCwgZmFkZSk7Ci0JCSAgZ3JfZmlsbCAoMCwgMCwgZ3JfZmJfd2lkdGggKCksIGdyX2ZiX2hlaWdodCAoKSk7Ci0JCSAgZ3JfZmxpcCAoKTsKKwkJCWdyX2JsaXQoZ0N1cnRhaW4sIDAsIDAsIGdyX2dldF93aWR0aChnQ3VydGFpbiksCisJCQlncl9nZXRfaGVpZ2h0KGdDdXJ0YWluKSwgMCwgMCk7CisJCQlncl9jb2xvcigwLCAwLCAwLCBmYWRlKTsKKwkJCWdyX2ZpbGwoMCwgMCwgZ3JfZmJfd2lkdGgoKSwgZ3JfZmJfaGVpZ2h0KCkpOworCQkJZ3JfZmxpcCgpOwogCQl9Ci0JICBncl9jb2xvciAoMCwgMCwgMCwgMjU1KTsKLQkgIGdyX2ZpbGwgKDAsIDAsIGdyX2ZiX3dpZHRoICgpLCBncl9mYl9oZWlnaHQgKCkpOwotCSAgZ3JfZmxpcCAoKTsKKwkJZ3JfY29sb3IoMCwgMCwgMCwgMjU1KTsKKwkJZ3JfZmlsbCgwLCAwLCBncl9mYl93aWR0aCgpLCBncl9mYl9oZWlnaHQoKSk7CisJCWdyX2ZsaXAoKTsKIAl9CiAjZWxzZQotICBncl9ibGl0IChnQ3VydGFpbiwgMCwgMCwgZ3JfZ2V0X3dpZHRoIChnQ3VydGFpbiksIGdyX2dldF9oZWlnaHQgKGdDdXJ0YWluKSwKLQkJICAgMCwgMCk7Ci0gIGdyX2ZsaXAgKCk7CisJZ3JfYmxpdChnQ3VydGFpbiwgMCwgMCwgZ3JfZ2V0X3dpZHRoKGdDdXJ0YWluKSwgZ3JfZ2V0X2hlaWdodChnQ3VydGFpbiksIDAsIDApOworCWdyX2ZsaXAoKTsKICNlbmRpZgotICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkICoKLWlucHV0X3RocmVhZCAodm9pZCAqY29va2llKQorc3RhdGljIHZvaWQgKiBpbnB1dF90aHJlYWQodm9pZCAqY29va2llKQogewotICBpbnQgZHJhZyA9IDA7Ci0gIHN0YXRpYyBpbnQgdG91Y2hfYW5kX2hvbGQgPSAwLCBkb250d2FpdCA9IDAsIHRvdWNoX3JlcGVhdCA9IDAsIHggPSAwLCB5ID0KLQkwLCBsc2hpZnQgPSAwLCByc2hpZnQgPSAwLCBrZXlfcmVwZWF0ID0gMDsKLSAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHRvdWNoU3RhcnQ7Ci0gIEhhcmR3YXJlS2V5Ym9hcmQga2I7Ci0gIHN0cmluZyBzZWNvbmRzOwogCi0gIC8vc3RhcnQgc2NyZWVuIHRpbWVvdXQgdGhyZWFkcwotICBibGFua1RpbWVyLnNldFRpbWVyVGhyZWFkKCk7Ci0gIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZSgidHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIsIHNlY29uZHMpOwotICBibGFua1RpbWVyLnNldFRpbWUoYXRvaShzZWNvbmRzLmNfc3RyKCkpKTsKKwlpbnQgZHJhZyA9IDA7CisJc3RhdGljIGludCB0b3VjaF9hbmRfaG9sZCA9IDAsIGRvbnR3YWl0ID0gMDsKKwlzdGF0aWMgaW50IHRvdWNoX3JlcGVhdCA9IDAsIGtleV9yZXBlYXQgPSAwOworCXN0YXRpYyBpbnQgeCA9IDAsIHkgPSAwOworCXN0YXRpYyBpbnQgbHNoaWZ0ID0gMCwgcnNoaWZ0ID0gMDsKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgdG91Y2hTdGFydDsKKwlIYXJkd2FyZUtleWJvYXJkIGtiOworCXN0cmluZyBzZWNvbmRzOwogCi0gIGZvciAoOzspCisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJLy9zdGFydCBzY3JlZW4gdGltZW91dCB0aHJlYWRzCisJYmxhbmtUaW1lci5zZXRUaW1lclRocmVhZCgpOworCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZSgidHdfc2NyZWVuX3RpbWVvdXRfc2VjcyIsIHNlY29uZHMpOworCWJsYW5rVGltZXIuc2V0VGltZShhdG9pKHNlY29uZHMuY19zdHIoKSkpOworI2Vsc2UKKwlMT0dJTkZPKCJTa2lwcGluZyBzY3JlZW4gdGltZW91dCB0aHJlYWRzOiBUV19OT19TQ1JFRU5fVElNRU9VVCBpcyBzZXRcbiIpOworI2VuZGlmCisKKwlmb3IgKDs7KQogCXsKKwkJLy8gd2FpdCBmb3IgdGhlIG5leHQgZXZlbnQKKwkJc3RydWN0IGlucHV0X2V2ZW50IGV2OworCQlpbnQgc3RhdGUgPSAwLCByZXQgPSAwOwogCi0JICAvLyB3YWl0IGZvciB0aGUgbmV4dCBldmVudAotCSAgc3RydWN0IGlucHV0X2V2ZW50IGV2OwotCSAgaW50IHN0YXRlID0gMCwgcmV0ID0gMDsKKwkJcmV0ID0gZXZfZ2V0KCZldiwgZG9udHdhaXQpOwogCi0JICByZXQgPSBldl9nZXQgKCZldiwgZG9udHdhaXQpOwotCi0JICBpZiAocmV0IDwgMCkKKwkJaWYgKHJldCA8IDApCiAJCXsKLQkJICBzdHJ1Y3QgdGltZXZhbCBjdXJUaW1lOwotCQkgIGdldHRpbWVvZmRheSAoJmN1clRpbWUsIE5VTEwpOwotCQkgIGxvbmcgbXRpbWUsIHNlY29uZHMsIHVzZWNvbmRzOworCQkJc3RydWN0IHRpbWV2YWwgY3VyVGltZTsKKwkJCWdldHRpbWVvZmRheSgmY3VyVGltZSwgTlVMTCk7CisJCQlsb25nIG10aW1lLCBzZWNvbmRzLCB1c2Vjb25kczsKIAotCQkgIHNlY29uZHMgPSBjdXJUaW1lLnR2X3NlYyAtIHRvdWNoU3RhcnQudHZfc2VjOwotCQkgIHVzZWNvbmRzID0gY3VyVGltZS50dl91c2VjIC0gdG91Y2hTdGFydC50dl91c2VjOworCQkJc2Vjb25kcyA9IGN1clRpbWUudHZfc2VjIC0gdG91Y2hTdGFydC50dl9zZWM7CisJCQl1c2Vjb25kcyA9IGN1clRpbWUudHZfdXNlYyAtIHRvdWNoU3RhcnQudHZfdXNlYzsKIAotCQkgIG10aW1lID0gKChzZWNvbmRzKSAqIDEwMDAgKyB1c2Vjb25kcyAvIDEwMDAuMCkgKyAwLjU7Ci0JCSAgaWYgKHRvdWNoX2FuZF9ob2xkICYmIG10aW1lID4gNTAwKQorCQkJbXRpbWUgPSAoKHNlY29uZHMpICogMTAwMCArIHVzZWNvbmRzIC8gMTAwMC4wKSArIDAuNTsKKwkJCWlmICh0b3VjaF9hbmRfaG9sZCAmJiBtdGltZSA+IDUwMCkKIAkJCXsKLQkJCSAgdG91Y2hfYW5kX2hvbGQgPSAwOwotCQkJICB0b3VjaF9yZXBlYXQgPSAxOwotCQkJICBnZXR0aW1lb2ZkYXkgKCZ0b3VjaFN0YXJ0LCBOVUxMKTsKKwkJCQl0b3VjaF9hbmRfaG9sZCA9IDA7CisJCQkJdG91Y2hfcmVwZWF0ID0gMTsKKwkJCQlnZXR0aW1lb2ZkYXkoJnRvdWNoU3RhcnQsIE5VTEwpOwogI2lmZGVmIF9FVkVOVF9MT0dHSU5HCi0JCQkgIExPR0VSUigiVE9VQ0hfSE9MRDogJWQsJWRcbiIsIHgsIHkpOworCQkJCUxPR0VSUigiVE9VQ0hfSE9MRDogJWQsJWRcbiIsIHgsIHkpOwogI2VuZGlmCi0JCQkgIFBhZ2VNYW5hZ2VyOjpOb3RpZnlUb3VjaCAoVE9VQ0hfSE9MRCwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rVGltZXIucmVzZXRUaW1lckFuZFVuYmxhbmsoKTsKKwkJCQlQYWdlTWFuYWdlcjo6Tm90aWZ5VG91Y2goVE9VQ0hfSE9MRCwgeCwgeSk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJCQkJYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworI2VuZGlmCiAJCQl9Ci0JCSAgZWxzZSBpZiAodG91Y2hfcmVwZWF0ICYmIG10aW1lID4gMTAwKQorCQkJZWxzZSBpZiAodG91Y2hfcmVwZWF0ICYmIG10aW1lID4gMTAwKQogCQkJewogI2lmZGVmIF9FVkVOVF9MT0dHSU5HCi0JCQkgIExPR0VSUigiVE9VQ0hfUkVQRUFUOiAlZCwlZFxuIiwgeCwgeSk7CisJCQkJTE9HRVJSKCJUT1VDSF9SRVBFQVQ6ICVkLCVkXG4iLCB4LCB5KTsKICNlbmRpZgotCQkJICBnZXR0aW1lb2ZkYXkgKCZ0b3VjaFN0YXJ0LCBOVUxMKTsKLQkJCSAgUGFnZU1hbmFnZXI6Ok5vdGlmeVRvdWNoIChUT1VDSF9SRVBFQVQsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBibGFua1RpbWVyLnJlc2V0VGltZXJBbmRVbmJsYW5rKCk7CisJCQkJZ2V0dGltZW9mZGF5KCZ0b3VjaFN0YXJ0LCBOVUxMKTsKKwkJCQlQYWdlTWFuYWdlcjo6Tm90aWZ5VG91Y2goVE9VQ0hfUkVQRUFULCB4LCB5KTsKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKKwkJCQlibGFua1RpbWVyLnJlc2V0VGltZXJBbmRVbmJsYW5rKCk7CisjZW5kaWYKIAkJCX0KLQkJICBlbHNlIGlmIChrZXlfcmVwZWF0ID09IDEgJiYgbXRpbWUgPiA1MDApCisJCQllbHNlIGlmIChrZXlfcmVwZWF0ID09IDEgJiYgbXRpbWUgPiA1MDApCiAJCQl7CiAjaWZkZWYgX0VWRU5UX0xPR0dJTkcKLQkJCSAgTE9HRVJSKCJLRVlfSE9MRDogJWQsJWRcbiIsIHgsIHkpOworCQkJCUxPR0VSUigiS0VZX0hPTEQ6ICVkLCVkXG4iLCB4LCB5KTsKICNlbmRpZgotCQkJICBnZXR0aW1lb2ZkYXkgKCZ0b3VjaFN0YXJ0LCBOVUxMKTsKLQkJCSAga2V5X3JlcGVhdCA9IDI7Ci0JCQkgIGtiLktleVJlcGVhdCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworCQkJCWdldHRpbWVvZmRheSgmdG91Y2hTdGFydCwgTlVMTCk7CisJCQkJa2V5X3JlcGVhdCA9IDI7CisJCQkJa2IuS2V5UmVwZWF0KCk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJCQkJYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworI2VuZGlmCisKIAkJCX0KLQkJICBlbHNlIGlmIChrZXlfcmVwZWF0ID09IDIgJiYgbXRpbWUgPiAxMDApCisJCQllbHNlIGlmIChrZXlfcmVwZWF0ID09IDIgJiYgbXRpbWUgPiAxMDApCiAJCQl7CiAjaWZkZWYgX0VWRU5UX0xPR0dJTkcKLQkJCSAgTE9HRVJSKCJLRVlfUkVQRUFUOiAlZCwlZFxuIiwgeCwgeSk7CisJCQkJTE9HRVJSKCJLRVlfUkVQRUFUOiAlZCwlZFxuIiwgeCwgeSk7CiAjZW5kaWYKLQkJCSAgZ2V0dGltZW9mZGF5ICgmdG91Y2hTdGFydCwgTlVMTCk7Ci0JCQkgIGtiLktleVJlcGVhdCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworCQkJCWdldHRpbWVvZmRheSgmdG91Y2hTdGFydCwgTlVMTCk7CisJCQkJa2IuS2V5UmVwZWF0KCk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJCQkJYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworI2VuZGlmCiAJCQl9CiAJCX0KLQkgIGVsc2UgaWYgKGV2LnR5cGUgPT0gRVZfQUJTKQorCQllbHNlIGlmIChldi50eXBlID09IEVWX0FCUykKIAkJewogCi0JCSAgeCA9IGV2LnZhbHVlID4+IDE2OwotCQkgIHkgPSBldi52YWx1ZSAmIDB4RkZGRjsKKwkJCXggPSBldi52YWx1ZSA+PiAxNjsKKwkJCXkgPSBldi52YWx1ZSAmIDB4RkZGRjsKIAotCQkgIGlmIChldi5jb2RlID09IDApCisJCQlpZiAoZXYuY29kZSA9PSAwKQogCQkJewotCQkJICBpZiAoc3RhdGUgPT0gMCkKKwkJCQlpZiAoc3RhdGUgPT0gMCkKIAkJCQl7CiAjaWZkZWYgX0VWRU5UX0xPR0dJTkcKLQkJCQkgIExPR0VSUigiVE9VQ0hfUkVMRUFTRTogJWQsJWRcbiIsIHgsIHkpOworCQkJCQlMT0dFUlIoIlRPVUNIX1JFTEVBU0U6ICVkLCVkXG4iLCB4LCB5KTsKICNlbmRpZgotCQkJCSAgUGFnZU1hbmFnZXI6Ok5vdGlmeVRvdWNoIChUT1VDSF9SRUxFQVNFLCB4LCB5KTsKLQkJCQkgIGJsYW5rVGltZXIucmVzZXRUaW1lckFuZFVuYmxhbmsoKTsKLQkJCQkgIHRvdWNoX2FuZF9ob2xkID0gMDsKLQkJCQkgIHRvdWNoX3JlcGVhdCA9IDA7Ci0JCQkJICBpZiAoIWtleV9yZXBlYXQpCi0JCQkJCWRvbnR3YWl0ID0gMDsKKwkJCQkJUGFnZU1hbmFnZXI6Ok5vdGlmeVRvdWNoKFRPVUNIX1JFTEVBU0UsIHgsIHkpOworI2lmbmRlZiBUV19OT19TQ1JFRU5fVElNRU9VVAorCQkJCQlibGFua1RpbWVyLnJlc2V0VGltZXJBbmRVbmJsYW5rKCk7CisjZW5kaWYKKwkJCQkJdG91Y2hfYW5kX2hvbGQgPSAwOworCQkJCQl0b3VjaF9yZXBlYXQgPSAwOworCQkJCQlpZiAoIWtleV9yZXBlYXQpCisJCQkJCQlkb250d2FpdCA9IDA7CiAJCQkJfQotCQkJICBzdGF0ZSA9IDA7Ci0JCQkgIGRyYWcgPSAwOworCQkJCXN0YXRlID0gMDsKKwkJCQlkcmFnID0gMDsKIAkJCX0KLQkJICBlbHNlCisJCQllbHNlCiAJCQl7Ci0JCQkgIGlmICghZHJhZykKKwkJCQlpZiAoIWRyYWcpCiAJCQkJewogI2lmZGVmIF9FVkVOVF9MT0dHSU5HCi0JCQkJICBMT0dFUlIoIlRPVUNIX1NUQVJUOiAlZCwlZFxuIiwgeCwgeSk7CisJCQkJCUxPR0VSUigiVE9VQ0hfU1RBUlQ6ICVkLCVkXG4iLCB4LCB5KTsKICNlbmRpZgotCQkJCSAgaWYgKFBhZ2VNYW5hZ2VyOjpOb3RpZnlUb3VjaCAoVE9VQ0hfU1RBUlQsIHgsIHkpID4gMCkKLQkJCQkJc3RhdGUgPSAxOwotCQkJCSAgZHJhZyA9IDE7Ci0JCQkJICB0b3VjaF9hbmRfaG9sZCA9IDE7Ci0JCQkJICBkb250d2FpdCA9IDE7Ci0JCQkJICBrZXlfcmVwZWF0ID0gMDsKLQkJCQkgIGdldHRpbWVvZmRheSAoJnRvdWNoU3RhcnQsIE5VTEwpOwotCQkJCSAgYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworCQkJCQlpZiAoUGFnZU1hbmFnZXI6Ok5vdGlmeVRvdWNoKFRPVUNIX1NUQVJULCB4LCB5KSA+IDApCisJCQkJCQlzdGF0ZSA9IDE7CisJCQkJCWRyYWcgPSAxOworCQkJCQl0b3VjaF9hbmRfaG9sZCA9IDE7CisJCQkJCWRvbnR3YWl0ID0gMTsKKwkJCQkJa2V5X3JlcGVhdCA9IDA7CisJCQkJCWdldHRpbWVvZmRheSgmdG91Y2hTdGFydCwgTlVMTCk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJCQkJCWJsYW5rVGltZXIucmVzZXRUaW1lckFuZFVuYmxhbmsoKTsKKyNlbmRpZgogCQkJCX0KLQkJCSAgZWxzZQorCQkJCWVsc2UKIAkJCQl7Ci0JCQkJICBpZiAoc3RhdGUgPT0gMCkKKwkJCQkJaWYgKHN0YXRlID09IDApCiAJCQkJCXsKICNpZmRlZiBfRVZFTlRfTE9HR0lORwotCQkJCQkgIExPR0VSUigiVE9VQ0hfRFJBRzogJWQsJWRcbiIsIHgsIHkpOworCQkJCQkJTE9HRVJSKCJUT1VDSF9EUkFHOiAlZCwlZFxuIiwgeCwgeSk7CiAjZW5kaWYKLQkJCQkJICBpZiAoUGFnZU1hbmFnZXI6Ok5vdGlmeVRvdWNoIChUT1VDSF9EUkFHLCB4LCB5KSA+IDApCi0JCQkJCQlzdGF0ZSA9IDE7Ci0JCQkJCSAga2V5X3JlcGVhdCA9IDA7Ci0JCQkJCSAgYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworCQkJCQkJaWYgKFBhZ2VNYW5hZ2VyOjpOb3RpZnlUb3VjaChUT1VDSF9EUkFHLCB4LCB5KSA+IDApCisJCQkJCQkJc3RhdGUgPSAxOworCQkJCQkJa2V5X3JlcGVhdCA9IDA7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJCQkJCQlibGFua1RpbWVyLnJlc2V0VGltZXJBbmRVbmJsYW5rKCk7CisjZW5kaWYKIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCSAgZWxzZSBpZiAoZXYudHlwZSA9PSBFVl9LRVkpCisJCWVsc2UgaWYgKGV2LnR5cGUgPT0gRVZfS0VZKQogCQl7Ci0JCSAgLy8gSGFuZGxlIGtleS1wcmVzcyBoZXJlCisJCQkvLyBIYW5kbGUga2V5LXByZXNzIGhlcmUKICNpZmRlZiBfRVZFTlRfTE9HR0lORwotCQkgIExPR0VSUigiVE9VQ0hfS0VZOiAlZFxuIiwgZXYuY29kZSk7CisJCQlMT0dFUlIoIlRPVUNIX0tFWTogJWRcbiIsIGV2LmNvZGUpOwogI2VuZGlmCi0JCSAgaWYgKGV2LnZhbHVlICE9IDApCisJCQlpZiAoZXYudmFsdWUgIT0gMCkKIAkJCXsKLQkJCSAgLy8gVGhpcyBpcyBhIGtleSBwcmVzcwotCQkJICBpZiAoa2IuS2V5RG93biAoZXYuY29kZSkpCisJCQkJLy8gVGhpcyBpcyBhIGtleSBwcmVzcworCQkJCWlmIChrYi5LZXlEb3duKGV2LmNvZGUpKQogCQkJCXsKLQkJCQkgIGtleV9yZXBlYXQgPSAxOwotCQkJCSAgdG91Y2hfYW5kX2hvbGQgPSAwOwotCQkJCSAgdG91Y2hfcmVwZWF0ID0gMDsKLQkJCQkgIGRvbnR3YWl0ID0gMTsKLQkJCQkgIGdldHRpbWVvZmRheSAoJnRvdWNoU3RhcnQsIE5VTEwpOwotCQkJCSAgYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworCQkJCQlrZXlfcmVwZWF0ID0gMTsKKwkJCQkJdG91Y2hfYW5kX2hvbGQgPSAwOworCQkJCQl0b3VjaF9yZXBlYXQgPSAwOworCQkJCQlkb250d2FpdCA9IDE7CisJCQkJCWdldHRpbWVvZmRheSgmdG91Y2hTdGFydCwgTlVMTCk7CisjaWZuZGVmIFRXX05PX1NDUkVFTl9USU1FT1VUCisJCQkJCWJsYW5rVGltZXIucmVzZXRUaW1lckFuZFVuYmxhbmsoKTsKKyNlbmRpZgogCQkJCX0KLQkJCSAgZWxzZQorCQkJCWVsc2UKIAkJCQl7Ci0JCQkJICBrZXlfcmVwZWF0ID0gMDsKLQkJCQkgIHRvdWNoX2FuZF9ob2xkID0gMDsKLQkJCQkgIHRvdWNoX3JlcGVhdCA9IDA7Ci0JCQkJICBkb250d2FpdCA9IDA7Ci0JCQkJICBibGFua1RpbWVyLnJlc2V0VGltZXJBbmRVbmJsYW5rKCk7CisJCQkJCWtleV9yZXBlYXQgPSAwOworCQkJCQl0b3VjaF9hbmRfaG9sZCA9IDA7CisJCQkJCXRvdWNoX3JlcGVhdCA9IDA7CisJCQkJCWRvbnR3YWl0ID0gMDsKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKKwkJCQkJYmxhbmtUaW1lci5yZXNldFRpbWVyQW5kVW5ibGFuaygpOworI2VuZGlmCiAJCQkJfQogCQkJfQotCQkgIGVsc2UKKwkJCWVsc2UKIAkJCXsKLQkJCSAgLy8gVGhpcyBpcyBhIGtleSByZWxlYXNlCi0JCQkgIGtiLktleVVwIChldi5jb2RlKTsKLQkJCSAga2V5X3JlcGVhdCA9IDA7Ci0JCQkgIHRvdWNoX2FuZF9ob2xkID0gMDsKLQkJCSAgdG91Y2hfcmVwZWF0ID0gMDsKLQkJCSAgZG9udHdhaXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBibGFua1RpbWVyLnJlc2V0VGltZXJBbmRVbmJsYW5rKCk7CisJCQkJLy8gVGhpcyBpcyBhIGtleSByZWxlYXNlCisJCQkJa2IuS2V5VXAoZXYuY29kZSk7CisJCQkJa2V5X3JlcGVhdCA9IDA7CisJCQkJdG91Y2hfYW5kX2hvbGQgPSAwOworCQkJCXRvdWNoX3JlcGVhdCA9IDA7CisJCQkJZG9udHdhaXQgPSAwOworI2lmbmRlZiBUV19OT19TQ1JFRU5fVElNRU9VVAorCQkJCWJsYW5rVGltZXIucmVzZXRUaW1lckFuZFVuYmxhbmsoKTsKKyNlbmRpZgogCQkJfQogCQl9CiAJfQotICByZXR1cm4gTlVMTDsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLy8gVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHRoZSBmaXJzdCB0aW1lLCBidXQgdGhlbgogLy8gYWx3YXlzIHJldHVybnMgMS8zMHRoIG9mIGEgc2Vjb25kIChvciBpbW1lZGlhdGVseSBpZiBjYWxsZWQgbGF0ZXIpIGZyb20KIC8vIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGNhbGxlZAotc3RhdGljIHZvaWQKLWxvb3BUaW1lciAodm9pZCkKK3N0YXRpYyB2b2lkIGxvb3BUaW1lcih2b2lkKQogewotICBzdGF0aWMgdGltZXNwZWMgbGFzdENhbGw7Ci0gIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCXN0YXRpYyB0aW1lc3BlYyBsYXN0Q2FsbDsKKwlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotICBpZiAoIWluaXRpYWxpemVkKQorCWlmICghaW5pdGlhbGl6ZWQpCiAJewotCSAgY2xvY2tfZ2V0dGltZSAoQ0xPQ0tfTU9OT1RPTklDLCAmbGFzdENhbGwpOwotCSAgaW5pdGlhbGl6ZWQgPSAxOwotCSAgcmV0dXJuOworCQljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmxhc3RDYWxsKTsKKwkJaW5pdGlhbGl6ZWQgPSAxOworCQlyZXR1cm47CiAJfQogCi0gIGRvCisJZG8KIAl7Ci0JICB0aW1lc3BlYyBjdXJUaW1lOwotCSAgY2xvY2tfZ2V0dGltZSAoQ0xPQ0tfTU9OT1RPTklDLCAmY3VyVGltZSk7CisJCXRpbWVzcGVjIGN1clRpbWU7CisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmY3VyVGltZSk7CiAKLQkgIHRpbWVzcGVjIGRpZmYgPSBUV0Z1bmM6OnRpbWVzcGVjX2RpZmYgKGxhc3RDYWxsLCBjdXJUaW1lKTsKKwkJdGltZXNwZWMgZGlmZiA9IFRXRnVuYzo6dGltZXNwZWNfZGlmZihsYXN0Q2FsbCwgY3VyVGltZSk7CiAKLQkgIC8vIFRoaXMgaXMgcmVhbGx5IDMwIHRpbWVzIHBlciBzZWNvbmQKLQkgIGlmIChkaWZmLnR2X3NlYyB8fCBkaWZmLnR2X25zZWMgPiAzMzMzMzMzMykKKwkJLy8gVGhpcyBpcyByZWFsbHkgMzAgdGltZXMgcGVyIHNlY29uZAorCQlpZiAoZGlmZi50dl9zZWMgfHwgZGlmZi50dl9uc2VjID4gMzMzMzMzMzMpCiAJCXsKLQkJICBsYXN0Q2FsbCA9IGN1clRpbWU7Ci0JCSAgcmV0dXJuOworCQkJbGFzdENhbGwgPSBjdXJUaW1lOworCQkJcmV0dXJuOwogCQl9CiAKLQkgIC8vIFdlIG5lZWQgdG8gc2xlZXAgc29tZSBwZXJpb2QgdGltZSBtaWNyb3NlY29uZHMKLQkgIHVuc2lnbmVkIGludCBzbGVlcFRpbWUgPSAzMzMzMyAtIChkaWZmLnR2X25zZWMgLyAxMDAwKTsKLQkgIHVzbGVlcCAoc2xlZXBUaW1lKTsKLQl9Ci0gIHdoaWxlICgxKTsKLSAgcmV0dXJuOworCQkvLyBXZSBuZWVkIHRvIHNsZWVwIHNvbWUgcGVyaW9kIHRpbWUgbWljcm9zZWNvbmRzCisJCXVuc2lnbmVkIGludCBzbGVlcFRpbWUgPSAzMzMzMyAtKGRpZmYudHZfbnNlYyAvIDEwMDApOworCQl1c2xlZXAoc2xlZXBUaW1lKTsKKwl9IHdoaWxlICgxKTsKIH0KIAotc3RhdGljIGludAotcnVuUGFnZXMgKHZvaWQpCitzdGF0aWMgaW50IHJ1blBhZ2VzKHZvaWQpCiB7Ci0gIC8vIFJhaXNlIHRoZSBjdXJ0YWluCi0gIGlmIChnQ3VydGFpbiAhPSBOVUxMKQorCS8vIFJhaXNlIHRoZSBjdXJ0YWluCisJaWYgKGdDdXJ0YWluICE9IE5VTEwpCiAJewotCSAgZ3Jfc3VyZmFjZSBzdXJmYWNlOworCQlncl9zdXJmYWNlIHN1cmZhY2U7CiAKLQkgIFBhZ2VNYW5hZ2VyOjpSZW5kZXIgKCk7Ci0JICBncl9nZXRfc3VyZmFjZSAoJnN1cmZhY2UpOwotCSAgY3VydGFpblJhaXNlIChzdXJmYWNlKTsKLQkgIGdyX2ZyZWVfc3VyZmFjZSAoc3VyZmFjZSk7CisJCVBhZ2VNYW5hZ2VyOjpSZW5kZXIoKTsKKwkJZ3JfZ2V0X3N1cmZhY2UoJnN1cmZhY2UpOworCQljdXJ0YWluUmFpc2Uoc3VyZmFjZSk7CisJCWdyX2ZyZWVfc3VyZmFjZShzdXJmYWNlKTsKIAl9CiAKLSAgZ0d1aVJ1bm5pbmcgPSAxOworCWdHdWlSdW5uaW5nID0gMTsKIAotICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUgKCJ0d19sb2FkZWQiLCAxKTsKKwlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X2xvYWRlZCIsIDEpOwogCi0gIGZvciAoOzspCisJZm9yICg7OykKIAl7Ci0JICBsb29wVGltZXIgKCk7CisJCWxvb3BUaW1lcigpOwogCi0JICBpZiAoIWdGb3JjZVJlbmRlcikKKwkJaWYgKCFnRm9yY2VSZW5kZXIpCiAJCXsKLQkJICBpbnQgcmV0OworCQkJaW50IHJldDsKIAotCQkgIHJldCA9IFBhZ2VNYW5hZ2VyOjpVcGRhdGUgKCk7Ci0JCSAgaWYgKHJldCA+IDEpCi0JCQlQYWdlTWFuYWdlcjo6UmVuZGVyICgpOworCQkJcmV0ID0gUGFnZU1hbmFnZXI6OlVwZGF0ZSgpOworCQkJaWYgKHJldCA+IDEpCisJCQkJUGFnZU1hbmFnZXI6OlJlbmRlcigpOwogCi0JCSAgaWYgKHJldCA+IDApCi0JCQlmbGlwICgpOworCQkJaWYgKHJldCA+IDApCisJCQkJZmxpcCgpOwogCQl9Ci0JICBlbHNlCisJCWVsc2UKIAkJewotCQkgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotCQkgIGdGb3JjZVJlbmRlciA9IDA7Ci0JCSAgcHRocmVhZF9tdXRleF91bmxvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKLQkJICBQYWdlTWFuYWdlcjo6UmVuZGVyICgpOwotCQkgIGZsaXAgKCk7CisJCQlwdGhyZWFkX211dGV4X2xvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKKwkJCWdGb3JjZVJlbmRlciA9IDA7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOworCQkJUGFnZU1hbmFnZXI6OlJlbmRlcigpOworCQkJZmxpcCgpOwogCQl9CisKIAkJaWYgKERhdGFNYW5hZ2VyOjpHZXRJbnRWYWx1ZSgidHdfZ3VpX2RvbmUiKSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJZ0d1aVJ1bm5pbmcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ1blBhZ2UoY29uc3QgY2hhciAqcGFnZV9uYW1lKQoreworCWd1aV9jaGFuZ2VQYWdlKHBhZ2VfbmFtZSk7CisKKwkvLyBSYWlzZSB0aGUgY3VydGFpbgorCWlmIChnQ3VydGFpbiAhPSBOVUxMKQorCXsKKwkJZ3Jfc3VyZmFjZSBzdXJmYWNlOworCisJCVBhZ2VNYW5hZ2VyOjpSZW5kZXIoKTsKKwkJZ3JfZ2V0X3N1cmZhY2UoJnN1cmZhY2UpOworCQljdXJ0YWluUmFpc2Uoc3VyZmFjZSk7CisJCWdyX2ZyZWVfc3VyZmFjZShzdXJmYWNlKTsKKwl9CisKKwlnR3VpUnVubmluZyA9IDE7CisKKwlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X2xvYWRlZCIsIDEpOworCisJZm9yICg7OykKKwl7CisJCWxvb3BUaW1lcigpOworCisJCWlmICghZ0ZvcmNlUmVuZGVyKQogCQl7CisJCQlpbnQgcmV0OworCisJCQlyZXQgPSBQYWdlTWFuYWdlcjo6VXBkYXRlKCk7CisJCQlpZiAocmV0ID4gMSkKKwkJCQlQYWdlTWFuYWdlcjo6UmVuZGVyKCk7CisKKwkJCWlmIChyZXQgPiAwKQorCQkJCWZsaXAoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOworCQkJZ0ZvcmNlUmVuZGVyID0gMDsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7CisJCQlQYWdlTWFuYWdlcjo6UmVuZGVyKCk7CisJCQlmbGlwKCk7CisJCX0KKwkJaWYgKERhdGFNYW5hZ2VyOjpHZXRJbnRWYWx1ZSgidHdfcGFnZV9kb25lIikgIT0gMCkKKwkJeworCQkJZ3VpX2NoYW5nZVBhZ2UoIm1haW4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0gIGdHdWlSdW5uaW5nID0gMDsKLSAgcmV0dXJuIDA7CisJZ0d1aVJ1bm5pbmcgPSAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1ydW5QYWdlIChjb25zdCBjaGFyICpwYWdlX25hbWUpCitpbnQgZ3VpX2ZvcmNlUmVuZGVyKHZvaWQpCiB7Ci0gIGd1aV9jaGFuZ2VQYWdlIChwYWdlX25hbWUpOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOworCWdGb3JjZVJlbmRlciA9IDE7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKKwlyZXR1cm4gMDsKK30KIAotICAvLyBSYWlzZSB0aGUgY3VydGFpbgotICBpZiAoZ0N1cnRhaW4gIT0gTlVMTCkKK2ludCBndWlfY2hhbmdlUGFnZShzdGQ6OnN0cmluZyBuZXdQYWdlKQoreworCUxPR0lORk8oIlNldCBwYWdlOiAnJXMnXG4iLCBuZXdQYWdlLmNfc3RyKCkpOworCVBhZ2VNYW5hZ2VyOjpDaGFuZ2VQYWdlKG5ld1BhZ2UpOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOworCWdGb3JjZVJlbmRlciA9IDE7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGd1aV9jaGFuZ2VPdmVybGF5KHN0ZDo6c3RyaW5nIG92ZXJsYXkpCit7CisJUGFnZU1hbmFnZXI6OkNoYW5nZU92ZXJsYXkob3ZlcmxheSk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7CisJZ0ZvcmNlUmVuZGVyID0gMTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOworCXJldHVybiAwOworfQorCitpbnQgZ3VpX2NoYW5nZVBhY2thZ2Uoc3RkOjpzdHJpbmcgbmV3UGFja2FnZSkKK3sKKwlQYWdlTWFuYWdlcjo6U2VsZWN0UGFja2FnZShuZXdQYWNrYWdlKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKKwlnRm9yY2VSZW5kZXIgPSAxOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0ZDo6c3RyaW5nIGd1aV9wYXJzZV90ZXh0KHN0cmluZyBpblRleHQpCit7CisJLy8gQ29waWVkIGZyb20gc3RkOjpzdHJpbmcgR1VJVGV4dDo6cGFyc2VUZXh0KHZvaWQpCisJLy8gVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGV4dCBmb3IgRGF0YU1hbmFnZXIgdmFsdWVzIGVuY29tcGFzc2VkIGJ5ICV2YWx1ZSUgaW4gdGhlIFhNTAorCXN0YXRpYyBpbnQgY291bnRlciA9IDA7CisJc3RkOjpzdHJpbmcgc3RyID0gaW5UZXh0OworCXNpemVfdCBwb3MgPSAwOworCXNpemVfdCBuZXh0ID0gMCwgZW5kID0gMDsKKworCXdoaWxlICgxKQogCXsKLQkgIGdyX3N1cmZhY2Ugc3VyZmFjZTsKKwkJbmV4dCA9IHN0ci5maW5kKCclJywgcG9zKTsKKwkJaWYgKG5leHQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisJCQlyZXR1cm4gc3RyOwogCi0JICBQYWdlTWFuYWdlcjo6UmVuZGVyICgpOwotCSAgZ3JfZ2V0X3N1cmZhY2UgKCZzdXJmYWNlKTsKLQkgIGN1cnRhaW5SYWlzZSAoc3VyZmFjZSk7Ci0JICBncl9mcmVlX3N1cmZhY2UgKHN1cmZhY2UpOwotCX0KKwkJZW5kID0gc3RyLmZpbmQoJyUnLCBuZXh0ICsgMSk7CisJCWlmIChlbmQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisJCQlyZXR1cm4gc3RyOwogCi0gIGdHdWlSdW5uaW5nID0gMTsKKwkJLy8gV2UgaGF2ZSBhIGJsb2NrIG9mIGRhdGEKKwkJc3RkOjpzdHJpbmcgdmFyID0gc3RyLnN1YnN0cihuZXh0ICsgMSwoZW5kIC0gbmV4dCkgLSAxKTsKKwkJc3RyLmVyYXNlKG5leHQsKGVuZCAtIG5leHQpICsgMSk7CiAKLSAgRGF0YU1hbmFnZXI6OlNldFZhbHVlICgidHdfbG9hZGVkIiwgMSk7Ci0KLSAgZm9yICg7OykKLQl7Ci0JICBsb29wVGltZXIgKCk7Ci0KLQkgIGlmICghZ0ZvcmNlUmVuZGVyKQorCQlpZiAobmV4dCArIDEgPT0gZW5kKQorCQkJc3RyLmluc2VydChuZXh0LCAxLCAnJScpOworCQllbHNlCiAJCXsKLQkJICBpbnQgcmV0OwotCi0JCSAgcmV0ID0gUGFnZU1hbmFnZXI6OlVwZGF0ZSAoKTsKLQkJICBpZiAocmV0ID4gMSkKLQkJCVBhZ2VNYW5hZ2VyOjpSZW5kZXIgKCk7Ci0KLQkJICBpZiAocmV0ID4gMCkKLQkJCWZsaXAgKCk7Ci0JCX0KLQkgIGVsc2UKLQkJewotCQkgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotCQkgIGdGb3JjZVJlbmRlciA9IDA7Ci0JCSAgcHRocmVhZF9tdXRleF91bmxvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKLQkJICBQYWdlTWFuYWdlcjo6UmVuZGVyICgpOwotCQkgIGZsaXAgKCk7Ci0JCX0KLQkgIGlmIChEYXRhTWFuYWdlcjo6R2V0SW50VmFsdWUgKCJ0d19wYWdlX2RvbmUiKSAhPSAwKQotCQl7Ci0JCSAgZ3VpX2NoYW5nZVBhZ2UgKCJtYWluIik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQl9Ci0KLSAgZ0d1aVJ1bm5pbmcgPSAwOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1ndWlfZm9yY2VSZW5kZXIgKHZvaWQpCi17Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotICBnRm9yY2VSZW5kZXIgPSAxOwotICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1ndWlfY2hhbmdlUGFnZSAoc3RkOjpzdHJpbmcgbmV3UGFnZSkKLXsKLSAgTE9HSU5GTygiU2V0IHBhZ2U6ICclcydcbiIsIG5ld1BhZ2UuY19zdHIgKCkpOwotICBQYWdlTWFuYWdlcjo6Q2hhbmdlUGFnZSAobmV3UGFnZSk7Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotICBnRm9yY2VSZW5kZXIgPSAxOwotICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1ndWlfY2hhbmdlT3ZlcmxheSAoc3RkOjpzdHJpbmcgb3ZlcmxheSkKLXsKLSAgUGFnZU1hbmFnZXI6OkNoYW5nZU92ZXJsYXkgKG92ZXJsYXkpOwotICBwdGhyZWFkX211dGV4X2xvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKLSAgZ0ZvcmNlUmVuZGVyID0gMTsKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJmdGb3JjZVJlbmRlcm11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZ3VpX2NoYW5nZVBhY2thZ2UgKHN0ZDo6c3RyaW5nIG5ld1BhY2thZ2UpCi17Ci0gIFBhZ2VNYW5hZ2VyOjpTZWxlY3RQYWNrYWdlIChuZXdQYWNrYWdlKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7Ci0gIGdGb3JjZVJlbmRlciA9IDE7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGQ6OnN0cmluZyBndWlfcGFyc2VfdGV4dCAoc3RyaW5nIGluVGV4dCkKLXsKLSAgLy8gQ29waWVkIGZyb20gc3RkOjpzdHJpbmcgR1VJVGV4dDo6cGFyc2VUZXh0KHZvaWQpCi0gIC8vIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRleHQgZm9yIERhdGFNYW5hZ2VyIHZhbHVlcyBlbmNvbXBhc3NlZCBieSAldmFsdWUlIGluIHRoZSBYTUwKLSAgc3RhdGljIGludCBjb3VudGVyID0gMDsKLSAgc3RkOjpzdHJpbmcgc3RyID0gaW5UZXh0OwotICBzaXplX3QgcG9zID0gMDsKLSAgc2l6ZV90IG5leHQgPSAwLCBlbmQgPSAwOwotCi0gIHdoaWxlICgxKQotCXsKLQkgIG5leHQgPSBzdHIuZmluZCAoJyUnLCBwb3MpOwotCSAgaWYgKG5leHQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCi0JCXJldHVybiBzdHI7Ci0JICBlbmQgPSBzdHIuZmluZCAoJyUnLCBuZXh0ICsgMSk7Ci0JICBpZiAoZW5kID09IHN0ZDo6c3RyaW5nOjpucG9zKQotCQlyZXR1cm4gc3RyOwotCi0JICAvLyBXZSBoYXZlIGEgYmxvY2sgb2YgZGF0YQotCSAgc3RkOjpzdHJpbmcgdmFyID0gc3RyLnN1YnN0ciAobmV4dCArIDEsIChlbmQgLSBuZXh0KSAtIDEpOwotCSAgc3RyLmVyYXNlIChuZXh0LCAoZW5kIC0gbmV4dCkgKyAxKTsKLQotCSAgaWYgKG5leHQgKyAxID09IGVuZCkKLQkJewotCQkgIHN0ci5pbnNlcnQgKG5leHQsIDEsICclJyk7Ci0JCX0KLQkgIGVsc2UKLQkJewotCQkgIHN0ZDo6c3RyaW5nIHZhbHVlOwotCQkgIGlmIChEYXRhTWFuYWdlcjo6R2V0VmFsdWUgKHZhciwgdmFsdWUpID09IDApCi0JCQlzdHIuaW5zZXJ0IChuZXh0LCB2YWx1ZSk7CisJCQlzdGQ6OnN0cmluZyB2YWx1ZTsKKwkJCWlmIChEYXRhTWFuYWdlcjo6R2V0VmFsdWUodmFyLCB2YWx1ZSkgPT0gMCkKKwkJCQlzdHIuaW5zZXJ0KG5leHQsIHZhbHVlKTsKIAkJfQogCi0JICBwb3MgPSBuZXh0ICsgMTsKKwkJcG9zID0gbmV4dCArIDE7CiAJfQogfQogCi1leHRlcm4gIkMiIGludAotZ3VpX2luaXQgKCkKK2V4dGVybiAiQyIgaW50IGd1aV9pbml0KHZvaWQpCiB7Ci0gIGludCBmZDsKKwlpbnQgZmQ7CiAKLSAgZ3JfaW5pdCAoKTsKKwlncl9pbml0KCk7CiAKLSAgaWYgKHJlc19jcmVhdGVfc3VyZmFjZSAoIi9yZXMvaW1hZ2VzL2N1cnRhaW4uanBnIiwgJmdDdXJ0YWluKSkKKwlpZiAocmVzX2NyZWF0ZV9zdXJmYWNlKCIvcmVzL2ltYWdlcy9jdXJ0YWluLmpwZyIsICZnQ3VydGFpbikpCiAJewotCSAgcHJpbnRmCisJCXByaW50ZgogCQkoIlVuYWJsZSB0byBsb2NhdGUgJy9yZXMvaW1hZ2VzL2N1cnRhaW4uanBnJ1xuRGlkIHlvdSBzZXQgYSBERVZJQ0VfUkVTT0xVVElPTiBpbiB5b3VyIGNvbmZpZyBmaWxlcz9cbiIpOwotCSAgcmV0dXJuIC0xOworCQlyZXR1cm4gLTE7CiAJfQogCi0gIGN1cnRhaW5TZXQgKCk7CisJY3VydGFpblNldCgpOwogCi0gIGV2X2luaXQgKCk7Ci0gIHJldHVybiAwOworCWV2X2luaXQoKTsKKwlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuICJDIiBpbnQKLWd1aV9sb2FkUmVzb3VyY2VzICgpCitleHRlcm4gIkMiIGludCBndWlfbG9hZFJlc291cmNlcyh2b2lkKQogewotLy8gICAgdW5saW5rKCIvc2RjYXJkL3ZpZGVvLmxhc3QiKTsKLS8vICAgIHJlbmFtZSgiL3NkY2FyZC92aWRlby5iaW4iLCAiL3NkY2FyZC92aWRlby5sYXN0Iik7Ci0vLyAgICBnUmVjb3JkZXIgPSBvcGVuKCIvc2RjYXJkL3ZpZGVvLmJpbiIsIE9fQ1JFQVQgfCBPX1dST05MWSk7CisJLy8gICAgdW5saW5rKCIvc2RjYXJkL3ZpZGVvLmxhc3QiKTsKKwkvLyAgICByZW5hbWUoIi9zZGNhcmQvdmlkZW8uYmluIiwgIi9zZGNhcmQvdmlkZW8ubGFzdCIpOworCS8vICAgIGdSZWNvcmRlciA9IG9wZW4oIi9zZGNhcmQvdmlkZW8uYmluIiwgT19DUkVBVCB8IE9fV1JPTkxZKTsKIAotICBpbnQgY2hlY2sgPSAwOwotICBEYXRhTWFuYWdlcjo6R2V0VmFsdWUgKFRXX0lTX0VOQ1JZUFRFRCwgY2hlY2spOwotICBpZiAoY2hlY2spCisJaW50IGNoZWNrID0gMDsKKwlEYXRhTWFuYWdlcjo6R2V0VmFsdWUoVFdfSVNfRU5DUllQVEVELCBjaGVjayk7CisJaWYgKGNoZWNrKQogCXsKLQkgIGlmIChQYWdlTWFuYWdlcjo6TG9hZFBhY2thZ2UgKCJUV1JQIiwgIi9yZXMvdWkueG1sIiwgImRlY3J5cHQiKSkKKwkJaWYgKFBhZ2VNYW5hZ2VyOjpMb2FkUGFja2FnZSgiVFdSUCIsICIvcmVzL3VpLnhtbCIsICJkZWNyeXB0IikpCiAJCXsKLQkJICBMT0dFUlIoIkZhaWxlZCB0byBsb2FkIGJhc2UgcGFja2FnZXMuXG4iKTsKLQkJICBnb3RvIGVycm9yOworCQkJTE9HRVJSKCJGYWlsZWQgdG8gbG9hZCBiYXNlIHBhY2thZ2VzLlxuIik7CisJCQlnb3RvIGVycm9yOwogCQl9Ci0JICBlbHNlCi0JCWNoZWNrID0gMTsKKwkJZWxzZQorCQkJY2hlY2sgPSAxOwogCX0KLSAgaWYgKGNoZWNrID09IDAKLQkgICYmIFBhZ2VNYW5hZ2VyOjpMb2FkUGFja2FnZSgiVFdSUCIsICIvc2NyaXB0L3VpLnhtbCIsICJtYWluIikpCi0JewotCSAgc3RkOjpzdHJpbmcgdGhlbWVfcGF0aDsKIAotCSAgdGhlbWVfcGF0aCA9IERhdGFNYW5hZ2VyOjpHZXRTZXR0aW5nc1N0b3JhZ2VQYXRoICgpOwotCSAgaWYgKCFQYXJ0aXRpb25NYW5hZ2VyLk1vdW50X1NldHRpbmdzX1N0b3JhZ2UoZmFsc2UpKQorCWlmIChjaGVjayA9PSAwICYmIFBhZ2VNYW5hZ2VyOjpMb2FkUGFja2FnZSgiVFdSUCIsICIvc2NyaXB0L3VpLnhtbCIsICJtYWluIikpCisJeworCQlzdGQ6OnN0cmluZyB0aGVtZV9wYXRoOworCisJCXRoZW1lX3BhdGggPSBEYXRhTWFuYWdlcjo6R2V0U2V0dGluZ3NTdG9yYWdlUGF0aCgpOworCQlpZiAoIVBhcnRpdGlvbk1hbmFnZXIuTW91bnRfU2V0dGluZ3NfU3RvcmFnZShmYWxzZSkpCiAJCXsKLQkJICBpbnQgcmV0cnlfY291bnQgPSA1OwotCQkgIHdoaWxlIChyZXRyeV9jb3VudCA+IDAKLQkJCQkgJiYgIVBhcnRpdGlvbk1hbmFnZXIuTW91bnRfU2V0dGluZ3NfU3RvcmFnZShmYWxzZSkpCisJCQlpbnQgcmV0cnlfY291bnQgPSA1OworCQkJd2hpbGUgKHJldHJ5X2NvdW50ID4gMCAmJiAhUGFydGl0aW9uTWFuYWdlci5Nb3VudF9TZXR0aW5nc19TdG9yYWdlKGZhbHNlKSkKIAkJCXsKLQkJCSAgdXNsZWVwICg1MDAwMDApOwotCQkJICByZXRyeV9jb3VudC0tOworCQkJCXVzbGVlcCg1MDAwMDApOworCQkJCXJldHJ5X2NvdW50LS07CiAJCQl9Ci0JCSAgaWYgKCFQYXJ0aXRpb25NYW5hZ2VyLk1vdW50X1NldHRpbmdzX1N0b3JhZ2UoZmFsc2UpKQorCisJCQlpZiAoIVBhcnRpdGlvbk1hbmFnZXIuTW91bnRfU2V0dGluZ3NfU3RvcmFnZShmYWxzZSkpCiAJCQl7Ci0JCQkgIExPR0VSUigiVW5hYmxlIHRvIG1vdW50ICVzIGR1cmluZyBHVUkgc3RhcnR1cC5cbiIsCi0JCQkJCXRoZW1lX3BhdGguY19zdHIgKCkpOwotCQkJICBjaGVjayA9IDE7CisJCQkJTE9HRVJSKCJVbmFibGUgdG8gbW91bnQgJXMgZHVyaW5nIEdVSSBzdGFydHVwLlxuIiwKKwkJCQkJICAgdGhlbWVfcGF0aC5jX3N0cigpKTsKKwkJCQljaGVjayA9IDE7CiAJCQl9CiAJCX0KIAotCSAgdGhlbWVfcGF0aCArPSAiL1RXUlAvdGhlbWUvdWkuemlwIjsKLQkgIGlmIChjaGVjayB8fCBQYWdlTWFuYWdlcjo6TG9hZFBhY2thZ2UoIlRXUlAiLCB0aGVtZV9wYXRoLCAibWFpbiIpKQorCQl0aGVtZV9wYXRoICs9ICIvVFdSUC90aGVtZS91aS56aXAiOworCQlpZiAoY2hlY2sgfHwgUGFnZU1hbmFnZXI6OkxvYWRQYWNrYWdlKCJUV1JQIiwgdGhlbWVfcGF0aCwgIm1haW4iKSkKIAkJewotCQkgIGlmIChQYWdlTWFuYWdlcjo6TG9hZFBhY2thZ2UoIlRXUlAiLCAiL3Jlcy91aS54bWwiLCAibWFpbiIpKQorCQkJaWYgKFBhZ2VNYW5hZ2VyOjpMb2FkUGFja2FnZSgiVFdSUCIsICIvcmVzL3VpLnhtbCIsICJtYWluIikpCiAJCQl7Ci0JCQkgIExPR0VSUigiRmFpbGVkIHRvIGxvYWQgYmFzZSBwYWNrYWdlcy5cbiIpOwotCQkJICBnb3RvIGVycm9yOworCQkJCUxPR0VSUigiRmFpbGVkIHRvIGxvYWQgYmFzZSBwYWNrYWdlcy5cbiIpOworCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCX0KIAl9CiAKLSAgLy8gU2V0IHRoZSBkZWZhdWx0IHBhY2thZ2UKLSAgUGFnZU1hbmFnZXI6OlNlbGVjdFBhY2thZ2UgKCJUV1JQIik7CisJLy8gU2V0IHRoZSBkZWZhdWx0IHBhY2thZ2UKKwlQYWdlTWFuYWdlcjo6U2VsZWN0UGFja2FnZSgiVFdSUCIpOwogCi0gIGdHdWlJbml0aWFsaXplZCA9IDE7Ci0gIHJldHVybiAwOworCWdHdWlJbml0aWFsaXplZCA9IDE7CisJcmV0dXJuIDA7CiAKIGVycm9yOgotICBMT0dFUlIoIkFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cbiIpOwotICBnR3VpSW5pdGlhbGl6ZWQgPSAwOwotICByZXR1cm4gLTE7CisJTE9HRVJSKCJBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG4iKTsKKwlnR3VpSW5pdGlhbGl6ZWQgPSAwOworCXJldHVybiAtMTsKIH0KIAotZXh0ZXJuICJDIiBpbnQKLWd1aV9zdGFydCAoKQorZXh0ZXJuICJDIiBpbnQgZ3VpX3N0YXJ0KHZvaWQpCiB7Ci0gIGlmICghZ0d1aUluaXRpYWxpemVkKQotCXJldHVybiAtMTsKKwlpZiAoIWdHdWlJbml0aWFsaXplZCkKKwkJcmV0dXJuIC0xOwogCi0gIGdHdWlDb25zb2xlVGVybWluYXRlID0gMTsKLSAgd2hpbGUgKGdHdWlDb25zb2xlUnVubmluZykKLQlsb29wVGltZXIgKCk7CisJZ0d1aUNvbnNvbGVUZXJtaW5hdGUgPSAxOwogCi0gIC8vIFNldCB0aGUgZGVmYXVsdCBwYWNrYWdlCi0gIFBhZ2VNYW5hZ2VyOjpTZWxlY3RQYWNrYWdlICgiVFdSUCIpOworCXdoaWxlIChnR3VpQ29uc29sZVJ1bm5pbmcpCisJCWxvb3BUaW1lcigpOwogCi0gIGlmICghZ0d1aUlucHV0UnVubmluZykKKwkvLyBTZXQgdGhlIGRlZmF1bHQgcGFja2FnZQorCVBhZ2VNYW5hZ2VyOjpTZWxlY3RQYWNrYWdlKCJUV1JQIik7CisKKwlpZiAoIWdHdWlJbnB1dFJ1bm5pbmcpCiAJewotCSAgLy8gU3RhcnQgYnkgc3Bpbm5pbmcgb2ZmIGFuIGlucHV0IGhhbmRsZXIuCi0JICBwdGhyZWFkX3QgdDsKLQkgIHB0aHJlYWRfY3JlYXRlICgmdCwgTlVMTCwgaW5wdXRfdGhyZWFkLCBOVUxMKTsKLQkgIGdHdWlJbnB1dFJ1bm5pbmcgPSAxOworCQkvLyBTdGFydCBieSBzcGlubmluZyBvZmYgYW4gaW5wdXQgaGFuZGxlci4KKwkJcHRocmVhZF90IHQ7CisJCXB0aHJlYWRfY3JlYXRlKCZ0LCBOVUxMLCBpbnB1dF90aHJlYWQsIE5VTEwpOworCQlnR3VpSW5wdXRSdW5uaW5nID0gMTsKIAl9CiAKLSAgcmV0dXJuIHJ1blBhZ2VzICgpOworCXJldHVybiBydW5QYWdlcygpOwogfQogCi1leHRlcm4gIkMiIGludAotZ3VpX3N0YXJ0UGFnZSAoY29uc3QgY2hhciAqcGFnZV9uYW1lKQorZXh0ZXJuICJDIiBpbnQgZ3VpX3N0YXJ0UGFnZShjb25zdCBjaGFyICpwYWdlX25hbWUpCiB7Ci0gIGlmICghZ0d1aUluaXRpYWxpemVkKQotCXJldHVybiAtMTsKKwlpZiAoIWdHdWlJbml0aWFsaXplZCkKKwkJcmV0dXJuIC0xOwogCi0gIGdHdWlDb25zb2xlVGVybWluYXRlID0gMTsKLSAgd2hpbGUgKGdHdWlDb25zb2xlUnVubmluZykKLQlsb29wVGltZXIgKCk7CisJZ0d1aUNvbnNvbGVUZXJtaW5hdGUgPSAxOwogCi0gIC8vIFNldCB0aGUgZGVmYXVsdCBwYWNrYWdlCi0gIFBhZ2VNYW5hZ2VyOjpTZWxlY3RQYWNrYWdlKCJUV1JQIik7CisJd2hpbGUgKGdHdWlDb25zb2xlUnVubmluZykKKwkJbG9vcFRpbWVyKCk7CiAKLSAgaWYgKCFnR3VpSW5wdXRSdW5uaW5nKQorCS8vIFNldCB0aGUgZGVmYXVsdCBwYWNrYWdlCisJUGFnZU1hbmFnZXI6OlNlbGVjdFBhY2thZ2UoIlRXUlAiKTsKKworCWlmICghZ0d1aUlucHV0UnVubmluZykKIAl7Ci0JICAvLyBTdGFydCBieSBzcGlubmluZyBvZmYgYW4gaW5wdXQgaGFuZGxlci4KLQkgIHB0aHJlYWRfdCB0OwotCSAgcHRocmVhZF9jcmVhdGUgKCZ0LCBOVUxMLCBpbnB1dF90aHJlYWQsIE5VTEwpOwotCSAgZ0d1aUlucHV0UnVubmluZyA9IDE7CisJCS8vIFN0YXJ0IGJ5IHNwaW5uaW5nIG9mZiBhbiBpbnB1dCBoYW5kbGVyLgorCQlwdGhyZWFkX3QgdDsKKwkJcHRocmVhZF9jcmVhdGUoJnQsIE5VTEwsIGlucHV0X3RocmVhZCwgTlVMTCk7CisJCWdHdWlJbnB1dFJ1bm5pbmcgPSAxOwogCX0KIAotICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X3BhZ2VfZG9uZSIsIDApOwotICByZXR1cm4gcnVuUGFnZSAocGFnZV9uYW1lKTsKKwlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X3BhZ2VfZG9uZSIsIDApOworCXJldHVybiBydW5QYWdlKHBhZ2VfbmFtZSk7CiB9CiAKLXN0YXRpYyB2b2lkICoKLWNvbnNvbGVfdGhyZWFkICh2b2lkICpjb29raWUpCitzdGF0aWMgdm9pZCAqIGNvbnNvbGVfdGhyZWFkKHZvaWQgKmNvb2tpZSkKIHsKLSAgUGFnZU1hbmFnZXI6OlN3aXRjaFRvQ29uc29sZSAoKTsKKwlQYWdlTWFuYWdlcjo6U3dpdGNoVG9Db25zb2xlKCk7CiAKLSAgd2hpbGUgKCFnR3VpQ29uc29sZVRlcm1pbmF0ZSkKKwl3aGlsZSAoIWdHdWlDb25zb2xlVGVybWluYXRlKQogCXsKLQkgIGxvb3BUaW1lciAoKTsKKwkJbG9vcFRpbWVyKCk7CiAKLQkgIGlmICghZ0ZvcmNlUmVuZGVyKQorCQlpZiAoIWdGb3JjZVJlbmRlcikKIAkJewotCQkgIGludCByZXQ7CisJCQlpbnQgcmV0OwogCi0JCSAgcmV0ID0gUGFnZU1hbmFnZXI6OlVwZGF0ZSAoKTsKLQkJICBpZiAocmV0ID4gMSkKLQkJCVBhZ2VNYW5hZ2VyOjpSZW5kZXIgKCk7CisJCQlyZXQgPSBQYWdlTWFuYWdlcjo6VXBkYXRlKCk7CisJCQlpZiAocmV0ID4gMSkKKwkJCQlQYWdlTWFuYWdlcjo6UmVuZGVyKCk7CiAKLQkJICBpZiAocmV0ID4gMCkKLQkJCWZsaXAgKCk7CisJCQlpZiAocmV0ID4gMCkKKwkJCQlmbGlwKCk7CiAKLQkJICBpZiAocmV0IDwgMCkKLQkJCUxPR0VSUigiQW4gdXBkYXRlIHJlcXVlc3QgaGFzIGZhaWxlZC5cbiIpOworCQkJaWYgKHJldCA8IDApCisJCQkJTE9HRVJSKCJBbiB1cGRhdGUgcmVxdWVzdCBoYXMgZmFpbGVkLlxuIik7CiAJCX0KLQkgIGVsc2UKKwkJZWxzZQogCQl7Ci0JCSAgcHRocmVhZF9tdXRleF9sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7Ci0JCSAgZ0ZvcmNlUmVuZGVyID0gMDsKLQkJICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOwotCQkgIFBhZ2VNYW5hZ2VyOjpSZW5kZXIgKCk7Ci0JCSAgZmxpcCAoKTsKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmZ0ZvcmNlUmVuZGVybXV0ZXgpOworCQkJZ0ZvcmNlUmVuZGVyID0gMDsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnRm9yY2VSZW5kZXJtdXRleCk7CisJCQlQYWdlTWFuYWdlcjo6UmVuZGVyKCk7CisJCQlmbGlwKCk7CiAJCX0KIAl9Ci0gIGdHdWlDb25zb2xlUnVubmluZyA9IDA7Ci0gIHJldHVybiBOVUxMOworCWdHdWlDb25zb2xlUnVubmluZyA9IDA7CisJcmV0dXJuIE5VTEw7CiB9CiAKLWV4dGVybiAiQyIgaW50Ci1ndWlfY29uc29sZV9vbmx5ICgpCitleHRlcm4gIkMiIGludCBndWlfY29uc29sZV9vbmx5KHZvaWQpCiB7Ci0gIGlmICghZ0d1aUluaXRpYWxpemVkKQotCXJldHVybiAtMTsKKwlpZiAoIWdHdWlJbml0aWFsaXplZCkKKwkJcmV0dXJuIC0xOwogCi0gIGdHdWlDb25zb2xlVGVybWluYXRlID0gMDsKLSAgZ0d1aUNvbnNvbGVSdW5uaW5nID0gMTsKKwlnR3VpQ29uc29sZVRlcm1pbmF0ZSA9IDA7CisJZ0d1aUNvbnNvbGVSdW5uaW5nID0gMTsKIAotICAvLyBTdGFydCBieSBzcGlubmluZyBvZmYgYW4gaW5wdXQgaGFuZGxlci4KLSAgcHRocmVhZF90IHQ7Ci0gIHB0aHJlYWRfY3JlYXRlICgmdCwgTlVMTCwgY29uc29sZV90aHJlYWQsIE5VTEwpOworCS8vIFN0YXJ0IGJ5IHNwaW5uaW5nIG9mZiBhbiBpbnB1dCBoYW5kbGVyLgorCXB0aHJlYWRfdCB0OworCXB0aHJlYWRfY3JlYXRlKCZ0LCBOVUxMLCBjb25zb2xlX3RocmVhZCwgTlVMTCk7CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9ndWkvaGFyZHdhcmVrZXlib2FyZC5jcHAgYi9ndWkvaGFyZHdhcmVrZXlib2FyZC5jcHAKaW5kZXggOTY5NThkNS4uYTVhOTk4NyAxMDA2NDQKLS0tIGEvZ3VpL2hhcmR3YXJla2V5Ym9hcmQuY3BwCisrKyBiL2d1aS9oYXJkd2FyZWtleWJvYXJkLmNwcApAQCAtMjYsMTUgKzI2LDE4IEBACiAjaW5jbHVkZSAicmFwaWR4bWwuaHBwIgogI2luY2x1ZGUgIm9iamVjdHMuaHBwIgogCi1IYXJkd2FyZUtleWJvYXJkOjpIYXJkd2FyZUtleWJvYXJkKHZvaWQpIHsKLQkvLyBEbyBOb3RoaW5nCitIYXJkd2FyZUtleWJvYXJkOjpIYXJkd2FyZUtleWJvYXJkKHZvaWQpCit7CisKIH0KIAotSGFyZHdhcmVLZXlib2FyZDo6fkhhcmR3YXJlS2V5Ym9hcmQoKSB7Ci0JLy8gRG8gTm90aGluZworSGFyZHdhcmVLZXlib2FyZDo6fkhhcmR3YXJlS2V5Ym9hcmQoKQoreworCQogfQogCi1pbnQgSGFyZHdhcmVLZXlib2FyZDo6S2V5RG93bihpbnQga2V5X2NvZGUpIHsKK2ludCBIYXJkd2FyZUtleWJvYXJkOjpLZXlEb3duKGludCBrZXlfY29kZSkKK3sKICNpZmRlZiBfRVZFTlRfTE9HR0lORwogCUxPR0VSUigiSGFyZHdhcmVLZXlib2FyZDo6S2V5RG93biAlaVxuIiwga2V5X2NvZGUpOwogI2VuZGlmCkBAIC00MiwxNCArNDUsMTYgQEAKIAlyZXR1cm4gMDsgLy8gMCA9IG5vIGtleSByZXBlYXQgYW55dGhpbmcgZWxzZSB0dXJucyBvbiBrZXkgcmVwZWF0CiB9CiAKLWludCBIYXJkd2FyZUtleWJvYXJkOjpLZXlVcChpbnQga2V5X2NvZGUpIHsKK2ludCBIYXJkd2FyZUtleWJvYXJkOjpLZXlVcChpbnQga2V5X2NvZGUpCit7CiAjaWZkZWYgX0VWRU5UX0xPR0dJTkcKIAlMT0dFUlIoIkhhcmR3YXJlS2V5Ym9hcmQ6OktleVVwICVpXG4iLCBrZXlfY29kZSk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAotaW50IEhhcmR3YXJlS2V5Ym9hcmQ6OktleVJlcGVhdCh2b2lkKSB7CitpbnQgSGFyZHdhcmVLZXlib2FyZDo6S2V5UmVwZWF0KHZvaWQpCit7CiAjaWZkZWYgX0VWRU5UX0xPR0dJTkcKIAlMT0dFUlIoIkhhcmR3YXJlS2V5Ym9hcmQ6OktleVJlcGVhdFxuIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2d1aS9pbWFnZS5jcHAgYi9ndWkvaW1hZ2UuY3BwCmluZGV4IGM2ODRkMWIuLjQ1ZDg2MzYgMTAwNjQ0Ci0tLSBhL2d1aS9pbWFnZS5jcHAKKysrIGIvZ3VpL2ltYWdlLmNwcApAQCAtMjcsNzEgKzI3LDc2IEBACiAKIEdVSUltYWdlOjpHVUlJbWFnZSh4bWxfbm9kZTw+KiBub2RlKQogewotICAgIHhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfYXR0cmlidXRlPD4qIGF0dHI7CisJeG1sX25vZGU8PiogY2hpbGQ7CiAKLSAgICBtSW1hZ2UgPSBOVUxMOworCW1JbWFnZSA9IE5VTEw7CiAJbUhpZ2hsaWdodEltYWdlID0gTlVMTDsKIAlpc0hpZ2hsaWdodGVkID0gZmFsc2U7CiAKLSAgICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybjsKKwlpZiAoIW5vZGUpCisJCXJldHVybjsKIAotICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiaW1hZ2UiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgewotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgicmVzb3VyY2UiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICBtSW1hZ2UgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOworCWNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiaW1hZ2UiKTsKKwlpZiAoY2hpbGQpCisJeworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgicmVzb3VyY2UiKTsKKwkJaWYgKGF0dHIpCisJCQltSW1hZ2UgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwogCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiaGlnaGxpZ2h0cmVzb3VyY2UiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICBtSGlnaGxpZ2h0SW1hZ2UgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwotICAgIH0KKwkJaWYgKGF0dHIpCisJCQltSGlnaGxpZ2h0SW1hZ2UgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOworCX0KIAotICAgIC8vIExvYWQgdGhlIHBsYWNlbWVudAotICAgIExvYWRQbGFjZW1lbnQobm9kZS0+Zmlyc3Rfbm9kZSgicGxhY2VtZW50IiksICZtUmVuZGVyWCwgJm1SZW5kZXJZLCBOVUxMLCBOVUxMLCAmbVBsYWNlbWVudCk7CisJLy8gTG9hZCB0aGUgcGxhY2VtZW50CisJTG9hZFBsYWNlbWVudChub2RlLT5maXJzdF9ub2RlKCJwbGFjZW1lbnQiKSwgJm1SZW5kZXJYLCAmbVJlbmRlclksIE5VTEwsIE5VTEwsICZtUGxhY2VtZW50KTsKIAotICAgIGlmIChtSW1hZ2UgJiYgbUltYWdlLT5HZXRSZXNvdXJjZSgpKQotICAgIHsKLSAgICAgICAgbVJlbmRlclcgPSBncl9nZXRfd2lkdGgobUltYWdlLT5HZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgbVJlbmRlckggPSBncl9nZXRfaGVpZ2h0KG1JbWFnZS0+R2V0UmVzb3VyY2UoKSk7CisJaWYgKG1JbWFnZSAmJiBtSW1hZ2UtPkdldFJlc291cmNlKCkpCisJeworCQltUmVuZGVyVyA9IGdyX2dldF93aWR0aChtSW1hZ2UtPkdldFJlc291cmNlKCkpOworCQltUmVuZGVySCA9IGdyX2dldF9oZWlnaHQobUltYWdlLT5HZXRSZXNvdXJjZSgpKTsKIAotICAgICAgICAvLyBBZGp1c3QgZm9yIHBsYWNlbWVudAotICAgICAgICBpZiAobVBsYWNlbWVudCAhPSBUT1BfTEVGVCAmJiBtUGxhY2VtZW50ICE9IEJPVFRPTV9MRUZUKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobVBsYWNlbWVudCA9PSBDRU5URVIpCi0gICAgICAgICAgICAgICAgbVJlbmRlclggLT0gKG1SZW5kZXJXIC8gMik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbVJlbmRlclggLT0gbVJlbmRlclc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QbGFjZW1lbnQgIT0gVE9QX0xFRlQgJiYgbVBsYWNlbWVudCAhPSBUT1BfUklHSFQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtUGxhY2VtZW50ID09IENFTlRFUikKLSAgICAgICAgICAgICAgICBtUmVuZGVyWSAtPSAobVJlbmRlckggLyAyKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtUmVuZGVyWSAtPSBtUmVuZGVySDsKLSAgICAgICAgfQotICAgICAgICBTZXRQbGFjZW1lbnQoVE9QX0xFRlQpOwotICAgIH0KKwkJLy8gQWRqdXN0IGZvciBwbGFjZW1lbnQKKwkJaWYgKG1QbGFjZW1lbnQgIT0gVE9QX0xFRlQgJiYgbVBsYWNlbWVudCAhPSBCT1RUT01fTEVGVCkKKwkJeworCQkJaWYgKG1QbGFjZW1lbnQgPT0gQ0VOVEVSKQorCQkJCW1SZW5kZXJYIC09IChtUmVuZGVyVyAvIDIpOworCQkJZWxzZQorCQkJCW1SZW5kZXJYIC09IG1SZW5kZXJXOworCQl9CisJCWlmIChtUGxhY2VtZW50ICE9IFRPUF9MRUZUICYmIG1QbGFjZW1lbnQgIT0gVE9QX1JJR0hUKQorCQl7CisJCQlpZiAobVBsYWNlbWVudCA9PSBDRU5URVIpCisJCQkJbVJlbmRlclkgLT0gKG1SZW5kZXJIIC8gMik7CisJCQllbHNlCisJCQkJbVJlbmRlclkgLT0gbVJlbmRlckg7CisJCX0KKwkJU2V0UGxhY2VtZW50KFRPUF9MRUZUKTsKKwl9CiAKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiBpbnQgR1VJSW1hZ2U6OlJlbmRlcih2b2lkKQogewotICAgIGlmIChpc0hpZ2hsaWdodGVkICYmIG1IaWdobGlnaHRJbWFnZSAmJiBtSGlnaGxpZ2h0SW1hZ2UtPkdldFJlc291cmNlKCkpIHsKKwlpZiAoaXNIaWdobGlnaHRlZCAmJiBtSGlnaGxpZ2h0SW1hZ2UgJiYgbUhpZ2hsaWdodEltYWdlLT5HZXRSZXNvdXJjZSgpKSB7CiAJCWdyX2JsaXQobUhpZ2hsaWdodEltYWdlLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtUmVuZGVyVywgbVJlbmRlckgsIG1SZW5kZXJYLCBtUmVuZGVyWSk7CiAJCXJldHVybiAwOwotCX0gZWxzZSBpZiAoIW1JbWFnZSB8fCAhbUltYWdlLT5HZXRSZXNvdXJjZSgpKSAgICAgIHJldHVybiAtMTsKLSAgICBncl9ibGl0KG1JbWFnZS0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbVJlbmRlclcsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOwotICAgIHJldHVybiAwOworCX0KKwllbHNlIGlmICghbUltYWdlIHx8ICFtSW1hZ2UtPkdldFJlc291cmNlKCkpCisJCXJldHVybiAtMTsKKworCWdyX2JsaXQobUltYWdlLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtUmVuZGVyVywgbVJlbmRlckgsIG1SZW5kZXJYLCBtUmVuZGVyWSk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBHVUlJbWFnZTo6U2V0UmVuZGVyUG9zKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQogewotICAgIGlmICh3IHx8IGgpICAgICByZXR1cm4gLTE7Ci0gICAgbVJlbmRlclggPSB4OwotICAgIG1SZW5kZXJZID0geTsKLSAgICByZXR1cm4gMDsKKwlpZiAodyB8fCBoKQorCQlyZXR1cm4gLTE7CisKKwltUmVuZGVyWCA9IHg7CisJbVJlbmRlclkgPSB5OworCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ndWkvaW5wdXQuY3BwIGIvZ3VpL2lucHV0LmNwcAppbmRleCBlMDE2NzI0Li4xOWU0ZTZhIDEwMDY0NAotLS0gYS9ndWkvaW5wdXQuY3BwCisrKyBiL2d1aS9pbnB1dC5jcHAKQEAgLTI5LDE3ICsyOSwxNyBAQAogI2luY2x1ZGUgIi4uL2RhdGEuaHBwIgogCiBHVUlJbnB1dDo6R1VJSW5wdXQoeG1sX25vZGU8Piogbm9kZSkKLSAgICA6IENvbmRpdGlvbmFsKG5vZGUpCisJOiBDb25kaXRpb25hbChub2RlKQogewotICAgIHhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfYXR0cmlidXRlPD4qIGF0dHI7CisJeG1sX25vZGU8PiogY2hpbGQ7CiAKLSAgICBtSW5wdXRUZXh0ID0gTlVMTDsKKwltSW5wdXRUZXh0ID0gTlVMTDsKIAltQWN0aW9uID0gTlVMTDsKIAltQmFja2dyb3VuZCA9IE5VTEw7CiAJbUN1cnNvciA9IE5VTEw7CiAJbUZvbnQgPSBOVUxMOwotICAgIG1SZW5kZXJlZCA9IGZhbHNlOworCW1SZW5kZXJlZCA9IGZhbHNlOwogCUhhc01hc2sgPSBmYWxzZTsKIAlEcmF3Q3Vyc29yID0gZmFsc2U7CiAJaXNMb2NhbENoYW5nZSA9IHRydWU7CkBAIC01MiwxOCArNTIsMTkgQEAKIAlDb252ZXJ0U3RyVG9Db2xvcigiYmxhY2siLCAmbUJhY2tncm91bmRDb2xvcik7CiAJQ29udmVydFN0clRvQ29sb3IoIndoaXRlIiwgJm1DdXJzb3JDb2xvcik7CiAKLSAgICBpZiAoIW5vZGUpICByZXR1cm47CisJaWYgKCFub2RlKQorCQlyZXR1cm47CiAKLSAgICAvLyBMb2FkIHRleHQgZGlyZWN0bHkgZnJvbSB0aGUgbm9kZQotICAgIG1JbnB1dFRleHQgPSBuZXcgR1VJVGV4dChub2RlKTsKKwkvLyBMb2FkIHRleHQgZGlyZWN0bHkgZnJvbSB0aGUgbm9kZQorCW1JbnB1dFRleHQgPSBuZXcgR1VJVGV4dChub2RlKTsKIAkvLyBMb2FkIGFjdGlvbiBkaXJlY3RseSBmcm9tIHRoZSBub2RlCiAJbUFjdGlvbiA9IG5ldyBHVUlBY3Rpb24obm9kZSk7CiAKIAlpZiAobUlucHV0VGV4dC0+UmVuZGVyKCkgPCAwKQotICAgIHsKLSAgICAgICAgZGVsZXRlIG1JbnB1dFRleHQ7Ci0gICAgICAgIG1JbnB1dFRleHQgPSBOVUxMOwotICAgIH0KKwl7CisJCWRlbGV0ZSBtSW5wdXRUZXh0OworCQltSW5wdXRUZXh0ID0gTlVMTDsKKwl9CiAKIAkvLyBMb2FkIHRoZSBiYWNrZ3JvdW5kCiAJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJiYWNrZ3JvdW5kIik7CkBAIC0xMTQsMTggKzExNSwxOCBAQAogCURyYXdDdXJzb3IgPSBIYXNJbnB1dEZvY3VzOwogCiAJLy8gTG9hZCB0aGUgZm9udCwgYW5kIHBvc3NpYmx5IG92ZXJyaWRlIHRoZSBjb2xvcgotICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiZm9udCIpOwotICAgIGlmIChjaGlsZCkKLSAgICB7Ci0gICAgICAgIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJyZXNvdXJjZSIpOwotICAgICAgICBpZiAoYXR0cikgewotICAgICAgICAgICAgbUZvbnQgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOworCWNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgiZm9udCIpOworCWlmIChjaGlsZCkKKwl7CisJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJyZXNvdXJjZSIpOworCQlpZiAoYXR0cikgeworCQkJbUZvbnQgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwogCQkJZ3JfZ2V0Rm9udERldGFpbHMobUZvbnQgPyBtRm9udC0+R2V0UmVzb3VyY2UoKSA6IE5VTEwsICZtRm9udEhlaWdodCwgTlVMTCk7CiAJCX0KLSAgICB9CisJfQogCiAJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJ0ZXh0Iik7Ci0gICAgaWYgKGNoaWxkKSAgbVRleHQgPSBjaGlsZC0+dmFsdWUoKTsKKwlpZiAoY2hpbGQpICBtVGV4dCA9IGNoaWxkLT52YWx1ZSgpOwogCW1MYXN0VmFsdWUgPSBndWlfcGFyc2VfdGV4dChtVGV4dCk7CiAKIAljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImRhdGEiKTsKQEAgLTE3NSw3ICsxNzYsNyBAQAogCQl9CiAJfQogCi0gICAgLy8gTG9hZCB0aGUgcGxhY2VtZW50CisJLy8gTG9hZCB0aGUgcGxhY2VtZW50CiAJTG9hZFBsYWNlbWVudChub2RlLT5maXJzdF9ub2RlKCJwbGFjZW1lbnQiKSwgJm1SZW5kZXJYLCAmbVJlbmRlclksICZtUmVuZGVyVywgJm1SZW5kZXJIKTsKIAlTZXRBY3Rpb25Qb3MobVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckgpOwogCkBAIC0xOTAsMTcgKzE5MSwxNSBAQAogCiAJaXNMb2NhbENoYW5nZSA9IGZhbHNlOwogCUhhbmRsZVRleHRMb2NhdGlvbigtMyk7Ci0KLSAgICByZXR1cm47CiB9CiAKIEdVSUlucHV0Ojp+R1VJSW5wdXQoKQogewotICAgIGlmIChtSW5wdXRUZXh0KSAgICAgZGVsZXRlIG1JbnB1dFRleHQ7Ci0JaWYgKG1CYWNrZ3JvdW5kKSAgICBkZWxldGUgbUJhY2tncm91bmQ7Ci0JaWYgKG1DdXJzb3IpICAgICAgICBkZWxldGUgbUN1cnNvcjsKLQlpZiAobUZvbnQpICAgICAgICAgIGRlbGV0ZSBtRm9udDsKLQlpZiAobUFjdGlvbikgICAgICAgIGRlbGV0ZSBtQWN0aW9uOworCWlmIChtSW5wdXRUZXh0KQkgCWRlbGV0ZSBtSW5wdXRUZXh0OworCWlmIChtQmFja2dyb3VuZCkJZGVsZXRlIG1CYWNrZ3JvdW5kOworCWlmIChtQ3Vyc29yKQkJZGVsZXRlIG1DdXJzb3I7CisJaWYgKG1Gb250KQkJCWRlbGV0ZSBtRm9udDsKKwlpZiAobUFjdGlvbikJCWRlbGV0ZSBtQWN0aW9uOwogfQogCiBpbnQgR1VJSW5wdXQ6OkhhbmRsZVRleHRMb2NhdGlvbihpbnQgeCkKQEAgLTIwOSw3ICsyMDgsOCBAQAogCXN0cmluZyBkaXNwbGF5VmFsdWUsIG9yaWdpbmFsVmFsdWUsIGluc2VydENoYXI7CiAJdm9pZCogZm9udFJlc291cmNlID0gTlVMTDsKIAotCWlmIChtRm9udCkgIGZvbnRSZXNvdXJjZSA9IG1Gb250LT5HZXRSZXNvdXJjZSgpOworCWlmIChtRm9udCkKKwkJZm9udFJlc291cmNlID0gbUZvbnQtPkdldFJlc291cmNlKCk7CiAKIAlEYXRhTWFuYWdlcjo6R2V0VmFsdWUobVZhcmlhYmxlLCBvcmlnaW5hbFZhbHVlKTsKIAlkaXNwbGF5VmFsdWUgPSBvcmlnaW5hbFZhbHVlOwpAQCAtMjI5LDkgKzIyOSwxMCBAQAogCQltUmVuZGVyZWQgPSBmYWxzZTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChza2lwQ2hhcnMgJiYgc2tpcENoYXJzIDwgZGlzcGxheVZhbHVlLnNpemUoKSkgeworCisJaWYgKHNraXBDaGFycyAmJiBza2lwQ2hhcnMgPCBkaXNwbGF5VmFsdWUuc2l6ZSgpKQogCQlkaXNwbGF5VmFsdWUuZXJhc2UoMCwgc2tpcENoYXJzKTsKLQl9CisKIAl0ZXh0V2lkdGggPSBncl9tZWFzdXJlRXgoZGlzcGxheVZhbHVlLmNfc3RyKCksIGZvbnRSZXNvdXJjZSk7CiAJbVJlbmRlcmVkID0gZmFsc2U7CiAKQEAgLTIzOSw5ICsyNDAsOSBAQAogCiAJaWYgKHggPCAtMTAwMCkgewogCQkvLyBObyBjaGFuZ2UgaW4gc2Nyb2xsaW5nCi0JCWlmICh4ID09IC0xMDAzKSB7CisJCWlmICh4ID09IC0xMDAzKQogCQkJbUN1cnNvckxvY2F0aW9uID0gLTE7Ci0JCX0KKwogCQlpZiAobUN1cnNvckxvY2F0aW9uID09IC0xKSB7CiAJCQlkaXNwbGF5VmFsdWUgPSBvcmlnaW5hbFZhbHVlOwogCQkJc2tpcENoYXJzID0gMDsKQEAgLTM3MiwxNSArMzczLDE1IEBACiBpbnQgR1VJSW5wdXQ6OlJlbmRlcih2b2lkKQogewogCWlmICghaXNDb25kaXRpb25UcnVlKCkpCi0gICAgewotICAgICAgICBtUmVuZGVyZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCXsKKwkJbVJlbmRlcmVkID0gZmFsc2U7CisJCXJldHVybiAwOworCX0KIAogCXZvaWQqIGZvbnRSZXNvdXJjZSA9IE5VTEw7CiAJaWYgKG1Gb250KSAgZm9udFJlc291cmNlID0gbUZvbnQtPkdldFJlc291cmNlKCk7CiAKLSAgICAvLyBGaXJzdCBzdGVwLCBmaWxsIGJhY2tncm91bmQKKwkvLyBGaXJzdCBzdGVwLCBmaWxsIGJhY2tncm91bmQKIAlncl9jb2xvcihtQmFja2dyb3VuZENvbG9yLnJlZCwgbUJhY2tncm91bmRDb2xvci5ncmVlbiwgbUJhY2tncm91bmRDb2xvci5ibHVlLCAyNTUpOwogCWdyX2ZpbGwobVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckgpOwogCkBAIC0zOTQsMTEgKzM5NSwxMSBAQAogCiAJaW50IHJldCA9IDA7CiAKLSAgICAvLyBSZW5kZXIgdGhlIHRleHQKKwkvLyBSZW5kZXIgdGhlIHRleHQKIAltSW5wdXRUZXh0LT5TZXRSZW5kZXJQb3MobVJlbmRlclggKyBzY3JvbGxpbmdYLCBtRm9udFkpOwogCW1JbnB1dFRleHQtPlNldE1heFdpZHRoKG1SZW5kZXJXIC0gc2Nyb2xsaW5nWCk7Ci0JaWYgKG1JbnB1dFRleHQpICAgICByZXQgPSBtSW5wdXRUZXh0LT5SZW5kZXIoKTsKLSAgICBpZiAocmV0IDwgMCkgICAgICAgIHJldHVybiByZXQ7CisJaWYgKG1JbnB1dFRleHQpCSByZXQgPSBtSW5wdXRUZXh0LT5SZW5kZXIoKTsKKwlpZiAocmV0IDwgMCkJCXJldHVybiByZXQ7CiAKIAlpZiAoSGFzSW5wdXRGb2N1cyAmJiBEcmF3Q3Vyc29yKSB7CiAJCS8vIFJlbmRlciB0aGUgY3Vyc29yCkBAIC00NTEsMjEgKzQ1MiwyMSBAQAogCQlncl9maWxsKGN1cnNvclgsIG1Gb250WSwgQ3Vyc29yV2lkdGgsIG1Gb250SGVpZ2h0KTsKIAl9CiAKLSAgICBtUmVuZGVyZWQgPSB0cnVlOwotICAgIHJldHVybiByZXQ7CisJbVJlbmRlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgR1VJSW5wdXQ6OlVwZGF0ZSh2b2lkKQogewotICAgIGlmICghaXNDb25kaXRpb25UcnVlKCkpICAgICByZXR1cm4gKG1SZW5kZXJlZCA/IDIgOiAwKTsKLSAgICBpZiAoIW1SZW5kZXJlZCkgICAgICAgICAgICAgcmV0dXJuIDI7CisJaWYgKCFpc0NvbmRpdGlvblRydWUoKSkJIHJldHVybiAobVJlbmRlcmVkID8gMiA6IDApOworCWlmICghbVJlbmRlcmVkKQkJCSByZXR1cm4gMjsKIAotICAgIGludCByZXQgPSAwOworCWludCByZXQgPSAwOwogCi0gICAgaWYgKG1JbnB1dFRleHQpICAgICAgICAgcmV0ID0gbUlucHV0VGV4dC0+VXBkYXRlKCk7Ci0gICAgaWYgKHJldCA8IDApICAgICAgICAgICAgcmV0dXJuIHJldDsKKwlpZiAobUlucHV0VGV4dCkJCSByZXQgPSBtSW5wdXRUZXh0LT5VcGRhdGUoKTsKKwlpZiAocmV0IDwgMCkJCQlyZXR1cm4gcmV0OwogCi0gICAgcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgR1VJSW5wdXQ6OkdldFNlbGVjdGlvbihpbnQgeCwgaW50IHkpCkBAIC00NzYsMTQgKzQ3NywxNSBAQAogCiBpbnQgR1VJSW5wdXQ6Ok5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpCiB7Ci0gICAgc3RhdGljIGludCBzdGFydFNlbGVjdGlvbiA9IC0xOworCXN0YXRpYyBpbnQgc3RhcnRTZWxlY3Rpb24gPSAtMTsKIAlpbnQgdGV4dFdpZHRoOwogCXN0cmluZyBkaXNwbGF5VmFsdWUsIG9yaWdpbmFsVmFsdWU7CiAJdm9pZCogZm9udFJlc291cmNlID0gTlVMTDsKIAogCWlmIChtRm9udCkgIGZvbnRSZXNvdXJjZSA9IG1Gb250LT5HZXRSZXNvdXJjZSgpOwogCi0JaWYgKCFpc0NvbmRpdGlvblRydWUoKSkgICAgIHJldHVybiAtMTsKKwlpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKQorCQlyZXR1cm4gLTE7CiAKIAlpZiAoIUhhc0lucHV0Rm9jdXMpIHsKIAkJaWYgKHN0YXRlICE9IFRPVUNIX1JFTEVBU0UpCkBAIC01NjksNyArNTcxLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBpbnQgR1VJSW5wdXQ6Ok5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSkKZGlmZiAtLWdpdCBhL2d1aS9saXN0Ym94LmNwcCBiL2d1aS9saXN0Ym94LmNwcAppbmRleCAzYWY0MGVkLi5hNDk3NmY0IDEwMDY0NAotLS0gYS9ndWkvbGlzdGJveC5jcHAKKysrIGIvZ3VpL2xpc3Rib3guY3BwCkBAIC0xOTEsMTIgKzE5MSwxMiBAQAogCiAJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJoaWdobGlnaHRjb2xvciIpOwogCQltZW1zZXQoJm1Gb250SGlnaGxpZ2h0Q29sb3IsIDAsIHNpemVvZihDT0xPUikpOwotICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOworCQlpZiAoYXR0cikKKwkJeworCQkJc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOwogCQkJQ29udmVydFN0clRvQ29sb3IoY29sb3IsICZtRm9udEhpZ2hsaWdodENvbG9yKTsKIAkJCWhhc0ZvbnRIaWdobGlnaHRDb2xvciA9IHRydWU7Ci0gICAgICAgIH0KKwkJfQogCX0KIAogCS8vIExvYWQgdGhlIHNlcGFyYXRvciBpZiBpdCBleGlzdHMKQEAgLTMyMywxNSArMzIzLDE1IEBACiAKIAkvLyBHZXQgdGhlIGRhdGEgZm9yIHRoZSBsaXN0CiAJY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJsaXN0aXRlbSIpOwotICAgIGlmICghY2hpbGQpIHJldHVybjsKKwlpZiAoIWNoaWxkKSByZXR1cm47CiAJCiAJd2hpbGUgKGNoaWxkKQotICAgIHsKLSAgICAgICAgTGlzdERhdGEgZGF0YTsKKwl7CisJCUxpc3REYXRhIGRhdGE7CiAKIAkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICAgICAgaWYgKCFhdHRyKSByZXR1cm47Ci0gICAgICAgIGRhdGEuZGlzcGxheU5hbWUgPSBhdHRyLT52YWx1ZSgpOworCQlpZiAoIWF0dHIpIHJldHVybjsKKwkJZGF0YS5kaXNwbGF5TmFtZSA9IGF0dHItPnZhbHVlKCk7CiAKIAkJZGF0YS52YXJpYWJsZVZhbHVlID0gY2hpbGQtPnZhbHVlKCk7CiAJCWlmIChjaGlsZC0+dmFsdWUoKSA9PSBjdXJyZW50VmFsdWUpIHsKQEAgLTM0MCwxMCArMzQwLDEwIEBACiAJCQlkYXRhLnNlbGVjdGVkID0gMDsKIAkJfQogCi0gICAgICAgIG1MaXN0LnB1c2hfYmFjayhkYXRhKTsKKwkJbUxpc3QucHVzaF9iYWNrKGRhdGEpOwogCi0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygibGlzdGl0ZW0iKTsKLSAgICB9CisJCWNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygibGlzdGl0ZW0iKTsKKwl9CiB9CiAKIEdVSUxpc3RCb3g6On5HVUlMaXN0Qm94KCkKQEAgLTQzMCwyMSArNDMwLDIxIEBACiAJCX0KIAogCQlpZiAobUxpc3QuYXQobGluZSArIG1TdGFydCkuc2VsZWN0ZWQgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWNvbiA9IG1JY29uU2VsZWN0ZWQ7CisJCXsKKwkJCWljb24gPSBtSWNvblNlbGVjdGVkOwogCQkJY3VycmVudEljb25IZWlnaHQgPSBtU2VsZWN0ZWRJY29uSGVpZ2h0OwogCQkJY3VycmVudEljb25XaWR0aCA9IG1TZWxlY3RlZEljb25XaWR0aDsKIAkJCWN1cnJlbnRJY29uT2Zmc2V0WSA9IFNlbGVjdGVkSWNvbk9mZnNldFk7CiAJCQljdXJyZW50SWNvbk9mZnNldFggPSBTZWxlY3RlZEljb25PZmZzZXRYOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWNvbiA9IG1JY29uVW5zZWxlY3RlZDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWljb24gPSBtSWNvblVuc2VsZWN0ZWQ7CiAJCQljdXJyZW50SWNvbkhlaWdodCA9IG1TZWxlY3RlZEljb25IZWlnaHQ7CiAJCQljdXJyZW50SWNvbldpZHRoID0gbVNlbGVjdGVkSWNvbldpZHRoOwogCQkJY3VycmVudEljb25PZmZzZXRZID0gU2VsZWN0ZWRJY29uT2Zmc2V0WTsKIAkJCWN1cnJlbnRJY29uT2Zmc2V0WCA9IFNlbGVjdGVkSWNvbk9mZnNldFg7Ci0gICAgICAgIH0KKwkJfQogCiAJCWlmIChpY29uICYmIGljb24tPkdldFJlc291cmNlKCkpCiAJCXsKQEAgLTc1OCw4ICs3NTgsOCBAQAogCQl9CiAJfQogCWlmICh2YXJOYW1lID09IG1WYXJpYWJsZSkKLSAgICB7Ci0gICAgICAgIGludCBpLCBsaXN0U2l6ZSA9IG1MaXN0LnNpemUoKSwgc2VsZWN0ZWRfaW5kZXggPSAwOworCXsKKwkJaW50IGksIGxpc3RTaXplID0gbUxpc3Quc2l6ZSgpLCBzZWxlY3RlZF9pbmRleCA9IDA7CiAKIAkJY3VycmVudFZhbHVlID0gdmFsdWU7CiAKQEAgLTc4Myw4ICs3ODMsOCBAQAogCQl9CiAKIAkJbVVwZGF0ZSA9IDE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ndWkvb2JqZWN0cy5ocHAgYi9ndWkvb2JqZWN0cy5ocHAKaW5kZXggZmY1NDI5YS4uOGY2ZjliYiAxMDA2NDQKLS0tIGEvZ3VpL29iamVjdHMuaHBwCisrKyBiL2d1aS9vYmplY3RzLmhwcApAQCAtMzksMTI0ICszOSwxMjMgQEAKIGNsYXNzIFJlbmRlck9iamVjdAogewogcHVibGljOgotICAgIGVudW0gUGxhY2VtZW50IHsKLSAgICAgICAgVE9QX0xFRlQgPSAwLAotICAgICAgICBUT1BfUklHSFQgPSAxLAotICAgICAgICBCT1RUT01fTEVGVCA9IDIsCi0gICAgICAgIEJPVFRPTV9SSUdIVCA9IDMsCi0gICAgICAgIENFTlRFUiA9IDQsCisJZW51bSBQbGFjZW1lbnQgeworCQlUT1BfTEVGVCA9IDAsCisJCVRPUF9SSUdIVCA9IDEsCisJCUJPVFRPTV9MRUZUID0gMiwKKwkJQk9UVE9NX1JJR0hUID0gMywKKwkJQ0VOVEVSID0gNCwKIAkJQ0VOVEVSX1hfT05MWSA9IDUsCi0gICAgfTsKKwl9OwogCiBwdWJsaWM6Ci0gICAgUmVuZGVyT2JqZWN0KCkgICAgICAgICAgICAgIHsgbVJlbmRlclggPSAwOyBtUmVuZGVyWSA9IDA7IG1SZW5kZXJXID0gMDsgbVJlbmRlckggPSAwOyBtUGxhY2VtZW50ID0gVE9QX0xFRlQ7IH0KLSAgICB2aXJ0dWFsIH5SZW5kZXJPYmplY3QoKSAgICAge30KKwlSZW5kZXJPYmplY3QoKSB7IG1SZW5kZXJYID0gMDsgbVJlbmRlclkgPSAwOyBtUmVuZGVyVyA9IDA7IG1SZW5kZXJIID0gMDsgbVBsYWNlbWVudCA9IFRPUF9MRUZUOyB9CisJdmlydHVhbCB+UmVuZGVyT2JqZWN0KCkge30KIAogcHVibGljOgotICAgIC8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBSZW5kZXIodm9pZCkgPSAwOworCS8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBSZW5kZXIodm9pZCkgPSAwOwogCi0gICAgLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKLSAgICAvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKSAgICAgICAgeyByZXR1cm4gMDsgfQorCS8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCisJLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBVcGRhdGUodm9pZCkgeyByZXR1cm4gMDsgfQogCi0gICAgLy8gR2V0UmVuZGVyUG9zIC0gUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0Ci0gICAgdmlydHVhbCBpbnQgR2V0UmVuZGVyUG9zKGludCYgeCwgaW50JiB5LCBpbnQmIHcsIGludCYgaCkgICAgICAgIHsgeCA9IG1SZW5kZXJYOyB5ID0gbVJlbmRlclk7IHcgPSBtUmVuZGVyVzsgaCA9IG1SZW5kZXJIOyByZXR1cm4gMDsgfQorCS8vIEdldFJlbmRlclBvcyAtIFJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIG9iamVjdAorCXZpcnR1YWwgaW50IEdldFJlbmRlclBvcyhpbnQmIHgsIGludCYgeSwgaW50JiB3LCBpbnQmIGgpIHsgeCA9IG1SZW5kZXJYOyB5ID0gbVJlbmRlclk7IHcgPSBtUmVuZGVyVzsgaCA9IG1SZW5kZXJIOyByZXR1cm4gMDsgfQogCi0gICAgLy8gU2V0UmVuZGVyUG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0Ci0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgU2V0UmVuZGVyUG9zKGludCB4LCBpbnQgeSwgaW50IHcgPSAwLCBpbnQgaCA9IDApICAgIHsgbVJlbmRlclggPSB4OyBtUmVuZGVyWSA9IHk7IGlmICh3IHx8IGgpIHsgbVJlbmRlclcgPSB3OyBtUmVuZGVySCA9IGg7IH0gcmV0dXJuIDA7IH0KKwkvLyBTZXRSZW5kZXJQb3MgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBvYmplY3QKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdyA9IDAsIGludCBoID0gMCkgeyBtUmVuZGVyWCA9IHg7IG1SZW5kZXJZID0geTsgaWYgKHcgfHwgaCkgeyBtUmVuZGVyVyA9IHc7IG1SZW5kZXJIID0gaDsgfSByZXR1cm4gMDsgfQogCi0gICAgLy8gR2V0UGxhY2VtZW50IC0gUmV0dXJucyB0aGUgY3VycmVudCBwbGFjZW1lbnQKLSAgICB2aXJ0dWFsIGludCBHZXRQbGFjZW1lbnQoUGxhY2VtZW50JiBwbGFjZW1lbnQpICAgICAgICAgICAgICAgICAgeyBwbGFjZW1lbnQgPSBtUGxhY2VtZW50OyByZXR1cm4gMDsgfQorCS8vIEdldFBsYWNlbWVudCAtIFJldHVybnMgdGhlIGN1cnJlbnQgcGxhY2VtZW50CisJdmlydHVhbCBpbnQgR2V0UGxhY2VtZW50KFBsYWNlbWVudCYgcGxhY2VtZW50KSB7IHBsYWNlbWVudCA9IG1QbGFjZW1lbnQ7IHJldHVybiAwOyB9CiAKLSAgICAvLyBTZXRQbGFjZW1lbnQgLSBVcGRhdGUgdGhlIGN1cnJlbnQgcGxhY2VtZW50Ci0gICAgdmlydHVhbCBpbnQgU2V0UGxhY2VtZW50KFBsYWNlbWVudCBwbGFjZW1lbnQpICAgICAgICAgICAgICAgICAgIHsgbVBsYWNlbWVudCA9IHBsYWNlbWVudDsgcmV0dXJuIDA7IH0KKwkvLyBTZXRQbGFjZW1lbnQgLSBVcGRhdGUgdGhlIGN1cnJlbnQgcGxhY2VtZW50CisJdmlydHVhbCBpbnQgU2V0UGxhY2VtZW50KFBsYWNlbWVudCBwbGFjZW1lbnQpIHsgbVBsYWNlbWVudCA9IHBsYWNlbWVudDsgcmV0dXJuIDA7IH0KIAotICAgIC8vIFNldFBhZ2VGb2N1cyAtIE5vdGlmeSB3aGVuIGEgcGFnZSBnYWlucyBvciBsb3NlcyBmb2N1cwotICAgIHZpcnR1YWwgdm9pZCBTZXRQYWdlRm9jdXMoaW50IGluRm9jdXMpICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybjsgfQorCS8vIFNldFBhZ2VGb2N1cyAtIE5vdGlmeSB3aGVuIGEgcGFnZSBnYWlucyBvciBsb3NlcyBmb2N1cworCXZpcnR1YWwgdm9pZCBTZXRQYWdlRm9jdXMoaW50IGluRm9jdXMpIHsgcmV0dXJuOyB9CiAKIHByb3RlY3RlZDoKLSAgICBpbnQgbVJlbmRlclgsIG1SZW5kZXJZLCBtUmVuZGVyVywgbVJlbmRlckg7Ci0gICAgUGxhY2VtZW50IG1QbGFjZW1lbnQ7CisJaW50IG1SZW5kZXJYLCBtUmVuZGVyWSwgbVJlbmRlclcsIG1SZW5kZXJIOworCVBsYWNlbWVudCBtUGxhY2VtZW50OwogfTsKIAogY2xhc3MgQWN0aW9uT2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgQWN0aW9uT2JqZWN0KCkgICAgICAgICAgICAgIHsgbUFjdGlvblggPSAwOyBtQWN0aW9uWSA9IDA7IG1BY3Rpb25XID0gMDsgbUFjdGlvbkggPSAwOyB9Ci0gICAgdmlydHVhbCB+QWN0aW9uT2JqZWN0KCkgICAgIHt9CisJQWN0aW9uT2JqZWN0KCkgeyBtQWN0aW9uWCA9IDA7IG1BY3Rpb25ZID0gMDsgbUFjdGlvblcgPSAwOyBtQWN0aW9uSCA9IDA7IH0KKwl2aXJ0dWFsIH5BY3Rpb25PYmplY3QoKSB7fQogCiBwdWJsaWM6Ci0gICAgLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KSAgICAgICAgeyByZXR1cm4gMDsgfQorCS8vIE5vdGlmeVRvdWNoIC0gTm90aWZ5IG9mIGEgdG91Y2ggZXZlbnQKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPjAgdG8gaWdub3JlIHJlbWFpbmRlciBvZiB0b3VjaCwgYW5kIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgTm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSkgeyByZXR1cm4gMDsgfQogCi0gICAgLy8gTm90aWZ5S2V5IC0gTm90aWZ5IG9mIGEga2V5IHByZXNzCi0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MgKGFuZCBjb25zdW1lIGtleSksID4wIHRvIHBhc3Mga2V5IHRvIG5leHQgaGFuZGxlciwgYW5kIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgTm90aWZ5S2V5KGludCBrZXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDE7IH0KKwkvLyBOb3RpZnlLZXkgLSBOb3RpZnkgb2YgYSBrZXkgcHJlc3MKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcyAoYW5kIGNvbnN1bWUga2V5KSwgPjAgdG8gcGFzcyBrZXkgdG8gbmV4dCBoYW5kbGVyLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBOb3RpZnlLZXkoaW50IGtleSkgeyByZXR1cm4gMTsgfQogCi0gICAgLy8gR2V0UmVuZGVyUG9zIC0gUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0Ci0gICAgdmlydHVhbCBpbnQgR2V0QWN0aW9uUG9zKGludCYgeCwgaW50JiB5LCBpbnQmIHcsIGludCYgaCkgICAgICAgIHsgeCA9IG1BY3Rpb25YOyB5ID0gbUFjdGlvblk7IHcgPSBtQWN0aW9uVzsgaCA9IG1BY3Rpb25IOyByZXR1cm4gMDsgfQorCS8vIEdldFJlbmRlclBvcyAtIFJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIG9iamVjdAorCXZpcnR1YWwgaW50IEdldEFjdGlvblBvcyhpbnQmIHgsIGludCYgeSwgaW50JiB3LCBpbnQmIGgpIHsgeCA9IG1BY3Rpb25YOyB5ID0gbUFjdGlvblk7IHcgPSBtQWN0aW9uVzsgaCA9IG1BY3Rpb25IOyByZXR1cm4gMDsgfQogCi0gICAgLy8gU2V0UmVuZGVyUG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0Ci0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgU2V0QWN0aW9uUG9zKGludCB4LCBpbnQgeSwgaW50IHcgPSAwLCBpbnQgaCA9IDApOworCS8vIFNldFJlbmRlclBvcyAtIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIG9iamVjdAorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFNldEFjdGlvblBvcyhpbnQgeCwgaW50IHksIGludCB3ID0gMCwgaW50IGggPSAwKTsKIAotICAgIC8vIElzSW5SZWdpb24gLSBDaGVja3MgaWYgdGhlIHJlcXVlc3QgaXMgaGFuZGxlZCBieSB0aGlzIG9iamVjdAotICAgIC8vICBSZXR1cm4gMCBpZiB0aGlzIG9iamVjdCBoYW5kbGVzIHRoZSByZXF1ZXN0LCAxIGlmIG5vdAotICAgIHZpcnR1YWwgaW50IElzSW5SZWdpb24oaW50IHgsIGludCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAoKHggPCBtQWN0aW9uWCB8fCB4ID4gbUFjdGlvblggKyBtQWN0aW9uVyB8fCB5IDwgbUFjdGlvblkgfHwgeSA+IG1BY3Rpb25ZICsgbUFjdGlvbkgpID8gMCA6IDEpOyB9CisJLy8gSXNJblJlZ2lvbiAtIENoZWNrcyBpZiB0aGUgcmVxdWVzdCBpcyBoYW5kbGVkIGJ5IHRoaXMgb2JqZWN0CisJLy8gIFJldHVybiAwIGlmIHRoaXMgb2JqZWN0IGhhbmRsZXMgdGhlIHJlcXVlc3QsIDEgaWYgbm90CisJdmlydHVhbCBpbnQgSXNJblJlZ2lvbihpbnQgeCwgaW50IHkpIHsgcmV0dXJuICgoeCA8IG1BY3Rpb25YIHx8IHggPiBtQWN0aW9uWCArIG1BY3Rpb25XIHx8IHkgPCBtQWN0aW9uWSB8fCB5ID4gbUFjdGlvblkgKyBtQWN0aW9uSCkgPyAwIDogMSk7IH0KIAotICAgIC8vIE5vdGlmeVZhckNoYW5nZSAtIE5vdGlmeSBvZiBhIHZhcmlhYmxlIGNoYW5nZQotICAgIC8vICBSZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpICAgICB7IHJldHVybiAwOyB9CisJLy8gTm90aWZ5VmFyQ2hhbmdlIC0gTm90aWZ5IG9mIGEgdmFyaWFibGUgY2hhbmdlCisJLy8gIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSkgeyByZXR1cm4gMDsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgaW50IG1BY3Rpb25YLCBtQWN0aW9uWSwgbUFjdGlvblcsIG1BY3Rpb25IOworCWludCBtQWN0aW9uWCwgbUFjdGlvblksIG1BY3Rpb25XLCBtQWN0aW9uSDsKIH07CiAKIGNsYXNzIENvbmRpdGlvbmFsCiB7CiBwdWJsaWM6Ci0gICAgQ29uZGl0aW9uYWwoeG1sX25vZGU8Piogbm9kZSk7CisJQ29uZGl0aW9uYWwoeG1sX25vZGU8Piogbm9kZSk7CiAKIHB1YmxpYzoKLSAgICBib29sIElzQ29uZGl0aW9uVmFyaWFibGUoc3RkOjpzdHJpbmcgdmFyKTsKLSAgICBib29sIGlzQ29uZGl0aW9uVHJ1ZSgpOwotICAgIGJvb2wgaXNDb25kaXRpb25WYWxpZCgpOwotICAgIHZvaWQgTm90aWZ5UGFnZVNldCgpOworCWJvb2wgSXNDb25kaXRpb25WYXJpYWJsZShzdGQ6OnN0cmluZyB2YXIpOworCWJvb2wgaXNDb25kaXRpb25UcnVlKCk7CisJYm9vbCBpc0NvbmRpdGlvblZhbGlkKCk7CisJdm9pZCBOb3RpZnlQYWdlU2V0KCk7CiAKIHByb3RlY3RlZDoKLSAgICBjbGFzcyBDb25kaXRpb24KLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGQ6OnN0cmluZyBtVmFyMTsKLSAgICAgICAgc3RkOjpzdHJpbmcgbVZhcjI7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1Db21wYXJlT3A7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1MYXN0VmFsOwotICAgIH07CisJY2xhc3MgQ29uZGl0aW9uCisJeworCXB1YmxpYzoKKwkJc3RkOjpzdHJpbmcgbVZhcjE7CisJCXN0ZDo6c3RyaW5nIG1WYXIyOworCQlzdGQ6OnN0cmluZyBtQ29tcGFyZU9wOworCQlzdGQ6OnN0cmluZyBtTGFzdFZhbDsKKwl9OwogCi0gICAgc3RkOjp2ZWN0b3I8Q29uZGl0aW9uPiBtQ29uZGl0aW9uczsKKwlzdGQ6OnZlY3RvcjxDb25kaXRpb24+IG1Db25kaXRpb25zOwogCiBwcm90ZWN0ZWQ6Ci0gICAgYm9vbCBpc01vdW50ZWQoc3RkOjpzdHJpbmcgdm9sKTsKLSAgICBib29sIGlzQ29uZGl0aW9uVHJ1ZShDb25kaXRpb24qIGNvbmRpdGlvbik7Ci0KKwlib29sIGlzTW91bnRlZChzdGQ6OnN0cmluZyB2b2wpOworCWJvb2wgaXNDb25kaXRpb25UcnVlKENvbmRpdGlvbiogY29uZGl0aW9uKTsKIH07CiAKIGNsYXNzIElucHV0T2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgSW5wdXRPYmplY3QoKSAgICAgICAgICAgICAgeyBIYXNJbnB1dEZvY3VzID0gMDsgfQotICAgIHZpcnR1YWwgfklucHV0T2JqZWN0KCkgICAgIHt9CisJSW5wdXRPYmplY3QoKSB7IEhhc0lucHV0Rm9jdXMgPSAwOyB9CisJdmlydHVhbCB+SW5wdXRPYmplY3QoKSB7fQogCiBwdWJsaWM6Ci0gICAgLy8gTm90aWZ5S2V5Ym9hcmQgLSBOb3RpZnkgb2Yga2V5Ym9hcmQgaW5wdXQKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcyAoYW5kIGNvbnN1bWUga2V5KSwgPjAgdG8gcGFzcyBrZXkgdG8gbmV4dCBoYW5kbGVyLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlLZXlib2FyZChpbnQga2V5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAxOyB9CisJLy8gTm90aWZ5S2V5Ym9hcmQgLSBOb3RpZnkgb2Yga2V5Ym9hcmQgaW5wdXQKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcyAoYW5kIGNvbnN1bWUga2V5KSwgPjAgdG8gcGFzcyBrZXkgdG8gbmV4dCBoYW5kbGVyLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBOb3RpZnlLZXlib2FyZChpbnQga2V5KSB7IHJldHVybiAxOyB9CiAKLQl2aXJ0dWFsIGludCBTZXRJbnB1dEZvY3VzKGludCBmb2N1cykgICAgeyBIYXNJbnB1dEZvY3VzID0gZm9jdXM7IHJldHVybiAxOyB9CisJdmlydHVhbCBpbnQgU2V0SW5wdXRGb2N1cyhpbnQgZm9jdXMpIHsgSGFzSW5wdXRGb2N1cyA9IGZvY3VzOyByZXR1cm4gMTsgfQogCiBwcm90ZWN0ZWQ6CiAJaW50IEhhc0lucHV0Rm9jdXM7CkBAIC0xNjUsMjYgKzE2NCwyNSBAQAogLy8gRGVyaXZlZCBPYmplY3RzCiAvLyBHVUlUZXh0IC0gVXNlZCBmb3Igc3RhdGljIHRleHQKIGNsYXNzIEdVSVRleHQgOiBwdWJsaWMgUmVuZGVyT2JqZWN0LCBwdWJsaWMgQWN0aW9uT2JqZWN0LCBwdWJsaWMgQ29uZGl0aW9uYWwKLQogewogcHVibGljOgotICAgIC8vIHcgYW5kIGggbWF5IGJlIGlnbm9yZWQsIGluIHdoaWNoIGNhc2UsIG5vIGJvdW5kaW5nIGJveCBpcyBhcHBsaWVkCi0gICAgR1VJVGV4dCh4bWxfbm9kZTw+KiBub2RlKTsKKwkvLyB3IGFuZCBoIG1heSBiZSBpZ25vcmVkLCBpbiB3aGljaCBjYXNlLCBubyBib3VuZGluZyBib3ggaXMgYXBwbGllZAorCUdVSVRleHQoeG1sX25vZGU8Piogbm9kZSk7CiAKIHB1YmxpYzoKLSAgICAvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCi0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOworCS8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CiAKLSAgICAvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQotICAgIC8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOworCS8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCisJLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CiAKLSAgICAvLyBSZXRyaWV2ZSB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBzdHJpbmcgKGR5bmFtaWMgc3RyaW5ncyBtYXkgY2hhbmdlIHBlciBjYWxsKQotICAgIHZpcnR1YWwgaW50IEdldEN1cnJlbnRCb3VuZHMoaW50JiB3LCBpbnQmIGgpOworCS8vIFJldHJpZXZlIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHN0cmluZyAoZHluYW1pYyBzdHJpbmdzIG1heSBjaGFuZ2UgcGVyIGNhbGwpCisJdmlydHVhbCBpbnQgR2V0Q3VycmVudEJvdW5kcyhpbnQmIHcsIGludCYgaCk7CiAKLSAgICAvLyBOb3RpZnkgb2YgYSB2YXJpYWJsZSBjaGFuZ2UKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOworCS8vIE5vdGlmeSBvZiBhIHZhcmlhYmxlIGNoYW5nZQorCXZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CiAKIAkvLyBTZXQgbWF4aW11bSB3aWR0aCBpbiBwaXhlbHMKIAl2aXJ0dWFsIGludCBTZXRNYXhXaWR0aCh1bnNpZ25lZCB3aWR0aCk7CkBAIC0xOTYsNDIgKzE5NCw0MiBAQAogCWJvb2wgaXNIaWdobGlnaHRlZDsKIAogcHJvdGVjdGVkOgotICAgIHN0ZDo6c3RyaW5nIG1UZXh0OwotICAgIHN0ZDo6c3RyaW5nIG1MYXN0VmFsdWU7Ci0gICAgQ09MT1IgbUNvbG9yOworCXN0ZDo6c3RyaW5nIG1UZXh0OworCXN0ZDo6c3RyaW5nIG1MYXN0VmFsdWU7CisJQ09MT1IgbUNvbG9yOwogCUNPTE9SIG1IaWdobGlnaHRDb2xvcjsKLSAgICBSZXNvdXJjZSogbUZvbnQ7Ci0gICAgaW50IG1Jc1N0YXRpYzsKLSAgICBpbnQgbVZhckNoYW5nZWQ7Ci0gICAgaW50IG1Gb250SGVpZ2h0OworCVJlc291cmNlKiBtRm9udDsKKwlpbnQgbUlzU3RhdGljOworCWludCBtVmFyQ2hhbmdlZDsKKwlpbnQgbUZvbnRIZWlnaHQ7CiAJdW5zaWduZWQgbWF4V2lkdGg7CiAJdW5zaWduZWQgY2hhclNraXA7CiAJYm9vbCBoYXNIaWdobGlnaHRDb2xvcjsKIAogcHJvdGVjdGVkOgotICAgIHN0ZDo6c3RyaW5nIHBhcnNlVGV4dCh2b2lkKTsKKwlzdGQ6OnN0cmluZyBwYXJzZVRleHQodm9pZCk7CiB9OwogCiAvLyBHVUlJbWFnZSAtIFVzZWQgZm9yIHN0YXRpYyBpbWFnZQogY2xhc3MgR1VJSW1hZ2UgOiBwdWJsaWMgUmVuZGVyT2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgR1VJSW1hZ2UoeG1sX25vZGU8Piogbm9kZSk7CisJR1VJSW1hZ2UoeG1sX25vZGU8Piogbm9kZSk7CiAKIHB1YmxpYzoKLSAgICAvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCi0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOworCS8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CiAKLSAgICAvLyBTZXRSZW5kZXJQb3MgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBvYmplY3QKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdyA9IDAsIGludCBoID0gMCk7CisJLy8gU2V0UmVuZGVyUG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgU2V0UmVuZGVyUG9zKGludCB4LCBpbnQgeSwgaW50IHcgPSAwLCBpbnQgaCA9IDApOwogCiBwdWJsaWM6CiAJYm9vbCBpc0hpZ2hsaWdodGVkOwogCiBwcm90ZWN0ZWQ6Ci0gICAgUmVzb3VyY2UqIG1JbWFnZTsKKwlSZXNvdXJjZSogbUltYWdlOwogCVJlc291cmNlKiBtSGlnaGxpZ2h0SW1hZ2U7CiB9OwogCkBAIC0yMzksNDYgKzIzNyw0NiBAQAogY2xhc3MgR1VJRmlsbCA6IHB1YmxpYyBSZW5kZXJPYmplY3QKIHsKIHB1YmxpYzoKLSAgICBHVUlGaWxsKHhtbF9ub2RlPD4qIG5vZGUpOworCUdVSUZpbGwoeG1sX25vZGU8Piogbm9kZSk7CiAKIHB1YmxpYzoKLSAgICAvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCi0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOworCS8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CiAKIHByb3RlY3RlZDoKLSAgICBDT0xPUiBtQ29sb3I7CisJQ09MT1IgbUNvbG9yOwogfTsKIAogLy8gR1VJQWN0aW9uIC0gVXNlZCBmb3Igc3RhbmRhcmQgYWN0aW9ucwogY2xhc3MgR1VJQWN0aW9uIDogcHVibGljIEFjdGlvbk9iamVjdCwgcHVibGljIENvbmRpdGlvbmFsCiB7CiBwdWJsaWM6Ci0gICAgR1VJQWN0aW9uKHhtbF9ub2RlPD4qIG5vZGUpOworCUdVSUFjdGlvbih4bWxfbm9kZTw+KiBub2RlKTsKIAogcHVibGljOgotICAgIHZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOwotICAgIHZpcnR1YWwgaW50IE5vdGlmeUtleShpbnQga2V5KTsKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOworCXZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOworCXZpcnR1YWwgaW50IE5vdGlmeUtleShpbnQga2V5KTsKKwl2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOwogCXZpcnR1YWwgaW50IGRvQWN0aW9ucygpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgQWN0aW9uCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RkOjpzdHJpbmcgbUZ1bmN0aW9uOwotICAgICAgICBzdGQ6OnN0cmluZyBtQXJnOwotICAgIH07CisJY2xhc3MgQWN0aW9uCisJeworCXB1YmxpYzoKKwkJc3RkOjpzdHJpbmcgbUZ1bmN0aW9uOworCQlzdGQ6OnN0cmluZyBtQXJnOworCX07CiAKLSAgICBzdGQ6OnZlY3RvcjxBY3Rpb24+IG1BY3Rpb25zOwotICAgIGludCBtS2V5OworCXN0ZDo6dmVjdG9yPEFjdGlvbj4gbUFjdGlvbnM7CisJaW50IG1LZXk7CiAKIHByb3RlY3RlZDoKLSAgICBpbnQgZ2V0S2V5QnlOYW1lKHN0ZDo6c3RyaW5nIGtleSk7Ci0gICAgdmlydHVhbCBpbnQgZG9BY3Rpb24oQWN0aW9uIGFjdGlvbiwgaW50IGlzVGhyZWFkZWQgPSAwKTsKLSAgICBzdGF0aWMgdm9pZCogdGhyZWFkX3N0YXJ0KHZvaWQgKmNvb2tpZSk7CisJaW50IGdldEtleUJ5TmFtZShzdGQ6OnN0cmluZyBrZXkpOworCXZpcnR1YWwgaW50IGRvQWN0aW9uKEFjdGlvbiBhY3Rpb24sIGludCBpc1RocmVhZGVkID0gMCk7CisJc3RhdGljIHZvaWQqIHRocmVhZF9zdGFydCh2b2lkICpjb29raWUpOwogCXZvaWQgc2ltdWxhdGVfcHJvZ3Jlc3NfYmFyKHZvaWQpOwotICAgIGludCBmbGFzaF96aXAoc3RkOjpzdHJpbmcgZmlsZW5hbWUsIHN0ZDo6c3RyaW5nIHBhZ2VOYW1lLCBjb25zdCBpbnQgc2ltdWxhdGUsIGludCogd2lwZV9jYWNoZSk7CisJaW50IGZsYXNoX3ppcChzdGQ6OnN0cmluZyBmaWxlbmFtZSwgc3RkOjpzdHJpbmcgcGFnZU5hbWUsIGNvbnN0IGludCBzaW11bGF0ZSwgaW50KiB3aXBlX2NhY2hlKTsKIAl2b2lkIG9wZXJhdGlvbl9zdGFydChjb25zdCBzdHJpbmcgb3BlcmF0aW9uX25hbWUpOwogCXZvaWQgb3BlcmF0aW9uX2VuZChjb25zdCBpbnQgb3BlcmF0aW9uX3N0YXR1cywgY29uc3QgaW50IHNpbXVsYXRlKTsKIAlzdGF0aWMgdm9pZCogY29tbWFuZF90aHJlYWQodm9pZCAqY29va2llKTsKQEAgLTI4Nyw5MiArMjg1LDkyIEBACiBjbGFzcyBHVUlDb25zb2xlIDogcHVibGljIFJlbmRlck9iamVjdCwgcHVibGljIEFjdGlvbk9iamVjdAogewogcHVibGljOgotICAgIEdVSUNvbnNvbGUoeG1sX25vZGU8Piogbm9kZSk7CisJR1VJQ29uc29sZSh4bWxfbm9kZTw+KiBub2RlKTsKIAogcHVibGljOgotICAgIC8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CisJLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKIAotICAgIC8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCi0gICAgLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CisJLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKKwkvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKIAotICAgIC8vIFNldFJlbmRlclBvcyAtIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIG9iamVjdAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFNldFJlbmRlclBvcyhpbnQgeCwgaW50IHksIGludCB3ID0gMCwgaW50IGggPSAwKTsKKwkvLyBTZXRSZW5kZXJQb3MgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBvYmplY3QKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdyA9IDAsIGludCBoID0gMCk7CiAKLSAgICAvLyBJc0luUmVnaW9uIC0gQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IGlzIGhhbmRsZWQgYnkgdGhpcyBvYmplY3QKLSAgICAvLyAgUmV0dXJuIDAgaWYgdGhpcyBvYmplY3QgaGFuZGxlcyB0aGUgcmVxdWVzdCwgMSBpZiBub3QKLSAgICB2aXJ0dWFsIGludCBJc0luUmVnaW9uKGludCB4LCBpbnQgeSk7CisJLy8gSXNJblJlZ2lvbiAtIENoZWNrcyBpZiB0aGUgcmVxdWVzdCBpcyBoYW5kbGVkIGJ5IHRoaXMgb2JqZWN0CisJLy8gIFJldHVybiAwIGlmIHRoaXMgb2JqZWN0IGhhbmRsZXMgdGhlIHJlcXVlc3QsIDEgaWYgbm90CisJdmlydHVhbCBpbnQgSXNJblJlZ2lvbihpbnQgeCwgaW50IHkpOwogCi0gICAgLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IgKFJldHVybiBlcnJvciB0byBhbGxvdyBvdGhlciBoYW5kbGVycykKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKKwkvLyBOb3RpZnlUb3VjaCAtIE5vdGlmeSBvZiBhIHRvdWNoIGV2ZW50CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvciAoUmV0dXJuIGVycm9yIHRvIGFsbG93IG90aGVyIGhhbmRsZXJzKQorCXZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgZW51bSBTbGlkZW91dFN0YXRlCi0gICAgewotICAgICAgICBoaWRkZW4gPSAwLAotICAgICAgICB2aXNpYmxlLAotICAgICAgICByZXF1ZXN0X2hpZGUsCi0gICAgICAgIHJlcXVlc3Rfc2hvdwotICAgIH07Ci0gICAgUmVzb3VyY2UqIG1Gb250OwotICAgIFJlc291cmNlKiBtU2xpZGVvdXRJbWFnZTsKLSAgICBDT0xPUiBtRm9yZWdyb3VuZENvbG9yOwotICAgIENPTE9SIG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgQ09MT1IgbVNjcm9sbENvbG9yOwotICAgIHVuc2lnbmVkIGludCBtRm9udEhlaWdodDsKLSAgICBpbnQgbUN1cnJlbnRMaW5lOwotICAgIHVuc2lnbmVkIGludCBtTGFzdENvdW50OwotICAgIHVuc2lnbmVkIGludCBtTWF4Um93czsKLSAgICBpbnQgbVN0YXJ0WTsKLSAgICBpbnQgbVNsaWRlb3V0WCwgbVNsaWRlb3V0WSwgbVNsaWRlb3V0VywgbVNsaWRlb3V0SDsKLSAgICBpbnQgbVNsaWRlaW5YLCBtU2xpZGVpblksIG1TbGlkZWluVywgbVNsaWRlaW5IOwotICAgIGludCBtQ29uc29sZVgsIG1Db25zb2xlWSwgbUNvbnNvbGVXLCBtQ29uc29sZUg7Ci0gICAgaW50IG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWTsKLSAgICBpbnQgbVNsaWRlTXVsdGlwbGllcjsKLSAgICBpbnQgbVNsaWRlb3V0OwotICAgIFNsaWRlb3V0U3RhdGUgbVNsaWRlb3V0U3RhdGU7CisJZW51bSBTbGlkZW91dFN0YXRlCisJeworCQloaWRkZW4gPSAwLAorCQl2aXNpYmxlLAorCQlyZXF1ZXN0X2hpZGUsCisJCXJlcXVlc3Rfc2hvdworCX07CisKKwlSZXNvdXJjZSogbUZvbnQ7CisJUmVzb3VyY2UqIG1TbGlkZW91dEltYWdlOworCUNPTE9SIG1Gb3JlZ3JvdW5kQ29sb3I7CisJQ09MT1IgbUJhY2tncm91bmRDb2xvcjsKKwlDT0xPUiBtU2Nyb2xsQ29sb3I7CisJdW5zaWduZWQgaW50IG1Gb250SGVpZ2h0OworCWludCBtQ3VycmVudExpbmU7CisJdW5zaWduZWQgaW50IG1MYXN0Q291bnQ7CisJdW5zaWduZWQgaW50IG1NYXhSb3dzOworCWludCBtU3RhcnRZOworCWludCBtU2xpZGVvdXRYLCBtU2xpZGVvdXRZLCBtU2xpZGVvdXRXLCBtU2xpZGVvdXRIOworCWludCBtU2xpZGVpblgsIG1TbGlkZWluWSwgbVNsaWRlaW5XLCBtU2xpZGVpbkg7CisJaW50IG1Db25zb2xlWCwgbUNvbnNvbGVZLCBtQ29uc29sZVcsIG1Db25zb2xlSDsKKwlpbnQgbUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZOworCWludCBtU2xpZGVNdWx0aXBsaWVyOworCWludCBtU2xpZGVvdXQ7CisJU2xpZGVvdXRTdGF0ZSBtU2xpZGVvdXRTdGF0ZTsKIAogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgaW50IFJlbmRlclNsaWRlb3V0KHZvaWQpOwotICAgIHZpcnR1YWwgaW50IFJlbmRlckNvbnNvbGUodm9pZCk7Ci0KKwl2aXJ0dWFsIGludCBSZW5kZXJTbGlkZW91dCh2b2lkKTsKKwl2aXJ0dWFsIGludCBSZW5kZXJDb25zb2xlKHZvaWQpOwogfTsKIAogY2xhc3MgR1VJQnV0dG9uIDogcHVibGljIFJlbmRlck9iamVjdCwgcHVibGljIEFjdGlvbk9iamVjdCwgcHVibGljIENvbmRpdGlvbmFsCiB7CiBwdWJsaWM6Ci0gICAgR1VJQnV0dG9uKHhtbF9ub2RlPD4qIG5vZGUpOwotICAgIHZpcnR1YWwgfkdVSUJ1dHRvbigpOworCUdVSUJ1dHRvbih4bWxfbm9kZTw+KiBub2RlKTsKKwl2aXJ0dWFsIH5HVUlCdXR0b24oKTsKIAogcHVibGljOgotICAgIC8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CisJLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKIAotICAgIC8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCi0gICAgLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CisJLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKKwkvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKIAotICAgIC8vIFNldFBvcyAtIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHJlbmRlciBvYmplY3QKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdyA9IDAsIGludCBoID0gMCk7CisJLy8gU2V0UG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVuZGVyIG9iamVjdAorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFNldFJlbmRlclBvcyhpbnQgeCwgaW50IHksIGludCB3ID0gMCwgaW50IGggPSAwKTsKIAotICAgIC8vIE5vdGlmeVRvdWNoIC0gTm90aWZ5IG9mIGEgdG91Y2ggZXZlbnQKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPjAgdG8gaWdub3JlIHJlbWFpbmRlciBvZiB0b3VjaCwgYW5kIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgTm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSk7CisJLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKIAogcHJvdGVjdGVkOgotICAgIEdVSUltYWdlKiBtQnV0dG9uSW1nOwotICAgIFJlc291cmNlKiBtQnV0dG9uSWNvbjsKLSAgICBHVUlUZXh0KiBtQnV0dG9uTGFiZWw7Ci0gICAgR1VJQWN0aW9uKiBtQWN0aW9uOwotICAgIGludCBtVGV4dFgsIG1UZXh0WSwgbVRleHRXLCBtVGV4dEg7Ci0gICAgaW50IG1JY29uWCwgbUljb25ZLCBtSWNvblcsIG1JY29uSDsKLSAgICBib29sIG1SZW5kZXJlZDsKKwlHVUlJbWFnZSogbUJ1dHRvbkltZzsKKwlSZXNvdXJjZSogbUJ1dHRvbkljb247CisJR1VJVGV4dCogbUJ1dHRvbkxhYmVsOworCUdVSUFjdGlvbiogbUFjdGlvbjsKKwlpbnQgbVRleHRYLCBtVGV4dFksIG1UZXh0VywgbVRleHRIOworCWludCBtSWNvblgsIG1JY29uWSwgbUljb25XLCBtSWNvbkg7CisJYm9vbCBtUmVuZGVyZWQ7CiAJYm9vbCBoYXNIaWdobGlnaHRDb2xvcjsKIAlib29sIHJlbmRlckhpZ2hsaWdodDsKIAlib29sIGhhc0ZpbGw7CkBAIC0zODMsMTAzICszODEsMTAzIEBACiBjbGFzcyBHVUlDaGVja2JveDogcHVibGljIFJlbmRlck9iamVjdCwgcHVibGljIEFjdGlvbk9iamVjdCwgcHVibGljIENvbmRpdGlvbmFsCiB7CiBwdWJsaWM6Ci0gICAgR1VJQ2hlY2tib3goeG1sX25vZGU8Piogbm9kZSk7Ci0gICAgdmlydHVhbCB+R1VJQ2hlY2tib3goKTsKKwlHVUlDaGVja2JveCh4bWxfbm9kZTw+KiBub2RlKTsKKwl2aXJ0dWFsIH5HVUlDaGVja2JveCgpOwogCiBwdWJsaWM6Ci0gICAgLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKKwkvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOwogCi0gICAgLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKLSAgICAvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKKwkvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQorCS8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOwogCi0gICAgLy8gU2V0UG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVuZGVyIG9iamVjdAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFNldFJlbmRlclBvcyhpbnQgeCwgaW50IHksIGludCB3ID0gMCwgaW50IGggPSAwKTsKKwkvLyBTZXRQb3MgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSByZW5kZXIgb2JqZWN0CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgU2V0UmVuZGVyUG9zKGludCB4LCBpbnQgeSwgaW50IHcgPSAwLCBpbnQgaCA9IDApOwogCi0gICAgLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKKwkvLyBOb3RpZnlUb3VjaCAtIE5vdGlmeSBvZiBhIHRvdWNoIGV2ZW50CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgUmVzb3VyY2UqIG1DaGVja2VkOwotICAgIFJlc291cmNlKiBtVW5jaGVja2VkOwotICAgIEdVSVRleHQqIG1MYWJlbDsKLSAgICBpbnQgbVRleHRYLCBtVGV4dFk7Ci0gICAgaW50IG1DaGVja1gsIG1DaGVja1ksIG1DaGVja1csIG1DaGVja0g7Ci0gICAgaW50IG1MYXN0U3RhdGU7Ci0gICAgYm9vbCBtUmVuZGVyZWQ7Ci0gICAgc3RkOjpzdHJpbmcgbVZhck5hbWU7CisJUmVzb3VyY2UqIG1DaGVja2VkOworCVJlc291cmNlKiBtVW5jaGVja2VkOworCUdVSVRleHQqIG1MYWJlbDsKKwlpbnQgbVRleHRYLCBtVGV4dFk7CisJaW50IG1DaGVja1gsIG1DaGVja1ksIG1DaGVja1csIG1DaGVja0g7CisJaW50IG1MYXN0U3RhdGU7CisJYm9vbCBtUmVuZGVyZWQ7CisJc3RkOjpzdHJpbmcgbVZhck5hbWU7CiB9OwogCiBjbGFzcyBHVUlGaWxlU2VsZWN0b3IgOiBwdWJsaWMgUmVuZGVyT2JqZWN0LCBwdWJsaWMgQWN0aW9uT2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgR1VJRmlsZVNlbGVjdG9yKHhtbF9ub2RlPD4qIG5vZGUpOwotICAgIHZpcnR1YWwgfkdVSUZpbGVTZWxlY3RvcigpOworCUdVSUZpbGVTZWxlY3Rvcih4bWxfbm9kZTw+KiBub2RlKTsKKwl2aXJ0dWFsIH5HVUlGaWxlU2VsZWN0b3IoKTsKIAogcHVibGljOgotICAgIC8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CisJLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKIAotICAgIC8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCi0gICAgLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CisJLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKKwkvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKIAotICAgIC8vIE5vdGlmeVRvdWNoIC0gTm90aWZ5IG9mIGEgdG91Y2ggZXZlbnQKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPjAgdG8gaWdub3JlIHJlbWFpbmRlciBvZiB0b3VjaCwgYW5kIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgTm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSk7CisJLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKIAotICAgIC8vIE5vdGlmeVZhckNoYW5nZSAtIE5vdGlmeSBvZiBhIHZhcmlhYmxlIGNoYW5nZQotICAgIHZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CisJLy8gTm90aWZ5VmFyQ2hhbmdlIC0gTm90aWZ5IG9mIGEgdmFyaWFibGUgY2hhbmdlCisJdmlydHVhbCBpbnQgTm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKTsKIAotICAgIC8vIFNldFBvcyAtIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHJlbmRlciBvYmplY3QKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdyA9IDAsIGludCBoID0gMCk7CisJLy8gU2V0UG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVuZGVyIG9iamVjdAorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFNldFJlbmRlclBvcyhpbnQgeCwgaW50IHksIGludCB3ID0gMCwgaW50IGggPSAwKTsKIAotICAgIC8vIFNldFBhZ2VGb2N1cyAtIE5vdGlmeSB3aGVuIGEgcGFnZSBnYWlucyBvciBsb3NlcyBmb2N1cwotICAgIHZpcnR1YWwgdm9pZCBTZXRQYWdlRm9jdXMoaW50IGluRm9jdXMpOworCS8vIFNldFBhZ2VGb2N1cyAtIE5vdGlmeSB3aGVuIGEgcGFnZSBnYWlucyBvciBsb3NlcyBmb2N1cworCXZpcnR1YWwgdm9pZCBTZXRQYWdlRm9jdXMoaW50IGluRm9jdXMpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgc3RydWN0IEZpbGVEYXRhIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgZmlsZU5hbWU7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgZmlsZVR5cGU7ICAgICAvLyBVc2VzIGRfdHlwZSBmb3JtYXQgZnJvbSBzdHJ1Y3QgZGlyZW50Ci0gICAgICAgIG1vZGVfdCBwcm90ZWN0aW9uOyAgICAgICAgICAvLyBVc2VzIG1vZGVfdCBmb3JtYXQgZnJvbSBzdGF0Ci0gICAgICAgIHVpZF90IHVzZXJJZDsKLSAgICAgICAgZ2lkX3QgZ3JvdXBJZDsKLSAgICAgICAgb2ZmX3QgZmlsZVNpemU7Ci0gICAgICAgIHRpbWVfdCBsYXN0QWNjZXNzOyAgICAgICAgICAvLyBVc2VzIHRpbWVfdCBmb3JtYXQgZnJvbSBzdGF0Ci0gICAgICAgIHRpbWVfdCBsYXN0TW9kaWZpZWQ7ICAgICAgICAvLyBVc2VzIHRpbWVfdCBmb3JtYXQgZnJvbSBzdGF0Ci0gICAgICAgIHRpbWVfdCBsYXN0U3RhdENoYW5nZTsgICAgICAvLyBVc2VzIHRpbWVfdCBmb3JtYXQgZnJvbSBzdGF0Ci0gICAgfTsKKwlzdHJ1Y3QgRmlsZURhdGEgeworCQlzdGQ6OnN0cmluZyBmaWxlTmFtZTsKKwkJdW5zaWduZWQgY2hhciBmaWxlVHlwZTsJIC8vIFVzZXMgZF90eXBlIGZvcm1hdCBmcm9tIHN0cnVjdCBkaXJlbnQKKwkJbW9kZV90IHByb3RlY3Rpb247CQkgIC8vIFVzZXMgbW9kZV90IGZvcm1hdCBmcm9tIHN0YXQKKwkJdWlkX3QgdXNlcklkOworCQlnaWRfdCBncm91cElkOworCQlvZmZfdCBmaWxlU2l6ZTsKKwkJdGltZV90IGxhc3RBY2Nlc3M7CQkgIC8vIFVzZXMgdGltZV90IGZvcm1hdCBmcm9tIHN0YXQKKwkJdGltZV90IGxhc3RNb2RpZmllZDsJCS8vIFVzZXMgdGltZV90IGZvcm1hdCBmcm9tIHN0YXQKKwkJdGltZV90IGxhc3RTdGF0Q2hhbmdlOwkgIC8vIFVzZXMgdGltZV90IGZvcm1hdCBmcm9tIHN0YXQKKwl9OwogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQgR2V0U2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CisJdmlydHVhbCBpbnQgR2V0U2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CiAKLSAgICB2aXJ0dWFsIGludCBHZXRGaWxlTGlzdChjb25zdCBzdGQ6OnN0cmluZyBmb2xkZXIpOwotICAgIHN0YXRpYyBib29sIGZpbGVTb3J0KEZpbGVEYXRhIGQxLCBGaWxlRGF0YSBkMik7CisJdmlydHVhbCBpbnQgR2V0RmlsZUxpc3QoY29uc3Qgc3RkOjpzdHJpbmcgZm9sZGVyKTsKKwlzdGF0aWMgYm9vbCBmaWxlU29ydChGaWxlRGF0YSBkMSwgRmlsZURhdGEgZDIpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjp2ZWN0b3I8RmlsZURhdGE+IG1Gb2xkZXJMaXN0OwotICAgIHN0ZDo6dmVjdG9yPEZpbGVEYXRhPiBtRmlsZUxpc3Q7Ci0gICAgc3RkOjpzdHJpbmcgbVBhdGhWYXI7Ci0gICAgc3RkOjpzdHJpbmcgbUV4dG47Ci0gICAgc3RkOjpzdHJpbmcgbVZhcmlhYmxlOworCXN0ZDo6dmVjdG9yPEZpbGVEYXRhPiBtRm9sZGVyTGlzdDsKKwlzdGQ6OnZlY3RvcjxGaWxlRGF0YT4gbUZpbGVMaXN0OworCXN0ZDo6c3RyaW5nIG1QYXRoVmFyOworCXN0ZDo6c3RyaW5nIG1FeHRuOworCXN0ZDo6c3RyaW5nIG1WYXJpYWJsZTsKIAlzdGQ6OnN0cmluZyBtU29ydFZhcmlhYmxlOwogCXN0ZDo6c3RyaW5nIG1TZWxlY3Rpb247CiAJc3RkOjpzdHJpbmcgbUhlYWRlclRleHQ7CiAJc3RkOjpzdHJpbmcgbUxhc3RWYWx1ZTsKLSAgICBpbnQgYWN0dWFsTGluZUhlaWdodDsKKwlpbnQgYWN0dWFsTGluZUhlaWdodDsKIAlpbnQgbVN0YXJ0OwotICAgIGludCBtTGluZVNwYWNpbmc7CisJaW50IG1MaW5lU3BhY2luZzsKIAlpbnQgbVNlcGFyYXRvckg7CiAJaW50IG1IZWFkZXJTZXBhcmF0b3JIOwotICAgIGludCBtU2hvd0ZvbGRlcnMsIG1TaG93RmlsZXMsIG1TaG93TmF2Rm9sZGVyczsKLSAgICBpbnQgbVVwZGF0ZTsKLSAgICBpbnQgbUJhY2tncm91bmRYLCBtQmFja2dyb3VuZFksIG1CYWNrZ3JvdW5kVywgbUJhY2tncm91bmRIOworCWludCBtU2hvd0ZvbGRlcnMsIG1TaG93RmlsZXMsIG1TaG93TmF2Rm9sZGVyczsKKwlpbnQgbVVwZGF0ZTsKKwlpbnQgbUJhY2tncm91bmRYLCBtQmFja2dyb3VuZFksIG1CYWNrZ3JvdW5kVywgbUJhY2tncm91bmRIOwogCWludCBtSGVhZGVySDsKIAlpbnQgbUZhc3RTY3JvbGxXOwogCWludCBtRmFzdFNjcm9sbExpbmVXOwpAQCAtNDkzLDE2ICs0OTEsMTYgQEAKIAlpbnQgc2Nyb2xsaW5nWTsKIAlpbnQgbUhlYWRlcklzU3RhdGljOwogCWludCB0b3VjaERlYm91bmNlOwotICAgIHVuc2lnbmVkIG1Gb250SGVpZ2h0OwotICAgIHVuc2lnbmVkIG1MaW5lSGVpZ2h0OwotICAgIGludCBtSWNvbldpZHRoLCBtSWNvbkhlaWdodCwgbUZvbGRlckljb25IZWlnaHQsIG1GaWxlSWNvbkhlaWdodCwgbUZvbGRlckljb25XaWR0aCwgbUZpbGVJY29uV2lkdGgsIG1IZWFkZXJJY29uSGVpZ2h0LCBtSGVhZGVySWNvbldpZHRoOwotICAgIFJlc291cmNlKiBtSGVhZGVySWNvbjsKKwl1bnNpZ25lZCBtRm9udEhlaWdodDsKKwl1bnNpZ25lZCBtTGluZUhlaWdodDsKKwlpbnQgbUljb25XaWR0aCwgbUljb25IZWlnaHQsIG1Gb2xkZXJJY29uSGVpZ2h0LCBtRmlsZUljb25IZWlnaHQsIG1Gb2xkZXJJY29uV2lkdGgsIG1GaWxlSWNvbldpZHRoLCBtSGVhZGVySWNvbkhlaWdodCwgbUhlYWRlckljb25XaWR0aDsKKwlSZXNvdXJjZSogbUhlYWRlckljb247CiAJUmVzb3VyY2UqIG1Gb2xkZXJJY29uOwotICAgIFJlc291cmNlKiBtRmlsZUljb247Ci0gICAgUmVzb3VyY2UqIG1CYWNrZ3JvdW5kOwotICAgIFJlc291cmNlKiBtRm9udDsKLSAgICBDT0xPUiBtQmFja2dyb3VuZENvbG9yOwotICAgIENPTE9SIG1Gb250Q29sb3I7CisJUmVzb3VyY2UqIG1GaWxlSWNvbjsKKwlSZXNvdXJjZSogbUJhY2tncm91bmQ7CisJUmVzb3VyY2UqIG1Gb250OworCUNPTE9SIG1CYWNrZ3JvdW5kQ29sb3I7CisJQ09MT1IgbUZvbnRDb2xvcjsKIAlDT0xPUiBtSGVhZGVyQmFja2dyb3VuZENvbG9yOwogCUNPTE9SIG1IZWFkZXJGb250Q29sb3I7CiAJQ09MT1IgbVNlcGFyYXRvckNvbG9yOwpAQCAtNTIxLDU2ICs1MTksNTYgQEAKIGNsYXNzIEdVSUxpc3RCb3ggOiBwdWJsaWMgUmVuZGVyT2JqZWN0LCBwdWJsaWMgQWN0aW9uT2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgR1VJTGlzdEJveCh4bWxfbm9kZTw+KiBub2RlKTsKLSAgICB2aXJ0dWFsIH5HVUlMaXN0Qm94KCk7CisJR1VJTGlzdEJveCh4bWxfbm9kZTw+KiBub2RlKTsKKwl2aXJ0dWFsIH5HVUlMaXN0Qm94KCk7CiAKIHB1YmxpYzoKLSAgICAvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCi0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOworCS8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CiAKLSAgICAvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQotICAgIC8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOworCS8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCisJLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CiAKLSAgICAvLyBOb3RpZnlUb3VjaCAtIE5vdGlmeSBvZiBhIHRvdWNoIGV2ZW50Ci0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOworCS8vIE5vdGlmeVRvdWNoIC0gTm90aWZ5IG9mIGEgdG91Y2ggZXZlbnQKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPjAgdG8gaWdub3JlIHJlbWFpbmRlciBvZiB0b3VjaCwgYW5kIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgTm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSk7CiAKLSAgICAvLyBOb3RpZnlWYXJDaGFuZ2UgLSBOb3RpZnkgb2YgYSB2YXJpYWJsZSBjaGFuZ2UKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOworCS8vIE5vdGlmeVZhckNoYW5nZSAtIE5vdGlmeSBvZiBhIHZhcmlhYmxlIGNoYW5nZQorCXZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CiAKLSAgICAvLyBTZXRQb3MgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSByZW5kZXIgb2JqZWN0Ci0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgU2V0UmVuZGVyUG9zKGludCB4LCBpbnQgeSwgaW50IHcgPSAwLCBpbnQgaCA9IDApOworCS8vIFNldFBvcyAtIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHJlbmRlciBvYmplY3QKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBTZXRSZW5kZXJQb3MoaW50IHgsIGludCB5LCBpbnQgdyA9IDAsIGludCBoID0gMCk7CiAKLSAgICAvLyBTZXRQYWdlRm9jdXMgLSBOb3RpZnkgd2hlbiBhIHBhZ2UgZ2FpbnMgb3IgbG9zZXMgZm9jdXMKLSAgICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUZvY3VzKGludCBpbkZvY3VzKTsKKwkvLyBTZXRQYWdlRm9jdXMgLSBOb3RpZnkgd2hlbiBhIHBhZ2UgZ2FpbnMgb3IgbG9zZXMgZm9jdXMKKwl2aXJ0dWFsIHZvaWQgU2V0UGFnZUZvY3VzKGludCBpbkZvY3VzKTsKIAogcHJvdGVjdGVkOgotICAgIHN0cnVjdCBMaXN0RGF0YSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGRpc3BsYXlOYW1lOworCXN0cnVjdCBMaXN0RGF0YSB7CisJCXN0ZDo6c3RyaW5nIGRpc3BsYXlOYW1lOwogCQlzdGQ6OnN0cmluZyB2YXJpYWJsZVZhbHVlOwogCQl1bnNpZ25lZCBpbnQgc2VsZWN0ZWQ7Ci0gICAgfTsKKwl9OwogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQgR2V0U2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CisJdmlydHVhbCBpbnQgR2V0U2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CiAKIHByb3RlY3RlZDoKLSAgICBzdGQ6OnZlY3RvcjxMaXN0RGF0YT4gbUxpc3Q7Ci0gICAgc3RkOjpzdHJpbmcgbVZhcmlhYmxlOworCXN0ZDo6dmVjdG9yPExpc3REYXRhPiBtTGlzdDsKKwlzdGQ6OnN0cmluZyBtVmFyaWFibGU7CiAJc3RkOjpzdHJpbmcgbVNlbGVjdGlvbjsKIAlzdGQ6OnN0cmluZyBjdXJyZW50VmFsdWU7CiAJc3RkOjpzdHJpbmcgbUhlYWRlclRleHQ7CiAJc3RkOjpzdHJpbmcgbUxhc3RWYWx1ZTsKIAlpbnQgYWN0dWFsTGluZUhlaWdodDsKLSAgICBpbnQgbVN0YXJ0OworCWludCBtU3RhcnQ7CiAJaW50IHN0YXJ0WTsKIAlpbnQgbVNlcGFyYXRvckgsIG1IZWFkZXJTZXBhcmF0b3JIOwotICAgIGludCBtTGluZVNwYWNpbmc7Ci0gICAgaW50IG1VcGRhdGU7Ci0gICAgaW50IG1CYWNrZ3JvdW5kWCwgbUJhY2tncm91bmRZLCBtQmFja2dyb3VuZFcsIG1CYWNrZ3JvdW5kSCwgbUhlYWRlckg7CisJaW50IG1MaW5lU3BhY2luZzsKKwlpbnQgbVVwZGF0ZTsKKwlpbnQgbUJhY2tncm91bmRYLCBtQmFja2dyb3VuZFksIG1CYWNrZ3JvdW5kVywgbUJhY2tncm91bmRILCBtSGVhZGVySDsKIAlpbnQgbUZhc3RTY3JvbGxXOwogCWludCBtRmFzdFNjcm9sbExpbmVXOwogCWludCBtRmFzdFNjcm9sbFJlY3RXOwpAQCAtNTgxLDE1ICs1NzksMTUgQEAKIAlpbnQgc2Nyb2xsaW5nU3BlZWQ7CiAJaW50IHNjcm9sbGluZ1k7CiAJc3RhdGljIGludCBtU29ydE9yZGVyOwotICAgIHVuc2lnbmVkIG1Gb250SGVpZ2h0OwotICAgIHVuc2lnbmVkIG1MaW5lSGVpZ2h0OworCXVuc2lnbmVkIG1Gb250SGVpZ2h0OworCXVuc2lnbmVkIG1MaW5lSGVpZ2h0OwogCVJlc291cmNlKiBtSGVhZGVySWNvbjsKLSAgICBSZXNvdXJjZSogbUljb25TZWxlY3RlZDsKLSAgICBSZXNvdXJjZSogbUljb25VbnNlbGVjdGVkOwotICAgIFJlc291cmNlKiBtQmFja2dyb3VuZDsKLSAgICBSZXNvdXJjZSogbUZvbnQ7Ci0gICAgQ09MT1IgbUJhY2tncm91bmRDb2xvcjsKLSAgICBDT0xPUiBtRm9udENvbG9yOworCVJlc291cmNlKiBtSWNvblNlbGVjdGVkOworCVJlc291cmNlKiBtSWNvblVuc2VsZWN0ZWQ7CisJUmVzb3VyY2UqIG1CYWNrZ3JvdW5kOworCVJlc291cmNlKiBtRm9udDsKKwlDT0xPUiBtQmFja2dyb3VuZENvbG9yOworCUNPTE9SIG1Gb250Q29sb3I7CiAJQ09MT1IgbUhlYWRlckJhY2tncm91bmRDb2xvcjsKIAlDT0xPUiBtSGVhZGVyRm9udENvbG9yOwogCUNPTE9SIG1TZXBhcmF0b3JDb2xvcjsKQEAgLTYwOSw1MyArNjA3LDUxIEBACiBjbGFzcyBHVUlQYXJ0aXRpb25MaXN0IDogcHVibGljIFJlbmRlck9iamVjdCwgcHVibGljIEFjdGlvbk9iamVjdAogewogcHVibGljOgotICAgIEdVSVBhcnRpdGlvbkxpc3QoeG1sX25vZGU8Piogbm9kZSk7Ci0gICAgdmlydHVhbCB+R1VJUGFydGl0aW9uTGlzdCgpOworCUdVSVBhcnRpdGlvbkxpc3QoeG1sX25vZGU8Piogbm9kZSk7CisJdmlydHVhbCB+R1VJUGFydGl0aW9uTGlzdCgpOwogCiBwdWJsaWM6Ci0gICAgLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKKwkvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOwogCi0gICAgLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKLSAgICAvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKKwkvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQorCS8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOwogCi0gICAgLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKKwkvLyBOb3RpZnlUb3VjaCAtIE5vdGlmeSBvZiBhIHRvdWNoIGV2ZW50CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOwogCi0gICAgLy8gTm90aWZ5VmFyQ2hhbmdlIC0gTm90aWZ5IG9mIGEgdmFyaWFibGUgY2hhbmdlCi0gICAgdmlydHVhbCBpbnQgTm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKTsKKwkvLyBOb3RpZnlWYXJDaGFuZ2UgLSBOb3RpZnkgb2YgYSB2YXJpYWJsZSBjaGFuZ2UKKwl2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOwogCi0gICAgLy8gU2V0UG9zIC0gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVuZGVyIG9iamVjdAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFNldFJlbmRlclBvcyhpbnQgeCwgaW50IHksIGludCB3ID0gMCwgaW50IGggPSAwKTsKKwkvLyBTZXRQb3MgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSByZW5kZXIgb2JqZWN0CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgU2V0UmVuZGVyUG9zKGludCB4LCBpbnQgeSwgaW50IHcgPSAwLCBpbnQgaCA9IDApOwogCi0gICAgLy8gU2V0UGFnZUZvY3VzIC0gTm90aWZ5IHdoZW4gYSBwYWdlIGdhaW5zIG9yIGxvc2VzIGZvY3VzCi0gICAgdmlydHVhbCB2b2lkIFNldFBhZ2VGb2N1cyhpbnQgaW5Gb2N1cyk7CisJLy8gU2V0UGFnZUZvY3VzIC0gTm90aWZ5IHdoZW4gYSBwYWdlIGdhaW5zIG9yIGxvc2VzIGZvY3VzCisJdmlydHVhbCB2b2lkIFNldFBhZ2VGb2N1cyhpbnQgaW5Gb2N1cyk7CiAKIHByb3RlY3RlZDoKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgaW50IEdldFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOworCXZpcnR1YWwgaW50IEdldFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogCXZpcnR1YWwgdm9pZCBNYXRjaExpc3Qodm9pZCk7CiAKIHByb3RlY3RlZDoKLSAgICBzdGQ6OnZlY3RvcjxQYXJ0aXRpb25MaXN0PiBtTGlzdDsKKwlzdGQ6OnZlY3RvcjxQYXJ0aXRpb25MaXN0PiBtTGlzdDsKIAlzdGQ6OnN0cmluZyBMaXN0VHlwZTsKLSAgICBzdGQ6OnN0cmluZyBtVmFyaWFibGU7CisJc3RkOjpzdHJpbmcgbVZhcmlhYmxlOwogCXN0ZDo6c3RyaW5nIHNlbGVjdGVkTGlzdDsKIAlzdGQ6OnN0cmluZyBjdXJyZW50VmFsdWU7CiAJc3RkOjpzdHJpbmcgbUhlYWRlclRleHQ7CiAJc3RkOjpzdHJpbmcgbUxhc3RWYWx1ZTsKIAlpbnQgYWN0dWFsTGluZUhlaWdodDsKLSAgICBpbnQgbVN0YXJ0OworCWludCBtU3RhcnQ7CiAJaW50IHN0YXJ0WTsKIAlpbnQgbVNlcGFyYXRvckgsIG1IZWFkZXJTZXBhcmF0b3JIOwotICAgIGludCBtTGluZVNwYWNpbmc7Ci0gICAgaW50IG1VcGRhdGU7Ci0gICAgaW50IG1CYWNrZ3JvdW5kWCwgbUJhY2tncm91bmRZLCBtQmFja2dyb3VuZFcsIG1CYWNrZ3JvdW5kSCwgbUhlYWRlckg7CisJaW50IG1MaW5lU3BhY2luZzsKKwlpbnQgbVVwZGF0ZTsKKwlpbnQgbUJhY2tncm91bmRYLCBtQmFja2dyb3VuZFksIG1CYWNrZ3JvdW5kVywgbUJhY2tncm91bmRILCBtSGVhZGVySDsKIAlpbnQgbUZhc3RTY3JvbGxXOwogCWludCBtRmFzdFNjcm9sbExpbmVXOwogCWludCBtRmFzdFNjcm9sbFJlY3RXOwpAQCAtNjY2LDE1ICs2NjIsMTUgQEAKIAlpbnQgc2Nyb2xsaW5nU3BlZWQ7CiAJaW50IHNjcm9sbGluZ1k7CiAJc3RhdGljIGludCBtU29ydE9yZGVyOwotICAgIHVuc2lnbmVkIG1Gb250SGVpZ2h0OwotICAgIHVuc2lnbmVkIG1MaW5lSGVpZ2h0OworCXVuc2lnbmVkIG1Gb250SGVpZ2h0OworCXVuc2lnbmVkIG1MaW5lSGVpZ2h0OwogCVJlc291cmNlKiBtSGVhZGVySWNvbjsKLSAgICBSZXNvdXJjZSogbUljb25TZWxlY3RlZDsKLSAgICBSZXNvdXJjZSogbUljb25VbnNlbGVjdGVkOwotICAgIFJlc291cmNlKiBtQmFja2dyb3VuZDsKLSAgICBSZXNvdXJjZSogbUZvbnQ7Ci0gICAgQ09MT1IgbUJhY2tncm91bmRDb2xvcjsKLSAgICBDT0xPUiBtRm9udENvbG9yOworCVJlc291cmNlKiBtSWNvblNlbGVjdGVkOworCVJlc291cmNlKiBtSWNvblVuc2VsZWN0ZWQ7CisJUmVzb3VyY2UqIG1CYWNrZ3JvdW5kOworCVJlc291cmNlKiBtRm9udDsKKwlDT0xPUiBtQmFja2dyb3VuZENvbG9yOworCUNPTE9SIG1Gb250Q29sb3I7CiAJQ09MT1IgbUhlYWRlckJhY2tncm91bmRDb2xvcjsKIAlDT0xPUiBtSGVhZGVyRm9udENvbG9yOwogCUNPTE9SIG1TZXBhcmF0b3JDb2xvcjsKQEAgLTY5Niw4NyArNjkyLDg2IEBACiBjbGFzcyBHVUlBbmltYXRpb24gOiBwdWJsaWMgUmVuZGVyT2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgR1VJQW5pbWF0aW9uKHhtbF9ub2RlPD4qIG5vZGUpOworCUdVSUFuaW1hdGlvbih4bWxfbm9kZTw+KiBub2RlKTsKIAogcHVibGljOgotICAgIC8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKLSAgICAvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CisJLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQorCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKIAotICAgIC8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCi0gICAgLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CisJLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKKwkvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKIAogcHJvdGVjdGVkOgotICAgIEFuaW1hdGlvblJlc291cmNlKiBtQW5pbWF0aW9uOwotICAgIGludCBtRnJhbWU7Ci0gICAgaW50IG1GUFM7Ci0gICAgaW50IG1Mb29wOwotICAgIGludCBtUmVuZGVyOwotICAgIGludCBtVXBkYXRlQ291bnQ7CisJQW5pbWF0aW9uUmVzb3VyY2UqIG1BbmltYXRpb247CisJaW50IG1GcmFtZTsKKwlpbnQgbUZQUzsKKwlpbnQgbUxvb3A7CisJaW50IG1SZW5kZXI7CisJaW50IG1VcGRhdGVDb3VudDsKIH07CiAKIGNsYXNzIEdVSVByb2dyZXNzQmFyIDogcHVibGljIFJlbmRlck9iamVjdCwgcHVibGljIEFjdGlvbk9iamVjdAogewogcHVibGljOgotICAgIEdVSVByb2dyZXNzQmFyKHhtbF9ub2RlPD4qIG5vZGUpOworCUdVSVByb2dyZXNzQmFyKHhtbF9ub2RlPD4qIG5vZGUpOwogCiBwdWJsaWM6Ci0gICAgLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKKwkvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOwogCi0gICAgLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKLSAgICAvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKKwkvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQorCS8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOwogCi0gICAgLy8gTm90aWZ5VmFyQ2hhbmdlIC0gTm90aWZ5IG9mIGEgdmFyaWFibGUgY2hhbmdlCi0gICAgLy8gIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CisJLy8gTm90aWZ5VmFyQ2hhbmdlIC0gTm90aWZ5IG9mIGEgdmFyaWFibGUgY2hhbmdlCisJLy8gIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CiAKIHByb3RlY3RlZDoKLSAgICBSZXNvdXJjZSogbUVtcHR5QmFyOwotICAgIFJlc291cmNlKiBtRnVsbEJhcjsKLSAgICBzdGQ6OnN0cmluZyBtTWluVmFsVmFyOwotICAgIHN0ZDo6c3RyaW5nIG1NYXhWYWxWYXI7Ci0gICAgc3RkOjpzdHJpbmcgbUN1clZhbFZhcjsKLSAgICBmbG9hdCBtU2xpZGU7Ci0gICAgZmxvYXQgbVNsaWRlSW5jOwotICAgIGludCBtU2xpZGVGcmFtZXM7Ci0gICAgaW50IG1MYXN0UG9zOworCVJlc291cmNlKiBtRW1wdHlCYXI7CisJUmVzb3VyY2UqIG1GdWxsQmFyOworCXN0ZDo6c3RyaW5nIG1NaW5WYWxWYXI7CisJc3RkOjpzdHJpbmcgbU1heFZhbFZhcjsKKwlzdGQ6OnN0cmluZyBtQ3VyVmFsVmFyOworCWZsb2F0IG1TbGlkZTsKKwlmbG9hdCBtU2xpZGVJbmM7CisJaW50IG1TbGlkZUZyYW1lczsKKwlpbnQgbUxhc3RQb3M7CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludCBSZW5kZXJJbnRlcm5hbCh2b2lkKTsgICAgICAgLy8gRG9lcyB0aGUgYWN0dWFsIHJlbmRlcgotCisJdmlydHVhbCBpbnQgUmVuZGVySW50ZXJuYWwodm9pZCk7CSAgIC8vIERvZXMgdGhlIGFjdHVhbCByZW5kZXIKIH07CiAKIGNsYXNzIEdVSVNsaWRlciA6IHB1YmxpYyBSZW5kZXJPYmplY3QsIHB1YmxpYyBBY3Rpb25PYmplY3QKIHsKIHB1YmxpYzoKLSAgICBHVUlTbGlkZXIoeG1sX25vZGU8Piogbm9kZSk7Ci0gICAgdmlydHVhbCB+R1VJU2xpZGVyKCk7CisJR1VJU2xpZGVyKHhtbF9ub2RlPD4qIG5vZGUpOworCXZpcnR1YWwgfkdVSVNsaWRlcigpOwogCiBwdWJsaWM6Ci0gICAgLy8gUmVuZGVyIC0gUmVuZGVyIHRoZSBmdWxsIG9iamVjdCB0byB0aGUgR0wgc3VyZmFjZQotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKKwkvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOwogCi0gICAgLy8gVXBkYXRlIC0gVXBkYXRlIGFueSBVSSBjb21wb25lbnQgYW5pbWF0aW9ucyAoY2FsbGVkIDw9IDMwIEZQUykKLSAgICAvLyAgUmV0dXJuIDAgaWYgbm90aGluZyB0byB1cGRhdGUsIDEgb24gc3VjY2VzcyBhbmQgY29udGl1ZSwgPjEgaWYgZnVsbCByZW5kZXIgcmVxdWlyZWQsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IFVwZGF0ZSh2b2lkKTsKKwkvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQorCS8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCisJdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOwogCi0gICAgLy8gTm90aWZ5VG91Y2ggLSBOb3RpZnkgb2YgYSB0b3VjaCBldmVudAotICAgIC8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKKwkvLyBOb3RpZnlUb3VjaCAtIE5vdGlmeSBvZiBhIHRvdWNoIGV2ZW50CisJLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvcgorCXZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgR1VJQWN0aW9uKiBzQWN0aW9uOwotICAgIFJlc291cmNlKiBzU2xpZGVyOwotICAgIFJlc291cmNlKiBzU2xpZGVyVXNlZDsKLSAgICBSZXNvdXJjZSogc1RvdWNoOwotICAgIGludCBzVG91Y2hXLCBzVG91Y2hIOwotICAgIGludCBzQ3VyVG91Y2hYOwotICAgIGludCBzVXBkYXRlOworCUdVSUFjdGlvbiogc0FjdGlvbjsKKwlSZXNvdXJjZSogc1NsaWRlcjsKKwlSZXNvdXJjZSogc1NsaWRlclVzZWQ7CisJUmVzb3VyY2UqIHNUb3VjaDsKKwlpbnQgc1RvdWNoVywgc1RvdWNoSDsKKwlpbnQgc0N1clRvdWNoWDsKKwlpbnQgc1VwZGF0ZTsKIH07CiAKICNkZWZpbmUgTUFYX0tFWUJPQVJEX0xBWU9VVFMgNQpAQCAtNzk5LDcgKzc5NCw3IEBACiB7CiBwdWJsaWM6CiAJR1VJS2V5Ym9hcmQoeG1sX25vZGU8Piogbm9kZSk7Ci0gICAgdmlydHVhbCB+R1VJS2V5Ym9hcmQoKTsKKwl2aXJ0dWFsIH5HVUlLZXlib2FyZCgpOwogCiBwdWJsaWM6CiAJdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOwpAQCAtODEyLDEyICs4MDcsMTIgQEAKIAogcHJvdGVjdGVkOgogCXN0cnVjdCBrZXlib2FyZF9rZXlfY2xhc3MKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIga2V5OworCXsKKwkJdW5zaWduZWQgY2hhciBrZXk7CiAJCXVuc2lnbmVkIGNoYXIgbG9uZ3ByZXNza2V5OwotICAgICAgICB1bnNpZ25lZCBpbnQgZW5kX3g7CisJCXVuc2lnbmVkIGludCBlbmRfeDsKIAkJdW5zaWduZWQgaW50IGxheW91dDsKLSAgICB9OworCX07CiAKIAlSZXNvdXJjZSoga2V5Ym9hcmRJbWdbTUFYX0tFWUJPQVJEX0xBWU9VVFNdOwogCXN0cnVjdCBrZXlib2FyZF9rZXlfY2xhc3Mga2V5Ym9hcmRfa2V5c1tNQVhfS0VZQk9BUkRfTEFZT1VUU11bTUFYX0tFWUJPQVJEX1JPV1NdW01BWF9LRVlCT0FSRF9LRVlTXTsKQEAgLTgzNiwyNSArODMxLDI1IEBACiBjbGFzcyBHVUlJbnB1dCA6IHB1YmxpYyBSZW5kZXJPYmplY3QsIHB1YmxpYyBBY3Rpb25PYmplY3QsIHB1YmxpYyBDb25kaXRpb25hbCwgcHVibGljIElucHV0T2JqZWN0CiB7CiBwdWJsaWM6Ci0gICAgLy8gdyBhbmQgaCBtYXkgYmUgaWdub3JlZCwgaW4gd2hpY2ggY2FzZSwgbm8gYm91bmRpbmcgYm94IGlzIGFwcGxpZWQKLSAgICBHVUlJbnB1dCh4bWxfbm9kZTw+KiBub2RlKTsKKwkvLyB3IGFuZCBoIG1heSBiZSBpZ25vcmVkLCBpbiB3aGljaCBjYXNlLCBubyBib3VuZGluZyBib3ggaXMgYXBwbGllZAorCUdVSUlucHV0KHhtbF9ub2RlPD4qIG5vZGUpOwogCXZpcnR1YWwgfkdVSUlucHV0KCk7CiAKIHB1YmxpYzoKLSAgICAvLyBSZW5kZXIgLSBSZW5kZXIgdGhlIGZ1bGwgb2JqZWN0IHRvIHRoZSBHTCBzdXJmYWNlCi0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgUmVuZGVyKHZvaWQpOworCS8vIFJlbmRlciAtIFJlbmRlciB0aGUgZnVsbCBvYmplY3QgdG8gdGhlIEdMIHN1cmZhY2UKKwkvLyAgUmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBSZW5kZXIodm9pZCk7CiAKLSAgICAvLyBVcGRhdGUgLSBVcGRhdGUgYW55IFVJIGNvbXBvbmVudCBhbmltYXRpb25zIChjYWxsZWQgPD0gMzAgRlBTKQotICAgIC8vICBSZXR1cm4gMCBpZiBub3RoaW5nIHRvIHVwZGF0ZSwgMSBvbiBzdWNjZXNzIGFuZCBjb250aXVlLCA+MSBpZiBmdWxsIHJlbmRlciByZXF1aXJlZCwgYW5kIDwwIG9uIGVycm9yCi0gICAgdmlydHVhbCBpbnQgVXBkYXRlKHZvaWQpOworCS8vIFVwZGF0ZSAtIFVwZGF0ZSBhbnkgVUkgY29tcG9uZW50IGFuaW1hdGlvbnMgKGNhbGxlZCA8PSAzMCBGUFMpCisJLy8gIFJldHVybiAwIGlmIG5vdGhpbmcgdG8gdXBkYXRlLCAxIG9uIHN1Y2Nlc3MgYW5kIGNvbnRpdWUsID4xIGlmIGZ1bGwgcmVuZGVyIHJlcXVpcmVkLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CiAKLSAgICAvLyBOb3RpZnkgb2YgYSB2YXJpYWJsZSBjaGFuZ2UKLSAgICB2aXJ0dWFsIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOworCS8vIE5vdGlmeSBvZiBhIHZhcmlhYmxlIGNoYW5nZQorCXZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CiAKIAkvLyBOb3RpZnlUb3VjaCAtIE5vdGlmeSBvZiBhIHRvdWNoIGV2ZW50Ci0gICAgLy8gIFJldHVybiAwIG9uIHN1Y2Nlc3MsID4wIHRvIGlnbm9yZSByZW1haW5kZXIgb2YgdG91Y2gsIGFuZCA8MCBvbiBlcnJvcgotICAgIHZpcnR1YWwgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOworCS8vICBSZXR1cm4gMCBvbiBzdWNjZXNzLCA+MCB0byBpZ25vcmUgcmVtYWluZGVyIG9mIHRvdWNoLCBhbmQgPDAgb24gZXJyb3IKKwl2aXJ0dWFsIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKIAogCXZpcnR1YWwgaW50IE5vdGlmeUtleWJvYXJkKGludCBrZXkpOwogCkBAIC04NjUsMTcgKzg2MCwxNyBAQAogCXZpcnR1YWwgaW50IEhhbmRsZVRleHRMb2NhdGlvbihpbnQgeCk7CiAKIHByb3RlY3RlZDoKLSAgICBHVUlUZXh0KiBtSW5wdXRUZXh0OworCUdVSVRleHQqIG1JbnB1dFRleHQ7CiAJR1VJQWN0aW9uKiBtQWN0aW9uOwogCVJlc291cmNlKiBtQmFja2dyb3VuZDsKIAlSZXNvdXJjZSogbUN1cnNvcjsKIAlSZXNvdXJjZSogbUZvbnQ7CiAJc3RkOjpzdHJpbmcgbVRleHQ7Ci0gICAgc3RkOjpzdHJpbmcgbUxhc3RWYWx1ZTsKKwlzdGQ6OnN0cmluZyBtTGFzdFZhbHVlOwogCXN0ZDo6c3RyaW5nIG1WYXJpYWJsZTsKIAlzdGQ6OnN0cmluZyBtTWFzazsKIAlzdGQ6OnN0cmluZyBtTWFza1ZhcmlhYmxlOwotICAgIENPTE9SIG1CYWNrZ3JvdW5kQ29sb3I7CisJQ09MT1IgbUJhY2tncm91bmRDb2xvcjsKIAlDT0xPUiBtQ3Vyc29yQ29sb3I7CiAJaW50IHNjcm9sbGluZ1g7CiAJaW50IGxhc3RYOwpkaWZmIC0tZ2l0IGEvZ3VpL3BhZ2VzLmNwcCBiL2d1aS9wYWdlcy5jcHAKaW5kZXggODZkNGRmZi4uMmJiNzBlMSAxMDA2NDQKLS0tIGEvZ3VpL3BhZ2VzLmNwcAorKysgYi9ndWkvcGFnZXMuY3BwCkBAIC00MSwzNiArNDEsNDEgQEAKIAogI2luY2x1ZGUgInJhcGlkeG1sLmhwcCIKICNpbmNsdWRlICJvYmplY3RzLmhwcCIKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKICNpbmNsdWRlICJibGFua3RpbWVyLmhwcCIKKyNlbmRpZgogCiBleHRlcm4gaW50IGdHdWlSdW5uaW5nOworI2lmbmRlZiBUV19OT19TQ1JFRU5fVElNRU9VVAogZXh0ZXJuIGJsYW5rdGltZXIgYmxhbmtUaW1lcjsKKyNlbmRpZgogCiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGFnZVNldCo+IFBhZ2VNYW5hZ2VyOjptUGFnZVNldHM7CiBQYWdlU2V0KiBQYWdlTWFuYWdlcjo6bUN1cnJlbnRTZXQ7CiBQYWdlU2V0KiBQYWdlTWFuYWdlcjo6bUJhc2VTZXQgPSBOVUxMOwogCi0KIC8vIEhlbHBlciByb3V0aW5lIHRvIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBjb2xvciBkZWNsYXJhdGlvbgogaW50IENvbnZlcnRTdHJUb0NvbG9yKHN0ZDo6c3RyaW5nIHN0ciwgQ09MT1IqIGNvbG9yKQogewotICAgIC8vIFNldCB0aGUgZGVmYXVsdCwgc29saWQgYmxhY2sKLSAgICBtZW1zZXQoY29sb3IsIDAsIHNpemVvZihDT0xPUikpOwotICAgIGNvbG9yLT5hbHBoYSA9IDI1NTsKKwkvLyBTZXQgdGhlIGRlZmF1bHQsIHNvbGlkIGJsYWNrCisJbWVtc2V0KGNvbG9yLCAwLCBzaXplb2YoQ09MT1IpKTsKKwljb2xvci0+YWxwaGEgPSAyNTU7CiAKLSAgICAvLyBUcmFuc2xhdGUgdmFyaWFibGVzCi0gICAgRGF0YU1hbmFnZXI6OkdldFZhbHVlKHN0ciwgc3RyKTsKLSAgICAKLSAgICAvLyBMb29rIGZvciBzb21lIGRlZmF1bHRzCi0gICAgaWYgKHN0ciA9PSAiYmxhY2siKSAgICAgICAgIHJldHVybiAwOwotICAgIGVsc2UgaWYgKHN0ciA9PSAid2hpdGUiKSAgICB7IGNvbG9yLT5yZWQgPSBjb2xvci0+Z3JlZW4gPSBjb2xvci0+Ymx1ZSA9IDI1NTsgcmV0dXJuIDA7IH0KLSAgICBlbHNlIGlmIChzdHIgPT0gInJlZCIpICAgICAgeyBjb2xvci0+cmVkID0gMjU1OyByZXR1cm4gMDsgfQotICAgIGVsc2UgaWYgKHN0ciA9PSAiZ3JlZW4iKSAgICB7IGNvbG9yLT5ncmVlbiA9IDI1NTsgcmV0dXJuIDA7IH0KLSAgICBlbHNlIGlmIChzdHIgPT0gImJsdWUiKSAgICAgeyBjb2xvci0+Ymx1ZSA9IDI1NTsgcmV0dXJuIDA7IH0KKwkvLyBUcmFuc2xhdGUgdmFyaWFibGVzCisJRGF0YU1hbmFnZXI6OkdldFZhbHVlKHN0ciwgc3RyKTsKKwkKKwkvLyBMb29rIGZvciBzb21lIGRlZmF1bHRzCisJaWYgKHN0ciA9PSAiYmxhY2siKQkJCXJldHVybiAwOworCWVsc2UgaWYgKHN0ciA9PSAid2hpdGUiKQl7IGNvbG9yLT5yZWQgPSBjb2xvci0+Z3JlZW4gPSBjb2xvci0+Ymx1ZSA9IDI1NTsgcmV0dXJuIDA7IH0KKwllbHNlIGlmIChzdHIgPT0gInJlZCIpCQl7IGNvbG9yLT5yZWQgPSAyNTU7IHJldHVybiAwOyB9CisJZWxzZSBpZiAoc3RyID09ICJncmVlbiIpCXsgY29sb3ItPmdyZWVuID0gMjU1OyByZXR1cm4gMDsgfQorCWVsc2UgaWYgKHN0ciA9PSAiYmx1ZSIpCQl7IGNvbG9yLT5ibHVlID0gMjU1OyByZXR1cm4gMDsgfQogCi0gICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgcmVxdWlyZSBhbiBSR0IoQSkgY29sb3IKLSAgICBpZiAoc3RyWzBdICE9ICcjJykgICAgICAgICAgcmV0dXJuIC0xOwotICAgIHN0ci5lcmFzZSgwLCAxKTsKKwkvLyBBdCB0aGlzIHBvaW50LCB3ZSByZXF1aXJlIGFuIFJHQihBKSBjb2xvcgorCWlmIChzdHJbMF0gIT0gJyMnKQorCQlyZXR1cm4gLTE7CisKKwlzdHIuZXJhc2UoMCwgMSk7CiAKIAlpbnQgcmVzdWx0OwogCWlmIChzdHIuc2l6ZSgpID49IDgpIHsKQEAgLTk1LDE4NiArMTAwLDE4OCBAQAogLy8gSGVscGVyIEFQSXMKIGJvb2wgTG9hZFBsYWNlbWVudCh4bWxfbm9kZTw+KiBub2RlLCBpbnQqIHgsIGludCogeSwgaW50KiB3IC8qID0gTlVMTCAqLywgaW50KiBoIC8qID0gTlVMTCAqLywgUmVuZGVyT2JqZWN0OjpQbGFjZW1lbnQqIHBsYWNlbWVudCAvKiA9IE5VTEwgKi8pCiB7Ci0gICAgaWYgKCFub2RlKSAgICAgIHJldHVybiBmYWxzZTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBmYWxzZTsKIAotICAgIHN0ZDo6c3RyaW5nIHZhbHVlOwotICAgIGlmIChub2RlLT5maXJzdF9hdHRyaWJ1dGUoIngiKSkKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJ4IiktPnZhbHVlKCk7Ci0gICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOwotICAgICAgICAqeCA9IGF0b2wodmFsdWUuY19zdHIoKSk7Ci0gICAgfQorCXN0ZDo6c3RyaW5nIHZhbHVlOworCWlmIChub2RlLT5maXJzdF9hdHRyaWJ1dGUoIngiKSkKKwl7CisJCXZhbHVlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJ4IiktPnZhbHVlKCk7CisJCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOworCQkqeCA9IGF0b2wodmFsdWUuY19zdHIoKSk7CisJfQogCi0gICAgaWYgKG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgieSIpKQotICAgIHsKLSAgICAgICAgdmFsdWUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoInkiKS0+dmFsdWUoKTsKLSAgICAgICAgRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgICp5ID0gYXRvbCh2YWx1ZS5jX3N0cigpKTsKLSAgICB9CisJaWYgKG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgieSIpKQorCXsKKwkJdmFsdWUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoInkiKS0+dmFsdWUoKTsKKwkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhbHVlLCB2YWx1ZSk7CisJCSp5ID0gYXRvbCh2YWx1ZS5jX3N0cigpKTsKKwl9CiAKLSAgICBpZiAodyAmJiBub2RlLT5maXJzdF9hdHRyaWJ1dGUoInciKSkKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJ3IiktPnZhbHVlKCk7Ci0gICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOwotICAgICAgICAqdyA9IGF0b2wodmFsdWUuY19zdHIoKSk7Ci0gICAgfQorCWlmICh3ICYmIG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgidyIpKQorCXsKKwkJdmFsdWUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoInciKS0+dmFsdWUoKTsKKwkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhbHVlLCB2YWx1ZSk7CisJCSp3ID0gYXRvbCh2YWx1ZS5jX3N0cigpKTsKKwl9CiAKLSAgICBpZiAoaCAmJiBub2RlLT5maXJzdF9hdHRyaWJ1dGUoImgiKSkKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJoIiktPnZhbHVlKCk7Ci0gICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOwotICAgICAgICAqaCA9IGF0b2wodmFsdWUuY19zdHIoKSk7Ci0gICAgfQorCWlmIChoICYmIG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgiaCIpKQorCXsKKwkJdmFsdWUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoImgiKS0+dmFsdWUoKTsKKwkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhbHVlLCB2YWx1ZSk7CisJCSpoID0gYXRvbCh2YWx1ZS5jX3N0cigpKTsKKwl9CiAKLSAgICBpZiAocGxhY2VtZW50ICYmIG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgicGxhY2VtZW50IikpCi0gICAgewotICAgICAgICB2YWx1ZSA9IG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgicGxhY2VtZW50IiktPnZhbHVlKCk7Ci0gICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOwotICAgICAgICAqcGxhY2VtZW50ID0gKFJlbmRlck9iamVjdDo6UGxhY2VtZW50KSBhdG9sKHZhbHVlLmNfc3RyKCkpOwotICAgIH0KKwlpZiAocGxhY2VtZW50ICYmIG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgicGxhY2VtZW50IikpCisJeworCQl2YWx1ZSA9IG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgicGxhY2VtZW50IiktPnZhbHVlKCk7CisJCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZSh2YWx1ZSwgdmFsdWUpOworCQkqcGxhY2VtZW50ID0gKFJlbmRlck9iamVjdDo6UGxhY2VtZW50KSBhdG9sKHZhbHVlLmNfc3RyKCkpOworCX0KIAotICAgIHJldHVybiB0cnVlOworCXJldHVybiB0cnVlOwogfQogCiBpbnQgQWN0aW9uT2JqZWN0OjpTZXRBY3Rpb25Qb3MoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCiB7Ci0gICAgaWYgKHggPCAwIHx8IHkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJaWYgKHggPCAwIHx8IHkgPCAwKQorCQlyZXR1cm4gLTE7CiAKLSAgICBtQWN0aW9uWCA9IHg7IAotICAgIG1BY3Rpb25ZID0geTsgCi0gICAgaWYgKHcgfHwgaCkKLSAgICB7Ci0gICAgICAgIG1BY3Rpb25XID0gdzsKLSAgICAgICAgbUFjdGlvbkggPSBoOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwltQWN0aW9uWCA9IHg7IAorCW1BY3Rpb25ZID0geTsgCisJaWYgKHcgfHwgaCkKKwl7CisJCW1BY3Rpb25XID0gdzsKKwkJbUFjdGlvbkggPSBoOworCX0KKwlyZXR1cm4gMDsKIH0KIAogUGFnZTo6UGFnZSh4bWxfbm9kZTw+KiBwYWdlLCB4bWxfbm9kZTw+KiB0ZW1wbGF0ZXMgLyogPSBOVUxMICovKQogewotICAgIG1Ub3VjaFN0YXJ0ID0gTlVMTDsKKwltVG91Y2hTdGFydCA9IE5VTEw7CiAKLSAgICAvLyBXZSBjYW4gbWVtc2V0IHRoZSB3aG9sZSBzdHJ1Y3R1cmUsIGJlY2F1c2UgdGhlIGFscGhhIGNoYW5uZWwgaXMgaWdub3JlZAotICAgIG1lbXNldCgmbUJhY2tncm91bmQsIDAsIHNpemVvZihDT0xPUikpOworCS8vIFdlIGNhbiBtZW1zZXQgdGhlIHdob2xlIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUgYWxwaGEgY2hhbm5lbCBpcyBpZ25vcmVkCisJbWVtc2V0KCZtQmFja2dyb3VuZCwgMCwgc2l6ZW9mKENPTE9SKSk7CiAKLSAgICAvLyBXaXRoIE5VTEwsIHdlIG1ha2UgYSBjb25zb2xlLW9ubHkgZGlzcGxheQotICAgIGlmICghcGFnZSkKLSAgICB7Ci0gICAgICAgIG1OYW1lID0gImNvbnNvbGUiOworCS8vIFdpdGggTlVMTCwgd2UgbWFrZSBhIGNvbnNvbGUtb25seSBkaXNwbGF5CisJaWYgKCFwYWdlKQorCXsKKwkJbU5hbWUgPSAiY29uc29sZSI7CiAKLSAgICAgICAgR1VJQ29uc29sZSogZWxlbWVudCA9IG5ldyBHVUlDb25zb2xlKE5VTEwpOwotICAgICAgICBtUmVuZGVycy5wdXNoX2JhY2soZWxlbWVudCk7Ci0gICAgICAgIG1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwkJR1VJQ29uc29sZSogZWxlbWVudCA9IG5ldyBHVUlDb25zb2xlKE5VTEwpOworCQltUmVuZGVycy5wdXNoX2JhY2soZWxlbWVudCk7CisJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJcmV0dXJuOworCX0KIAotICAgIGlmIChwYWdlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgICAgbU5hbWUgPSBwYWdlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKS0+dmFsdWUoKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBMT0dFUlIoIk5vIHBhZ2UgbmFtZSBhdHRyaWJ1dGUgZm91bmQhXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwlpZiAocGFnZS0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIikpCisJCW1OYW1lID0gcGFnZS0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIiktPnZhbHVlKCk7CisJZWxzZQorCXsKKwkJTE9HRVJSKCJObyBwYWdlIG5hbWUgYXR0cmlidXRlIGZvdW5kIVxuIik7CisJCXJldHVybjsKKwl9CiAKLSAgICBMT0dJTkZPKCJMb2FkaW5nIHBhZ2UgJXNcbiIsIG1OYW1lLmNfc3RyKCkpOworCUxPR0lORk8oIkxvYWRpbmcgcGFnZSAlc1xuIiwgbU5hbWUuY19zdHIoKSk7CiAKLSAgICAvLyBUaGlzIGlzIGEgcmVjdXJzaXZlIHJvdXRpbmUgZm9yIHRlbXBsYXRlIGhhbmRsaW5nCi0gICAgUHJvY2Vzc05vZGUocGFnZSwgdGVtcGxhdGVzKTsKKwkvLyBUaGlzIGlzIGEgcmVjdXJzaXZlIHJvdXRpbmUgZm9yIHRlbXBsYXRlIGhhbmRsaW5nCisJUHJvY2Vzc05vZGUocGFnZSwgdGVtcGxhdGVzKTsKIAotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKIGJvb2wgUGFnZTo6UHJvY2Vzc05vZGUoeG1sX25vZGU8PiogcGFnZSwgeG1sX25vZGU8PiogdGVtcGxhdGVzIC8qID0gTlVMTCAqLywgaW50IGRlcHRoIC8qID0gMCAqLykKIHsKLSAgICBpZiAoZGVwdGggPT0gMTApCi0gICAgewotICAgICAgICBMT0dFUlIoIlBhZ2UgcHJvY2Vzc2luZyBkZXB0aCBoYXMgZXhjZWVkZWQgMTAuIEZhaWxpbmcgb3V0LiBUaGlzIGlzIGxpa2VseSBhIHJlY3Vyc2l2ZSB0ZW1wbGF0ZS5cbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorCWlmIChkZXB0aCA9PSAxMCkKKwl7CisJCUxPR0VSUigiUGFnZSBwcm9jZXNzaW5nIGRlcHRoIGhhcyBleGNlZWRlZCAxMC4gRmFpbGluZyBvdXQuIFRoaXMgaXMgbGlrZWx5IGEgcmVjdXJzaXZlIHRlbXBsYXRlLlxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKLSAgICAvLyBMZXQncyByZXRyaWV2ZSB0aGUgYmFja2dyb3VuZCB2YWx1ZSwgaWYgYW55Ci0gICAgeG1sX25vZGU8PiogYmcgPSBwYWdlLT5maXJzdF9ub2RlKCJiYWNrZ3JvdW5kIik7Ci0gICAgaWYgKGJnKQotICAgIHsKLSAgICAgICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyID0gYmctPmZpcnN0X2F0dHJpYnV0ZSgiY29sb3IiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgICAgIENvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbUJhY2tncm91bmQpOwotICAgICAgICB9Ci0gICAgfQorCS8vIExldCdzIHJldHJpZXZlIHRoZSBiYWNrZ3JvdW5kIHZhbHVlLCBpZiBhbnkKKwl4bWxfbm9kZTw+KiBiZyA9IHBhZ2UtPmZpcnN0X25vZGUoImJhY2tncm91bmQiKTsKKwlpZiAoYmcpCisJeworCQl4bWxfYXR0cmlidXRlPD4qIGF0dHIgPSBiZy0+Zmlyc3RfYXR0cmlidXRlKCJjb2xvciIpOworCQlpZiAoYXR0cikKKwkJeworCQkJc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOworCQkJQ29udmVydFN0clRvQ29sb3IoY29sb3IsICZtQmFja2dyb3VuZCk7CisJCX0KKwl9CiAKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKLSAgICBjaGlsZCA9IHBhZ2UtPmZpcnN0X25vZGUoIm9iamVjdCIpOwotICAgIHdoaWxlIChjaGlsZCkKLSAgICB7Ci0gICAgICAgIGlmICghY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgidHlwZSIpKQotICAgICAgICAgICAgYnJlYWs7CisJeG1sX25vZGU8PiogY2hpbGQ7CisJY2hpbGQgPSBwYWdlLT5maXJzdF9ub2RlKCJvYmplY3QiKTsKKwl3aGlsZSAoY2hpbGQpCisJeworCQlpZiAoIWNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInR5cGUiKSkKKwkJCWJyZWFrOwogCi0gICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ0eXBlIiktPnZhbHVlKCk7CisJCXN0ZDo6c3RyaW5nIHR5cGUgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ0eXBlIiktPnZhbHVlKCk7CiAKLSAgICAgICAgaWYgKHR5cGUgPT0gInRleHQiKQotICAgICAgICB7Ci0gICAgICAgICAgICBHVUlUZXh0KiBlbGVtZW50ID0gbmV3IEdVSVRleHQoY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImltYWdlIikKLSAgICAgICAgewotICAgICAgICAgICAgR1VJSW1hZ2UqIGVsZW1lbnQgPSBuZXcgR1VJSW1hZ2UoY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZpbGwiKQotICAgICAgICB7Ci0gICAgICAgICAgICBHVUlGaWxsKiBlbGVtZW50ID0gbmV3IEdVSUZpbGwoY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImFjdGlvbiIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdVSUFjdGlvbiogZWxlbWVudCA9IG5ldyBHVUlBY3Rpb24oY2hpbGQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNvbnNvbGUiKQotICAgICAgICB7Ci0gICAgICAgICAgICBHVUlDb25zb2xlKiBlbGVtZW50ID0gbmV3IEdVSUNvbnNvbGUoY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImJ1dHRvbiIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdVSUJ1dHRvbiogZWxlbWVudCA9IG5ldyBHVUlCdXR0b24oY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNoZWNrYm94IikKLSAgICAgICAgewotICAgICAgICAgICAgR1VJQ2hlY2tib3gqIGVsZW1lbnQgPSBuZXcgR1VJQ2hlY2tib3goY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZpbGVzZWxlY3RvciIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdVSUZpbGVTZWxlY3RvciogZWxlbWVudCA9IG5ldyBHVUlGaWxlU2VsZWN0b3IoY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImFuaW1hdGlvbiIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdVSUFuaW1hdGlvbiogZWxlbWVudCA9IG5ldyBHVUlBbmltYXRpb24oY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInByb2dyZXNzYmFyIikKLSAgICAgICAgewotICAgICAgICAgICAgR1VJUHJvZ3Jlc3NCYXIqIGVsZW1lbnQgPSBuZXcgR1VJUHJvZ3Jlc3NCYXIoY2hpbGQpOwotICAgICAgICAgICAgbVJlbmRlcnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgbUFjdGlvbnMucHVzaF9iYWNrKGVsZW1lbnQpOwotICAgICAgICB9CisJCWlmICh0eXBlID09ICJ0ZXh0IikKKwkJeworCQkJR1VJVGV4dCogZWxlbWVudCA9IG5ldyBHVUlUZXh0KGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJpbWFnZSIpCisJCXsKKwkJCUdVSUltYWdlKiBlbGVtZW50ID0gbmV3IEdVSUltYWdlKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJmaWxsIikKKwkJeworCQkJR1VJRmlsbCogZWxlbWVudCA9IG5ldyBHVUlGaWxsKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJhY3Rpb24iKQorCQl7CisJCQlHVUlBY3Rpb24qIGVsZW1lbnQgPSBuZXcgR1VJQWN0aW9uKGNoaWxkKTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJjb25zb2xlIikKKwkJeworCQkJR1VJQ29uc29sZSogZWxlbWVudCA9IG5ldyBHVUlDb25zb2xlKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJidXR0b24iKQorCQl7CisJCQlHVUlCdXR0b24qIGVsZW1lbnQgPSBuZXcgR1VJQnV0dG9uKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJjaGVja2JveCIpCisJCXsKKwkJCUdVSUNoZWNrYm94KiBlbGVtZW50ID0gbmV3IEdVSUNoZWNrYm94KGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJmaWxlc2VsZWN0b3IiKQorCQl7CisJCQlHVUlGaWxlU2VsZWN0b3IqIGVsZW1lbnQgPSBuZXcgR1VJRmlsZVNlbGVjdG9yKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJhbmltYXRpb24iKQorCQl7CisJCQlHVUlBbmltYXRpb24qIGVsZW1lbnQgPSBuZXcgR1VJQW5pbWF0aW9uKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJwcm9ncmVzc2JhciIpCisJCXsKKwkJCUdVSVByb2dyZXNzQmFyKiBlbGVtZW50ID0gbmV3IEdVSVByb2dyZXNzQmFyKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQogCQllbHNlIGlmICh0eXBlID09ICJzbGlkZXIiKQotICAgICAgICB7Ci0gICAgICAgICAgICBHVUlTbGlkZXIqIGVsZW1lbnQgPSBuZXcgR1VJU2xpZGVyKGNoaWxkKTsKLSAgICAgICAgICAgIG1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKLSAgICAgICAgICAgIG1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKLSAgICAgICAgfQorCQl7CisJCQlHVUlTbGlkZXIqIGVsZW1lbnQgPSBuZXcgR1VJU2xpZGVyKGNoaWxkKTsKKwkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKKwkJfQogCQllbHNlIGlmICh0eXBlID09ICJzbGlkZXJ2YWx1ZSIpCiAJCXsKIAkJCUdVSVNsaWRlclZhbHVlICplbGVtZW50ID0gbmV3IEdVSVNsaWRlclZhbHVlKGNoaWxkKTsKQEAgLTMwNiw2MjcgKzMxMyw2NTIgQEAKIAkJCW1SZW5kZXJzLnB1c2hfYmFjayhlbGVtZW50KTsKIAkJCW1BY3Rpb25zLnB1c2hfYmFjayhlbGVtZW50KTsKIAkJfQotICAgICAgICBlbHNlIGlmICh0eXBlID09ICJ0ZW1wbGF0ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdGVtcGxhdGVzIHx8ICFjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTE9HRVJSKCJJbnZhbGlkIHRlbXBsYXRlIHJlcXVlc3QuXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpLT52YWx1ZSgpOworCQllbHNlIGlmICh0eXBlID09ICJ0ZW1wbGF0ZSIpCisJCXsKKwkJCWlmICghdGVtcGxhdGVzIHx8ICFjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIikpCisJCQl7CisJCQkJTE9HRVJSKCJJbnZhbGlkIHRlbXBsYXRlIHJlcXVlc3QuXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdGQ6OnN0cmluZyBuYW1lID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpLT52YWx1ZSgpOwogCi0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIHRoZSBjb3JyZWN0IHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgeG1sX25vZGU8Piogbm9kZTsKLSAgICAgICAgICAgICAgICBub2RlID0gdGVtcGxhdGVzLT5maXJzdF9ub2RlKCJ0ZW1wbGF0ZSIpOworCQkJCS8vIFdlIG5lZWQgdG8gZmluZCB0aGUgY29ycmVjdCB0ZW1wbGF0ZQorCQkJCXhtbF9ub2RlPD4qIG5vZGU7CisJCQkJbm9kZSA9IHRlbXBsYXRlcy0+Zmlyc3Rfbm9kZSgidGVtcGxhdGUiKTsKIAotICAgICAgICAgICAgICAgIHdoaWxlIChub2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCQkJCXdoaWxlIChub2RlKQorCQkJCXsKKwkJCQkJaWYgKCFub2RlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKSkKKwkJCQkJCWNvbnRpbnVlOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpLT52YWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVByb2Nlc3NOb2RlKG5vZGUsIHRlbXBsYXRlcywgZGVwdGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHRfc2libGluZygidGVtcGxhdGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0dFUlIoIlVua25vd24gb2JqZWN0IHR5cGUuXG4iKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0X3NpYmxpbmcoIm9iamVjdCIpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKwkJCQkJaWYgKG5hbWUgPT0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIiktPnZhbHVlKCkpCisJCQkJCXsKKwkJCQkJCWlmICghUHJvY2Vzc05vZGUobm9kZSwgdGVtcGxhdGVzLCBkZXB0aCArIDEpKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlub2RlID0gbm9kZS0+bmV4dF9zaWJsaW5nKCJ0ZW1wbGF0ZSIpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUxPR0VSUigiVW5rbm93biBvYmplY3QgdHlwZS5cbiIpOworCQl9CisJCWNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygib2JqZWN0Iik7CisJfQorCXJldHVybiB0cnVlOwogfQogCiBpbnQgUGFnZTo6UmVuZGVyKHZvaWQpCiB7Ci0gICAgLy8gUmVuZGVyIGJhY2tncm91bmQKLSAgICBncl9jb2xvcihtQmFja2dyb3VuZC5yZWQsIG1CYWNrZ3JvdW5kLmdyZWVuLCBtQmFja2dyb3VuZC5ibHVlLCBtQmFja2dyb3VuZC5hbHBoYSk7Ci0gICAgZ3JfZmlsbCgwLCAwLCBncl9mYl93aWR0aCgpLCBncl9mYl9oZWlnaHQoKSk7CisJLy8gUmVuZGVyIGJhY2tncm91bmQKKwlncl9jb2xvcihtQmFja2dyb3VuZC5yZWQsIG1CYWNrZ3JvdW5kLmdyZWVuLCBtQmFja2dyb3VuZC5ibHVlLCBtQmFja2dyb3VuZC5hbHBoYSk7CisJZ3JfZmlsbCgwLCAwLCBncl9mYl93aWR0aCgpLCBncl9mYl9oZWlnaHQoKSk7CiAKLSAgICAvLyBSZW5kZXIgcmVtYWluaW5nIG9iamVjdHMKLSAgICBzdGQ6OnZlY3RvcjxSZW5kZXJPYmplY3QqPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBtUmVuZGVycy5iZWdpbigpOyBpdGVyICE9IG1SZW5kZXJzLmVuZCgpOyBpdGVyKyspCi0gICAgewotICAgICAgICBpZiAoKCppdGVyKS0+UmVuZGVyKCkpCi0gICAgICAgICAgICBMT0dFUlIoIkEgcmVuZGVyIHJlcXVlc3QgaGFzIGZhaWxlZC5cbiIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwkvLyBSZW5kZXIgcmVtYWluaW5nIG9iamVjdHMKKwlzdGQ6OnZlY3RvcjxSZW5kZXJPYmplY3QqPjo6aXRlcmF0b3IgaXRlcjsKKwlmb3IgKGl0ZXIgPSBtUmVuZGVycy5iZWdpbigpOyBpdGVyICE9IG1SZW5kZXJzLmVuZCgpOyBpdGVyKyspCisJeworCQlpZiAoKCppdGVyKS0+UmVuZGVyKCkpCisJCQlMT0dFUlIoIkEgcmVuZGVyIHJlcXVlc3QgaGFzIGZhaWxlZC5cbiIpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogaW50IFBhZ2U6OlVwZGF0ZSh2b2lkKQogewotICAgIGludCByZXRDb2RlID0gMDsKKwlpbnQgcmV0Q29kZSA9IDA7CiAKLSAgICBzdGQ6OnZlY3RvcjxSZW5kZXJPYmplY3QqPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBtUmVuZGVycy5iZWdpbigpOyBpdGVyICE9IG1SZW5kZXJzLmVuZCgpOyBpdGVyKyspCi0gICAgewotICAgICAgICBpbnQgcmV0ID0gKCppdGVyKS0+VXBkYXRlKCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgTE9HRVJSKCJBbiB1cGRhdGUgcmVxdWVzdCBoYXMgZmFpbGVkLlxuIik7Ci0gICAgICAgIGVsc2UgaWYgKHJldCA+IHJldENvZGUpCi0gICAgICAgICAgICByZXRDb2RlID0gcmV0OwotICAgIH0KKwlzdGQ6OnZlY3RvcjxSZW5kZXJPYmplY3QqPjo6aXRlcmF0b3IgaXRlcjsKKwlmb3IgKGl0ZXIgPSBtUmVuZGVycy5iZWdpbigpOyBpdGVyICE9IG1SZW5kZXJzLmVuZCgpOyBpdGVyKyspCisJeworCQlpbnQgcmV0ID0gKCppdGVyKS0+VXBkYXRlKCk7CisJCWlmIChyZXQgPCAwKQorCQkJTE9HRVJSKCJBbiB1cGRhdGUgcmVxdWVzdCBoYXMgZmFpbGVkLlxuIik7CisJCWVsc2UgaWYgKHJldCA+IHJldENvZGUpCisJCQlyZXRDb2RlID0gcmV0OworCX0KIAotICAgIHJldHVybiByZXRDb2RlOworCXJldHVybiByZXRDb2RlOwogfQogCiBpbnQgUGFnZTo6Tm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSkKIHsKLSAgICAvLyBCeSBkZWZhdWx0LCByZXR1cm4gMSB0byBpZ25vcmUgZnVydGhlciB0b3VjaGVzIGlmIG5vYm9keSBpcyBsaXN0ZW5pbmcKLSAgICBpbnQgcmV0ID0gMTsKKwkvLyBCeSBkZWZhdWx0LCByZXR1cm4gMSB0byBpZ25vcmUgZnVydGhlciB0b3VjaGVzIGlmIG5vYm9keSBpcyBsaXN0ZW5pbmcKKwlpbnQgcmV0ID0gMTsKIAotICAgIC8vIERvbid0IHRyeSB0byBoYW5kbGUgYSBsYWNrIG9mIGhhbmRsZXJzCi0gICAgaWYgKG1BY3Rpb25zLnNpemUoKSA9PSAwKSAgIHJldHVybiByZXQ7CisJLy8gRG9uJ3QgdHJ5IHRvIGhhbmRsZSBhIGxhY2sgb2YgaGFuZGxlcnMKKwlpZiAobUFjdGlvbnMuc2l6ZSgpID09IDApCisJCXJldHVybiByZXQ7CiAKLSAgICAvLyBXZSByZWNvcmQgbVRvdWNoU3RhcnQgc28gd2UgY2FuIHBhc3MgYWxsIHRoZSB0b3VjaCBzdHJlYW0gdG8gdGhlIHNhbWUgaGFuZGxlcgotICAgIGlmIChzdGF0ZSA9PSBUT1VDSF9TVEFSVCkKLSAgICB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEFjdGlvbk9iamVjdCo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ZXI7Ci0gICAgICAgIC8vIFdlIHdvcmsgYmFja3dhcmRzLCBmcm9tIHRvcC1tb3N0IGVsZW1lbnQgdG8gYm90dG9tLW1vc3QgZWxlbWVudAotICAgICAgICBmb3IgKGl0ZXIgPSBtQWN0aW9ucy5yYmVnaW4oKTsgaXRlciAhPSBtQWN0aW9ucy5yZW5kKCk7IGl0ZXIrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCgqaXRlciktPklzSW5SZWdpb24oeCwgeSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbVRvdWNoU3RhcnQgPSAoKml0ZXIpOwotICAgICAgICAgICAgICAgIHJldCA9IG1Ub3VjaFN0YXJ0LT5Ob3RpZnlUb3VjaChzdGF0ZSwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgIGJyZWFrOwotICAgICAgICAgICAgICAgIG1Ub3VjaFN0YXJ0ID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0ZSA9PSBUT1VDSF9SRUxFQVNFICYmIG1Ub3VjaFN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgICByZXQgPSBtVG91Y2hTdGFydC0+Tm90aWZ5VG91Y2goc3RhdGUsIHgsIHkpOwotICAgICAgICBtVG91Y2hTdGFydCA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdGF0ZSA9PSBUT1VDSF9EUkFHIHx8IHN0YXRlID09IFRPVUNIX0hPTEQgfHwgc3RhdGUgPT0gVE9VQ0hfUkVQRUFUKSAmJiBtVG91Y2hTdGFydCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0ID0gbVRvdWNoU3RhcnQtPk5vdGlmeVRvdWNoKHN0YXRlLCB4LCB5KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKwkvLyBXZSByZWNvcmQgbVRvdWNoU3RhcnQgc28gd2UgY2FuIHBhc3MgYWxsIHRoZSB0b3VjaCBzdHJlYW0gdG8gdGhlIHNhbWUgaGFuZGxlcgorCWlmIChzdGF0ZSA9PSBUT1VDSF9TVEFSVCkKKwl7CisJCXN0ZDo6dmVjdG9yPEFjdGlvbk9iamVjdCo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ZXI7CisJCS8vIFdlIHdvcmsgYmFja3dhcmRzLCBmcm9tIHRvcC1tb3N0IGVsZW1lbnQgdG8gYm90dG9tLW1vc3QgZWxlbWVudAorCQlmb3IgKGl0ZXIgPSBtQWN0aW9ucy5yYmVnaW4oKTsgaXRlciAhPSBtQWN0aW9ucy5yZW5kKCk7IGl0ZXIrKykKKwkJeworCQkJaWYgKCgqaXRlciktPklzSW5SZWdpb24oeCwgeSkpCisJCQl7CisJCQkJbVRvdWNoU3RhcnQgPSAoKml0ZXIpOworCQkJCXJldCA9IG1Ub3VjaFN0YXJ0LT5Ob3RpZnlUb3VjaChzdGF0ZSwgeCwgeSk7CisJCQkJaWYgKHJldCA+PSAwKQorCQkJCQlicmVhazsKKwkJCQltVG91Y2hTdGFydCA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoc3RhdGUgPT0gVE9VQ0hfUkVMRUFTRSAmJiBtVG91Y2hTdGFydCAhPSBOVUxMKQorCXsKKwkJcmV0ID0gbVRvdWNoU3RhcnQtPk5vdGlmeVRvdWNoKHN0YXRlLCB4LCB5KTsKKwkJbVRvdWNoU3RhcnQgPSBOVUxMOworCX0KKwllbHNlIGlmICgoc3RhdGUgPT0gVE9VQ0hfRFJBRyB8fCBzdGF0ZSA9PSBUT1VDSF9IT0xEIHx8IHN0YXRlID09IFRPVUNIX1JFUEVBVCkgJiYgbVRvdWNoU3RhcnQgIT0gTlVMTCkKKwl7CisJCXJldCA9IG1Ub3VjaFN0YXJ0LT5Ob3RpZnlUb3VjaChzdGF0ZSwgeCwgeSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIGludCBQYWdlOjpOb3RpZnlLZXkoaW50IGtleSkKIHsKLSAgICBzdGQ6OnZlY3RvcjxBY3Rpb25PYmplY3QqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyOworCXN0ZDo6dmVjdG9yPEFjdGlvbk9iamVjdCo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ZXI7CiAKLSAgICAvLyBEb24ndCB0cnkgdG8gaGFuZGxlIGEgbGFjayBvZiBoYW5kbGVycwotICAgIGlmIChtQWN0aW9ucy5zaXplKCkgPT0gMCkgICByZXR1cm4gMTsKKwkvLyBEb24ndCB0cnkgdG8gaGFuZGxlIGEgbGFjayBvZiBoYW5kbGVycworCWlmIChtQWN0aW9ucy5zaXplKCkgPT0gMCkKKwkJcmV0dXJuIDE7CiAKLSAgICAvLyBXZSB3b3JrIGJhY2t3YXJkcywgZnJvbSB0b3AtbW9zdCBlbGVtZW50IHRvIGJvdHRvbS1tb3N0IGVsZW1lbnQKLSAgICBmb3IgKGl0ZXIgPSBtQWN0aW9ucy5yYmVnaW4oKTsgaXRlciAhPSBtQWN0aW9ucy5yZW5kKCk7IGl0ZXIrKykKLSAgICB7Ci0gICAgICAgIGludCByZXQgPSAoKml0ZXIpLT5Ob3RpZnlLZXkoa2V5KTsKLSAgICAgICAgaWYgKHJldCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGVsc2UgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBMT0dFUlIoIkFuIGFjdGlvbiBoYW5kbGVyIGhhcyByZXR1cm5lZCBhbiBlcnJvciIpOwotICAgIH0KLSAgICByZXR1cm4gMTsKKwkvLyBXZSB3b3JrIGJhY2t3YXJkcywgZnJvbSB0b3AtbW9zdCBlbGVtZW50IHRvIGJvdHRvbS1tb3N0IGVsZW1lbnQKKwlmb3IgKGl0ZXIgPSBtQWN0aW9ucy5yYmVnaW4oKTsgaXRlciAhPSBtQWN0aW9ucy5yZW5kKCk7IGl0ZXIrKykKKwl7CisJCWludCByZXQgPSAoKml0ZXIpLT5Ob3RpZnlLZXkoa2V5KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKHJldCA8IDApCisJCQlMT0dFUlIoIkFuIGFjdGlvbiBoYW5kbGVyIGhhcyByZXR1cm5lZCBhbiBlcnJvciIpOworCX0KKwlyZXR1cm4gMTsKIH0KIAogaW50IFBhZ2U6Ok5vdGlmeUtleWJvYXJkKGludCBrZXkpCiB7Ci0gICAgc3RkOjp2ZWN0b3I8SW5wdXRPYmplY3QqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyOworCXN0ZDo6dmVjdG9yPElucHV0T2JqZWN0Kj46OnJldmVyc2VfaXRlcmF0b3IgaXRlcjsKIAotICAgIC8vIERvbid0IHRyeSB0byBoYW5kbGUgYSBsYWNrIG9mIGhhbmRsZXJzCi0gICAgaWYgKG1JbnB1dHMuc2l6ZSgpID09IDApICAgcmV0dXJuIDE7CisJLy8gRG9uJ3QgdHJ5IHRvIGhhbmRsZSBhIGxhY2sgb2YgaGFuZGxlcnMKKwlpZiAobUlucHV0cy5zaXplKCkgPT0gMCkKKwkJcmV0dXJuIDE7CiAKLSAgICAvLyBXZSB3b3JrIGJhY2t3YXJkcywgZnJvbSB0b3AtbW9zdCBlbGVtZW50IHRvIGJvdHRvbS1tb3N0IGVsZW1lbnQKLSAgICBmb3IgKGl0ZXIgPSBtSW5wdXRzLnJiZWdpbigpOyBpdGVyICE9IG1JbnB1dHMucmVuZCgpOyBpdGVyKyspCi0gICAgewotICAgICAgICBpbnQgcmV0ID0gKCppdGVyKS0+Tm90aWZ5S2V5Ym9hcmQoa2V5KTsKLSAgICAgICAgaWYgKHJldCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGVsc2UgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBMT0dFUlIoIkEga2V5Ym9hcmQgaGFuZGxlciBoYXMgcmV0dXJuZWQgYW4gZXJyb3IiKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7CisJLy8gV2Ugd29yayBiYWNrd2FyZHMsIGZyb20gdG9wLW1vc3QgZWxlbWVudCB0byBib3R0b20tbW9zdCBlbGVtZW50CisJZm9yIChpdGVyID0gbUlucHV0cy5yYmVnaW4oKTsgaXRlciAhPSBtSW5wdXRzLnJlbmQoKTsgaXRlcisrKQorCXsKKwkJaW50IHJldCA9ICgqaXRlciktPk5vdGlmeUtleWJvYXJkKGtleSk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChyZXQgPCAwKQorCQkJTE9HRVJSKCJBIGtleWJvYXJkIGhhbmRsZXIgaGFzIHJldHVybmVkIGFuIGVycm9yIik7CisJfQorCXJldHVybiAxOwogfQogCiBpbnQgUGFnZTo6U2V0S2V5Qm9hcmRGb2N1cyhpbnQgaW5Gb2N1cykKIHsKLSAgICBzdGQ6OnZlY3RvcjxJbnB1dE9iamVjdCo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ZXI7CisJc3RkOjp2ZWN0b3I8SW5wdXRPYmplY3QqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyOwogCi0gICAgLy8gRG9uJ3QgdHJ5IHRvIGhhbmRsZSBhIGxhY2sgb2YgaGFuZGxlcnMKLSAgICBpZiAobUlucHV0cy5zaXplKCkgPT0gMCkgICByZXR1cm4gMTsKKwkvLyBEb24ndCB0cnkgdG8gaGFuZGxlIGEgbGFjayBvZiBoYW5kbGVycworCWlmIChtSW5wdXRzLnNpemUoKSA9PSAwKQorCQlyZXR1cm4gMTsKIAotICAgIC8vIFdlIHdvcmsgYmFja3dhcmRzLCBmcm9tIHRvcC1tb3N0IGVsZW1lbnQgdG8gYm90dG9tLW1vc3QgZWxlbWVudAotICAgIGZvciAoaXRlciA9IG1JbnB1dHMucmJlZ2luKCk7IGl0ZXIgIT0gbUlucHV0cy5yZW5kKCk7IGl0ZXIrKykKLSAgICB7Ci0gICAgICAgIGludCByZXQgPSAoKml0ZXIpLT5TZXRJbnB1dEZvY3VzKGluRm9jdXMpOwotICAgICAgICBpZiAocmV0ID09IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZWxzZSBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIExPR0VSUigiQW4gaW5wdXQgZm9jdXMgaGFuZGxlciBoYXMgcmV0dXJuZWQgYW4gZXJyb3IiKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7CisJLy8gV2Ugd29yayBiYWNrd2FyZHMsIGZyb20gdG9wLW1vc3QgZWxlbWVudCB0byBib3R0b20tbW9zdCBlbGVtZW50CisJZm9yIChpdGVyID0gbUlucHV0cy5yYmVnaW4oKTsgaXRlciAhPSBtSW5wdXRzLnJlbmQoKTsgaXRlcisrKQorCXsKKwkJaW50IHJldCA9ICgqaXRlciktPlNldElucHV0Rm9jdXMoaW5Gb2N1cyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChyZXQgPCAwKQorCQkJTE9HRVJSKCJBbiBpbnB1dCBmb2N1cyBoYW5kbGVyIGhhcyByZXR1cm5lZCBhbiBlcnJvciIpOworCX0KKwlyZXR1cm4gMTsKIH0KIAogdm9pZCBQYWdlOjpTZXRQYWdlRm9jdXMoaW50IGluRm9jdXMpCiB7Ci0gICAgLy8gUmVuZGVyIHJlbWFpbmluZyBvYmplY3RzCi0gICAgc3RkOjp2ZWN0b3I8UmVuZGVyT2JqZWN0Kj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gbVJlbmRlcnMuYmVnaW4oKTsgaXRlciAhPSBtUmVuZGVycy5lbmQoKTsgaXRlcisrKQotICAgIHsKLSAgICAgICAgKCppdGVyKS0+U2V0UGFnZUZvY3VzKGluRm9jdXMpOwotICAgIH0KLSAgICByZXR1cm47CisJLy8gUmVuZGVyIHJlbWFpbmluZyBvYmplY3RzCisJc3RkOjp2ZWN0b3I8UmVuZGVyT2JqZWN0Kj46Oml0ZXJhdG9yIGl0ZXI7CisJZm9yIChpdGVyID0gbVJlbmRlcnMuYmVnaW4oKTsgaXRlciAhPSBtUmVuZGVycy5lbmQoKTsgaXRlcisrKQorCQkoKml0ZXIpLT5TZXRQYWdlRm9jdXMoaW5Gb2N1cyk7CisKKwlyZXR1cm47CiB9CiAKIGludCBQYWdlOjpOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpCiB7Ci0gICAgc3RkOjp2ZWN0b3I8QWN0aW9uT2JqZWN0Kj46Oml0ZXJhdG9yIGl0ZXI7CisJc3RkOjp2ZWN0b3I8QWN0aW9uT2JqZWN0Kj46Oml0ZXJhdG9yIGl0ZXI7CiAKLSAgICAvLyBEb24ndCB0cnkgdG8gaGFuZGxlIGEgbGFjayBvZiBoYW5kbGVycwotICAgIGlmIChtQWN0aW9ucy5zaXplKCkgPT0gMCkgICByZXR1cm4gMTsKKwkvLyBEb24ndCB0cnkgdG8gaGFuZGxlIGEgbGFjayBvZiBoYW5kbGVycworCWlmIChtQWN0aW9ucy5zaXplKCkgPT0gMCkKKwkJcmV0dXJuIDE7CiAKLSAgICBmb3IgKGl0ZXIgPSBtQWN0aW9ucy5iZWdpbigpOyBpdGVyICE9IG1BY3Rpb25zLmVuZCgpOyArK2l0ZXIpCi0gICAgewotICAgICAgICBpZiAoKCppdGVyKS0+Tm90aWZ5VmFyQ2hhbmdlKHZhck5hbWUsIHZhbHVlKSkKLSAgICAgICAgICAgIExPR0VSUigiQW4gYWN0aW9uIGhhbmRsZXIgZXJyb3JlZCBvbiBOb3RpZnlWYXJDaGFuZ2UuXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJZm9yIChpdGVyID0gbUFjdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBtQWN0aW9ucy5lbmQoKTsgKytpdGVyKQorCXsKKwkJaWYgKCgqaXRlciktPk5vdGlmeVZhckNoYW5nZSh2YXJOYW1lLCB2YWx1ZSkpCisJCQlMT0dFUlIoIkFuIGFjdGlvbiBoYW5kbGVyIGVycm9yZWQgb24gTm90aWZ5VmFyQ2hhbmdlLlxuIik7CisJfQorCXJldHVybiAwOwogfQogCiBQYWdlU2V0OjpQYWdlU2V0KGNoYXIqIHhtbEZpbGUpCiB7Ci0gICAgbVJlc291cmNlcyA9IE5VTEw7Ci0gICAgbUN1cnJlbnRQYWdlID0gTlVMTDsKLSAgICBtT3ZlcmxheVBhZ2UgPSBOVUxMOworCW1SZXNvdXJjZXMgPSBOVUxMOworCW1DdXJyZW50UGFnZSA9IE5VTEw7CisJbU92ZXJsYXlQYWdlID0gTlVMTDsKIAotICAgIG1YbWxGaWxlID0geG1sRmlsZTsKLSAgICBpZiAoeG1sRmlsZSkKLSAgICAgICAgbURvYy5wYXJzZTwwPihtWG1sRmlsZSk7Ci0gICAgZWxzZQotICAgICAgICBtQ3VycmVudFBhZ2UgPSBuZXcgUGFnZShOVUxMKTsKKwltWG1sRmlsZSA9IHhtbEZpbGU7CisJaWYgKHhtbEZpbGUpCisJCW1Eb2MucGFyc2U8MD4obVhtbEZpbGUpOworCWVsc2UKKwkJbUN1cnJlbnRQYWdlID0gbmV3IFBhZ2UoTlVMTCk7CiB9CiAKIFBhZ2VTZXQ6On5QYWdlU2V0KCkKIHsKLSAgICBkZWxldGUgbVJlc291cmNlczsKLSAgICBmcmVlKG1YbWxGaWxlKTsKKwlkZWxldGUgbVJlc291cmNlczsKKwlmcmVlKG1YbWxGaWxlKTsKIH0KIAogaW50IFBhZ2VTZXQ6OkxvYWQoWmlwQXJjaGl2ZSogcGFja2FnZSkKIHsKLSAgICB4bWxfbm9kZTw+KiBwYXJlbnQ7Ci0gICAgeG1sX25vZGU8PiogY2hpbGQ7Ci0gICAgeG1sX25vZGU8PiogdGVtcGxhdGVzOworCXhtbF9ub2RlPD4qIHBhcmVudDsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfbm9kZTw+KiB0ZW1wbGF0ZXM7CiAgCi0gICAgcGFyZW50ID0gbURvYy5maXJzdF9ub2RlKCJyZWNvdmVyeSIpOwotICAgIGlmICghcGFyZW50KQotICAgICAgICBwYXJlbnQgPSBtRG9jLmZpcnN0X25vZGUoImluc3RhbGwiKTsKKwlwYXJlbnQgPSBtRG9jLmZpcnN0X25vZGUoInJlY292ZXJ5Iik7CisJaWYgKCFwYXJlbnQpCisJCXBhcmVudCA9IG1Eb2MuZmlyc3Rfbm9kZSgiaW5zdGFsbCIpOwogCi0gICAgLy8gTm93LCBsZXQncyBwYXJzZSB0aGUgWE1MCi0gICAgTE9HSU5GTygiTG9hZGluZyByZXNvdXJjZXMuLi5cbiIpOwotICAgIGNoaWxkID0gcGFyZW50LT5maXJzdF9ub2RlKCJyZXNvdXJjZXMiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgICAgIG1SZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKGNoaWxkLCBwYWNrYWdlKTsKKwkvLyBOb3csIGxldCdzIHBhcnNlIHRoZSBYTUwKKwlMT0dJTkZPKCJMb2FkaW5nIHJlc291cmNlcy4uLlxuIik7CisJY2hpbGQgPSBwYXJlbnQtPmZpcnN0X25vZGUoInJlc291cmNlcyIpOworCWlmIChjaGlsZCkKKwkJbVJlc291cmNlcyA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoY2hpbGQsIHBhY2thZ2UpOwogCi0gICAgTE9HSU5GTygiTG9hZGluZyB2YXJpYWJsZXMuLi5cbiIpOwotICAgIGNoaWxkID0gcGFyZW50LT5maXJzdF9ub2RlKCJ2YXJpYWJsZXMiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgICAgIExvYWRWYXJpYWJsZXMoY2hpbGQpOworCUxPR0lORk8oIkxvYWRpbmcgdmFyaWFibGVzLi4uXG4iKTsKKwljaGlsZCA9IHBhcmVudC0+Zmlyc3Rfbm9kZSgidmFyaWFibGVzIik7CisJaWYgKGNoaWxkKQorCQlMb2FkVmFyaWFibGVzKGNoaWxkKTsKIAotICAgIExPR0lORk8oIkxvYWRpbmcgcGFnZXMuLi5cbiIpOwotICAgIC8vIFRoaXMgbWF5IGJlIE5VTEwgaWYgbm8gdGVtcGxhdGVzIGFyZSBwcmVzZW50Ci0gICAgdGVtcGxhdGVzID0gcGFyZW50LT5maXJzdF9ub2RlKCJ0ZW1wbGF0ZXMiKTsKKwlMT0dJTkZPKCJMb2FkaW5nIHBhZ2VzLi4uXG4iKTsKKwkvLyBUaGlzIG1heSBiZSBOVUxMIGlmIG5vIHRlbXBsYXRlcyBhcmUgcHJlc2VudAorCXRlbXBsYXRlcyA9IHBhcmVudC0+Zmlyc3Rfbm9kZSgidGVtcGxhdGVzIik7CiAKLSAgICBjaGlsZCA9IHBhcmVudC0+Zmlyc3Rfbm9kZSgicGFnZXMiKTsKLSAgICBpZiAoIWNoaWxkKQotICAgICAgICByZXR1cm4gLTE7CisJY2hpbGQgPSBwYXJlbnQtPmZpcnN0X25vZGUoInBhZ2VzIik7CisJaWYgKCFjaGlsZCkKKwkJcmV0dXJuIC0xOwogCi0gICAgcmV0dXJuIExvYWRQYWdlcyhjaGlsZCwgdGVtcGxhdGVzKTsKKwlyZXR1cm4gTG9hZFBhZ2VzKGNoaWxkLCB0ZW1wbGF0ZXMpOwogfQogCiBpbnQgUGFnZVNldDo6U2V0UGFnZShzdGQ6OnN0cmluZyBwYWdlKQogewotICAgIFBhZ2UqIHRtcCA9IEZpbmRQYWdlKHBhZ2UpOwotICAgIGlmICh0bXApCi0gICAgewotICAgICAgICBpZiAobUN1cnJlbnRQYWdlKSAgIG1DdXJyZW50UGFnZS0+U2V0UGFnZUZvY3VzKDApOwotICAgICAgICBtQ3VycmVudFBhZ2UgPSB0bXA7Ci0gICAgICAgIG1DdXJyZW50UGFnZS0+U2V0UGFnZUZvY3VzKDEpOwotICAgICAgICBtQ3VycmVudFBhZ2UtPk5vdGlmeVZhckNoYW5nZSgiIiwgIiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTE9HRVJSKCJVbmFibGUgdG8gbG9jYXRlIHBhZ2UgKCVzKVxuIiwgcGFnZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOworCVBhZ2UqIHRtcCA9IEZpbmRQYWdlKHBhZ2UpOworCWlmICh0bXApCisJeworCQlpZiAobUN1cnJlbnRQYWdlKSAgIG1DdXJyZW50UGFnZS0+U2V0UGFnZUZvY3VzKDApOworCQltQ3VycmVudFBhZ2UgPSB0bXA7CisJCW1DdXJyZW50UGFnZS0+U2V0UGFnZUZvY3VzKDEpOworCQltQ3VycmVudFBhZ2UtPk5vdGlmeVZhckNoYW5nZSgiIiwgIiIpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCXsKKwkJTE9HRVJSKCJVbmFibGUgdG8gbG9jYXRlIHBhZ2UgKCVzKVxuIiwgcGFnZS5jX3N0cigpKTsKKwl9CisJcmV0dXJuIC0xOwogfQogCiBpbnQgUGFnZVNldDo6U2V0T3ZlcmxheShQYWdlKiBwYWdlKQogewotICAgIGlmIChtT3ZlcmxheVBhZ2UpICAgbU92ZXJsYXlQYWdlLT5TZXRQYWdlRm9jdXMoMCk7Ci0gICAgbU92ZXJsYXlQYWdlID0gcGFnZTsKLSAgICBpZiAobU92ZXJsYXlQYWdlKQotICAgIHsKLSAgICAgICAgbU92ZXJsYXlQYWdlLT5TZXRQYWdlRm9jdXMoMSk7Ci0gICAgICAgIG1PdmVybGF5UGFnZS0+Tm90aWZ5VmFyQ2hhbmdlKCIiLCAiIik7Ci0gICAgfQotICAgIHJldHVybiAwOworCWlmIChtT3ZlcmxheVBhZ2UpICAgbU92ZXJsYXlQYWdlLT5TZXRQYWdlRm9jdXMoMCk7CisJbU92ZXJsYXlQYWdlID0gcGFnZTsKKwlpZiAobU92ZXJsYXlQYWdlKQorCXsKKwkJbU92ZXJsYXlQYWdlLT5TZXRQYWdlRm9jdXMoMSk7CisJCW1PdmVybGF5UGFnZS0+Tm90aWZ5VmFyQ2hhbmdlKCIiLCAiIik7CisJfQorCXJldHVybiAwOwogfQogCiBSZXNvdXJjZSogUGFnZVNldDo6RmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIG5hbWUpCiB7Ci0gICAgcmV0dXJuIG1SZXNvdXJjZXMgPyBtUmVzb3VyY2VzLT5GaW5kUmVzb3VyY2UobmFtZSkgOiBOVUxMOworCXJldHVybiBtUmVzb3VyY2VzID8gbVJlc291cmNlcy0+RmluZFJlc291cmNlKG5hbWUpIDogTlVMTDsKIH0KIAogUGFnZSogUGFnZVNldDo6RmluZFBhZ2Uoc3RkOjpzdHJpbmcgbmFtZSkKIHsKLSAgICBzdGQ6OnZlY3RvcjxQYWdlKj46Oml0ZXJhdG9yIGl0ZXI7CisJc3RkOjp2ZWN0b3I8UGFnZSo+OjppdGVyYXRvciBpdGVyOwogCi0gICAgZm9yIChpdGVyID0gbVBhZ2VzLmJlZ2luKCk7IGl0ZXIgIT0gbVBhZ2VzLmVuZCgpOyBpdGVyKyspCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSAoKml0ZXIpLT5HZXROYW1lKCkpCi0gICAgICAgICAgICByZXR1cm4gKCppdGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisJZm9yIChpdGVyID0gbVBhZ2VzLmJlZ2luKCk7IGl0ZXIgIT0gbVBhZ2VzLmVuZCgpOyBpdGVyKyspCisJeworCQlpZiAobmFtZSA9PSAoKml0ZXIpLT5HZXROYW1lKCkpCisJCQlyZXR1cm4gKCppdGVyKTsKKwl9CisJcmV0dXJuIE5VTEw7CiB9CiAKIGludCBQYWdlU2V0OjpMb2FkVmFyaWFibGVzKHhtbF9ub2RlPD4qIHZhcnMpCiB7Ci0gICAgeG1sX25vZGU8PiogY2hpbGQ7CisJeG1sX25vZGU8PiogY2hpbGQ7CiAKLSAgICBjaGlsZCA9IHZhcnMtPmZpcnN0X25vZGUoInZhcmlhYmxlIik7Ci0gICAgd2hpbGUgKGNoaWxkKQotICAgIHsKLSAgICAgICAgaWYgKCFjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIikpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCFjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ2YWx1ZSIpKQotICAgICAgICAgICAgYnJlYWs7CisJY2hpbGQgPSB2YXJzLT5maXJzdF9ub2RlKCJ2YXJpYWJsZSIpOworCXdoaWxlIChjaGlsZCkKKwl7CisJCWlmICghY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpKQorCQkJYnJlYWs7CisJCWlmICghY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgidmFsdWUiKSkKKwkJCWJyZWFrOwogCi0gICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJuYW1lIiktPnZhbHVlKCksIGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInZhbHVlIiktPnZhbHVlKCkpOwotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0X3NpYmxpbmcoInZhcmlhYmxlIik7Ci0gICAgfQotICAgIHJldHVybiAwOworCQlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpLT52YWx1ZSgpLCBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ2YWx1ZSIpLT52YWx1ZSgpKTsKKwkJY2hpbGQgPSBjaGlsZC0+bmV4dF9zaWJsaW5nKCJ2YXJpYWJsZSIpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogaW50IFBhZ2VTZXQ6OkxvYWRQYWdlcyh4bWxfbm9kZTw+KiBwYWdlcywgeG1sX25vZGU8PiogdGVtcGxhdGVzIC8qID0gTlVMTCAqLykKIHsKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKIAotICAgIGlmICghcGFnZXMpICAgIHJldHVybiAtMTsKKwlpZiAoIXBhZ2VzKQorCQlyZXR1cm4gLTE7CiAKLSAgICBjaGlsZCA9IHBhZ2VzLT5maXJzdF9ub2RlKCJwYWdlIik7Ci0gICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpCi0gICAgewotICAgICAgICBQYWdlKiBwYWdlID0gbmV3IFBhZ2UoY2hpbGQsIHRlbXBsYXRlcyk7Ci0gICAgICAgIGlmIChwYWdlLT5HZXROYW1lKCkuZW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTE9HRVJSKCJVbmFibGUgdG8gcHJvY2VzcyBsb2FkIHBhZ2VcbiIpOwotICAgICAgICAgICAgZGVsZXRlIHBhZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtUGFnZXMucHVzaF9iYWNrKHBhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygicGFnZSIpOwotICAgIH0KLSAgICBpZiAobVBhZ2VzLnNpemUoKSA+IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAtMTsKKwljaGlsZCA9IHBhZ2VzLT5maXJzdF9ub2RlKCJwYWdlIik7CisJd2hpbGUgKGNoaWxkICE9IE5VTEwpCisJeworCQlQYWdlKiBwYWdlID0gbmV3IFBhZ2UoY2hpbGQsIHRlbXBsYXRlcyk7CisJCWlmIChwYWdlLT5HZXROYW1lKCkuZW1wdHkoKSkKKwkJeworCQkJTE9HRVJSKCJVbmFibGUgdG8gcHJvY2VzcyBsb2FkIHBhZ2VcbiIpOworCQkJZGVsZXRlIHBhZ2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQltUGFnZXMucHVzaF9iYWNrKHBhZ2UpOworCQl9CisJCWNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygicGFnZSIpOworCX0KKwlpZiAobVBhZ2VzLnNpemUoKSA+IDApCisJCXJldHVybiAwOworCXJldHVybiAtMTsKIH0KIAogaW50IFBhZ2VTZXQ6OklzQ3VycmVudFBhZ2UoUGFnZSogcGFnZSkKIHsKLSAgICByZXR1cm4gKChtQ3VycmVudFBhZ2UgJiYgbUN1cnJlbnRQYWdlID09IHBhZ2UpID8gMSA6IDApOworCXJldHVybiAoKG1DdXJyZW50UGFnZSAmJiBtQ3VycmVudFBhZ2UgPT0gcGFnZSkgPyAxIDogMCk7CiB9CiAKIGludCBQYWdlU2V0OjpSZW5kZXIodm9pZCkKIHsKLSAgICBpbnQgcmV0OworCWludCByZXQ7CiAKLSAgICByZXQgPSAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5SZW5kZXIoKSA6IC0xKTsKLSAgICBpZiAocmV0IDwgMCkgICAgcmV0dXJuIHJldDsKLSAgICByZXQgPSAobU92ZXJsYXlQYWdlID8gbU92ZXJsYXlQYWdlLT5SZW5kZXIoKSA6IC0xKTsKLSAgICByZXR1cm4gcmV0OworCXJldCA9IChtQ3VycmVudFBhZ2UgPyBtQ3VycmVudFBhZ2UtPlJlbmRlcigpIDogLTEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IChtT3ZlcmxheVBhZ2UgPyBtT3ZlcmxheVBhZ2UtPlJlbmRlcigpIDogLTEpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBQYWdlU2V0OjpVcGRhdGUodm9pZCkKIHsKLSAgICBpbnQgcmV0OworCWludCByZXQ7CiAKLSAgICByZXQgPSAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5VcGRhdGUoKSA6IC0xKTsKLSAgICBpZiAocmV0IDwgMCB8fCByZXQgPiAxKSAgICAgcmV0dXJuIHJldDsKLSAgICByZXQgPSAobU92ZXJsYXlQYWdlID8gbU92ZXJsYXlQYWdlLT5VcGRhdGUoKSA6IC0xKTsKLSAgICByZXR1cm4gcmV0OworCXJldCA9IChtQ3VycmVudFBhZ2UgPyBtQ3VycmVudFBhZ2UtPlVwZGF0ZSgpIDogLTEpOworCWlmIChyZXQgPCAwIHx8IHJldCA+IDEpCisJCXJldHVybiByZXQ7CisJcmV0ID0gKG1PdmVybGF5UGFnZSA/IG1PdmVybGF5UGFnZS0+VXBkYXRlKCkgOiAtMSk7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IFBhZ2VTZXQ6Ok5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpCiB7Ci0gICAgaWYgKG1PdmVybGF5UGFnZSkgICByZXR1cm4gKG1PdmVybGF5UGFnZS0+Tm90aWZ5VG91Y2goc3RhdGUsIHgsIHkpKTsKLSAgICByZXR1cm4gKG1DdXJyZW50UGFnZSA/IG1DdXJyZW50UGFnZS0+Tm90aWZ5VG91Y2goc3RhdGUsIHgsIHkpIDogLTEpOworCWlmIChtT3ZlcmxheVBhZ2UpCisJCXJldHVybiAobU92ZXJsYXlQYWdlLT5Ob3RpZnlUb3VjaChzdGF0ZSwgeCwgeSkpOworCisJcmV0dXJuIChtQ3VycmVudFBhZ2UgPyBtQ3VycmVudFBhZ2UtPk5vdGlmeVRvdWNoKHN0YXRlLCB4LCB5KSA6IC0xKTsKIH0KIAogaW50IFBhZ2VTZXQ6Ok5vdGlmeUtleShpbnQga2V5KQogewotICAgIGlmIChtT3ZlcmxheVBhZ2UpICAgcmV0dXJuIChtT3ZlcmxheVBhZ2UtPk5vdGlmeUtleShrZXkpKTsKLSAgICByZXR1cm4gKG1DdXJyZW50UGFnZSA/IG1DdXJyZW50UGFnZS0+Tm90aWZ5S2V5KGtleSkgOiAtMSk7CisJaWYgKG1PdmVybGF5UGFnZSkKKwkJcmV0dXJuIChtT3ZlcmxheVBhZ2UtPk5vdGlmeUtleShrZXkpKTsKKworCXJldHVybiAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5Ob3RpZnlLZXkoa2V5KSA6IC0xKTsKIH0KIAogaW50IFBhZ2VTZXQ6Ok5vdGlmeUtleWJvYXJkKGludCBrZXkpCiB7Ci0gICAgaWYgKG1PdmVybGF5UGFnZSkgICByZXR1cm4gKG1PdmVybGF5UGFnZS0+Tm90aWZ5S2V5Ym9hcmQoa2V5KSk7Ci0gICAgcmV0dXJuIChtQ3VycmVudFBhZ2UgPyBtQ3VycmVudFBhZ2UtPk5vdGlmeUtleWJvYXJkKGtleSkgOiAtMSk7CisJaWYgKG1PdmVybGF5UGFnZSkKKwkJcmV0dXJuIChtT3ZlcmxheVBhZ2UtPk5vdGlmeUtleWJvYXJkKGtleSkpOworCisJcmV0dXJuIChtQ3VycmVudFBhZ2UgPyBtQ3VycmVudFBhZ2UtPk5vdGlmeUtleWJvYXJkKGtleSkgOiAtMSk7CiB9CiAKIGludCBQYWdlU2V0OjpTZXRLZXlCb2FyZEZvY3VzKGludCBpbkZvY3VzKQogewotICAgIGlmIChtT3ZlcmxheVBhZ2UpICAgcmV0dXJuIChtT3ZlcmxheVBhZ2UtPlNldEtleUJvYXJkRm9jdXMoaW5Gb2N1cykpOwotICAgIHJldHVybiAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5TZXRLZXlCb2FyZEZvY3VzKGluRm9jdXMpIDogLTEpOworCWlmIChtT3ZlcmxheVBhZ2UpCisJCXJldHVybiAobU92ZXJsYXlQYWdlLT5TZXRLZXlCb2FyZEZvY3VzKGluRm9jdXMpKTsKKworCXJldHVybiAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5TZXRLZXlCb2FyZEZvY3VzKGluRm9jdXMpIDogLTEpOwogfQogCiBpbnQgUGFnZVNldDo6Tm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKQogewotICAgIGlmIChtT3ZlcmxheVBhZ2UpICAgbU92ZXJsYXlQYWdlLT5Ob3RpZnlWYXJDaGFuZ2UodmFyTmFtZSwgdmFsdWUpOwotICAgIHJldHVybiAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5Ob3RpZnlWYXJDaGFuZ2UodmFyTmFtZSwgdmFsdWUpIDogLTEpOworCWlmIChtT3ZlcmxheVBhZ2UpCisJCW1PdmVybGF5UGFnZS0+Tm90aWZ5VmFyQ2hhbmdlKHZhck5hbWUsIHZhbHVlKTsKKworCXJldHVybiAobUN1cnJlbnRQYWdlID8gbUN1cnJlbnRQYWdlLT5Ob3RpZnlWYXJDaGFuZ2UodmFyTmFtZSwgdmFsdWUpIDogLTEpOwogfQogCiBpbnQgUGFnZU1hbmFnZXI6OkxvYWRQYWNrYWdlKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHBhY2thZ2UsIHN0ZDo6c3RyaW5nIHN0YXJ0cGFnZSkKIHsKLSAgICBpbnQgZmQ7Ci0gICAgWmlwQXJjaGl2ZSB6aXAsICpwWmlwID0gTlVMTDsKLSAgICBsb25nIGxlbjsKLSAgICBjaGFyKiB4bWxGaWxlID0gTlVMTDsKLSAgICBQYWdlU2V0KiBwYWdlU2V0ID0gTlVMTDsKLSAgICBpbnQgcmV0OworCWludCBmZDsKKwlaaXBBcmNoaXZlIHppcCwgKnBaaXAgPSBOVUxMOworCWxvbmcgbGVuOworCWNoYXIqIHhtbEZpbGUgPSBOVUxMOworCVBhZ2VTZXQqIHBhZ2VTZXQgPSBOVUxMOworCWludCByZXQ7CiAKLSAgICAvLyBPcGVuIHRoZSBYTUwgZmlsZQotICAgIExPR0lORk8oIkxvYWRpbmcgcGFja2FnZTogJXMgKCVzKVxuIiwgbmFtZS5jX3N0cigpLCBwYWNrYWdlLmNfc3RyKCkpOwotICAgIGlmIChtek9wZW5aaXBBcmNoaXZlKHBhY2thZ2UuY19zdHIoKSwgJnppcCkpCi0gICAgewotICAgICAgICAvLyBXZSBjYW4gdHJ5IHRvIGxvYWQgdGhlIFhNTCBkaXJlY3RseS4uLgotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgICAgaWYoc3RhdChwYWNrYWdlLmNfc3RyKCksJnN0KSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOworCS8vIE9wZW4gdGhlIFhNTCBmaWxlCisJTE9HSU5GTygiTG9hZGluZyBwYWNrYWdlOiAlcyAoJXMpXG4iLCBuYW1lLmNfc3RyKCksIHBhY2thZ2UuY19zdHIoKSk7CisJaWYgKG16T3BlblppcEFyY2hpdmUocGFja2FnZS5jX3N0cigpLCAmemlwKSkKKwl7CisJCS8vIFdlIGNhbiB0cnkgdG8gbG9hZCB0aGUgWE1MIGRpcmVjdGx5Li4uCisJCXN0cnVjdCBzdGF0IHN0OworCQlpZihzdGF0KHBhY2thZ2UuY19zdHIoKSwmc3QpICE9IDApCisJCQlyZXR1cm4gLTE7CiAKLSAgICAgICAgbGVuID0gc3Quc3Rfc2l6ZTsKLSAgICAgICAgeG1sRmlsZSA9IChjaGFyKikgbWFsbG9jKGxlbiArIDEpOwotICAgICAgICBpZiAoIXhtbEZpbGUpICAgICAgIHJldHVybiAtMTsKKwkJbGVuID0gc3Quc3Rfc2l6ZTsKKwkJeG1sRmlsZSA9IChjaGFyKikgbWFsbG9jKGxlbiArIDEpOworCQlpZiAoIXhtbEZpbGUpCisJCQlyZXR1cm4gLTE7CiAKLSAgICAgICAgZmQgPSBvcGVuKHBhY2thZ2UuY19zdHIoKSwgT19SRE9OTFkpOwotICAgICAgICBpZiAoZmQgPT0gLTEpICAgICAgIGdvdG8gZXJyb3I7CisJCWZkID0gb3BlbihwYWNrYWdlLmNfc3RyKCksIE9fUkRPTkxZKTsKKwkJaWYgKGZkID09IC0xKQorCQkJZ290byBlcnJvcjsKIAotICAgICAgICByZWFkKGZkLCB4bWxGaWxlLCBsZW4pOwotICAgICAgICBjbG9zZShmZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBaaXAgPSAmemlwOwotICAgICAgICBjb25zdCBaaXBFbnRyeSogdWlfeG1sID0gbXpGaW5kWmlwRW50cnkoJnppcCwgInVpLnhtbCIpOwotICAgICAgICBpZiAodWlfeG1sID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPR0VSUigiVW5hYmxlIHRvIGxvY2F0ZSB1aS54bWwgaW4gemlwIGZpbGVcbiIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyIGZvciB0aGUgZmlsZQotICAgICAgICBsZW4gPSBtekdldFppcEVudHJ5VW5jb21wTGVuKHVpX3htbCk7Ci0gICAgICAgIHhtbEZpbGUgPSAoY2hhciopIG1hbGxvYyhsZW4gKyAxKTsKLSAgICAgICAgaWYgKCF4bWxGaWxlKSAgICAgICAgZ290byBlcnJvcjsKLSAgICAKLSAgICAgICAgaWYgKCFtekV4dHJhY3RaaXBFbnRyeVRvQnVmZmVyKCZ6aXAsIHVpX3htbCwgKHVuc2lnbmVkIGNoYXIqKSB4bWxGaWxlKSkKLSAgICAgICAgewotICAgICAgICAgICAgTE9HRVJSKCJVbmFibGUgdG8gZXh0cmFjdCB1aS54bWxcbiIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5VTEwtdGVybWluYXRlIHRoZSBzdHJpbmcKLSAgICB4bWxGaWxlW2xlbl0gPSAweDAwOwotCi0gICAgLy8gQmVmb3JlIGxvYWRpbmcsIG1DdXJyZW50U2V0IG11c3QgYmUgdGhlIGxvYWRpbmcgcGFja2FnZSBzbyB3ZSBjYW4gZmluZCByZXNvdXJjZXMKLSAgICBwYWdlU2V0ID0gbUN1cnJlbnRTZXQ7Ci0gICAgbUN1cnJlbnRTZXQgPSBuZXcgUGFnZVNldCh4bWxGaWxlKTsKLQotICAgIHJldCA9IG1DdXJyZW50U2V0LT5Mb2FkKHBaaXApOwotICAgIGlmIChyZXQgPT0gMCkKLSAgICB7Ci0gICAgICAgIG1DdXJyZW50U2V0LT5TZXRQYWdlKHN0YXJ0cGFnZSk7Ci0gICAgICAgIG1QYWdlU2V0cy5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBQYWdlU2V0Kj4obmFtZSwgbUN1cnJlbnRTZXQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTE9HRVJSKCJQYWNrYWdlICVzIGZhaWxlZCB0byBsb2FkLlxuIiwgbmFtZS5jX3N0cigpKTsKLSAgICB9CisJCXJlYWQoZmQsIHhtbEZpbGUsIGxlbik7CisJCWNsb3NlKGZkKTsKKwl9CisJZWxzZQorCXsKKwkJcFppcCA9ICZ6aXA7CisJCWNvbnN0IFppcEVudHJ5KiB1aV94bWwgPSBtekZpbmRaaXBFbnRyeSgmemlwLCAidWkueG1sIik7CisJCWlmICh1aV94bWwgPT0gTlVMTCkKKwkJeworCQkJTE9HRVJSKCJVbmFibGUgdG8gbG9jYXRlIHVpLnhtbCBpbiB6aXAgZmlsZVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CiAJCi0gICAgLy8gVGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcGFja2FnZSB3ZSBsb2FkZWQgaXMgdGhlIGJhc2UKLSAgICBpZiAobUJhc2VTZXQgPT0gTlVMTCkKLSAgICAgICAgbUJhc2VTZXQgPSBtQ3VycmVudFNldDsKKwkJLy8gQWxsb2NhdGUgdGhlIGJ1ZmZlciBmb3IgdGhlIGZpbGUKKwkJbGVuID0gbXpHZXRaaXBFbnRyeVVuY29tcExlbih1aV94bWwpOworCQl4bWxGaWxlID0gKGNoYXIqKSBtYWxsb2MobGVuICsgMSk7CisJCWlmICgheG1sRmlsZSkKKwkJCWdvdG8gZXJyb3I7CisJCisJCWlmICghbXpFeHRyYWN0WmlwRW50cnlUb0J1ZmZlcigmemlwLCB1aV94bWwsICh1bnNpZ25lZCBjaGFyKikgeG1sRmlsZSkpCisJCXsKKwkJCUxPR0VSUigiVW5hYmxlIHRvIGV4dHJhY3QgdWkueG1sXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CiAKLSAgICBtQ3VycmVudFNldCA9IHBhZ2VTZXQ7CisJLy8gTlVMTC10ZXJtaW5hdGUgdGhlIHN0cmluZworCXhtbEZpbGVbbGVuXSA9IDB4MDA7CiAKLSAgICBpZiAocFppcCkgICBtekNsb3NlWmlwQXJjaGl2ZShwWmlwKTsKLSAgICByZXR1cm4gcmV0OworCS8vIEJlZm9yZSBsb2FkaW5nLCBtQ3VycmVudFNldCBtdXN0IGJlIHRoZSBsb2FkaW5nIHBhY2thZ2Ugc28gd2UgY2FuIGZpbmQgcmVzb3VyY2VzCisJcGFnZVNldCA9IG1DdXJyZW50U2V0OworCW1DdXJyZW50U2V0ID0gbmV3IFBhZ2VTZXQoeG1sRmlsZSk7CisKKwlyZXQgPSBtQ3VycmVudFNldC0+TG9hZChwWmlwKTsKKwlpZiAocmV0ID09IDApCisJeworCQltQ3VycmVudFNldC0+U2V0UGFnZShzdGFydHBhZ2UpOworCQltUGFnZVNldHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUGFnZVNldCo+KG5hbWUsIG1DdXJyZW50U2V0KSk7CisJfQorCWVsc2UKKwl7CisJCUxPR0VSUigiUGFja2FnZSAlcyBmYWlsZWQgdG8gbG9hZC5cbiIsIG5hbWUuY19zdHIoKSk7CisJfQorCQorCS8vIFRoZSBmaXJzdCBzdWNjZXNzZnVsIHBhY2thZ2Ugd2UgbG9hZGVkIGlzIHRoZSBiYXNlCisJaWYgKG1CYXNlU2V0ID09IE5VTEwpCisJCW1CYXNlU2V0ID0gbUN1cnJlbnRTZXQ7CisKKwltQ3VycmVudFNldCA9IHBhZ2VTZXQ7CisKKwlpZiAocFppcCkKKwkJbXpDbG9zZVppcEFyY2hpdmUocFppcCk7CisJcmV0dXJuIHJldDsKIAogZXJyb3I6Ci0gICAgTE9HRVJSKCJBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG4iKTsKLSAgICBpZiAocFppcCkgICAgICAgbXpDbG9zZVppcEFyY2hpdmUocFppcCk7Ci0gICAgaWYgKHhtbEZpbGUpICAgIGZyZWUoeG1sRmlsZSk7Ci0gICAgcmV0dXJuIC0xOworCUxPR0VSUigiQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuIik7CisJaWYgKHBaaXApCisJCW16Q2xvc2VaaXBBcmNoaXZlKHBaaXApOworCWlmICh4bWxGaWxlKQorCQlmcmVlKHhtbEZpbGUpOworCXJldHVybiAtMTsKIH0KIAogUGFnZVNldCogUGFnZU1hbmFnZXI6OkZpbmRQYWNrYWdlKHN0ZDo6c3RyaW5nIG5hbWUpCiB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFBhZ2VTZXQqPjo6aXRlcmF0b3IgaXRlcjsKKwlzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGFnZVNldCo+OjppdGVyYXRvciBpdGVyOwogCi0gICAgaXRlciA9IG1QYWdlU2V0cy5maW5kKG5hbWUpOwotICAgIGlmIChpdGVyICE9IG1QYWdlU2V0cy5lbmQoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKml0ZXIpLnNlY29uZDsKLSAgICB9Ci0gICAgTE9HRVJSKCJVbmFibGUgdG8gbG9jYXRlIHBhY2thZ2UgJXNcbiIsIG5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5VTEw7CisJaXRlciA9IG1QYWdlU2V0cy5maW5kKG5hbWUpOworCWlmIChpdGVyICE9IG1QYWdlU2V0cy5lbmQoKSkKKwkJcmV0dXJuICgqaXRlcikuc2Vjb25kOworCisJTE9HRVJSKCJVbmFibGUgdG8gbG9jYXRlIHBhY2thZ2UgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIFBhZ2VTZXQqIFBhZ2VNYW5hZ2VyOjpTZWxlY3RQYWNrYWdlKHN0ZDo6c3RyaW5nIG5hbWUpCiB7Ci0gICAgTE9HSU5GTygiU3dpdGNoaW5nIHBhY2thZ2VzICglcylcbiIsIG5hbWUuY19zdHIoKSk7Ci0gICAgUGFnZVNldCogdG1wOworCUxPR0lORk8oIlN3aXRjaGluZyBwYWNrYWdlcyAoJXMpXG4iLCBuYW1lLmNfc3RyKCkpOworCVBhZ2VTZXQqIHRtcDsKIAotICAgIHRtcCA9IEZpbmRQYWNrYWdlKG5hbWUpOwotICAgIGlmICh0bXApCi0gICAgICAgIG1DdXJyZW50U2V0ID0gdG1wOwotICAgIGVsc2UKLSAgICAgICAgTE9HRVJSKCJVbmFibGUgdG8gZmluZCBwYWNrYWdlLlxuIik7CisJdG1wID0gRmluZFBhY2thZ2UobmFtZSk7CisJaWYgKHRtcCkKKwkJbUN1cnJlbnRTZXQgPSB0bXA7CisJZWxzZQorCQlMT0dFUlIoIlVuYWJsZSB0byBmaW5kIHBhY2thZ2UuXG4iKTsKIAotICAgIHJldHVybiBtQ3VycmVudFNldDsKKwlyZXR1cm4gbUN1cnJlbnRTZXQ7CiB9CiAKIGludCBQYWdlTWFuYWdlcjo6UmVsb2FkUGFja2FnZShzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBwYWNrYWdlKQogewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQYWdlU2V0Kj46Oml0ZXJhdG9yIGl0ZXI7CisJc3RkOjptYXA8c3RkOjpzdHJpbmcsIFBhZ2VTZXQqPjo6aXRlcmF0b3IgaXRlcjsKIAotICAgIGl0ZXIgPSBtUGFnZVNldHMuZmluZChuYW1lKTsKLSAgICBpZiAoaXRlciA9PSBtUGFnZVNldHMuZW5kKCkpCi0gICAgICAgIHJldHVybiAtMTsKKwlpdGVyID0gbVBhZ2VTZXRzLmZpbmQobmFtZSk7CisJaWYgKGl0ZXIgPT0gbVBhZ2VTZXRzLmVuZCgpKQorCQlyZXR1cm4gLTE7CiAKLSAgICBQYWdlU2V0KiBzZXQgPSAoKml0ZXIpLnNlY29uZDsKLSAgICBtUGFnZVNldHMuZXJhc2UoaXRlcik7CisJUGFnZVNldCogc2V0ID0gKCppdGVyKS5zZWNvbmQ7CisJbVBhZ2VTZXRzLmVyYXNlKGl0ZXIpOwogCi0gICAgaWYgKExvYWRQYWNrYWdlKG5hbWUsIHBhY2thZ2UsICJtYWluIikgIT0gMCkKLSAgICB7Ci0gICAgICAgIExPR0VSUigiRmFpbGVkIHRvIGxvYWQgcGFja2FnZS5cbiIpOwotICAgICAgICBtUGFnZVNldHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUGFnZVNldCo+KG5hbWUsIHNldCkpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChtQ3VycmVudFNldCA9PSBzZXQpICAgICBTZWxlY3RQYWNrYWdlKG5hbWUpOwotICAgIGRlbGV0ZSBzZXQ7Ci0gICAgcmV0dXJuIDA7CisJaWYgKExvYWRQYWNrYWdlKG5hbWUsIHBhY2thZ2UsICJtYWluIikgIT0gMCkKKwl7CisJCUxPR0VSUigiRmFpbGVkIHRvIGxvYWQgcGFja2FnZS5cbiIpOworCQltUGFnZVNldHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUGFnZVNldCo+KG5hbWUsIHNldCkpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtQ3VycmVudFNldCA9PSBzZXQpCisJCVNlbGVjdFBhY2thZ2UobmFtZSk7CisJZGVsZXRlIHNldDsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBQYWdlTWFuYWdlcjo6UmVsZWFzZVBhY2thZ2Uoc3RkOjpzdHJpbmcgbmFtZSkKIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGFnZVNldCo+OjppdGVyYXRvciBpdGVyOworCXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQYWdlU2V0Kj46Oml0ZXJhdG9yIGl0ZXI7CiAKLSAgICBpdGVyID0gbVBhZ2VTZXRzLmZpbmQobmFtZSk7Ci0gICAgaWYgKGl0ZXIgPT0gbVBhZ2VTZXRzLmVuZCgpKQotICAgICAgICByZXR1cm47CisJaXRlciA9IG1QYWdlU2V0cy5maW5kKG5hbWUpOworCWlmIChpdGVyID09IG1QYWdlU2V0cy5lbmQoKSkKKwkJcmV0dXJuOwogCi0gICAgUGFnZVNldCogc2V0ID0gKCppdGVyKS5zZWNvbmQ7Ci0gICAgbVBhZ2VTZXRzLmVyYXNlKGl0ZXIpOwotICAgIGRlbGV0ZSBzZXQ7Ci0gICAgcmV0dXJuOworCVBhZ2VTZXQqIHNldCA9ICgqaXRlcikuc2Vjb25kOworCW1QYWdlU2V0cy5lcmFzZShpdGVyKTsKKwlkZWxldGUgc2V0OworCXJldHVybjsKIH0KIAogaW50IFBhZ2VNYW5hZ2VyOjpDaGFuZ2VQYWdlKHN0ZDo6c3RyaW5nIG5hbWUpCiB7Ci0gICAgRGF0YU1hbmFnZXI6OlNldFZhbHVlKCJ0d19vcGVyYXRpb25fc3RhdGUiLCAwKTsKLSAgICBpbnQgcmV0ID0gKG1DdXJyZW50U2V0ID8gbUN1cnJlbnRTZXQtPlNldFBhZ2UobmFtZSkgOiAtMSk7Ci0gICAgcmV0dXJuIHJldDsKKwlEYXRhTWFuYWdlcjo6U2V0VmFsdWUoInR3X29wZXJhdGlvbl9zdGF0ZSIsIDApOworCWludCByZXQgPSAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+U2V0UGFnZShuYW1lKSA6IC0xKTsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgUGFnZU1hbmFnZXI6OkNoYW5nZU92ZXJsYXkoc3RkOjpzdHJpbmcgbmFtZSkKIHsKLSAgICBpZiAobmFtZS5lbXB0eSgpKQotICAgICAgICByZXR1cm4gbUN1cnJlbnRTZXQtPlNldE92ZXJsYXkoTlVMTCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgUGFnZSogcGFnZSA9IG1CYXNlU2V0ID8gbUJhc2VTZXQtPkZpbmRQYWdlKG5hbWUpIDogTlVMTDsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50U2V0LT5TZXRPdmVybGF5KHBhZ2UpOwotICAgIH0KKwlpZiAobmFtZS5lbXB0eSgpKQorCQlyZXR1cm4gbUN1cnJlbnRTZXQtPlNldE92ZXJsYXkoTlVMTCk7CisJZWxzZQorCXsKKwkJUGFnZSogcGFnZSA9IG1CYXNlU2V0ID8gbUJhc2VTZXQtPkZpbmRQYWdlKG5hbWUpIDogTlVMTDsKKwkJcmV0dXJuIG1DdXJyZW50U2V0LT5TZXRPdmVybGF5KHBhZ2UpOworCX0KIH0KIAogUmVzb3VyY2UqIFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2Uoc3RkOjpzdHJpbmcgbmFtZSkKIHsKLSAgICByZXR1cm4gKG1DdXJyZW50U2V0ID8gbUN1cnJlbnRTZXQtPkZpbmRSZXNvdXJjZShuYW1lKSA6IE5VTEwpOworCXJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+RmluZFJlc291cmNlKG5hbWUpIDogTlVMTCk7CiB9CiAKIFJlc291cmNlKiBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIHBhY2thZ2UsIHN0ZDo6c3RyaW5nIG5hbWUpCiB7Ci0gICAgUGFnZVNldCogdG1wOworCVBhZ2VTZXQqIHRtcDsKIAotICAgIHRtcCA9IEZpbmRQYWNrYWdlKG5hbWUpOwotICAgIHJldHVybiAodG1wID8gdG1wLT5GaW5kUmVzb3VyY2UobmFtZSkgOiBOVUxMKTsKKwl0bXAgPSBGaW5kUGFja2FnZShuYW1lKTsKKwlyZXR1cm4gKHRtcCA/IHRtcC0+RmluZFJlc291cmNlKG5hbWUpIDogTlVMTCk7CiB9CiAKIGludCBQYWdlTWFuYWdlcjo6U3dpdGNoVG9Db25zb2xlKHZvaWQpCiB7Ci0gICAgUGFnZVNldCogY29uc29sZSA9IG5ldyBQYWdlU2V0KE5VTEwpOworCVBhZ2VTZXQqIGNvbnNvbGUgPSBuZXcgUGFnZVNldChOVUxMKTsKIAotICAgIG1DdXJyZW50U2V0ID0gY29uc29sZTsKLSAgICByZXR1cm4gMDsKKwltQ3VycmVudFNldCA9IGNvbnNvbGU7CisJcmV0dXJuIDA7CiB9CiAKIGludCBQYWdlTWFuYWdlcjo6SXNDdXJyZW50UGFnZShQYWdlKiBwYWdlKQogewotICAgIHJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+SXNDdXJyZW50UGFnZShwYWdlKSA6IDApOworCXJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+SXNDdXJyZW50UGFnZShwYWdlKSA6IDApOwogfQogCiBpbnQgUGFnZU1hbmFnZXI6OlJlbmRlcih2b2lkKQogewotICAgIHJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+UmVuZGVyKCkgOiAtMSk7CisJcmV0dXJuIChtQ3VycmVudFNldCA/IG1DdXJyZW50U2V0LT5SZW5kZXIoKSA6IC0xKTsKIH0KIAogaW50IFBhZ2VNYW5hZ2VyOjpVcGRhdGUodm9pZCkKIHsKLSAgICBpZihibGFua1RpbWVyLklzU2NyZWVuT2ZmKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIChtQ3VycmVudFNldCA/IG1DdXJyZW50U2V0LT5VcGRhdGUoKSA6IC0xKTsKKyNpZm5kZWYgVFdfTk9fU0NSRUVOX1RJTUVPVVQKKwlpZihibGFua1RpbWVyLklzU2NyZWVuT2ZmKCkpCisJCXJldHVybiAwOworI2VuZGlmCisJcmV0dXJuIChtQ3VycmVudFNldCA/IG1DdXJyZW50U2V0LT5VcGRhdGUoKSA6IC0xKTsKIH0KIAogaW50IFBhZ2VNYW5hZ2VyOjpOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KQogewotICAgIHJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+Tm90aWZ5VG91Y2goc3RhdGUsIHgsIHkpIDogLTEpOworCXJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+Tm90aWZ5VG91Y2goc3RhdGUsIHgsIHkpIDogLTEpOwogfQogCiBpbnQgUGFnZU1hbmFnZXI6Ok5vdGlmeUtleShpbnQga2V5KQogewotICAgIHJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+Tm90aWZ5S2V5KGtleSkgOiAtMSk7CisJcmV0dXJuIChtQ3VycmVudFNldCA/IG1DdXJyZW50U2V0LT5Ob3RpZnlLZXkoa2V5KSA6IC0xKTsKIH0KIAogaW50IFBhZ2VNYW5hZ2VyOjpOb3RpZnlLZXlib2FyZChpbnQga2V5KQogewotICAgIHJldHVybiAobUN1cnJlbnRTZXQgPyBtQ3VycmVudFNldC0+Tm90aWZ5S2V5Ym9hcmQoa2V5KSA6IC0xKTsKKwlyZXR1cm4gKG1DdXJyZW50U2V0ID8gbUN1cnJlbnRTZXQtPk5vdGlmeUtleWJvYXJkKGtleSkgOiAtMSk7CiB9CiAKIGludCBQYWdlTWFuYWdlcjo6U2V0S2V5Qm9hcmRGb2N1cyhpbnQgaW5Gb2N1cykKIHsKLSAgICByZXR1cm4gKG1DdXJyZW50U2V0ID8gbUN1cnJlbnRTZXQtPlNldEtleUJvYXJkRm9jdXMoaW5Gb2N1cykgOiAtMSk7CisJcmV0dXJuIChtQ3VycmVudFNldCA/IG1DdXJyZW50U2V0LT5TZXRLZXlCb2FyZEZvY3VzKGluRm9jdXMpIDogLTEpOwogfQogCiBpbnQgUGFnZU1hbmFnZXI6Ok5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSkKIHsKLSAgICByZXR1cm4gKG1DdXJyZW50U2V0ID8gbUN1cnJlbnRTZXQtPk5vdGlmeVZhckNoYW5nZSh2YXJOYW1lLCB2YWx1ZSkgOiAtMSk7CisJcmV0dXJuIChtQ3VycmVudFNldCA/IG1DdXJyZW50U2V0LT5Ob3RpZnlWYXJDaGFuZ2UodmFyTmFtZSwgdmFsdWUpIDogLTEpOwogfQogCiBleHRlcm4gIkMiIHZvaWQgZ3VpX25vdGlmeVZhckNoYW5nZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKIHsKLSAgICBpZiAoIWdHdWlSdW5uaW5nKSAgIHJldHVybjsKKwlpZiAoIWdHdWlSdW5uaW5nKQorCQlyZXR1cm47CiAKLSAgICBQYWdlTWFuYWdlcjo6Tm90aWZ5VmFyQ2hhbmdlKG5hbWUsIHZhbHVlKTsKKwlQYWdlTWFuYWdlcjo6Tm90aWZ5VmFyQ2hhbmdlKG5hbWUsIHZhbHVlKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3VpL3BhZ2VzLmhwcCBiL2d1aS9wYWdlcy5ocHAKaW5kZXggMmM3MTczNS4uYzMwOGMxYSAxMDA2NDQKLS0tIGEvZ3VpL3BhZ2VzLmhwcAorKysgYi9ndWkvcGFnZXMuaHBwCkBAIC00LDEwICs0LDEwIEBACiAjZGVmaW5lIF9QQUdFU19IRUFERVJfSFBQCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBjaGFyIHJlZDsKLSAgICB1bnNpZ25lZCBjaGFyIGdyZWVuOwotICAgIHVuc2lnbmVkIGNoYXIgYmx1ZTsKLSAgICB1bnNpZ25lZCBjaGFyIGFscGhhOworCXVuc2lnbmVkIGNoYXIgcmVkOworCXVuc2lnbmVkIGNoYXIgZ3JlZW47CisJdW5zaWduZWQgY2hhciBibHVlOworCXVuc2lnbmVkIGNoYXIgYWxwaGE7CiB9IENPTE9SOwogCiAvLyBVdGlsaXR5IEZ1bmN0aW9ucwpAQCAtMjYsMTEwICsyNiwxMTAgQEAKIGNsYXNzIFBhZ2UKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5QYWdlKCkgICAgICAgICAgICAge30KKwl2aXJ0dWFsIH5QYWdlKCkge30KIAogcHVibGljOgotICAgIFBhZ2UoeG1sX25vZGU8PiogcGFnZSwgeG1sX25vZGU8PiogdGVtcGxhdGVzID0gTlVMTCk7Ci0gICAgc3RkOjpzdHJpbmcgR2V0TmFtZSh2b2lkKSAgIHsgcmV0dXJuIG1OYW1lOyB9CisJUGFnZSh4bWxfbm9kZTw+KiBwYWdlLCB4bWxfbm9kZTw+KiB0ZW1wbGF0ZXMgPSBOVUxMKTsKKwlzdGQ6OnN0cmluZyBHZXROYW1lKHZvaWQpICAgeyByZXR1cm4gbU5hbWU7IH0KIAogcHVibGljOgotICAgIHZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKLSAgICB2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7Ci0gICAgdmlydHVhbCBpbnQgTm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSk7Ci0gICAgdmlydHVhbCBpbnQgTm90aWZ5S2V5KGludCBrZXkpOworCXZpcnR1YWwgaW50IFJlbmRlcih2b2lkKTsKKwl2aXJ0dWFsIGludCBVcGRhdGUodm9pZCk7CisJdmlydHVhbCBpbnQgTm90aWZ5VG91Y2goVE9VQ0hfU1RBVEUgc3RhdGUsIGludCB4LCBpbnQgeSk7CisJdmlydHVhbCBpbnQgTm90aWZ5S2V5KGludCBrZXkpOwogCXZpcnR1YWwgaW50IE5vdGlmeUtleWJvYXJkKGludCBrZXkpOwogCXZpcnR1YWwgaW50IFNldEtleUJvYXJkRm9jdXMoaW50IGluRm9jdXMpOwotICAgIHZpcnR1YWwgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7Ci0gICAgdmlydHVhbCB2b2lkIFNldFBhZ2VGb2N1cyhpbnQgaW5Gb2N1cyk7CisJdmlydHVhbCBpbnQgTm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKTsKKwl2aXJ0dWFsIHZvaWQgU2V0UGFnZUZvY3VzKGludCBpbkZvY3VzKTsKIAogcHJvdGVjdGVkOgotICAgIHN0ZDo6c3RyaW5nIG1OYW1lOwotICAgIHN0ZDo6dmVjdG9yPFJlbmRlck9iamVjdCo+IG1SZW5kZXJzOwotICAgIHN0ZDo6dmVjdG9yPEFjdGlvbk9iamVjdCo+IG1BY3Rpb25zOworCXN0ZDo6c3RyaW5nIG1OYW1lOworCXN0ZDo6dmVjdG9yPFJlbmRlck9iamVjdCo+IG1SZW5kZXJzOworCXN0ZDo6dmVjdG9yPEFjdGlvbk9iamVjdCo+IG1BY3Rpb25zOwogCXN0ZDo6dmVjdG9yPElucHV0T2JqZWN0Kj4gbUlucHV0czsKIAotICAgIEFjdGlvbk9iamVjdCogbVRvdWNoU3RhcnQ7Ci0gICAgQ09MT1IgbUJhY2tncm91bmQ7CisJQWN0aW9uT2JqZWN0KiBtVG91Y2hTdGFydDsKKwlDT0xPUiBtQmFja2dyb3VuZDsKIAogcHJvdGVjdGVkOgotICAgIGJvb2wgUHJvY2Vzc05vZGUoeG1sX25vZGU8PiogcGFnZSwgeG1sX25vZGU8PiogdGVtcGxhdGVzID0gTlVMTCwgaW50IGRlcHRoID0gMCk7CisJYm9vbCBQcm9jZXNzTm9kZSh4bWxfbm9kZTw+KiBwYWdlLCB4bWxfbm9kZTw+KiB0ZW1wbGF0ZXMgPSBOVUxMLCBpbnQgZGVwdGggPSAwKTsKIH07CiAKIGNsYXNzIFBhZ2VTZXQKIHsKIHB1YmxpYzoKLSAgICBQYWdlU2V0KGNoYXIqIHhtbEZpbGUpOwotICAgIHZpcnR1YWwgflBhZ2VTZXQoKTsKKwlQYWdlU2V0KGNoYXIqIHhtbEZpbGUpOworCXZpcnR1YWwgflBhZ2VTZXQoKTsKIAogcHVibGljOgotICAgIGludCBMb2FkKFppcEFyY2hpdmUqIHBhY2thZ2UpOworCWludCBMb2FkKFppcEFyY2hpdmUqIHBhY2thZ2UpOwogCi0gICAgUGFnZSogRmluZFBhZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gICAgaW50IFNldFBhZ2Uoc3RkOjpzdHJpbmcgcGFnZSk7CisJUGFnZSogRmluZFBhZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7CisJaW50IFNldFBhZ2Uoc3RkOjpzdHJpbmcgcGFnZSk7CiAJaW50IFNldE92ZXJsYXkoUGFnZSogcGFnZSk7Ci0gICAgUmVzb3VyY2UqIEZpbmRSZXNvdXJjZShzdGQ6OnN0cmluZyBuYW1lKTsKKwlSZXNvdXJjZSogRmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIG5hbWUpOwogCi0gICAgLy8gSGVscGVyIHJvdXRpbmUgZm9yIGlkZW50aWZpbmcgaWYgd2UncmUgdGhlIGN1cnJlbnQgcGFnZQotICAgIGludCBJc0N1cnJlbnRQYWdlKFBhZ2UqIHBhZ2UpOworCS8vIEhlbHBlciByb3V0aW5lIGZvciBpZGVudGlmaW5nIGlmIHdlJ3JlIHRoZSBjdXJyZW50IHBhZ2UKKwlpbnQgSXNDdXJyZW50UGFnZShQYWdlKiBwYWdlKTsKIAotICAgIC8vIFRoZXNlIGFyZSByb3V0aW5nIHJvdXRpbmVzCi0gICAgaW50IFJlbmRlcih2b2lkKTsKLSAgICBpbnQgVXBkYXRlKHZvaWQpOwotICAgIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKLSAgICBpbnQgTm90aWZ5S2V5KGludCBrZXkpOworCS8vIFRoZXNlIGFyZSByb3V0aW5nIHJvdXRpbmVzCisJaW50IFJlbmRlcih2b2lkKTsKKwlpbnQgVXBkYXRlKHZvaWQpOworCWludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKKwlpbnQgTm90aWZ5S2V5KGludCBrZXkpOwogCWludCBOb3RpZnlLZXlib2FyZChpbnQga2V5KTsKIAlpbnQgU2V0S2V5Qm9hcmRGb2N1cyhpbnQgaW5Gb2N1cyk7Ci0gICAgaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CisJaW50IE5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CiAKIHByb3RlY3RlZDoKLSAgICBpbnQgTG9hZFBhZ2VzKHhtbF9ub2RlPD4qIHBhZ2VzLCB4bWxfbm9kZTw+KiB0ZW1wbGF0ZXMgPSBOVUxMKTsKLSAgICBpbnQgTG9hZFZhcmlhYmxlcyh4bWxfbm9kZTw+KiB2YXJzKTsKKwlpbnQgTG9hZFBhZ2VzKHhtbF9ub2RlPD4qIHBhZ2VzLCB4bWxfbm9kZTw+KiB0ZW1wbGF0ZXMgPSBOVUxMKTsKKwlpbnQgTG9hZFZhcmlhYmxlcyh4bWxfbm9kZTw+KiB2YXJzKTsKIAogcHJvdGVjdGVkOgotICAgIGNoYXIqIG1YbWxGaWxlOwotICAgIHhtbF9kb2N1bWVudDw+IG1Eb2M7Ci0gICAgUmVzb3VyY2VNYW5hZ2VyKiBtUmVzb3VyY2VzOwotICAgIHN0ZDo6dmVjdG9yPFBhZ2UqPiBtUGFnZXM7Ci0gICAgUGFnZSogbUN1cnJlbnRQYWdlOwotCVBhZ2UqIG1PdmVybGF5UGFnZTsgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIHVzZWQgZm9yICJsb2NraW5nIiB0aGUgc2NyZWVuCisJY2hhciogbVhtbEZpbGU7CisJeG1sX2RvY3VtZW50PD4gbURvYzsKKwlSZXNvdXJjZU1hbmFnZXIqIG1SZXNvdXJjZXM7CisJc3RkOjp2ZWN0b3I8UGFnZSo+IG1QYWdlczsKKwlQYWdlKiBtQ3VycmVudFBhZ2U7CisJUGFnZSogbU92ZXJsYXlQYWdlOyAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCB1c2VkIGZvciAibG9ja2luZyIgdGhlIHNjcmVlbgogfTsKIAogY2xhc3MgUGFnZU1hbmFnZXIKIHsKIHB1YmxpYzoKLSAgICAvLyBVc2VkIGJ5IEdVSQotICAgIHN0YXRpYyBpbnQgTG9hZFBhY2thZ2Uoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgcGFja2FnZSwgc3RkOjpzdHJpbmcgc3RhcnRwYWdlKTsKLSAgICBzdGF0aWMgUGFnZVNldCogU2VsZWN0UGFja2FnZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgICBzdGF0aWMgaW50IFJlbG9hZFBhY2thZ2Uoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgcGFja2FnZSk7Ci0gICAgc3RhdGljIHZvaWQgUmVsZWFzZVBhY2thZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7CisJLy8gVXNlZCBieSBHVUkKKwlzdGF0aWMgaW50IExvYWRQYWNrYWdlKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHBhY2thZ2UsIHN0ZDo6c3RyaW5nIHN0YXJ0cGFnZSk7CisJc3RhdGljIFBhZ2VTZXQqIFNlbGVjdFBhY2thZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7CisJc3RhdGljIGludCBSZWxvYWRQYWNrYWdlKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHBhY2thZ2UpOworCXN0YXRpYyB2b2lkIFJlbGVhc2VQYWNrYWdlKHN0ZDo6c3RyaW5nIG5hbWUpOwogCi0gICAgLy8gVXNlZCBmb3IgYWN0aW9ucyBhbmQgcGFnZXMKLSAgICBzdGF0aWMgaW50IENoYW5nZVBhZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7CisJLy8gVXNlZCBmb3IgYWN0aW9ucyBhbmQgcGFnZXMKKwlzdGF0aWMgaW50IENoYW5nZVBhZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7CiAJc3RhdGljIGludCBDaGFuZ2VPdmVybGF5KHN0ZDo6c3RyaW5nIG5hbWUpOwotICAgIHN0YXRpYyBSZXNvdXJjZSogRmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIG5hbWUpOwotICAgIHN0YXRpYyBSZXNvdXJjZSogRmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIHBhY2thZ2UsIHN0ZDo6c3RyaW5nIG5hbWUpOworCXN0YXRpYyBSZXNvdXJjZSogRmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIG5hbWUpOworCXN0YXRpYyBSZXNvdXJjZSogRmluZFJlc291cmNlKHN0ZDo6c3RyaW5nIHBhY2thZ2UsIHN0ZDo6c3RyaW5nIG5hbWUpOwogCi0gICAgLy8gVXNlZCBmb3IgY29uc29sZS1vbmx5IG1vZGUgLSBDYW4gYmUgcmV2ZXJ0ZWQgdmlhIENoYW5nZVBhZ2UKLSAgICBzdGF0aWMgaW50IFN3aXRjaFRvQ29uc29sZSh2b2lkKTsKKwkvLyBVc2VkIGZvciBjb25zb2xlLW9ubHkgbW9kZSAtIENhbiBiZSByZXZlcnRlZCB2aWEgQ2hhbmdlUGFnZQorCXN0YXRpYyBpbnQgU3dpdGNoVG9Db25zb2xlKHZvaWQpOwogCi0gICAgLy8gSGVscGVyIHRvIGlkZW50aWZ5IGlmIGEgcGFydGljdWxhciBwYWdlIGlzIHRoZSBhY3RpdmUgcGFnZQotICAgIHN0YXRpYyBpbnQgSXNDdXJyZW50UGFnZShQYWdlKiBwYWdlKTsKKwkvLyBIZWxwZXIgdG8gaWRlbnRpZnkgaWYgYSBwYXJ0aWN1bGFyIHBhZ2UgaXMgdGhlIGFjdGl2ZSBwYWdlCisJc3RhdGljIGludCBJc0N1cnJlbnRQYWdlKFBhZ2UqIHBhZ2UpOwogCi0gICAgLy8gVGhlc2UgYXJlIHJvdXRpbmcgcm91dGluZXMKLSAgICBzdGF0aWMgaW50IFJlbmRlcih2b2lkKTsKLSAgICBzdGF0aWMgaW50IFVwZGF0ZSh2b2lkKTsKLSAgICBzdGF0aWMgaW50IE5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpOwotICAgIHN0YXRpYyBpbnQgTm90aWZ5S2V5KGludCBrZXkpOworCS8vIFRoZXNlIGFyZSByb3V0aW5nIHJvdXRpbmVzCisJc3RhdGljIGludCBSZW5kZXIodm9pZCk7CisJc3RhdGljIGludCBVcGRhdGUodm9pZCk7CisJc3RhdGljIGludCBOb3RpZnlUb3VjaChUT1VDSF9TVEFURSBzdGF0ZSwgaW50IHgsIGludCB5KTsKKwlzdGF0aWMgaW50IE5vdGlmeUtleShpbnQga2V5KTsKIAlzdGF0aWMgaW50IE5vdGlmeUtleWJvYXJkKGludCBrZXkpOwogCXN0YXRpYyBpbnQgU2V0S2V5Qm9hcmRGb2N1cyhpbnQgaW5Gb2N1cyk7Ci0gICAgc3RhdGljIGludCBOb3RpZnlWYXJDaGFuZ2Uoc3RkOjpzdHJpbmcgdmFyTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOworCXN0YXRpYyBpbnQgTm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKTsKIAogcHJvdGVjdGVkOgotICAgIHN0YXRpYyBQYWdlU2V0KiBGaW5kUGFja2FnZShzdGQ6OnN0cmluZyBuYW1lKTsKKwlzdGF0aWMgUGFnZVNldCogRmluZFBhY2thZ2Uoc3RkOjpzdHJpbmcgbmFtZSk7CiAKIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFBhZ2VTZXQqPiBtUGFnZVNldHM7Ci0gICAgc3RhdGljIFBhZ2VTZXQqIG1DdXJyZW50U2V0OworCXN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGFnZVNldCo+IG1QYWdlU2V0czsKKwlzdGF0aWMgUGFnZVNldCogbUN1cnJlbnRTZXQ7CiAJc3RhdGljIFBhZ2VTZXQqIG1CYXNlU2V0OwogfTsKIApkaWZmIC0tZ2l0IGEvZ3VpL3BhcnRpdGlvbmxpc3QuY3BwIGIvZ3VpL3BhcnRpdGlvbmxpc3QuY3BwCmluZGV4IDM2ZDVjMTYuLmFiZTBhMzggMTAwNjQ0Ci0tLSBhL2d1aS9wYXJ0aXRpb25saXN0LmNwcAorKysgYi9ndWkvcGFydGl0aW9ubGlzdC5jcHAKQEAgLTE5MywxMiArMTkzLDEyIEBACiAKIAkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImhpZ2hsaWdodGNvbG9yIik7CiAJCW1lbXNldCgmbUZvbnRIaWdobGlnaHRDb2xvciwgMCwgc2l6ZW9mKENPTE9SKSk7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7CisJCWlmIChhdHRyKQorCQl7CisJCQlzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7CiAJCQlDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1Gb250SGlnaGxpZ2h0Q29sb3IpOwogCQkJaGFzRm9udEhpZ2hsaWdodENvbG9yID0gdHJ1ZTsKLSAgICAgICAgfQorCQl9CiAJfQogCiAJLy8gTG9hZCB0aGUgc2VwYXJhdG9yIGlmIGl0IGV4aXN0cwpAQCAtNDMzLDIxICs0MzMsMjEgQEAKIAkJfQogCiAJCWlmIChtTGlzdC5hdChsaW5lICsgbVN0YXJ0KS5zZWxlY3RlZCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpY29uID0gbUljb25TZWxlY3RlZDsKKwkJeworCQkJaWNvbiA9IG1JY29uU2VsZWN0ZWQ7CiAJCQljdXJyZW50SWNvbkhlaWdodCA9IG1TZWxlY3RlZEljb25IZWlnaHQ7CiAJCQljdXJyZW50SWNvbldpZHRoID0gbVNlbGVjdGVkSWNvbldpZHRoOwogCQkJY3VycmVudEljb25PZmZzZXRZID0gU2VsZWN0ZWRJY29uT2Zmc2V0WTsKIAkJCWN1cnJlbnRJY29uT2Zmc2V0WCA9IFNlbGVjdGVkSWNvbk9mZnNldFg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpY29uID0gbUljb25VbnNlbGVjdGVkOworCQl9CisJCWVsc2UKKwkJeworCQkJaWNvbiA9IG1JY29uVW5zZWxlY3RlZDsKIAkJCWN1cnJlbnRJY29uSGVpZ2h0ID0gbVNlbGVjdGVkSWNvbkhlaWdodDsKIAkJCWN1cnJlbnRJY29uV2lkdGggPSBtU2VsZWN0ZWRJY29uV2lkdGg7CiAJCQljdXJyZW50SWNvbk9mZnNldFkgPSBTZWxlY3RlZEljb25PZmZzZXRZOwogCQkJY3VycmVudEljb25PZmZzZXRYID0gU2VsZWN0ZWRJY29uT2Zmc2V0WDsKLSAgICAgICAgfQorCQl9CiAKIAkJaWYgKGljb24gJiYgaWNvbi0+R2V0UmVzb3VyY2UoKSkKIAkJewpAQCAtODI3LDggKzgyNyw4IEBACiAJCX0KIAl9CiAJaWYgKHZhck5hbWUgPT0gbVZhcmlhYmxlICYmICFtVXBkYXRlKQotICAgIHsKLSAgICAgICAgaWYgKExpc3RUeXBlID09ICJzdG9yYWdlIikgeworCXsKKwkJaWYgKExpc3RUeXBlID09ICJzdG9yYWdlIikgewogCQkJaW50IGksIGxpc3RTaXplID0gbUxpc3Quc2l6ZSgpLCBzZWxlY3RlZF9pbmRleCA9IDA7CiAKIAkJCWN1cnJlbnRWYWx1ZSA9IHZhbHVlOwpAQCAtODU2LDggKzg1Niw4IEBACiAJCX0KIAogCQltVXBkYXRlID0gMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCQlyZXR1cm4gMDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2d1aS9wcm9ncmVzc2Jhci5jcHAgYi9ndWkvcHJvZ3Jlc3NiYXIuY3BwCmluZGV4IGRjZTQzMTUuLmQ1M2ZkYzEgMTAwNjQ0Ci0tLSBhL2d1aS9wcm9ncmVzc2Jhci5jcHAKKysrIGIvZ3VpL3Byb2dyZXNzYmFyLmNwcApAQCAtMjcsMTg4ICsyNywyMDAgQEAKIAogR1VJUHJvZ3Jlc3NCYXI6OkdVSVByb2dyZXNzQmFyKHhtbF9ub2RlPD4qIG5vZGUpCiB7Ci0gICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOwotICAgIHhtbF9ub2RlPD4qIGNoaWxkOworCXhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKIAotICAgIG1FbXB0eUJhciA9IE5VTEw7Ci0gICAgbUZ1bGxCYXIgPSBOVUxMOwotICAgIG1MYXN0UG9zID0gMDsKLSAgICBtU2xpZGUgPSAwLjA7Ci0gICAgbVNsaWRlSW5jID0gMC4wOworCW1FbXB0eUJhciA9IE5VTEw7CisJbUZ1bGxCYXIgPSBOVUxMOworCW1MYXN0UG9zID0gMDsKKwltU2xpZGUgPSAwLjA7CisJbVNsaWRlSW5jID0gMC4wOwogCi0gICAgaWYgKCFub2RlKQotICAgIHsKLSAgICAgICAgTE9HRVJSKCJHVUlQcm9ncmVzc0JhciBjcmVhdGVkIHdpdGhvdXQgWE1MIG5vZGVcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCWlmICghbm9kZSkKKwl7CisJCUxPR0VSUigiR1VJUHJvZ3Jlc3NCYXIgY3JlYXRlZCB3aXRob3V0IFhNTCBub2RlXG4iKTsKKwkJcmV0dXJuOworCX0KIAotICAgIGNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgicmVzb3VyY2UiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgewotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiZW1wdHkiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICBtRW1wdHlCYXIgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOworCWNoaWxkID0gbm9kZS0+Zmlyc3Rfbm9kZSgicmVzb3VyY2UiKTsKKwlpZiAoY2hpbGQpCisJeworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiZW1wdHkiKTsKKwkJaWYgKGF0dHIpCisJCQltRW1wdHlCYXIgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwogCi0gICAgICAgIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJmdWxsIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgbUZ1bGxCYXIgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOwotICAgIH0KKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImZ1bGwiKTsKKwkJaWYgKGF0dHIpCisJCQltRnVsbEJhciA9IFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2UoYXR0ci0+dmFsdWUoKSk7CisJfQogCi0gICAgLy8gTG9hZCB0aGUgcGxhY2VtZW50Ci0gICAgTG9hZFBsYWNlbWVudChub2RlLT5maXJzdF9ub2RlKCJwbGFjZW1lbnQiKSwgJm1SZW5kZXJYLCAmbVJlbmRlclkpOworCS8vIExvYWQgdGhlIHBsYWNlbWVudAorCUxvYWRQbGFjZW1lbnQobm9kZS0+Zmlyc3Rfbm9kZSgicGxhY2VtZW50IiksICZtUmVuZGVyWCwgJm1SZW5kZXJZKTsKIAotICAgIC8vIExvYWQgdGhlIGRhdGEKLSAgICBjaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImRhdGEiKTsKLSAgICBpZiAoY2hpbGQpCi0gICAgewotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibWluIik7Ci0gICAgICAgIGlmIChhdHRyKSAgIG1NaW5WYWxWYXIgPSBhdHRyLT52YWx1ZSgpOworCS8vIExvYWQgdGhlIGRhdGEKKwljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImRhdGEiKTsKKwlpZiAoY2hpbGQpCisJeworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibWluIik7CisJCWlmIChhdHRyKSAgIG1NaW5WYWxWYXIgPSBhdHRyLT52YWx1ZSgpOwogCi0gICAgICAgIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJtYXgiKTsKLSAgICAgICAgaWYgKGF0dHIpICAgbU1heFZhbFZhciA9IGF0dHItPnZhbHVlKCk7CisJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJtYXgiKTsKKwkJaWYgKGF0dHIpICAgbU1heFZhbFZhciA9IGF0dHItPnZhbHVlKCk7CiAKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICAgICAgaWYgKGF0dHIpICAgbUN1clZhbFZhciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfQorCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpOworCQlpZiAoYXR0cikgICBtQ3VyVmFsVmFyID0gYXR0ci0+dmFsdWUoKTsKKwl9CiAKLSAgICBpZiAobUVtcHR5QmFyICYmIG1FbXB0eUJhci0+R2V0UmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICAgIG1SZW5kZXJXID0gZ3JfZ2V0X3dpZHRoKG1FbXB0eUJhci0+R2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIG1SZW5kZXJIID0gZ3JfZ2V0X2hlaWdodChtRW1wdHlCYXItPkdldFJlc291cmNlKCkpOwotICAgIH0KKwlpZiAobUVtcHR5QmFyICYmIG1FbXB0eUJhci0+R2V0UmVzb3VyY2UoKSkKKwl7CisJCW1SZW5kZXJXID0gZ3JfZ2V0X3dpZHRoKG1FbXB0eUJhci0+R2V0UmVzb3VyY2UoKSk7CisJCW1SZW5kZXJIID0gZ3JfZ2V0X2hlaWdodChtRW1wdHlCYXItPkdldFJlc291cmNlKCkpOworCX0KIAotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKIGludCBHVUlQcm9ncmVzc0Jhcjo6UmVuZGVyKHZvaWQpCiB7Ci0gICAgLy8gVGhpcyBoYW5kbGVzIG1ha2luZyBzdXJlIHRpbWluZyB1cGRhdGVzIG9jY3VyCi0gICAgVXBkYXRlKCk7Ci0gICAgcmV0dXJuIFJlbmRlckludGVybmFsKCk7CisJLy8gVGhpcyBoYW5kbGVzIG1ha2luZyBzdXJlIHRpbWluZyB1cGRhdGVzIG9jY3VyCisJVXBkYXRlKCk7CisJcmV0dXJuIFJlbmRlckludGVybmFsKCk7CiB9CiAKIGludCBHVUlQcm9ncmVzc0Jhcjo6UmVuZGVySW50ZXJuYWwodm9pZCkKIHsKLSAgICBpZiAoIW1FbXB0eUJhciB8fCAhbUVtcHR5QmFyLT5HZXRSZXNvdXJjZSgpKSAgICByZXR1cm4gLTE7Ci0gICAgaWYgKCFtRnVsbEJhciB8fCAhbUZ1bGxCYXItPkdldFJlc291cmNlKCkpICAgICAgcmV0dXJuIC0xOworCWlmICghbUVtcHR5QmFyIHx8ICFtRW1wdHlCYXItPkdldFJlc291cmNlKCkpCisJCXJldHVybiAtMTsKIAotICAgIGdyX2JsaXQobUVtcHR5QmFyLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBtUmVuZGVyVywgbVJlbmRlckgsIG1SZW5kZXJYLCBtUmVuZGVyWSk7Ci0gICAgZ3JfYmxpdChtRnVsbEJhci0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbUxhc3RQb3MsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOwotICAgIHJldHVybiAwOworCWlmICghbUZ1bGxCYXIgfHwgIW1GdWxsQmFyLT5HZXRSZXNvdXJjZSgpKQorCQlyZXR1cm4gLTE7CisKKwlncl9ibGl0KG1FbXB0eUJhci0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbVJlbmRlclcsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOworCWdyX2JsaXQobUZ1bGxCYXItPkdldFJlc291cmNlKCksIDAsIDAsIG1MYXN0UG9zLCBtUmVuZGVySCwgbVJlbmRlclgsIG1SZW5kZXJZKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IEdVSVByb2dyZXNzQmFyOjpVcGRhdGUodm9pZCkKIHsKLSAgICBzdGQ6OnN0cmluZyBzdHI7Ci0gICAgaW50IG1pbiwgbWF4LCBjdXIsIHBvczsKKwlzdGQ6OnN0cmluZyBzdHI7CisJaW50IG1pbiwgbWF4LCBjdXIsIHBvczsKIAotICAgIGlmIChtTWluVmFsVmFyLmVtcHR5KCkpICAgICBtaW4gPSAwOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0ci5jbGVhcigpOwotICAgICAgICBpZiAoYXRvaShtTWluVmFsVmFyLmNfc3RyKCkpICE9IDApICAgICAgc3RyID0gbU1pblZhbFZhcjsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpHZXRWYWx1ZShtTWluVmFsVmFyLCBzdHIpOwotICAgICAgICBtaW4gPSBhdG9pKHN0ci5jX3N0cigpKTsKLSAgICB9CisJaWYgKG1NaW5WYWxWYXIuZW1wdHkoKSkKKwkJbWluID0gMDsKKwllbHNlCisJeworCQlzdHIuY2xlYXIoKTsKKwkJaWYgKGF0b2kobU1pblZhbFZhci5jX3N0cigpKSAhPSAwKQorCQkJc3RyID0gbU1pblZhbFZhcjsKKwkJZWxzZQorCQkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKG1NaW5WYWxWYXIsIHN0cik7CisJCW1pbiA9IGF0b2koc3RyLmNfc3RyKCkpOworCX0KIAotICAgIGlmIChtTWF4VmFsVmFyLmVtcHR5KCkpICAgICBtYXggPSAxMDA7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RyLmNsZWFyKCk7Ci0gICAgICAgIGlmIChhdG9pKG1NYXhWYWxWYXIuY19zdHIoKSkgIT0gMCkgICAgICBzdHIgPSBtTWF4VmFsVmFyOwotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YU1hbmFnZXI6OkdldFZhbHVlKG1NYXhWYWxWYXIsIHN0cik7Ci0gICAgICAgIG1heCA9IGF0b2koc3RyLmNfc3RyKCkpOwotICAgIH0KKwlpZiAobU1heFZhbFZhci5lbXB0eSgpKQorCQltYXggPSAxMDA7CisJZWxzZQorCXsKKwkJc3RyLmNsZWFyKCk7CisJCWlmIChhdG9pKG1NYXhWYWxWYXIuY19zdHIoKSkgIT0gMCkKKwkJCXN0ciA9IG1NYXhWYWxWYXI7CisJCWVsc2UKKwkJCURhdGFNYW5hZ2VyOjpHZXRWYWx1ZShtTWF4VmFsVmFyLCBzdHIpOworCQltYXggPSBhdG9pKHN0ci5jX3N0cigpKTsKKwl9CiAKLSAgICBzdHIuY2xlYXIoKTsKLSAgICBEYXRhTWFuYWdlcjo6R2V0VmFsdWUobUN1clZhbFZhciwgc3RyKTsKLSAgICBjdXIgPSBhdG9pKHN0ci5jX3N0cigpKTsKKwlzdHIuY2xlYXIoKTsKKwlEYXRhTWFuYWdlcjo6R2V0VmFsdWUobUN1clZhbFZhciwgc3RyKTsKKwljdXIgPSBhdG9pKHN0ci5jX3N0cigpKTsKIAotICAgIC8vIERvIHNsaWRlLCBpZiBuZWVkZWQKLSAgICBpZiAobVNsaWRlRnJhbWVzKQotICAgIHsKLSAgICAgICAgbVNsaWRlICs9IG1TbGlkZUluYzsKLSAgICAgICAgbVNsaWRlRnJhbWVzLS07Ci0gICAgICAgIGlmIChjdXIgIT0gKGludCkgbVNsaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXIgPSAoaW50KSBtU2xpZGU7Ci0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6U2V0VmFsdWUobUN1clZhbFZhciwgY3VyKTsKLSAgICAgICAgfQotICAgIH0KKwkvLyBEbyBzbGlkZSwgaWYgbmVlZGVkCisJaWYgKG1TbGlkZUZyYW1lcykKKwl7CisJCW1TbGlkZSArPSBtU2xpZGVJbmM7CisJCW1TbGlkZUZyYW1lcy0tOworCQlpZiAoY3VyICE9IChpbnQpIG1TbGlkZSkKKwkJeworCQkJY3VyID0gKGludCkgbVNsaWRlOworCQkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKG1DdXJWYWxWYXIsIGN1cik7CisJCX0KKwl9CiAKLSAgICAvLyBOb3JtYWxpemUgdG8gMAotICAgIG1heCAtPSBtaW47Ci0gICAgY3VyIC09IG1pbjsKLSAgICBtaW4gPSAwOworCS8vIE5vcm1hbGl6ZSB0byAwCisJbWF4IC09IG1pbjsKKwljdXIgLT0gbWluOworCW1pbiA9IDA7CiAKLSAgICBpZiAoY3VyIDwgbWluKSAgY3VyID0gbWluOwotICAgIGlmIChjdXIgPiBtYXgpICBjdXIgPSBtYXg7CisJaWYgKGN1ciA8IG1pbikgIGN1ciA9IG1pbjsKKwlpZiAoY3VyID4gbWF4KSAgY3VyID0gbWF4OwogCi0gICAgaWYgKG1heCA9PSAwKSAgIHBvcyA9IDA7Ci0gICAgZWxzZSAgICAgICAgICAgIHBvcyA9IChjdXIgKiBtUmVuZGVyVykgLyBtYXg7CisJaWYgKG1heCA9PSAwKSAgIHBvcyA9IDA7CisJZWxzZSAgICAgICAgICAgIHBvcyA9IChjdXIgKiBtUmVuZGVyVykgLyBtYXg7CiAKLSAgICBpZiAocG9zID09IG1MYXN0UG9zKSAgICAgICAgICAgIHJldHVybiAwOwotICAgIG1MYXN0UG9zID0gcG9zOwotICAgIGlmIChSZW5kZXJJbnRlcm5hbCgpICE9IDApICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiAyOworCWlmIChwb3MgPT0gbUxhc3RQb3MpCisJCXJldHVybiAwOworCisJbUxhc3RQb3MgPSBwb3M7CisKKwlpZiAoUmVuZGVySW50ZXJuYWwoKSAhPSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDI7CiB9CiAKIGludCBHVUlQcm9ncmVzc0Jhcjo6Tm90aWZ5VmFyQ2hhbmdlKHN0ZDo6c3RyaW5nIHZhck5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlKQogewotICAgIHN0YXRpYyBpbnQgbmV4dFB1c2ggPSAwOworCXN0YXRpYyBpbnQgbmV4dFB1c2ggPSAwOwogCi0gICAgaWYgKHZhck5hbWUuZW1wdHkoKSkKLSAgICB7Ci0gICAgICAgIG5leHRQdXNoID0gMDsKLSAgICAgICAgbUxhc3RQb3MgPSAwOwotICAgICAgICBtU2xpZGUgPSAwLjA7Ci0gICAgICAgIG1TbGlkZUluYyA9IDAuMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCWlmICh2YXJOYW1lLmVtcHR5KCkpCisJeworCQluZXh0UHVzaCA9IDA7CisJCW1MYXN0UG9zID0gMDsKKwkJbVNsaWRlID0gMC4wOworCQltU2xpZGVJbmMgPSAwLjA7CisJCXJldHVybiAwOworCX0KIAotICAgIGlmICh2YXJOYW1lID09ICJ1aV9wcm9ncmVzc19wb3J0aW9uIiB8fCB2YXJOYW1lID09ICJ1aV9wcm9ncmVzc19mcmFtZXMiKQotICAgIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgc3RyOwotICAgICAgICBpbnQgY3VyOworCWlmICh2YXJOYW1lID09ICJ1aV9wcm9ncmVzc19wb3J0aW9uIiB8fCB2YXJOYW1lID09ICJ1aV9wcm9ncmVzc19mcmFtZXMiKQorCXsKKwkJc3RkOjpzdHJpbmcgc3RyOworCQlpbnQgY3VyOwogCi0gICAgICAgIGlmIChtU2xpZGVGcmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1TbGlkZSArPSAobVNsaWRlSW5jICogbVNsaWRlRnJhbWVzKTsKLSAgICAgICAgICAgIGN1ciA9IChpbnQpIG1TbGlkZTsKLSAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShtQ3VyVmFsVmFyLCBjdXIpOwotICAgICAgICAgICAgbVNsaWRlRnJhbWVzID0gMDsKLSAgICAgICAgfQorCQlpZiAobVNsaWRlRnJhbWVzKQorCQl7CisJCQltU2xpZGUgKz0gKG1TbGlkZUluYyAqIG1TbGlkZUZyYW1lcyk7CisJCQljdXIgPSAoaW50KSBtU2xpZGU7CisJCQlEYXRhTWFuYWdlcjo6U2V0VmFsdWUobUN1clZhbFZhciwgY3VyKTsKKwkJCW1TbGlkZUZyYW1lcyA9IDA7CisJCX0KIAotICAgICAgICBpZiAobmV4dFB1c2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1TbGlkZSArPSBuZXh0UHVzaDsKLSAgICAgICAgICAgIGN1ciA9IChpbnQpIG1TbGlkZTsKLSAgICAgICAgICAgIERhdGFNYW5hZ2VyOjpTZXRWYWx1ZShtQ3VyVmFsVmFyLCBjdXIpOwotICAgICAgICAgICAgbmV4dFB1c2ggPSAwOwotICAgICAgICB9CisJCWlmIChuZXh0UHVzaCkKKwkJeworCQkJbVNsaWRlICs9IG5leHRQdXNoOworCQkJY3VyID0gKGludCkgbVNsaWRlOworCQkJRGF0YU1hbmFnZXI6OlNldFZhbHVlKG1DdXJWYWxWYXIsIGN1cik7CisJCQluZXh0UHVzaCA9IDA7CisJCX0KIAotICAgICAgICBpZiAodmFyTmFtZSA9PSAidWlfcHJvZ3Jlc3NfcG9ydGlvbiIpICAgbVNsaWRlID0gYXRvZih2YWx1ZS5jX3N0cigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtU2xpZGVGcmFtZXMgPSBhdG9sKHZhbHVlLmNfc3RyKCkpOwotICAgICAgICAgICAgaWYgKG1TbGlkZUZyYW1lcyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGp1c3QgaG9sZGluZyB0aGlzIHByb2dyZXNzIHVudGlsIHRoZSBuZXh0IHB1c2gKLSAgICAgICAgICAgICAgICBuZXh0UHVzaCA9IG1TbGlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodmFyTmFtZSA9PSAidWlfcHJvZ3Jlc3NfcG9ydGlvbiIpICAgbVNsaWRlID0gYXRvZih2YWx1ZS5jX3N0cigpKTsKKwkJZWxzZQorCQl7CisJCQltU2xpZGVGcmFtZXMgPSBhdG9sKHZhbHVlLmNfc3RyKCkpOworCQkJaWYgKG1TbGlkZUZyYW1lcyA9PSAwKQorCQkJeworCQkJCS8vIFdlJ3JlIGp1c3QgaG9sZGluZyB0aGlzIHByb2dyZXNzIHVudGlsIHRoZSBuZXh0IHB1c2gKKwkJCQluZXh0UHVzaCA9IG1TbGlkZTsKKwkJCX0KKwkJfQogCi0gICAgICAgIGlmIChtU2xpZGUgPiAwICYmIG1TbGlkZUZyYW1lcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbgotICAgICAgICAgICAgc3RyLmNsZWFyKCk7Ci0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6R2V0VmFsdWUobUN1clZhbFZhciwgc3RyKTsKLSAgICAgICAgICAgIGN1ciA9IGF0b2koc3RyLmNfc3RyKCkpOworCQlpZiAobVNsaWRlID4gMCAmJiBtU2xpZGVGcmFtZXMgPiAwKQorCQl7CisJCQkvLyBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24KKwkJCXN0ci5jbGVhcigpOworCQkJRGF0YU1hbmFnZXI6OkdldFZhbHVlKG1DdXJWYWxWYXIsIHN0cik7CisJCQljdXIgPSBhdG9pKHN0ci5jX3N0cigpKTsKIAotICAgICAgICAgICAgbVNsaWRlSW5jID0gKGZsb2F0KSBtU2xpZGUgLyAoZmxvYXQpIG1TbGlkZUZyYW1lczsKLSAgICAgICAgICAgIG1TbGlkZSA9IGN1cjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKKwkJCW1TbGlkZUluYyA9IChmbG9hdCkgbVNsaWRlIC8gKGZsb2F0KSBtU2xpZGVGcmFtZXM7CisJCQltU2xpZGUgPSBjdXI7CisJCX0KKwl9CisJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2d1aS9yZXNvdXJjZXMuY3BwIGIvZ3VpL3Jlc291cmNlcy5jcHAKaW5kZXggYWFhMTUzMy4uNmJhYmM1NyAxMDA2NDQKLS0tIGEvZ3VpL3Jlc291cmNlcy5jcHAKKysrIGIvZ3VpL3Jlc291cmNlcy5jcHAKQEAgLTMyLDU5ICszMiw1NiBAQAogCiBSZXNvdXJjZTo6UmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCkKIHsKLSAgICBpZiAobm9kZSAmJiBub2RlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgICAgbU5hbWUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKS0+dmFsdWUoKTsKKwlpZiAobm9kZSAmJiBub2RlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKSkKKwkJbU5hbWUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKS0+dmFsdWUoKTsKIH0KIAotCi1pbnQgUmVzb3VyY2U6OkV4dHJhY3RSZXNvdXJjZShaaXBBcmNoaXZlKiBwWmlwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZvbGRlck5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZUV4dG4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdEZpbGUpCitpbnQgUmVzb3VyY2U6OkV4dHJhY3RSZXNvdXJjZShaaXBBcmNoaXZlKiBwWmlwLCBzdGQ6OnN0cmluZyBmb2xkZXJOYW1lLCBzdGQ6OnN0cmluZyBmaWxlTmFtZSwgc3RkOjpzdHJpbmcgZmlsZUV4dG4sIHN0ZDo6c3RyaW5nIGRlc3RGaWxlKQogewotICAgIGlmICghcFppcCkgIHJldHVybiAtMTsKKwlpZiAoIXBaaXApCisJCXJldHVybiAtMTsKIAotICAgIHN0ZDo6c3RyaW5nIHNyYyA9IGZvbGRlck5hbWUgKyAiLyIgKyBmaWxlTmFtZSArIGZpbGVFeHRuOworCXN0ZDo6c3RyaW5nIHNyYyA9IGZvbGRlck5hbWUgKyAiLyIgKyBmaWxlTmFtZSArIGZpbGVFeHRuOwogCiAJY29uc3QgWmlwRW50cnkqIGJpbmFyeSA9IG16RmluZFppcEVudHJ5KHBaaXAsIHNyYy5jX3N0cigpKTsKLSAgICBpZiAoYmluYXJ5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOworCWlmIChiaW5hcnkgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CiAJfQogCi0gICAgdW5saW5rKGRlc3RGaWxlLmNfc3RyKCkpOwotICAgIGludCBmZCA9IGNyZWF0KGRlc3RGaWxlLmNfc3RyKCksIDA2NjYpOwotICAgIGlmIChmZCA8IDApCi0gICAgICAgIHJldHVybiAtMTsKKwl1bmxpbmsoZGVzdEZpbGUuY19zdHIoKSk7CisJaW50IGZkID0gY3JlYXQoZGVzdEZpbGUuY19zdHIoKSwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOwogCi0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYgKCFtekV4dHJhY3RaaXBFbnRyeVRvRmlsZShwWmlwLCBiaW5hcnksIGZkKSkKLSAgICAgICAgcmV0ID0gLTE7CisJaW50IHJldCA9IDA7CisJaWYgKCFtekV4dHJhY3RaaXBFbnRyeVRvRmlsZShwWmlwLCBiaW5hcnksIGZkKSkKKwkJcmV0ID0gLTE7CiAKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIHJldDsKKwljbG9zZShmZCk7CisJcmV0dXJuIHJldDsKIH0KIAogRm9udFJlc291cmNlOjpGb250UmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCkKICA6IFJlc291cmNlKG5vZGUsIHBaaXApCiB7Ci0gICAgc3RkOjpzdHJpbmcgZmlsZTsKKwlzdGQ6OnN0cmluZyBmaWxlOwogCi0gICAgbUZvbnQgPSBOVUxMOwotICAgIGlmICghbm9kZSkgIHJldHVybjsKKwltRm9udCA9IE5VTEw7CisJaWYgKCFub2RlKQorCQlyZXR1cm47CiAKLSAgICBpZiAobm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJmaWxlbmFtZSIpKQotICAgICAgICBmaWxlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJmaWxlbmFtZSIpLT52YWx1ZSgpOworCWlmIChub2RlLT5maXJzdF9hdHRyaWJ1dGUoImZpbGVuYW1lIikpCisJCWZpbGUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoImZpbGVuYW1lIiktPnZhbHVlKCk7CiAKLSAgICBpZiAoRXh0cmFjdFJlc291cmNlKHBaaXAsICJmb250cyIsIGZpbGUsICIuZGF0IiwgVE1QX1JFU09VUkNFX05BTUUpID09IDApCi0gICAgewotICAgICAgICBtRm9udCA9IGdyX2xvYWRGb250KFRNUF9SRVNPVVJDRV9OQU1FKTsKLSAgICAgICAgdW5saW5rKFRNUF9SRVNPVVJDRV9OQU1FKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbUZvbnQgPSBncl9sb2FkRm9udChmaWxlLmNfc3RyKCkpOwotICAgIH0KKwlpZiAoRXh0cmFjdFJlc291cmNlKHBaaXAsICJmb250cyIsIGZpbGUsICIuZGF0IiwgVE1QX1JFU09VUkNFX05BTUUpID09IDApCisJeworCQltRm9udCA9IGdyX2xvYWRGb250KFRNUF9SRVNPVVJDRV9OQU1FKTsKKwkJdW5saW5rKFRNUF9SRVNPVVJDRV9OQU1FKTsKKwl9CisJZWxzZQorCXsKKwkJbUZvbnQgPSBncl9sb2FkRm9udChmaWxlLmNfc3RyKCkpOworCX0KIH0KIAogRm9udFJlc291cmNlOjp+Rm9udFJlc291cmNlKCkKQEAgLTk0LDExNSArOTEsMTE4IEBACiBJbWFnZVJlc291cmNlOjpJbWFnZVJlc291cmNlKHhtbF9ub2RlPD4qIG5vZGUsIFppcEFyY2hpdmUqIHBaaXApCiAgOiBSZXNvdXJjZShub2RlLCBwWmlwKQogewotICAgIHN0ZDo6c3RyaW5nIGZpbGU7CisJc3RkOjpzdHJpbmcgZmlsZTsKIAotICAgIG1TdXJmYWNlID0gTlVMTDsKLSAgICBpZiAoIW5vZGUpICByZXR1cm47CisJbVN1cmZhY2UgPSBOVUxMOworCWlmICghbm9kZSkKKwkJcmV0dXJuOwogCi0gICAgaWYgKG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgiZmlsZW5hbWUiKSkKLSAgICAgICAgZmlsZSA9IG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgiZmlsZW5hbWUiKS0+dmFsdWUoKTsKKwlpZiAobm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJmaWxlbmFtZSIpKQorCQlmaWxlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJmaWxlbmFtZSIpLT52YWx1ZSgpOwogCi0gICAgaWYgKEV4dHJhY3RSZXNvdXJjZShwWmlwLCAiaW1hZ2VzIiwgZmlsZSwgIi5wbmciLCBUTVBfUkVTT1VSQ0VfTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJlc19jcmVhdGVfc3VyZmFjZShUTVBfUkVTT1VSQ0VfTkFNRSwgJm1TdXJmYWNlKTsKLSAgICAgICAgdW5saW5rKFRNUF9SRVNPVVJDRV9OQU1FKTsKLSAgICB9IGVsc2UgaWYgKEV4dHJhY3RSZXNvdXJjZShwWmlwLCAiaW1hZ2VzIiwgZmlsZSwgIiIsIFRNUF9SRVNPVVJDRV9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgICAgLy8gSlBHIGluY2x1ZGVzIHRoZSAuanBnIGV4dGVuc2lvbiBpbiB0aGUgZmlsZW5hbWUgc28gZXh0ZW5zaW9uIHNob3VsZCBiZSBibGFuaworCWlmIChFeHRyYWN0UmVzb3VyY2UocFppcCwgImltYWdlcyIsIGZpbGUsICIucG5nIiwgVE1QX1JFU09VUkNFX05BTUUpID09IDApCisJewogCQlyZXNfY3JlYXRlX3N1cmZhY2UoVE1QX1JFU09VUkNFX05BTUUsICZtU3VyZmFjZSk7Ci0gICAgICAgIHVubGluayhUTVBfUkVTT1VSQ0VfTkFNRSk7Ci0gICAgfQotICAgIGVsc2UKKwkJdW5saW5rKFRNUF9SRVNPVVJDRV9OQU1FKTsKKwl9CisJZWxzZSBpZiAoRXh0cmFjdFJlc291cmNlKHBaaXAsICJpbWFnZXMiLCBmaWxlLCAiIiwgVE1QX1JFU09VUkNFX05BTUUpID09IDApCisJeworCQkvLyBKUEcgaW5jbHVkZXMgdGhlIC5qcGcgZXh0ZW5zaW9uIGluIHRoZSBmaWxlbmFtZSBzbyBleHRlbnNpb24gc2hvdWxkIGJlIGJsYW5rCisJCXJlc19jcmVhdGVfc3VyZmFjZShUTVBfUkVTT1VSQ0VfTkFNRSwgJm1TdXJmYWNlKTsKKwkJdW5saW5rKFRNUF9SRVNPVVJDRV9OQU1FKTsKKwl9CisJZWxzZQogCQlyZXNfY3JlYXRlX3N1cmZhY2UoZmlsZS5jX3N0cigpLCAmbVN1cmZhY2UpOwogfQogCiBJbWFnZVJlc291cmNlOjp+SW1hZ2VSZXNvdXJjZSgpCiB7Ci0gICAgaWYgKG1TdXJmYWNlKQotICAgICAgICByZXNfZnJlZV9zdXJmYWNlKG1TdXJmYWNlKTsKKwlpZiAobVN1cmZhY2UpCisJCXJlc19mcmVlX3N1cmZhY2UobVN1cmZhY2UpOwogfQogCiBBbmltYXRpb25SZXNvdXJjZTo6QW5pbWF0aW9uUmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCkKICA6IFJlc291cmNlKG5vZGUsIHBaaXApCiB7Ci0gICAgc3RkOjpzdHJpbmcgZmlsZTsKLSAgICBpbnQgZmlsZU51bSA9IDE7CisJc3RkOjpzdHJpbmcgZmlsZTsKKwlpbnQgZmlsZU51bSA9IDE7CiAKLSAgICBpZiAoIW5vZGUpICByZXR1cm47CisJaWYgKCFub2RlKQorCQlyZXR1cm47CiAKLSAgICBpZiAobm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJmaWxlbmFtZSIpKQotICAgICAgICBmaWxlID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJmaWxlbmFtZSIpLT52YWx1ZSgpOworCWlmIChub2RlLT5maXJzdF9hdHRyaWJ1dGUoImZpbGVuYW1lIikpCisJCWZpbGUgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoImZpbGVuYW1lIiktPnZhbHVlKCk7CiAKLSAgICBmb3IgKCA7IDsgKQotICAgIHsKLSAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGZpbGVOYW1lOwotICAgICAgICBmaWxlTmFtZSA8PCBmaWxlIDw8IHN0ZDo6c2V0ZmlsbCAoJzAnKSA8PCBzdGQ6OnNldHcgKDMpIDw8IGZpbGVOdW07CisJZm9yICg7OykKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBmaWxlTmFtZTsKKwkJZmlsZU5hbWUgPDwgZmlsZSA8PCBzdGQ6OnNldGZpbGwgKCcwJykgPDwgc3RkOjpzZXR3ICgzKSA8PCBmaWxlTnVtOwogCi0gICAgICAgIGdyX3N1cmZhY2Ugc3VyZmFjZTsKLSAgICAgICAgaWYgKHBaaXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChFeHRyYWN0UmVzb3VyY2UocFppcCwgImltYWdlcyIsIGZpbGVOYW1lLnN0cigpLCAiLnBuZyIsIFRNUF9SRVNPVVJDRV9OQU1FKSAhPSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAotICAgICAgICAgICAgaWYgKHJlc19jcmVhdGVfc3VyZmFjZShUTVBfUkVTT1VSQ0VfTkFNRSwgJnN1cmZhY2UpKQotICAgICAgICAgICAgICAgIGJyZWFrOworCQlncl9zdXJmYWNlIHN1cmZhY2U7CisJCWlmIChwWmlwKQorCQl7CisJCQlpZiAoRXh0cmFjdFJlc291cmNlKHBaaXAsICJpbWFnZXMiLCBmaWxlTmFtZS5zdHIoKSwgIi5wbmciLCBUTVBfUkVTT1VSQ0VfTkFNRSkgIT0gMCkKKwkJCQlicmVhazsKKwkKKwkJCWlmIChyZXNfY3JlYXRlX3N1cmZhY2UoVE1QX1JFU09VUkNFX05BTUUsICZzdXJmYWNlKSkKKwkJCQlicmVhazsKIAotICAgICAgICAgICAgdW5saW5rKFRNUF9SRVNPVVJDRV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXNfY3JlYXRlX3N1cmZhY2UoZmlsZU5hbWUuc3RyKCkuY19zdHIoKSwgJnN1cmZhY2UpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlcy5wdXNoX2JhY2soc3VyZmFjZSk7Ci0gICAgICAgIGZpbGVOdW0rKzsKLSAgICB9CisJCQl1bmxpbmsoVE1QX1JFU09VUkNFX05BTUUpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHJlc19jcmVhdGVfc3VyZmFjZShmaWxlTmFtZS5zdHIoKS5jX3N0cigpLCAmc3VyZmFjZSkpCisJCQkJYnJlYWs7CisJCX0KKwkJbVN1cmZhY2VzLnB1c2hfYmFjayhzdXJmYWNlKTsKKwkJZmlsZU51bSsrOworCX0KIH0KIAogQW5pbWF0aW9uUmVzb3VyY2U6On5BbmltYXRpb25SZXNvdXJjZSgpCiB7Ci0gICAgc3RkOjp2ZWN0b3I8Z3Jfc3VyZmFjZT46Oml0ZXJhdG9yIGl0OworCXN0ZDo6dmVjdG9yPGdyX3N1cmZhY2U+OjppdGVyYXRvciBpdDsKIAotICAgIGZvciAoaXQgPSBtU3VyZmFjZXMuYmVnaW4oKTsgaXQgIT0gbVN1cmZhY2VzLmVuZCgpOyArK2l0KQotICAgIHsKLSAgICAgICAgcmVzX2ZyZWVfc3VyZmFjZSgqaXQpOwotICAgIH0KLSAgICBtU3VyZmFjZXMuY2xlYXIoKTsKKwlmb3IgKGl0ID0gbVN1cmZhY2VzLmJlZ2luKCk7IGl0ICE9IG1TdXJmYWNlcy5lbmQoKTsgKytpdCkKKwkJcmVzX2ZyZWVfc3VyZmFjZSgqaXQpOworCisJbVN1cmZhY2VzLmNsZWFyKCk7CiB9CiAKIFJlc291cmNlKiBSZXNvdXJjZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShzdGQ6OnN0cmluZyBuYW1lKQogewotICAgIHN0ZDo6dmVjdG9yPFJlc291cmNlKj46Oml0ZXJhdG9yIGl0ZXI7CisJc3RkOjp2ZWN0b3I8UmVzb3VyY2UqPjo6aXRlcmF0b3IgaXRlcjsKIAotICAgIGZvciAoaXRlciA9IG1SZXNvdXJjZXMuYmVnaW4oKTsgaXRlciAhPSBtUmVzb3VyY2VzLmVuZCgpOyBpdGVyKyspCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSAoKml0ZXIpLT5HZXROYW1lKCkpCi0gICAgICAgICAgICByZXR1cm4gKCppdGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisJZm9yIChpdGVyID0gbVJlc291cmNlcy5iZWdpbigpOyBpdGVyICE9IG1SZXNvdXJjZXMuZW5kKCk7IGl0ZXIrKykKKwl7CisJCWlmIChuYW1lID09ICgqaXRlciktPkdldE5hbWUoKSkKKwkJCXJldHVybiAoKml0ZXIpOworCX0KKwlyZXR1cm4gTlVMTDsKIH0KIAogUmVzb3VyY2VNYW5hZ2VyOjpSZXNvdXJjZU1hbmFnZXIoeG1sX25vZGU8PiogcmVzTGlzdCwgWmlwQXJjaGl2ZSogcFppcCkKIHsKLSAgICB4bWxfbm9kZTw+KiBjaGlsZDsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKIAotICAgIGlmICghcmVzTGlzdCkgICAgICAgcmV0dXJuOworCWlmICghcmVzTGlzdCkKKwkJcmV0dXJuOwogCi0gICAgY2hpbGQgPSByZXNMaXN0LT5maXJzdF9ub2RlKCJyZXNvdXJjZSIpOwotICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgidHlwZSIpOwotICAgICAgICBpZiAoIWF0dHIpCi0gICAgICAgICAgICBicmVhazsKKwljaGlsZCA9IHJlc0xpc3QtPmZpcnN0X25vZGUoInJlc291cmNlIik7CisJd2hpbGUgKGNoaWxkICE9IE5VTEwpCisJeworCQl4bWxfYXR0cmlidXRlPD4qIGF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ0eXBlIik7CisJCWlmICghYXR0cikKKwkJCWJyZWFrOwogCiAJCXN0ZDo6c3RyaW5nIHR5cGUgPSBhdHRyLT52YWx1ZSgpOwogCi0gICAgICAgIGlmICh0eXBlID09ICJmb250IikKLSAgICAgICAgewotICAgICAgICAgICAgRm9udFJlc291cmNlKiByZXMgPSBuZXcgRm9udFJlc291cmNlKGNoaWxkLCBwWmlwKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCB8fCByZXMtPkdldFJlc291cmNlKCkgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4bWxfYXR0cmlidXRlPD4qIGF0dHJfbmFtZSA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKKwkJaWYgKHR5cGUgPT0gImZvbnQiKQorCQl7CisJCQlGb250UmVzb3VyY2UqIHJlcyA9IG5ldyBGb250UmVzb3VyY2UoY2hpbGQsIHBaaXApOworCQkJaWYgKHJlcyA9PSBOVUxMIHx8IHJlcy0+R2V0UmVzb3VyY2UoKSA9PSBOVUxMKQorCQkJeworCQkJCXhtbF9hdHRyaWJ1dGU8PiogYXR0cl9uYW1lID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgibmFtZSIpOwogCiAJCQkJaWYgKCFhdHRyX25hbWUpIHsKIAkJCQkJc3RkOjpzdHJpbmcgcmVzX25hbWUgPSBhdHRyX25hbWUtPnZhbHVlKCk7CkBAIC0yMTAsMzkgKzIxMCwxOSBAQAogCQkJCX0gZWxzZQogCQkJCQlMT0dFUlIoIlJlc291cmNlIHR5cGUgKCVzKSBmYWlsZWQgdG8gbG9hZFxuIiwgdHlwZS5jX3N0cigpKTsKIAotICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5wdXNoX2JhY2soKFJlc291cmNlKikgcmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0eXBlID09ICJpbWFnZSIpCi0gICAgICAgIHsKLQkJCUltYWdlUmVzb3VyY2UqIHJlcyA9IG5ldyBJbWFnZVJlc291cmNlKGNoaWxkLCBwWmlwKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCB8fCByZXMtPkdldFJlc291cmNlKCkgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4bWxfYXR0cmlidXRlPD4qIGF0dHJfbmFtZSA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKLQotCQkJCWlmICghYXR0cl9uYW1lKSB7Ci0JCQkJCXN0ZDo6c3RyaW5nIHJlc19uYW1lID0gYXR0cl9uYW1lLT52YWx1ZSgpOwotCQkJCQlMT0dFUlIoIlJlc291cmNlICglcyktKCVzKSBmYWlsZWQgdG8gbG9hZFxuIiwgdHlwZS5jX3N0cigpLCByZXNfbmFtZS5jX3N0cigpKTsKLQkJCQl9IGVsc2UKLQkJCQkJTE9HRVJSKCJSZXNvdXJjZSB0eXBlICglcykgZmFpbGVkIHRvIGxvYWRcbiIsIHR5cGUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBkZWxldGUgcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworCQkJCWRlbGV0ZSByZXM7CisJCQl9CisJCQllbHNlCisJCQl7CiAJCQkJbVJlc291cmNlcy5wdXNoX2JhY2soKFJlc291cmNlKikgcmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0eXBlID09ICJhbmltYXRpb24iKQotICAgICAgICB7Ci0gICAgICAgICAgICBBbmltYXRpb25SZXNvdXJjZSogcmVzID0gbmV3IEFuaW1hdGlvblJlc291cmNlKGNoaWxkLCBwWmlwKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCB8fCByZXMtPkdldFJlc291cmNlKCkgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4bWxfYXR0cmlidXRlPD4qIGF0dHJfbmFtZSA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJpbWFnZSIpCisJCXsKKwkJCUltYWdlUmVzb3VyY2UqIHJlcyA9IG5ldyBJbWFnZVJlc291cmNlKGNoaWxkLCBwWmlwKTsKKwkJCWlmIChyZXMgPT0gTlVMTCB8fCByZXMtPkdldFJlc291cmNlKCkgPT0gTlVMTCkKKwkJCXsKKwkJCQl4bWxfYXR0cmlidXRlPD4qIGF0dHJfbmFtZSA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKIAogCQkJCWlmICghYXR0cl9uYW1lKSB7CiAJCQkJCXN0ZDo6c3RyaW5nIHJlc19uYW1lID0gYXR0cl9uYW1lLT52YWx1ZSgpOwpAQCAtMjUwLDMwICsyMzAsNDggQEAKIAkJCQl9IGVsc2UKIAkJCQkJTE9HRVJSKCJSZXNvdXJjZSB0eXBlICglcykgZmFpbGVkIHRvIGxvYWRcbiIsIHR5cGUuY19zdHIoKSk7CiAKLSAgICAgICAgICAgICAgICBkZWxldGUgcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMucHVzaF9iYWNrKChSZXNvdXJjZSopIHJlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0dFUlIoIlJlc291cmNlIHR5cGUgKCVzKSBub3Qgc3VwcG9ydGVkLlxuIiwgdHlwZS5jX3N0cigpKTsKLSAgICAgICAgfQorCQkJCWRlbGV0ZSByZXM7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbVJlc291cmNlcy5wdXNoX2JhY2soKFJlc291cmNlKikgcmVzKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICh0eXBlID09ICJhbmltYXRpb24iKQorCQl7CisJCQlBbmltYXRpb25SZXNvdXJjZSogcmVzID0gbmV3IEFuaW1hdGlvblJlc291cmNlKGNoaWxkLCBwWmlwKTsKKwkJCWlmIChyZXMgPT0gTlVMTCB8fCByZXMtPkdldFJlc291cmNlKCkgPT0gTlVMTCkKKwkJCXsKKwkJCQl4bWxfYXR0cmlidXRlPD4qIGF0dHJfbmFtZSA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoIm5hbWUiKTsKIAotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0X3NpYmxpbmcoInJlc291cmNlIik7Ci0gICAgfQorCQkJCWlmICghYXR0cl9uYW1lKSB7CisJCQkJCXN0ZDo6c3RyaW5nIHJlc19uYW1lID0gYXR0cl9uYW1lLT52YWx1ZSgpOworCQkJCQlMT0dFUlIoIlJlc291cmNlICglcyktKCVzKSBmYWlsZWQgdG8gbG9hZFxuIiwgdHlwZS5jX3N0cigpLCByZXNfbmFtZS5jX3N0cigpKTsKKwkJCQl9IGVsc2UKKwkJCQkJTE9HRVJSKCJSZXNvdXJjZSB0eXBlICglcykgZmFpbGVkIHRvIGxvYWRcbiIsIHR5cGUuY19zdHIoKSk7CisKKwkJCQlkZWxldGUgcmVzOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1SZXNvdXJjZXMucHVzaF9iYWNrKChSZXNvdXJjZSopIHJlcyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlMT0dFUlIoIlJlc291cmNlIHR5cGUgKCVzKSBub3Qgc3VwcG9ydGVkLlxuIiwgdHlwZS5jX3N0cigpKTsKKwkJfQorCisJCWNoaWxkID0gY2hpbGQtPm5leHRfc2libGluZygicmVzb3VyY2UiKTsKKwl9CiB9CiAKIFJlc291cmNlTWFuYWdlcjo6flJlc291cmNlTWFuYWdlcigpCiB7Ci0gICAgc3RkOjp2ZWN0b3I8UmVzb3VyY2UqPjo6aXRlcmF0b3IgaXRlcjsKKwlzdGQ6OnZlY3RvcjxSZXNvdXJjZSo+OjppdGVyYXRvciBpdGVyOwogCi0gICAgZm9yIChpdGVyID0gbVJlc291cmNlcy5iZWdpbigpOyBpdGVyICE9IG1SZXNvdXJjZXMuZW5kKCk7IGl0ZXIrKykKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSAqaXRlcjsKLSAgICB9Ci0gICAgbVJlc291cmNlcy5jbGVhcigpOworCWZvciAoaXRlciA9IG1SZXNvdXJjZXMuYmVnaW4oKTsgaXRlciAhPSBtUmVzb3VyY2VzLmVuZCgpOyBpdGVyKyspCisJCWRlbGV0ZSAqaXRlcjsKKworCW1SZXNvdXJjZXMuY2xlYXIoKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3VpL3Jlc291cmNlcy5ocHAgYi9ndWkvcmVzb3VyY2VzLmhwcAppbmRleCA2Y2I1ZGEyLi40ZTA1ZTQxIDEwMDY0NAotLS0gYS9ndWkvcmVzb3VyY2VzLmhwcAorKysgYi9ndWkvcmVzb3VyY2VzLmhwcApAQCAtNywyNCArNywyNCBAQAogY2xhc3MgUmVzb3VyY2UKIHsKIHB1YmxpYzoKLSAgICBSZXNvdXJjZSh4bWxfbm9kZTw+KiBub2RlLCBaaXBBcmNoaXZlKiBwWmlwKTsKLSAgICB2aXJ0dWFsIH5SZXNvdXJjZSgpICAgICAgICAge30KKwlSZXNvdXJjZSh4bWxfbm9kZTw+KiBub2RlLCBaaXBBcmNoaXZlKiBwWmlwKTsKKwl2aXJ0dWFsIH5SZXNvdXJjZSgpIHt9CiAKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQqIEdldFJlc291cmNlKHZvaWQpID0gMDsKLSAgICBzdGQ6OnN0cmluZyBHZXROYW1lKHZvaWQpIHsgcmV0dXJuIG1OYW1lOyB9CisJdmlydHVhbCB2b2lkKiBHZXRSZXNvdXJjZSh2b2lkKSA9IDA7CisJc3RkOjpzdHJpbmcgR2V0TmFtZSh2b2lkKSB7IHJldHVybiBtTmFtZTsgfQogCiBwcml2YXRlOgotICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworCXN0ZDo6c3RyaW5nIG1OYW1lOwogCiBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGludCBFeHRyYWN0UmVzb3VyY2UoWmlwQXJjaGl2ZSogcFppcCwgc3RkOjpzdHJpbmcgZm9sZGVyTmFtZSwgc3RkOjpzdHJpbmcgZmlsZU5hbWUsIHN0ZDo6c3RyaW5nIGZpbGVFeHRuLCBzdGQ6OnN0cmluZyBkZXN0RmlsZSk7CisJc3RhdGljIGludCBFeHRyYWN0UmVzb3VyY2UoWmlwQXJjaGl2ZSogcFppcCwgc3RkOjpzdHJpbmcgZm9sZGVyTmFtZSwgc3RkOjpzdHJpbmcgZmlsZU5hbWUsIHN0ZDo6c3RyaW5nIGZpbGVFeHRuLCBzdGQ6OnN0cmluZyBkZXN0RmlsZSk7CiB9OwogCiB0eXBlZGVmIGVudW0gewotICAgIFRPVUNIX1NUQVJUID0gMCwgCi0gICAgVE9VQ0hfRFJBRyA9IDEsCi0gICAgVE9VQ0hfUkVMRUFTRSA9IDIsCisJVE9VQ0hfU1RBUlQgPSAwLCAKKwlUT1VDSF9EUkFHID0gMSwKKwlUT1VDSF9SRUxFQVNFID0gMiwKIAlUT1VDSF9IT0xEID0gMywKIAlUT1VDSF9SRVBFQVQgPSA0CiB9IFRPVUNIX1NUQVRFOwpAQCAtMzIsNTYgKzMyLDU1IEBACiBjbGFzcyBGb250UmVzb3VyY2UgOiBwdWJsaWMgUmVzb3VyY2UKIHsKIHB1YmxpYzoKLSAgICBGb250UmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCk7Ci0gICAgdmlydHVhbCB+Rm9udFJlc291cmNlKCk7CisJRm9udFJlc291cmNlKHhtbF9ub2RlPD4qIG5vZGUsIFppcEFyY2hpdmUqIHBaaXApOworCXZpcnR1YWwgfkZvbnRSZXNvdXJjZSgpOwogCiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkKiBHZXRSZXNvdXJjZSh2b2lkKSB7IHJldHVybiBtRm9udDsgfQorCXZpcnR1YWwgdm9pZCogR2V0UmVzb3VyY2Uodm9pZCkgeyByZXR1cm4gbUZvbnQ7IH0KIAogcHJvdGVjdGVkOgotICAgIHZvaWQqIG1Gb250OworCXZvaWQqIG1Gb250OwogfTsKIAogY2xhc3MgSW1hZ2VSZXNvdXJjZSA6IHB1YmxpYyBSZXNvdXJjZQogewogcHVibGljOgotICAgIEltYWdlUmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCk7Ci0gICAgdmlydHVhbCB+SW1hZ2VSZXNvdXJjZSgpOworCUltYWdlUmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCk7CisJdmlydHVhbCB+SW1hZ2VSZXNvdXJjZSgpOwogCiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkKiBHZXRSZXNvdXJjZSh2b2lkKSB7IHJldHVybiBtU3VyZmFjZTsgfQorCXZpcnR1YWwgdm9pZCogR2V0UmVzb3VyY2Uodm9pZCkgeyByZXR1cm4gbVN1cmZhY2U7IH0KIAogcHJvdGVjdGVkOgotICAgIGdyX3N1cmZhY2UgbVN1cmZhY2U7CisJZ3Jfc3VyZmFjZSBtU3VyZmFjZTsKIH07CiAKIGNsYXNzIEFuaW1hdGlvblJlc291cmNlIDogcHVibGljIFJlc291cmNlCiB7CiBwdWJsaWM6Ci0gICAgQW5pbWF0aW9uUmVzb3VyY2UoeG1sX25vZGU8Piogbm9kZSwgWmlwQXJjaGl2ZSogcFppcCk7Ci0gICAgdmlydHVhbCB+QW5pbWF0aW9uUmVzb3VyY2UoKTsKKwlBbmltYXRpb25SZXNvdXJjZSh4bWxfbm9kZTw+KiBub2RlLCBaaXBBcmNoaXZlKiBwWmlwKTsKKwl2aXJ0dWFsIH5BbmltYXRpb25SZXNvdXJjZSgpOwogCiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkKiBHZXRSZXNvdXJjZSh2b2lkKSAgICAgICAgIHsgcmV0dXJuIG1TdXJmYWNlcy5hdCgwKTsgfQotICAgIHZpcnR1YWwgdm9pZCogR2V0UmVzb3VyY2UoaW50IGVudHJ5KSAgICB7IHJldHVybiBtU3VyZmFjZXMuYXQoZW50cnkpOyB9Ci0gICAgdmlydHVhbCBpbnQgR2V0UmVzb3VyY2VDb3VudCh2b2lkKSAgICAgIHsgcmV0dXJuIG1TdXJmYWNlcy5zaXplKCk7IH0KKwl2aXJ0dWFsIHZvaWQqIEdldFJlc291cmNlKHZvaWQpIHsgcmV0dXJuIG1TdXJmYWNlcy5hdCgwKTsgfQorCXZpcnR1YWwgdm9pZCogR2V0UmVzb3VyY2UoaW50IGVudHJ5KSB7IHJldHVybiBtU3VyZmFjZXMuYXQoZW50cnkpOyB9CisJdmlydHVhbCBpbnQgR2V0UmVzb3VyY2VDb3VudCh2b2lkKSB7IHJldHVybiBtU3VyZmFjZXMuc2l6ZSgpOyB9CiAKIHByb3RlY3RlZDoKLSAgICBzdGQ6OnZlY3Rvcjxncl9zdXJmYWNlPiBtU3VyZmFjZXM7CisJc3RkOjp2ZWN0b3I8Z3Jfc3VyZmFjZT4gbVN1cmZhY2VzOwogfTsKIAogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyCiB7CiBwdWJsaWM6Ci0gICAgUmVzb3VyY2VNYW5hZ2VyKHhtbF9ub2RlPD4qIHJlc0xpc3QsIFppcEFyY2hpdmUqIHBaaXApOwotICAgIHZpcnR1YWwgflJlc291cmNlTWFuYWdlcigpOworCVJlc291cmNlTWFuYWdlcih4bWxfbm9kZTw+KiByZXNMaXN0LCBaaXBBcmNoaXZlKiBwWmlwKTsKKwl2aXJ0dWFsIH5SZXNvdXJjZU1hbmFnZXIoKTsKIAogcHVibGljOgotICAgIFJlc291cmNlKiBGaW5kUmVzb3VyY2Uoc3RkOjpzdHJpbmcgbmFtZSk7CisJUmVzb3VyY2UqIEZpbmRSZXNvdXJjZShzdGQ6OnN0cmluZyBuYW1lKTsKIAogcHJpdmF0ZToKLSAgICBzdGQ6OnZlY3RvcjxSZXNvdXJjZSo+IG1SZXNvdXJjZXM7CisJc3RkOjp2ZWN0b3I8UmVzb3VyY2UqPiBtUmVzb3VyY2VzOwogfTsKIAogI2VuZGlmICAvLyBfUkVTT1VSQ0VfSEVBREVSCi0KZGlmZiAtLWdpdCBhL2d1aS9zbGlkZXIuY3BwIGIvZ3VpL3NsaWRlci5jcHAKaW5kZXggNDU0MmQ2MC4uYjQ2ZDE1NiAxMDA2NDQKLS0tIGEvZ3VpL3NsaWRlci5jcHAKKysrIGIvZ3VpL3NsaWRlci5jcHAKQEAgLTI4LDE0MyArMjgsMTQzIEBACiAKIEdVSVNsaWRlcjo6R1VJU2xpZGVyKHhtbF9ub2RlPD4qIG5vZGUpCiB7Ci0gICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOwotICAgIHhtbF9ub2RlPD4qIGNoaWxkOworCXhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKIAotICAgIHNBY3Rpb24gPSBOVUxMOwotICAgIHNTbGlkZXIgPSBOVUxMOwotICAgIHNTbGlkZXJVc2VkID0gTlVMTDsKLSAgICBzVG91Y2ggPSBOVUxMOwotICAgIHNUb3VjaFcgPSAyMDsKKwlzQWN0aW9uID0gTlVMTDsKKwlzU2xpZGVyID0gTlVMTDsKKwlzU2xpZGVyVXNlZCA9IE5VTEw7CisJc1RvdWNoID0gTlVMTDsKKwlzVG91Y2hXID0gMjA7CiAKLSAgICBpZiAoIW5vZGUpCi0gICAgewotICAgICAgICBMT0dFUlIoIkdVSVNsaWRlciBjcmVhdGVkIHdpdGhvdXQgWE1MIG5vZGVcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCWlmICghbm9kZSkKKwl7CisJCUxPR0VSUigiR1VJU2xpZGVyIGNyZWF0ZWQgd2l0aG91dCBYTUwgbm9kZVxuIik7CisJCXJldHVybjsKKwl9CiAKLSAgICBjaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoInJlc291cmNlIik7Ci0gICAgaWYgKGNoaWxkKQotICAgIHsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImJhc2UiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICBzU2xpZGVyID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKKwljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoInJlc291cmNlIik7CisJaWYgKGNoaWxkKQorCXsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImJhc2UiKTsKKwkJaWYgKGF0dHIpCisJCQlzU2xpZGVyID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKIAotICAgICAgICBhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgidXNlZCIpOwotICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgICAgIHNTbGlkZXJVc2VkID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInVzZWQiKTsKKwkJaWYgKGF0dHIpCisJCQlzU2xpZGVyVXNlZCA9IFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2UoYXR0ci0+dmFsdWUoKSk7CiAKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInRvdWNoIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgc1RvdWNoID0gUGFnZU1hbmFnZXI6OkZpbmRSZXNvdXJjZShhdHRyLT52YWx1ZSgpKTsKLSAgICB9CisJCWF0dHIgPSBjaGlsZC0+Zmlyc3RfYXR0cmlidXRlKCJ0b3VjaCIpOworCQlpZiAoYXR0cikKKwkJCXNUb3VjaCA9IFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2UoYXR0ci0+dmFsdWUoKSk7CisJfQogCi0gICAgLy8gTG9hZCB0aGUgcGxhY2VtZW50CisJLy8gTG9hZCB0aGUgcGxhY2VtZW50CiAJTG9hZFBsYWNlbWVudChub2RlLT5maXJzdF9ub2RlKCJwbGFjZW1lbnQiKSwgJm1SZW5kZXJYLCAmbVJlbmRlclkpOwogCi0gICAgaWYgKHNTbGlkZXIgJiYgc1NsaWRlci0+R2V0UmVzb3VyY2UoKSkKLSAgICB7CisJaWYgKHNTbGlkZXIgJiYgc1NsaWRlci0+R2V0UmVzb3VyY2UoKSkKKwl7CiAJCW1SZW5kZXJXID0gZ3JfZ2V0X3dpZHRoKHNTbGlkZXItPkdldFJlc291cmNlKCkpOwotICAgICAgICBtUmVuZGVySCA9IGdyX2dldF9oZWlnaHQoc1NsaWRlci0+R2V0UmVzb3VyY2UoKSk7Ci0gICAgfQotICAgIGlmIChzVG91Y2ggJiYgc1RvdWNoLT5HZXRSZXNvdXJjZSgpKQotICAgIHsKLSAgICAgICAgc1RvdWNoVyA9IGdyX2dldF93aWR0aChzVG91Y2gtPkdldFJlc291cmNlKCkpOyAgLy8gV2lkdGggb2YgdGhlICJ0b3VjaCBpbWFnZSIgdGhhdCBmb2xsb3dzIHRoZSB0b3VjaCAoYXJyb3cpCi0gICAgICAgIHNUb3VjaEggPSBncl9nZXRfaGVpZ2h0KHNUb3VjaC0+R2V0UmVzb3VyY2UoKSk7IC8vIEhlaWdodCBvZiB0aGUgInRvdWNoIGltYWdlIiB0aGF0IGZvbGxvd3MgdGhlIHRvdWNoIChhcnJvdykKLSAgICB9CisJCW1SZW5kZXJIID0gZ3JfZ2V0X2hlaWdodChzU2xpZGVyLT5HZXRSZXNvdXJjZSgpKTsKKwl9CisJaWYgKHNUb3VjaCAmJiBzVG91Y2gtPkdldFJlc291cmNlKCkpCisJeworCQlzVG91Y2hXID0gZ3JfZ2V0X3dpZHRoKHNUb3VjaC0+R2V0UmVzb3VyY2UoKSk7ICAvLyBXaWR0aCBvZiB0aGUgInRvdWNoIGltYWdlIiB0aGF0IGZvbGxvd3MgdGhlIHRvdWNoIChhcnJvdykKKwkJc1RvdWNoSCA9IGdyX2dldF9oZWlnaHQoc1RvdWNoLT5HZXRSZXNvdXJjZSgpKTsgLy8gSGVpZ2h0IG9mIHRoZSAidG91Y2ggaW1hZ2UiIHRoYXQgZm9sbG93cyB0aGUgdG91Y2ggKGFycm93KQorCX0KIAotICAgIC8vTE9HSU5GTygibVJlbmRlclc6ICVpIG1Ub3VjaFc6ICVpXG4iLCBtUmVuZGVyVywgbVRvdWNoVyk7CisJLy9MT0dJTkZPKCJtUmVuZGVyVzogJWkgbVRvdWNoVzogJWlcbiIsIG1SZW5kZXJXLCBtVG91Y2hXKTsKIAltQWN0aW9uWCA9IG1SZW5kZXJYOwotICAgIG1BY3Rpb25ZID0gbVJlbmRlclk7Ci0gICAgbUFjdGlvblcgPSBtUmVuZGVyVzsKLSAgICBtQWN0aW9uSCA9IG1SZW5kZXJIOworCW1BY3Rpb25ZID0gbVJlbmRlclk7CisJbUFjdGlvblcgPSBtUmVuZGVyVzsKKwltQWN0aW9uSCA9IG1SZW5kZXJIOwogCi0gICAgc0FjdGlvbiA9IG5ldyBHVUlBY3Rpb24obm9kZSk7CisJc0FjdGlvbiA9IG5ldyBHVUlBY3Rpb24obm9kZSk7CiAKLSAgICBzQ3VyVG91Y2hYID0gbVJlbmRlclg7Ci0gICAgc1VwZGF0ZSA9IDE7Ci0KLSAgICByZXR1cm47CisJc0N1clRvdWNoWCA9IG1SZW5kZXJYOworCXNVcGRhdGUgPSAxOwogfQogCiBHVUlTbGlkZXI6On5HVUlTbGlkZXIoKQogewotICAgIGRlbGV0ZSBzQWN0aW9uOworCWRlbGV0ZSBzQWN0aW9uOwogfQogCiBpbnQgR1VJU2xpZGVyOjpSZW5kZXIodm9pZCkKIHsKLSAgICBpZiAoIXNTbGlkZXIgfHwgIXNTbGlkZXItPkdldFJlc291cmNlKCkpICAgICAgIHJldHVybiAtMTsKKwlpZiAoIXNTbGlkZXIgfHwgIXNTbGlkZXItPkdldFJlc291cmNlKCkpCisJCXJldHVybiAtMTsKIAotICAgIC8vIERyYXcgdGhlIHNsaWRlcgotICAgIGdyX2JsaXQoc1NsaWRlci0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbVJlbmRlclcsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOworCS8vIERyYXcgdGhlIHNsaWRlcgorCWdyX2JsaXQoc1NsaWRlci0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgbVJlbmRlclcsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOwogCi0gICAgLy8gRHJhdyB0aGUgdXNlZAotICAgIGlmIChzU2xpZGVyVXNlZCAmJiBzU2xpZGVyVXNlZC0+R2V0UmVzb3VyY2UoKSAmJiBzQ3VyVG91Y2hYID4gbVJlbmRlclgpCi0gICAgewotICAgICAgICBncl9ibGl0KHNTbGlkZXJVc2VkLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBzQ3VyVG91Y2hYIC0gbVJlbmRlclgsIG1SZW5kZXJILCBtUmVuZGVyWCwgbVJlbmRlclkpOwotICAgIH0KKwkvLyBEcmF3IHRoZSB1c2VkCisJaWYgKHNTbGlkZXJVc2VkICYmIHNTbGlkZXJVc2VkLT5HZXRSZXNvdXJjZSgpICYmIHNDdXJUb3VjaFggPiBtUmVuZGVyWCkKKwkJZ3JfYmxpdChzU2xpZGVyVXNlZC0+R2V0UmVzb3VyY2UoKSwgMCwgMCwgc0N1clRvdWNoWCAtIG1SZW5kZXJYLCBtUmVuZGVySCwgbVJlbmRlclgsIG1SZW5kZXJZKTsKIAotICAgIC8vIERyYXcgdGhlIHRvdWNoIGljb24KLSAgICBpZiAoc1RvdWNoICYmIHNUb3VjaC0+R2V0UmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICAgIGdyX2JsaXQoc1RvdWNoLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBzVG91Y2hXLCBzVG91Y2hILCBzQ3VyVG91Y2hYLCAobVJlbmRlclkgKyAoKG1SZW5kZXJIIC0gc1RvdWNoSCkgLyAyKSkpOwotICAgIH0KKwkvLyBEcmF3IHRoZSB0b3VjaCBpY29uCisJaWYgKHNUb3VjaCAmJiBzVG91Y2gtPkdldFJlc291cmNlKCkpCisJCWdyX2JsaXQoc1RvdWNoLT5HZXRSZXNvdXJjZSgpLCAwLCAwLCBzVG91Y2hXLCBzVG91Y2hILCBzQ3VyVG91Y2hYLCAobVJlbmRlclkgKyAoKG1SZW5kZXJIIC0gc1RvdWNoSCkgLyAyKSkpOwogCi0gICAgc1VwZGF0ZSA9IDA7Ci0gICAgcmV0dXJuIDA7CisJc1VwZGF0ZSA9IDA7CisJcmV0dXJuIDA7CiB9CiAKIGludCBHVUlTbGlkZXI6OlVwZGF0ZSh2b2lkKQogewotICAgIGlmIChzVXBkYXRlKSAgICByZXR1cm4gMjsKLSAgICByZXR1cm4gMDsKKwlpZiAoc1VwZGF0ZSkKKwkJcmV0dXJuIDI7CisJcmV0dXJuIDA7CiB9CiAKIGludCBHVUlTbGlkZXI6Ok5vdGlmeVRvdWNoKFRPVUNIX1NUQVRFIHN0YXRlLCBpbnQgeCwgaW50IHkpCiB7Ci0gICAgc3RhdGljIGJvb2wgZHJhZ2dpbmcgPSBmYWxzZTsKKwlzdGF0aWMgYm9vbCBkcmFnZ2luZyA9IGZhbHNlOwogCiAJc3dpdGNoIChzdGF0ZSkKLSAgICB7Ci0gICAgY2FzZSBUT1VDSF9TVEFSVDoKLSAgICAgICAgaWYgKHggPj0gbVJlbmRlclggJiYgeCA8PSBtUmVuZGVyWCArIHNUb3VjaFcgJiYgCi0gICAgICAgICAgICB5ID49IG1SZW5kZXJZICYmIHkgPD0gbVJlbmRlclkgKyBtUmVuZGVySCkKLSAgICAgICAgewotICAgICAgICAgICAgc0N1clRvdWNoWCA9IHggLSAoc1RvdWNoVyAvIDIpOwotICAgICAgICAgICAgaWYgKHNDdXJUb3VjaFggPCBtUmVuZGVyWCkgIHNDdXJUb3VjaFggPSBtUmVuZGVyWDsKLSAgICAgICAgICAgIGRyYWdnaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKwl7CisJY2FzZSBUT1VDSF9TVEFSVDoKKwkJaWYgKHggPj0gbVJlbmRlclggJiYgeCA8PSBtUmVuZGVyWCArIHNUb3VjaFcgJiYgCisJCQl5ID49IG1SZW5kZXJZICYmIHkgPD0gbVJlbmRlclkgKyBtUmVuZGVySCkKKwkJeworCQkJc0N1clRvdWNoWCA9IHggLSAoc1RvdWNoVyAvIDIpOworCQkJaWYgKHNDdXJUb3VjaFggPCBtUmVuZGVyWCkKKwkJCQlzQ3VyVG91Y2hYID0gbVJlbmRlclg7CisJCQlkcmFnZ2luZyA9IHRydWU7CisJCX0KKwkJYnJlYWs7CiAKLSAgICBjYXNlIFRPVUNIX0RSQUc6Ci0gICAgICAgIGlmICghZHJhZ2dpbmcpICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHkgPCBtUmVuZGVyWSAtIHNUb3VjaEggfHwgeSA+IG1SZW5kZXJZICsgKHNUb3VjaEggKiAyKSkKLSAgICAgICAgewotICAgICAgICAgICAgc0N1clRvdWNoWCA9IG1SZW5kZXJYOwotICAgICAgICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIHNVcGRhdGUgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc0N1clRvdWNoWCA9IHggLSAoc1RvdWNoVyAvIDIpOwotICAgICAgICBpZiAoc0N1clRvdWNoWCA8IG1SZW5kZXJYKSAgICAgICAgICAgICAgICAgICAgICAgICAgc0N1clRvdWNoWCA9IG1SZW5kZXJYOwotICAgICAgICBpZiAoc0N1clRvdWNoWCA+IG1SZW5kZXJYICsgbVJlbmRlclcgLSBzVG91Y2hXKSAgICAgc0N1clRvdWNoWCA9IG1SZW5kZXJYICsgbVJlbmRlclcgLSBzVG91Y2hXOwotICAgICAgICBzVXBkYXRlID0gMTsKLSAgICAgICAgYnJlYWs7CisJY2FzZSBUT1VDSF9EUkFHOgorCQlpZiAoIWRyYWdnaW5nKQorCQkJcmV0dXJuIDA7CisJCWlmICh5IDwgbVJlbmRlclkgLSBzVG91Y2hIIHx8IHkgPiBtUmVuZGVyWSArIChzVG91Y2hIICogMikpCisJCXsKKwkJCXNDdXJUb3VjaFggPSBtUmVuZGVyWDsKKwkJCWRyYWdnaW5nID0gZmFsc2U7CisJCQlzVXBkYXRlID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXNDdXJUb3VjaFggPSB4IC0gKHNUb3VjaFcgLyAyKTsKKwkJaWYgKHNDdXJUb3VjaFggPCBtUmVuZGVyWCkKKwkJCXNDdXJUb3VjaFggPSBtUmVuZGVyWDsKKwkJaWYgKHNDdXJUb3VjaFggPiBtUmVuZGVyWCArIG1SZW5kZXJXIC0gc1RvdWNoVykKKwkJCXNDdXJUb3VjaFggPSBtUmVuZGVyWCArIG1SZW5kZXJXIC0gc1RvdWNoVzsKKwkJc1VwZGF0ZSA9IDE7CisJCWJyZWFrOwogCi0gICAgY2FzZSBUT1VDSF9SRUxFQVNFOgotICAgICAgICBpZiAoIWRyYWdnaW5nKSAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChzQ3VyVG91Y2hYID49IG1SZW5kZXJYICsgbVJlbmRlclcgLSBzVG91Y2hXKQotICAgICAgICB7Ci0gICAgICAgICAgICBzQWN0aW9uLT5kb0FjdGlvbnMoKTsKLSAgICAgICAgfQotICAgICAgICBzQ3VyVG91Y2hYID0gbVJlbmRlclg7Ci0gICAgICAgIGRyYWdnaW5nID0gZmFsc2U7Ci0gICAgICAgIHNVcGRhdGUgPSAxOworCWNhc2UgVE9VQ0hfUkVMRUFTRToKKwkJaWYgKCFkcmFnZ2luZykKKwkJCXJldHVybiAwOworCisJCWlmIChzQ3VyVG91Y2hYID49IG1SZW5kZXJYICsgbVJlbmRlclcgLSBzVG91Y2hXKQorCQkJc0FjdGlvbi0+ZG9BY3Rpb25zKCk7CisKKwkJc0N1clRvdWNoWCA9IG1SZW5kZXJYOworCQlkcmFnZ2luZyA9IGZhbHNlOworCQlzVXBkYXRlID0gMTsKIAljYXNlIFRPVUNIX1JFUEVBVDoKIAljYXNlIFRPVUNIX0hPTEQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9ndWkvdGV4dC5jcHAgYi9ndWkvdGV4dC5jcHAKaW5kZXggNDZhNjYyMi4uN2ViNmMxOCAxMDA2NDQKLS0tIGEvZ3VpL3RleHQuY3BwCisrKyBiL2d1aS90ZXh0LmNwcApAQCAtMjYsMTE2ICsyNiwxMTkgQEAKICNpbmNsdWRlICJvYmplY3RzLmhwcCIKIAogR1VJVGV4dDo6R1VJVGV4dCh4bWxfbm9kZTw+KiBub2RlKQotICAgIDogQ29uZGl0aW9uYWwobm9kZSkKKwk6IENvbmRpdGlvbmFsKG5vZGUpCiB7Ci0gICAgeG1sX2F0dHJpYnV0ZTw+KiBhdHRyOwotICAgIHhtbF9ub2RlPD4qIGNoaWxkOworCXhtbF9hdHRyaWJ1dGU8PiogYXR0cjsKKwl4bWxfbm9kZTw+KiBjaGlsZDsKIAotICAgIG1Gb250ID0gTlVMTDsKLSAgICBtSXNTdGF0aWMgPSAxOwotICAgIG1WYXJDaGFuZ2VkID0gMDsKLSAgICBtRm9udEhlaWdodCA9IDA7CisJbUZvbnQgPSBOVUxMOworCW1Jc1N0YXRpYyA9IDE7CisJbVZhckNoYW5nZWQgPSAwOworCW1Gb250SGVpZ2h0ID0gMDsKIAltYXhXaWR0aCA9IDA7CiAJY2hhclNraXAgPSAwOwogCWlzSGlnaGxpZ2h0ZWQgPSBmYWxzZTsKIAloYXNIaWdobGlnaHRDb2xvciA9IGZhbHNlOwogCi0gICAgaWYgKCFub2RlKSAgICAgIHJldHVybjsKKwlpZiAoIW5vZGUpCisJCXJldHVybjsKIAotICAgIC8vIEluaXRpYWxpemUgY29sb3IgdG8gc29saWQgYmxhY2sKLSAgICBtZW1zZXQoJm1Db2xvciwgMCwgc2l6ZW9mKENPTE9SKSk7Ci0gICAgbUNvbG9yLmFscGhhID0gMjU1OworCS8vIEluaXRpYWxpemUgY29sb3IgdG8gc29saWQgYmxhY2sKKwltZW1zZXQoJm1Db2xvciwgMCwgc2l6ZW9mKENPTE9SKSk7CisJbUNvbG9yLmFscGhhID0gMjU1OwogCW1lbXNldCgmbUhpZ2hsaWdodENvbG9yLCAwLCBzaXplb2YoQ09MT1IpKTsKLSAgICBtSGlnaGxpZ2h0Q29sb3IuYWxwaGEgPSAyNTU7CisJbUhpZ2hsaWdodENvbG9yLmFscGhhID0gMjU1OwogCi0gICAgYXR0ciA9IG5vZGUtPmZpcnN0X2F0dHJpYnV0ZSgiY29sb3IiKTsKLSAgICBpZiAoYXR0cikKLSAgICB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgQ29udmVydFN0clRvQ29sb3IoY29sb3IsICZtQ29sb3IpOwotICAgIH0KKwlhdHRyID0gbm9kZS0+Zmlyc3RfYXR0cmlidXRlKCJjb2xvciIpOworCWlmIChhdHRyKQorCXsKKwkJc3RkOjpzdHJpbmcgY29sb3IgPSBhdHRyLT52YWx1ZSgpOworCQlDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1Db2xvcik7CisJfQogCWF0dHIgPSBub2RlLT5maXJzdF9hdHRyaWJ1dGUoImhpZ2hsaWdodGNvbG9yIik7Ci0gICAgaWYgKGF0dHIpCi0gICAgewotICAgICAgICBzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7CisJaWYgKGF0dHIpCisJeworCQlzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7CiAJCUNvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbUhpZ2hsaWdodENvbG9yKTsKIAkJaGFzSGlnaGxpZ2h0Q29sb3IgPSB0cnVlOwotICAgIH0KKwl9CiAKLSAgICAvLyBMb2FkIHRoZSBmb250LCBhbmQgcG9zc2libHkgb3ZlcnJpZGUgdGhlIGNvbG9yCi0gICAgY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJmb250Iik7Ci0gICAgaWYgKGNoaWxkKQotICAgIHsKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoInJlc291cmNlIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgbUZvbnQgPSBQYWdlTWFuYWdlcjo6RmluZFJlc291cmNlKGF0dHItPnZhbHVlKCkpOworCS8vIExvYWQgdGhlIGZvbnQsIGFuZCBwb3NzaWJseSBvdmVycmlkZSB0aGUgY29sb3IKKwljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoImZvbnQiKTsKKwlpZiAoY2hpbGQpCisJeworCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgicmVzb3VyY2UiKTsKKwkJaWYgKGF0dHIpCisJCQltRm9udCA9IFBhZ2VNYW5hZ2VyOjpGaW5kUmVzb3VyY2UoYXR0ci0+dmFsdWUoKSk7CiAKLSAgICAgICAgYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImNvbG9yIik7Ci0gICAgICAgIGlmIChhdHRyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgICAgICBDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1Db2xvcik7Ci0gICAgICAgIH0KKwkJYXR0ciA9IGNoaWxkLT5maXJzdF9hdHRyaWJ1dGUoImNvbG9yIik7CisJCWlmIChhdHRyKQorCQl7CisJCQlzdGQ6OnN0cmluZyBjb2xvciA9IGF0dHItPnZhbHVlKCk7CisJCQlDb252ZXJ0U3RyVG9Db2xvcihjb2xvciwgJm1Db2xvcik7CisJCX0KIAogCQlhdHRyID0gY2hpbGQtPmZpcnN0X2F0dHJpYnV0ZSgiaGlnaGxpZ2h0Y29sb3IiKTsKLSAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKKwkJaWYgKGF0dHIpCisJCXsKKwkJCXN0ZDo6c3RyaW5nIGNvbG9yID0gYXR0ci0+dmFsdWUoKTsKIAkJCUNvbnZlcnRTdHJUb0NvbG9yKGNvbG9yLCAmbUhpZ2hsaWdodENvbG9yKTsKIAkJCWhhc0hpZ2hsaWdodENvbG9yID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KKwkJfQorCX0KIAotICAgIC8vIExvYWQgdGhlIHBsYWNlbWVudAotICAgIExvYWRQbGFjZW1lbnQobm9kZS0+Zmlyc3Rfbm9kZSgicGxhY2VtZW50IiksICZtUmVuZGVyWCwgJm1SZW5kZXJZLCAmbVJlbmRlclcsICZtUmVuZGVySCwgJm1QbGFjZW1lbnQpOworCS8vIExvYWQgdGhlIHBsYWNlbWVudAorCUxvYWRQbGFjZW1lbnQobm9kZS0+Zmlyc3Rfbm9kZSgicGxhY2VtZW50IiksICZtUmVuZGVyWCwgJm1SZW5kZXJZLCAmbVJlbmRlclcsICZtUmVuZGVySCwgJm1QbGFjZW1lbnQpOwogCi0gICAgY2hpbGQgPSBub2RlLT5maXJzdF9ub2RlKCJ0ZXh0Iik7Ci0gICAgaWYgKGNoaWxkKSAgbVRleHQgPSBjaGlsZC0+dmFsdWUoKTsKKwljaGlsZCA9IG5vZGUtPmZpcnN0X25vZGUoInRleHQiKTsKKwlpZiAoY2hpbGQpICBtVGV4dCA9IGNoaWxkLT52YWx1ZSgpOwogCi0gICAgLy8gU2ltcGxlIHdheSB0byBjaGVjayBmb3Igc3RhdGljIHN0YXRlCi0gICAgbUxhc3RWYWx1ZSA9IHBhcnNlVGV4dCgpOwotICAgIGlmIChtTGFzdFZhbHVlICE9IG1UZXh0KSAgIG1Jc1N0YXRpYyA9IDA7CisJLy8gU2ltcGxlIHdheSB0byBjaGVjayBmb3Igc3RhdGljIHN0YXRlCisJbUxhc3RWYWx1ZSA9IHBhcnNlVGV4dCgpOworCWlmIChtTGFzdFZhbHVlICE9IG1UZXh0KSAgIG1Jc1N0YXRpYyA9IDA7CiAKLSAgICBncl9nZXRGb250RGV0YWlscyhtRm9udCA/IG1Gb250LT5HZXRSZXNvdXJjZSgpIDogTlVMTCwgKHVuc2lnbmVkKikgJm1Gb250SGVpZ2h0LCBOVUxMKTsKLSAgICByZXR1cm47CisJZ3JfZ2V0Rm9udERldGFpbHMobUZvbnQgPyBtRm9udC0+R2V0UmVzb3VyY2UoKSA6IE5VTEwsICh1bnNpZ25lZCopICZtRm9udEhlaWdodCwgTlVMTCk7CisJcmV0dXJuOwogfQogCiBpbnQgR1VJVGV4dDo6UmVuZGVyKHZvaWQpCiB7Ci0gICAgaWYgKCFpc0NvbmRpdGlvblRydWUoKSkgICAgIHJldHVybiAwOworCWlmICghaXNDb25kaXRpb25UcnVlKCkpCisJCXJldHVybiAwOwogCi0gICAgdm9pZCogZm9udFJlc291cmNlID0gTlVMTDsKKwl2b2lkKiBmb250UmVzb3VyY2UgPSBOVUxMOwogCXN0cmluZyBkaXNwbGF5VmFsdWU7CiAKLSAgICBpZiAobUZvbnQpICBmb250UmVzb3VyY2UgPSBtRm9udC0+R2V0UmVzb3VyY2UoKTsKKwlpZiAobUZvbnQpCisJCWZvbnRSZXNvdXJjZSA9IG1Gb250LT5HZXRSZXNvdXJjZSgpOwogCi0gICAgbUxhc3RWYWx1ZSA9IHBhcnNlVGV4dCgpOworCW1MYXN0VmFsdWUgPSBwYXJzZVRleHQoKTsKIAlkaXNwbGF5VmFsdWUgPSBtTGFzdFZhbHVlOwogCiAJaWYgKGNoYXJTa2lwKQogCQlkaXNwbGF5VmFsdWUuZXJhc2UoMCwgY2hhclNraXApOwogCi0gICAgbVZhckNoYW5nZWQgPSAwOworCW1WYXJDaGFuZ2VkID0gMDsKIAotICAgIGludCB4ID0gbVJlbmRlclgsIHkgPSBtUmVuZGVyWTsKLSAgICBpbnQgd2lkdGggPSBncl9tZWFzdXJlRXgoZGlzcGxheVZhbHVlLmNfc3RyKCksIGZvbnRSZXNvdXJjZSk7CisJaW50IHggPSBtUmVuZGVyWCwgeSA9IG1SZW5kZXJZOworCWludCB3aWR0aCA9IGdyX21lYXN1cmVFeChkaXNwbGF5VmFsdWUuY19zdHIoKSwgZm9udFJlc291cmNlKTsKIAotICAgIGlmIChtUGxhY2VtZW50ICE9IFRPUF9MRUZUICYmIG1QbGFjZW1lbnQgIT0gQk9UVE9NX0xFRlQpCi0gICAgewotICAgICAgICBpZiAobVBsYWNlbWVudCA9PSBDRU5URVIgfHwgbVBsYWNlbWVudCA9PSBDRU5URVJfWF9PTkxZKQotICAgICAgICAgICAgeCAtPSAod2lkdGggLyAyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeCAtPSB3aWR0aDsKLSAgICB9Ci0gICAgaWYgKG1QbGFjZW1lbnQgIT0gVE9QX0xFRlQgJiYgbVBsYWNlbWVudCAhPSBUT1BfUklHSFQpCi0gICAgewotICAgICAgICBpZiAobVBsYWNlbWVudCA9PSBDRU5URVIpCi0gICAgICAgICAgICB5IC09IChtRm9udEhlaWdodCAvIDIpOwotICAgICAgICBlbHNlIGlmIChtUGxhY2VtZW50ID09IEJPVFRPTV9MRUZUIHx8IG1QbGFjZW1lbnQgPT0gQk9UVE9NX1JJR0hUKQotICAgICAgICAgICAgeSAtPSBtRm9udEhlaWdodDsKLSAgICB9CisJaWYgKG1QbGFjZW1lbnQgIT0gVE9QX0xFRlQgJiYgbVBsYWNlbWVudCAhPSBCT1RUT01fTEVGVCkKKwl7CisJCWlmIChtUGxhY2VtZW50ID09IENFTlRFUiB8fCBtUGxhY2VtZW50ID09IENFTlRFUl9YX09OTFkpCisJCQl4IC09ICh3aWR0aCAvIDIpOworCQllbHNlCisJCQl4IC09IHdpZHRoOworCX0KKwlpZiAobVBsYWNlbWVudCAhPSBUT1BfTEVGVCAmJiBtUGxhY2VtZW50ICE9IFRPUF9SSUdIVCkKKwl7CisJCWlmIChtUGxhY2VtZW50ID09IENFTlRFUikKKwkJCXkgLT0gKG1Gb250SGVpZ2h0IC8gMik7CisJCWVsc2UgaWYgKG1QbGFjZW1lbnQgPT0gQk9UVE9NX0xFRlQgfHwgbVBsYWNlbWVudCA9PSBCT1RUT01fUklHSFQpCisJCQl5IC09IG1Gb250SGVpZ2h0OworCX0KIAotICAgIGlmIChoYXNIaWdobGlnaHRDb2xvciAmJiBpc0hpZ2hsaWdodGVkKQorCWlmIChoYXNIaWdobGlnaHRDb2xvciAmJiBpc0hpZ2hsaWdodGVkKQogCQlncl9jb2xvcihtSGlnaGxpZ2h0Q29sb3IucmVkLCBtSGlnaGxpZ2h0Q29sb3IuZ3JlZW4sIG1IaWdobGlnaHRDb2xvci5ibHVlLCBtSGlnaGxpZ2h0Q29sb3IuYWxwaGEpOwogCWVsc2UKIAkJZ3JfY29sb3IobUNvbG9yLnJlZCwgbUNvbG9yLmdyZWVuLCBtQ29sb3IuYmx1ZSwgbUNvbG9yLmFscGhhKTsKQEAgLTE0NCw4MiArMTQ3LDg1IEBACiAJCWdyX3RleHRFeFcoeCwgeSwgZGlzcGxheVZhbHVlLmNfc3RyKCksIGZvbnRSZXNvdXJjZSwgbWF4V2lkdGggKyB4KTsKIAllbHNlCiAJCWdyX3RleHRFeCh4LCB5LCBkaXNwbGF5VmFsdWUuY19zdHIoKSwgZm9udFJlc291cmNlKTsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogaW50IEdVSVRleHQ6OlVwZGF0ZSh2b2lkKQogewotICAgIGlmICghaXNDb25kaXRpb25UcnVlKCkpICAgICByZXR1cm4gMDsKKwlpZiAoIWlzQ29uZGl0aW9uVHJ1ZSgpKQorCQlyZXR1cm4gMDsKIAotICAgIHN0YXRpYyBpbnQgdXBkYXRlQ291bnRlciA9IDM7CisJc3RhdGljIGludCB1cGRhdGVDb3VudGVyID0gMzsKIAotICAgIC8vIFRoaXMgaGFjayBqdXN0IG1ha2VzIHN1cmUgd2UgdXBkYXRlIGF0IGxlYXN0IG9uY2UgYSBtaW51dGUgZm9yIHRoaW5ncyBsaWtlIGNsb2NrIGFuZCBiYXR0ZXJ5Ci0gICAgaWYgKHVwZGF0ZUNvdW50ZXIpICB1cGRhdGVDb3VudGVyLS07Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbVZhckNoYW5nZWQgPSAxOwotICAgICAgICB1cGRhdGVDb3VudGVyID0gMzsKLSAgICB9CisJLy8gVGhpcyBoYWNrIGp1c3QgbWFrZXMgc3VyZSB3ZSB1cGRhdGUgYXQgbGVhc3Qgb25jZSBhIG1pbnV0ZSBmb3IgdGhpbmdzIGxpa2UgY2xvY2sgYW5kIGJhdHRlcnkKKwlpZiAodXBkYXRlQ291bnRlcikgIHVwZGF0ZUNvdW50ZXItLTsKKwllbHNlCisJeworCQltVmFyQ2hhbmdlZCA9IDE7CisJCXVwZGF0ZUNvdW50ZXIgPSAzOworCX0KIAotICAgIGlmIChtSXNTdGF0aWMgfHwgIW1WYXJDaGFuZ2VkKSAgICAgIHJldHVybiAwOworCWlmIChtSXNTdGF0aWMgfHwgIW1WYXJDaGFuZ2VkKQorCQlyZXR1cm4gMDsKIAotICAgIHN0ZDo6c3RyaW5nIG5ld1ZhbHVlID0gcGFyc2VUZXh0KCk7Ci0gICAgaWYgKG1MYXN0VmFsdWUgPT0gbmV3VmFsdWUpCisJc3RkOjpzdHJpbmcgbmV3VmFsdWUgPSBwYXJzZVRleHQoKTsKKwlpZiAobUxhc3RWYWx1ZSA9PSBuZXdWYWx1ZSkKIAkJcmV0dXJuIDA7CiAJZWxzZQogCQltTGFzdFZhbHVlID0gbmV3VmFsdWU7Ci0gICAgcmV0dXJuIDI7CisJcmV0dXJuIDI7CiB9CiAKIGludCBHVUlUZXh0OjpHZXRDdXJyZW50Qm91bmRzKGludCYgdywgaW50JiBoKQogewotICAgIHZvaWQqIGZvbnRSZXNvdXJjZSA9IE5VTEw7CisJdm9pZCogZm9udFJlc291cmNlID0gTlVMTDsKIAotICAgIGlmIChtRm9udCkgIGZvbnRSZXNvdXJjZSA9IG1Gb250LT5HZXRSZXNvdXJjZSgpOworCWlmIChtRm9udCkKKwkJZm9udFJlc291cmNlID0gbUZvbnQtPkdldFJlc291cmNlKCk7CiAKLSAgICBoID0gbUZvbnRIZWlnaHQ7CisJaCA9IG1Gb250SGVpZ2h0OwogCW1MYXN0VmFsdWUgPSBwYXJzZVRleHQoKTsKLSAgICB3ID0gZ3JfbWVhc3VyZUV4KG1MYXN0VmFsdWUuY19zdHIoKSwgZm9udFJlc291cmNlKTsKLSAgICByZXR1cm4gMDsKKwl3ID0gZ3JfbWVhc3VyZUV4KG1MYXN0VmFsdWUuY19zdHIoKSwgZm9udFJlc291cmNlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RkOjpzdHJpbmcgR1VJVGV4dDo6cGFyc2VUZXh0KHZvaWQpCiB7Ci0gICAgc3RhdGljIGludCBjb3VudGVyID0gMDsKLSAgICBzdGQ6OnN0cmluZyBzdHIgPSBtVGV4dDsKLSAgICBzaXplX3QgcG9zID0gMDsKLSAgICBzaXplX3QgbmV4dCA9IDAsIGVuZCA9IDA7CisJc3RhdGljIGludCBjb3VudGVyID0gMDsKKwlzdGQ6OnN0cmluZyBzdHIgPSBtVGV4dDsKKwlzaXplX3QgcG9zID0gMDsKKwlzaXplX3QgbmV4dCA9IDAsIGVuZCA9IDA7CiAKLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgIG5leHQgPSBzdHIuZmluZCgnJScsIHBvcyk7Ci0gICAgICAgIGlmIChuZXh0ID09IHN0ZDo6c3RyaW5nOjpucG9zKSAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIGVuZCA9IHN0ci5maW5kKCclJywgbmV4dCArIDEpOwotICAgICAgICBpZiAoZW5kID09IHN0ZDo6c3RyaW5nOjpucG9zKSAgICAgICByZXR1cm4gc3RyOworCXdoaWxlICgxKQorCXsKKwkJbmV4dCA9IHN0ci5maW5kKCclJywgcG9zKTsKKwkJaWYgKG5leHQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHJldHVybiBzdHI7CisJCWVuZCA9IHN0ci5maW5kKCclJywgbmV4dCArIDEpOworCQlpZiAoZW5kID09IHN0ZDo6c3RyaW5nOjpucG9zKSByZXR1cm4gc3RyOwogCi0gICAgICAgIC8vIFdlIGhhdmUgYSBibG9jayBvZiBkYXRhCi0gICAgICAgIHN0ZDo6c3RyaW5nIHZhciA9IHN0ci5zdWJzdHIobmV4dCArIDEsIChlbmQgLSBuZXh0KSAtIDEpOwotICAgICAgICBzdHIuZXJhc2UobmV4dCwgKGVuZCAtIG5leHQpICsgMSk7CisJCS8vIFdlIGhhdmUgYSBibG9jayBvZiBkYXRhCisJCXN0ZDo6c3RyaW5nIHZhciA9IHN0ci5zdWJzdHIobmV4dCArIDEsIChlbmQgLSBuZXh0KSAtIDEpOworCQlzdHIuZXJhc2UobmV4dCwgKGVuZCAtIG5leHQpICsgMSk7CiAKLSAgICAgICAgaWYgKG5leHQgKyAxID09IGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyLmluc2VydChuZXh0LCAxLCAnJScpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7Ci0gICAgICAgICAgICBpZiAoRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhciwgdmFsdWUpID09IDApCi0gICAgICAgICAgICAgICAgc3RyLmluc2VydChuZXh0LCB2YWx1ZSk7Ci0gICAgICAgIH0KKwkJaWYgKG5leHQgKyAxID09IGVuZCkKKwkJeworCQkJc3RyLmluc2VydChuZXh0LCAxLCAnJScpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RkOjpzdHJpbmcgdmFsdWU7CisJCQlpZiAoRGF0YU1hbmFnZXI6OkdldFZhbHVlKHZhciwgdmFsdWUpID09IDApCisJCQkJc3RyLmluc2VydChuZXh0LCB2YWx1ZSk7CisJCX0KIAotICAgICAgICBwb3MgPSBuZXh0ICsgMTsKLSAgICB9CisJCXBvcyA9IG5leHQgKyAxOworCX0KIH0KIAogaW50IEdVSVRleHQ6Ok5vdGlmeVZhckNoYW5nZShzdGQ6OnN0cmluZyB2YXJOYW1lLCBzdGQ6OnN0cmluZyB2YWx1ZSkKIHsKLSAgICBtVmFyQ2hhbmdlZCA9IDE7Ci0gICAgcmV0dXJuIDA7CisJbVZhckNoYW5nZWQgPSAxOworCXJldHVybiAwOwogfQogCiBpbnQgR1VJVGV4dDo6U2V0TWF4V2lkdGgodW5zaWduZWQgd2lkdGgpCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9BbmRyb2lkLm1rIGIvbGlianBlZ3R3cnAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThiMjUzOS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfQVJNX01PREUgOj0gYXJtCi0KLSMgU2V0IEFORFJPSURfSlBFR19VU0VfVkVOVU0gdG8gdHJ1ZSB0byBlbmFibGUgVmVOdW0gb3B0aW1pemF0aW9ucwotQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSA6PSB0cnVlCi0KLSMgRGlzYWJsZSBWZU51bSBvcHRpbWl6YXRpb25zIGlmIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGJ1aWxkIHRhcmdldAotaWZuZXEgKCQoQVJDSF9BUk1fSEFWRV9WRlApLHRydWUpCi1BTkRST0lEX0pQRUdfVVNFX1ZFTlVNIDo9IGZhbHNlCi1lbHNlCi1pZm5lcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCi1BTkRST0lEX0pQRUdfVVNFX1ZFTlVNIDo9IGZhbHNlCi1lbmRpZgotZW5kaWYKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQlqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0JamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0JamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLQlqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0JamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotCWpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLQlqZmRjdGludC5jIGppZGN0Zmx0LmMganF1YW50MS5jIFwKLQlqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jIFwKLQotIyB1c2UgYXNobWVtIGFzIGxpYmpwZWcgZGVjb2RlcidzIGJhY2tpbmcgc3RvcmUKLUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9BTkRST0lEX0FTSE1FTQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLQlqbWVtLWFzaG1lbS5jCi0KLSMgdGhlIG9yaWdpbmFsIGFuZHJvaWQgbWVtb3J5IG1hbmFnZXIuCi0jIHVzZSBzZGNhcmQgYXMgbGlianBlZyBkZWNvZGVyJ3MgYmFja2luZyBzdG9yZQotI0xPQ0FMX1NSQ19GSUxFUyArPSBcCi0jCWptZW0tYW5kcm9pZC5jCi0KLQotIyB0aGUgYXNzZW1ibGVyIGlzIG9ubHkgZm9yIHRoZSBBUk0gdmVyc2lvbiwgZG9uJ3QgYnJlYWsgdGhlIExpbnV4IHNpbQotaWZuZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKLUFORFJPSURfSlBFR19OT19BU1NFTUJMRVIgOj0gdHJ1ZQotZW5kaWYKLQotaWZlcSAoJChzdHJpcCAkKEFORFJPSURfSlBFR19OT19BU1NFTUJMRVIpKSx0cnVlKQotTE9DQUxfU1JDX0ZJTEVTICs9IGppZGN0aW50LmMgamlkY3Rmc3QuYyBqaWRjdHJlZC5jCi1lbHNlCi1pZmVxICgkKEFORFJPSURfSlBFR19VU0VfVkVOVU0pLHRydWUpCi1MT0NBTF9TUkNfRklMRVMgKz0gamlkY3R2ZW51bS5jCi1MT0NBTF9TUkNfRklMRVMgKz0gYXNtL2FybXY3L2pkY29sb3ItYXJtdjcuUwotTE9DQUxfU1JDX0ZJTEVTICs9IGFzbS9hcm12Ny9qZGNvbG9yLWFuZHJvaWQtYXJtdjcuUwotTE9DQUxfU1JDX0ZJTEVTICs9IGFzbS9hcm12Ny9qZGlkY3QtYXJtdjcuUwotTE9DQUxfQ0ZMQUdTICAgICs9IC1EQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotZWxzZSAjIEFORFJPSURfSlBFR19VU0VfVkVOVU0sIGZhbHNlCi1MT0NBTF9TUkNfRklMRVMgKz0gamlkY3RpbnQuYyBqaWRjdHJlZC5jIGppZGN0ZnN0LmMgYXJtdjZfaWRjdC5TCi1MT0NBTF9DRkxBR1MgICAgKz0gLURBTkRST0lEX0FSTVY2X0lEQ1QKLWVuZGlmICMgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotZW5kaWYKLQotTE9DQUxfQ0ZMQUdTICs9IC1EQVZPSURfVEFCTEVTCi1MT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMKLQotIyBlbmFibGUgdGlsZSBiYXNlZCBkZWNvZGUKLUxPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLQotaWZkZWYgTkVFRFNfQVJNX0VSUkFUQV83NTQzMTlfNzU0MzIwCi1hc21fZmxhZ3MgOj0gXAotCS0tZGVmc3ltIE5FRURTX0FSTV9FUlJBVEFfNzU0MzE5Xzc1NDMyMF9BU009MQotCi1MT0NBTF9DRkxBR1MrPSBcCi0JJChmb3JlYWNoIGYsJChhc21fZmxhZ3MpLC1XYSwiJChmKSIpCi1lbmRpZgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gZW5nCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscwotTE9DQUxfTU9EVUxFOj0gbGlianBlZ3R3cnAKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9DbGVhblNwZWMubWsgYi9saWJqcGVndHdycC9DbGVhblNwZWMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NGUxYjYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvQ2xlYW5TcGVjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKLSMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCi0jIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgotIyBydW4gYmVmb3JlLgotIwotIyBFLmcuOgotIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQotIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQotIwotIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKLSMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCi0jCi0jIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KLSMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KLSMKLSMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5Ci0jIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCi0jIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91Ci0jIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKLSMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0jCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRm9yIGV4YW1wbGU6Ci0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCi0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQotCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9NT0RVTEVfTElDRU5TRV9CU0RfTElLRSBiL2xpYmpwZWd0d3JwL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL05PVElDRSBiL2xpYmpwZWd0d3JwL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NjI1Zi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1UaGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKLXdpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAotaXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgotCi1UaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotc29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgdG8gdGhlc2UKLWNvbmRpdGlvbnM6Ci0oMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKLVJFQURNRSBmaWxlIG11c3QgYmUgaW5jbHVkZWQsIHdpdGggdGhpcyBjb3B5cmlnaHQgYW5kIG5vLXdhcnJhbnR5IG5vdGljZQotdW5hbHRlcmVkOyBhbmQgYW55IGFkZGl0aW9ucywgZGVsZXRpb25zLCBvciBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBmaWxlcwotbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KLSgyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nCi1kb2N1bWVudGF0aW9uIG11c3Qgc3RhdGUgdGhhdCAidGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mCi10aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCIuCi0oMykgUGVybWlzc2lvbiBmb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBvbmx5IGlmIHRoZSB1c2VyIGFjY2VwdHMKLWZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdAotTk8gTElBQklMSVRZIGZvciBkYW1hZ2VzIG9mIGFueSBraW5kLgotCi1UaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLAotbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodCB0bwotYWNrbm93bGVkZ2UgdXMuCi0KLVBlcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQotaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi1pdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKLXNvZnR3YXJlIi4KLQotV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YKLWNvbW1lcmNpYWwgcHJvZHVjdHMsIHByb3ZpZGVkIHRoYXQgYWxsIHdhcnJhbnR5IG9yIGxpYWJpbGl0eSBjbGFpbXMgYXJlCi1hc3N1bWVkIGJ5IHRoZSBwcm9kdWN0IHZlbmRvci4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL1JFQURNRSBiL2xpYmpwZWd0d3JwL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjYzIwNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotVGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUkVBRE1FIGZvciByZWxlYXNlIDZiIG9mIDI3LU1hci0xOTk4Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIHNpeHRoIHB1YmxpYyByZWxlYXNlIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHCi1Hcm91cCdzIGZyZWUgSlBFRyBzb2Z0d2FyZS4gIFlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKLXRvIHVzZSBpdCBmb3IgYW55IHB1cnBvc2UsIHN1YmplY3QgdG8gdGhlIGNvbmRpdGlvbnMgdW5kZXIgTEVHQUwgSVNTVUVTLCBiZWxvdy4KLQotU2VyaW91cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIChwYXJ0aWN1bGFybHkgdGhvc2UgaW5jb3Jwb3JhdGluZyBpdCBpbnRvCi1sYXJnZXIgcHJvZ3JhbXMpIHNob3VsZCBjb250YWN0IElKRyBhdCBqcGVnLWluZm9AdXVuZXQudXUubmV0IHRvIGJlIGFkZGVkIHRvCi1vdXIgZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3QuICBNYWlsaW5nIGxpc3QgbWVtYmVycyBhcmUgbm90aWZpZWQgb2YgdXBkYXRlcwotYW5kIGhhdmUgYSBjaGFuY2UgdG8gcGFydGljaXBhdGUgaW4gdGVjaG5pY2FsIGRpc2N1c3Npb25zLCBldGMuCi0KLVRoaXMgc29mdHdhcmUgaXMgdGhlIHdvcmsgb2YgVG9tIExhbmUsIFBoaWxpcCBHbGFkc3RvbmUsIEppbSBCb3VjaGVyLAotTGVlIENyb2NrZXIsIEp1bGlhbiBNaW5ndWlsbG9uLCBMdWlzIE9ydGl6LCBHZW9yZ2UgUGhpbGxpcHMsIERhdmlkZSBSb3NzaSwKLUd1aWRvIFZvbGxiZWRpbmcsIEdlJyBXZWlqZXJzLCBhbmQgb3RoZXIgbWVtYmVycyBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRwotR3JvdXAuCi0KLUlKRyBpcyBub3QgYWZmaWxpYXRlZCB3aXRoIHRoZSBvZmZpY2lhbCBJU08gSlBFRyBzdGFuZGFyZHMgY29tbWl0dGVlLgotCi0KLURPQ1VNRU5UQVRJT04gUk9BRE1BUAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgotCi1PVkVSVklFVyAgICAgICAgICAgIEdlbmVyYWwgZGVzY3JpcHRpb24gb2YgSlBFRyBhbmQgdGhlIElKRyBzb2Z0d2FyZS4KLUxFR0FMIElTU1VFUyAgICAgICAgQ29weXJpZ2h0LCBsYWNrIG9mIHdhcnJhbnR5LCB0ZXJtcyBvZiBkaXN0cmlidXRpb24uCi1SRUZFUkVOQ0VTICAgICAgICAgIFdoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSlBFRy4KLUFSQ0hJVkUgTE9DQVRJT05TICAgV2hlcmUgdG8gZmluZCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlLgotUkVMQVRFRCBTT0ZUV0FSRSAgICBPdGhlciBzdHVmZiB5b3Ugc2hvdWxkIGdldC4KLUZJTEUgRk9STUFUIFdBUlMgICAgU29mdHdhcmUgKm5vdCogdG8gZ2V0LgotVE8gRE8gICAgICAgICAgICAgICBQbGFucyBmb3IgZnV0dXJlIElKRyByZWxlYXNlcy4KLQotT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZToKLQotVXNlciBkb2N1bWVudGF0aW9uOgotICBpbnN0YWxsLmRvYyAgICAgICBIb3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuCi0gIHVzYWdlLmRvYyAgICAgICAgIFVzYWdlIGluc3RydWN0aW9ucyBmb3IgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwKLSAgICAgICAgICAgICAgICAgICAgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KLSAgKi4xICAgICAgICAgICAgICAgVW5peC1zdHlsZSBtYW4gcGFnZXMgZm9yIHByb2dyYW1zIChzYW1lIGluZm8gYXMgdXNhZ2UuZG9jKS4KLSAgd2l6YXJkLmRvYyAgICAgICAgQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBKUEVHIHdpemFyZHMgb25seS4KLSAgY2hhbmdlLmxvZyAgICAgICAgVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgotUHJvZ3JhbW1lciBhbmQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbjoKLSAgbGlianBlZy5kb2MgICAgICAgSG93IHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW1zLgotICBleGFtcGxlLmMgICAgICAgICBTYW1wbGUgY29kZSBmb3IgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgotICBzdHJ1Y3R1cmUuZG9jICAgICBPdmVydmlldyBvZiB0aGUgSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgc3RydWN0dXJlLgotICBmaWxlbGlzdC5kb2MgICAgICBSb2FkIG1hcCBvZiBJSkcgZmlsZXMuCi0gIGNvZGVydWxlcy5kb2MgICAgIENvZGluZyBzdHlsZSBydWxlcyAtLS0gcGxlYXNlIHJlYWQgaWYgeW91IGNvbnRyaWJ1dGUgY29kZS4KLQotUGxlYXNlIHJlYWQgYXQgbGVhc3QgdGhlIGZpbGVzIGluc3RhbGwuZG9jIGFuZCB1c2FnZS5kb2MuICBVc2VmdWwgaW5mb3JtYXRpb24KLWNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBKUEVHIEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMpIGFydGljbGUuICBTZWUKLUFSQ0hJVkUgTE9DQVRJT05TIGJlbG93IHRvIGZpbmQgb3V0IHdoZXJlIHRvIG9idGFpbiB0aGUgRkFRIGFydGljbGUuCi0KLUlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBKUEVHIGNvZGUgd29ya3MsIHdlIHN1Z2dlc3QgcmVhZGluZyBvbmUgb3IKLW1vcmUgb2YgdGhlIFJFRkVSRU5DRVMsIHRoZW4gbG9va2luZyBhdCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyAoaW4gcm91Z2hseQotdGhlIG9yZGVyIGxpc3RlZCkgYmVmb3JlIGRpdmluZyBpbnRvIHRoZSBjb2RlLgotCi0KLU9WRVJWSUVXCi09PT09PT09PQotCi1UaGlzIHBhY2thZ2UgY29udGFpbnMgQyBzb2Z0d2FyZSB0byBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb24uICBKUEVHIChwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24KLW1ldGhvZCBmb3IgZnVsbC1jb2xvciBhbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGludGVuZGVkIGZvciBjb21wcmVzc2luZwotInJlYWwtd29ybGQiIHNjZW5lczsgbGluZSBkcmF3aW5ncywgY2FydG9vbnMgYW5kIG90aGVyIG5vbi1yZWFsaXN0aWMgaW1hZ2VzCi1hcmUgbm90IGl0cyBzdHJvbmcgc3VpdC4gIEpQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdAotZXhhY3RseSBpZGVudGljYWwgdG8gdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IG11c3Qgbm90IHVzZSBKUEVHIGlmIHlvdQotaGF2ZSB0byBoYXZlIGlkZW50aWNhbCBvdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcGhvdG9ncmFwaGljIGltYWdlcywKLXZlcnkgZ29vZCBjb21wcmVzc2lvbiBsZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZAotcmVtYXJrYWJseSBoaWdoIGNvbXByZXNzaW9uIGxldmVscyBhcmUgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhCi1sb3ctcXVhbGl0eSBpbWFnZS4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVmZXJlbmNlcywgb3IganVzdCBleHBlcmltZW50Ci13aXRoIHZhcmlvdXMgY29tcHJlc3Npb24gc2V0dGluZ3MuCi0KLVRoaXMgc29mdHdhcmUgaW1wbGVtZW50cyBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZC1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUKLWNvbXByZXNzaW9uIHByb2Nlc3Nlcy4gIFByb3Zpc2lvbiBpcyBtYWRlIGZvciBzdXBwb3J0aW5nIGFsbCB2YXJpYW50cyBvZiB0aGVzZQotcHJvY2Vzc2VzLCBhbHRob3VnaCBzb21lIHVuY29tbW9uIHBhcmFtZXRlciBzZXR0aW5ncyBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LgotRm9yIGxlZ2FsIHJlYXNvbnMsIHdlIGFyZSBub3QgZGlzdHJpYnV0aW5nIGNvZGUgZm9yIHRoZSBhcml0aG1ldGljLWNvZGluZwotdmFyaWFudHMgb2YgSlBFRzsgc2VlIExFR0FMIElTU1VFUy4gIFdlIGhhdmUgbWFkZSBubyBwcm92aXNpb24gZm9yIHN1cHBvcnRpbmcKLXRoZSBoaWVyYXJjaGljYWwgb3IgbG9zc2xlc3MgcHJvY2Vzc2VzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLgotCi1XZSBwcm92aWRlIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgSlBFRyBpbWFnZSBmaWxlcywKLXBsdXMgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgImNqcGVnIiBhbmQgImRqcGVnIiwgd2hpY2ggdXNlIHRoZSBsaWJyYXJ5IHRvCi1wZXJmb3JtIGNvbnZlcnNpb24gYmV0d2VlbiBKUEVHIGFuZCBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZmlsZSBmb3JtYXRzLgotVGhlIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgcmV1c2VkIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KLQotSW4gb3JkZXIgdG8gc3VwcG9ydCBmaWxlIGNvbnZlcnNpb24gYW5kIHZpZXdpbmcgc29mdHdhcmUsIHdlIGhhdmUgaW5jbHVkZWQKLWNvbnNpZGVyYWJsZSBmdW5jdGlvbmFsaXR5IGJleW9uZCB0aGUgYmFyZSBKUEVHIGNvZGluZy9kZWNvZGluZyBjYXBhYmlsaXR5OwotZm9yIGV4YW1wbGUsIHRoZSBjb2xvciBxdWFudGl6YXRpb24gbW9kdWxlcyBhcmUgbm90IHN0cmljdGx5IHBhcnQgb2YgSlBFRwotZGVjb2RpbmcsIGJ1dCB0aGV5IGFyZSBlc3NlbnRpYWwgZm9yIG91dHB1dCB0byBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdHMgb3IKLWNvbG9ybWFwcGVkIGRpc3BsYXlzLiAgVGhlc2UgZXh0cmEgZnVuY3Rpb25zIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlCi1saWJyYXJ5IGlmIG5vdCByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiAgV2UgaGF2ZSBhbHNvIGluY2x1ZGVkCi0ianBlZ3RyYW4iLCBhIHV0aWxpdHkgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50IEpQRUcKLXByb2Nlc3NlcywgYW5kICJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIsIHR3byBzaW1wbGUgYXBwbGljYXRpb25zIGZvcgotaW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRleHR1YWwgY29tbWVudHMgaW4gSkZJRiBmaWxlcy4KLQotVGhlIGVtcGhhc2lzIGluIGRlc2lnbmluZyB0aGlzIHNvZnR3YXJlIGhhcyBiZWVuIG9uIGFjaGlldmluZyBwb3J0YWJpbGl0eSBhbmQKLWZsZXhpYmlsaXR5LCB3aGlsZSBhbHNvIG1ha2luZyBpdCBmYXN0IGVub3VnaCB0byBiZSB1c2VmdWwuICBJbiBwYXJ0aWN1bGFyLAotdGhlIHNvZnR3YXJlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWFkIGFzIGEgdHV0b3JpYWwgb24gSlBFRy4gIChTZWUgdGhlCi1SRUZFUkVOQ0VTIHNlY3Rpb24gZm9yIGludHJvZHVjdG9yeSBtYXRlcmlhbC4pICBSYXRoZXIsIGl0IGlzIGludGVuZGVkIHRvCi1iZSByZWxpYWJsZSwgcG9ydGFibGUsIGluZHVzdHJpYWwtc3RyZW5ndGggY29kZS4gIFdlIGRvIG5vdCBjbGFpbSB0byBoYXZlCi1hY2hpZXZlZCB0aGF0IGdvYWwgaW4gZXZlcnkgYXNwZWN0IG9mIHRoZSBzb2Z0d2FyZSwgYnV0IHdlIHN0cml2ZSBmb3IgaXQuCi0KLVdlIHdlbGNvbWUgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIGEgY29tcG9uZW50IG9mIGNvbW1lcmNpYWwgcHJvZHVjdHMuCi1ObyByb3lhbHR5IGlzIHJlcXVpcmVkLCBidXQgd2UgZG8gYXNrIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgaW4gcHJvZHVjdAotZG9jdW1lbnRhdGlvbiwgYXMgZGVzY3JpYmVkIHVuZGVyIExFR0FMIElTU1VFUy4KLQotCi1MRUdBTCBJU1NVRVMKLT09PT09PT09PT09PQotCi1JbiBwbGFpbiBFbmdsaXNoOgotCi0xLiBXZSBkb24ndCBwcm9taXNlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3b3Jrcy4gIChCdXQgaWYgeW91IGZpbmQgYW55IGJ1Z3MsCi0gICBwbGVhc2UgbGV0IHVzIGtub3chKQotMi4gWW91IGNhbiB1c2UgdGhpcyBzb2Z0d2FyZSBmb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBZb3UgZG9uJ3QgaGF2ZSB0byBwYXkgdXMuCi0zLiBZb3UgbWF5IG5vdCBwcmV0ZW5kIHRoYXQgeW91IHdyb3RlIHRoaXMgc29mdHdhcmUuICBJZiB5b3UgdXNlIGl0IGluIGEKLSAgIHByb2dyYW0sIHlvdSBtdXN0IGFja25vd2xlZGdlIHNvbWV3aGVyZSBpbiB5b3VyIGRvY3VtZW50YXRpb24gdGhhdAotICAgeW91J3ZlIHVzZWQgdGhlIElKRyBjb2RlLgotCi1JbiBsZWdhbGVzZToKLQotVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKLXdpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAotaXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgotCi1UaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotc29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgdG8gdGhlc2UKLWNvbmRpdGlvbnM6Ci0oMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKLVJFQURNRSBmaWxlIG11c3QgYmUgaW5jbHVkZWQsIHdpdGggdGhpcyBjb3B5cmlnaHQgYW5kIG5vLXdhcnJhbnR5IG5vdGljZQotdW5hbHRlcmVkOyBhbmQgYW55IGFkZGl0aW9ucywgZGVsZXRpb25zLCBvciBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBmaWxlcwotbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KLSgyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nCi1kb2N1bWVudGF0aW9uIG11c3Qgc3RhdGUgdGhhdCAidGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mCi10aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCIuCi0oMykgUGVybWlzc2lvbiBmb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBvbmx5IGlmIHRoZSB1c2VyIGFjY2VwdHMKLWZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdAotTk8gTElBQklMSVRZIGZvciBkYW1hZ2VzIG9mIGFueSBraW5kLgotCi1UaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLAotbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodCB0bwotYWNrbm93bGVkZ2UgdXMuCi0KLVBlcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQotaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi1pdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKLXNvZnR3YXJlIi4KLQotV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YKLWNvbW1lcmNpYWwgcHJvZHVjdHMsIHByb3ZpZGVkIHRoYXQgYWxsIHdhcnJhbnR5IG9yIGxpYWJpbGl0eSBjbGFpbXMgYXJlCi1hc3N1bWVkIGJ5IHRoZSBwcm9kdWN0IHZlbmRvci4KLQotCi1hbnNpMmtuci5jIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGJ5IHBlcm1pc3Npb24gb2YgTC4gUGV0ZXIgRGV1dHNjaCwKLXNvbGUgcHJvcHJpZXRvciBvZiBpdHMgY29weXJpZ2h0IGhvbGRlciwgQWxhZGRpbiBFbnRlcnByaXNlcyBvZiBNZW5sbyBQYXJrLCBDQS4KLWFuc2kya25yLmMgaXMgTk9UIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgY29uZGl0aW9ucywgYnV0IGluc3RlYWQKLWJ5IHRoZSB1c3VhbCBkaXN0cmlidXRpb24gdGVybXMgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgcHJpbmNpcGFsbHksCi10aGF0IHlvdSBtdXN0IGluY2x1ZGUgc291cmNlIGNvZGUgaWYgeW91IHJlZGlzdHJpYnV0ZSBpdC4gIChTZWUgdGhlIGZpbGUKLWFuc2kya25yLmMgZm9yIGZ1bGwgZGV0YWlscy4pICBIb3dldmVyLCBzaW5jZSBhbnNpMmtuci5jIGlzIG5vdCBuZWVkZWQgYXMgcGFydAotb2YgYW55IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gdGhlIElKRyBjb2RlLCB0aGlzIGRvZXMgbm90IGxpbWl0IHlvdSBtb3JlIHRoYW4KLXRoZSBmb3JlZ29pbmcgcGFyYWdyYXBocyBkby4KLQotVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLgotSXQgaXMgY29weXJpZ2h0IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYnV0IGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgotVGhlIHNhbWUgaG9sZHMgZm9yIGl0cyBzdXBwb3J0aW5nIHNjcmlwdHMgKGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKLWx0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0Ci1ieSBNLkkuVC4gYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCi0KLUl0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieQotcGF0ZW50cyBvd25lZCBieSBJQk0sIEFUJlQsIGFuZCBNaXRzdWJpc2hpLiAgSGVuY2UgYXJpdGhtZXRpYyBjb2RpbmcgY2Fubm90Ci1sZWdhbGx5IGJlIHVzZWQgd2l0aG91dCBvYnRhaW5pbmcgb25lIG9yIG1vcmUgbGljZW5zZXMuICBGb3IgdGhpcyByZWFzb24sCi1zdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4KLShTaW5jZSBhcml0aG1ldGljIGNvZGluZyBwcm92aWRlcyBvbmx5IGEgbWFyZ2luYWwgZ2FpbiBvdmVyIHRoZSB1bnBhdGVudGVkCi1IdWZmbWFuIG1vZGUsIGl0IGlzIHVubGlrZWx5IHRoYXQgdmVyeSBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIHN1cHBvcnQgaXQuKQotU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZwotY29kZS4KLQotVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuCi1UbyBhdm9pZCBlbnRhbmdsZW1lbnQgd2l0aCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIEdJRiByZWFkaW5nIHN1cHBvcnQgaGFzCi1iZWVuIHJlbW92ZWQgYWx0b2dldGhlciwgYW5kIHRoZSBHSUYgd3JpdGVyIGhhcyBiZWVuIHNpbXBsaWZpZWQgdG8gcHJvZHVjZQotInVuY29tcHJlc3NlZCBHSUZzIi4gIFRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHVzZSB0aGUgTFpXIGFsZ29yaXRobTsgdGhlCi1yZXN1bHRpbmcgR0lGIGZpbGVzIGFyZSBsYXJnZXIgdGhhbiB1c3VhbCwgYnV0IGFyZSByZWFkYWJsZSBieSBhbGwgc3RhbmRhcmQKLUdJRiBkZWNvZGVycy4KLQotV2UgYXJlIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKLSAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCi0gICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuICBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCi0gICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgotCi0KLVJFRkVSRU5DRVMKLT09PT09PT09PT0KLQotV2UgaGlnaGx5IHJlY29tbWVuZCByZWFkaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlZmVyZW5jZXMgYmVmb3JlIHRyeWluZyB0bwotdW5kZXJzdGFuZCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBzb2Z0d2FyZS4KLQotVGhlIGJlc3Qgc2hvcnQgdGVjaG5pY2FsIGludHJvZHVjdGlvbiB0byB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMKLQlXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCi0JQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCBuby4gNCksIHBwLiAzMC00NC4KLShBZGphY2VudCBhcnRpY2xlcyBpbiB0aGF0IGlzc3VlIGRpc2N1c3MgTVBFRyBtb3Rpb24gcGljdHVyZSBjb21wcmVzc2lvbiwKLWFwcGxpY2F0aW9ucyBvZiBKUEVHLCBhbmQgcmVsYXRlZCB0b3BpY3MuKSAgSWYgeW91IGRvbid0IGhhdmUgdGhlIENBQ00gaXNzdWUKLWhhbmR5LCBhIFBvc3RTY3JpcHQgZmlsZSBjb250YWluaW5nIGEgcmV2aXNlZCB2ZXJzaW9uIG9mIFdhbGxhY2UncyBhcnRpY2xlIGlzCi1hdmFpbGFibGUgYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL3dhbGxhY2UucHMuZ3ouICBUaGUgZmlsZSAoYWN0dWFsbHkKLWEgcHJlcHJpbnQgZm9yIGFuIGFydGljbGUgdGhhdCBhcHBlYXJlZCBpbiBJRUVFIFRyYW5zLiBDb25zdW1lciBFbGVjdHJvbmljcykKLW9taXRzIHRoZSBzYW1wbGUgaW1hZ2VzIHRoYXQgYXBwZWFyZWQgaW4gQ0FDTSwgYnV0IGl0IGluY2x1ZGVzIGNvcnJlY3Rpb25zCi1hbmQgc29tZSBhZGRlZCBtYXRlcmlhbC4gIE5vdGU6IHRoZSBXYWxsYWNlIGFydGljbGUgaXMgY29weXJpZ2h0IEFDTSBhbmQgSUVFRSwKLWFuZCBpdCBtYXkgbm90IGJlIHVzZWQgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuCi0KLUEgc29tZXdoYXQgbGVzcyB0ZWNobmljYWwsIG1vcmUgbGVpc3VyZWx5IGludHJvZHVjdGlvbiB0byBKUEVHIGNhbiBiZSBmb3VuZCBpbgotIlRoZSBEYXRhIENvbXByZXNzaW9uIEJvb2siIGJ5IE1hcmsgTmVsc29uIGFuZCBKZWFuLWxvdXAgR2FpbGx5LCBwdWJsaXNoZWQgYnkKLU0mVCBCb29rcyAoTmV3IFlvcmspLCAybmQgZWQuIDE5OTYsIElTQk4gMS01NTg1MS00MzQtMS4gIFRoaXMgYm9vayBwcm92aWRlcwotZ29vZCBleHBsYW5hdGlvbnMgYW5kIGV4YW1wbGUgQyBjb2RlIGZvciBhIG11bHRpdHVkZSBvZiBjb21wcmVzc2lvbiBtZXRob2RzCi1pbmNsdWRpbmcgSlBFRy4gIEl0IGlzIGFuIGV4Y2VsbGVudCBzb3VyY2UgaWYgeW91IGFyZSBjb21mb3J0YWJsZSByZWFkaW5nIEMKLWNvZGUgYnV0IGRvbid0IGtub3cgbXVjaCBhYm91dCBkYXRhIGNvbXByZXNzaW9uIGluIGdlbmVyYWwuICBUaGUgYm9vaydzIEpQRUcKLXNhbXBsZSBjb2RlIGlzIGZhciBmcm9tIGluZHVzdHJpYWwtc3RyZW5ndGgsIGJ1dCB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbG9vawotYXQgYSBmdWxsIGltcGxlbWVudGF0aW9uLCB5b3UndmUgZ290IG9uZSBoZXJlLi4uCi0KLVRoZSBiZXN0IGZ1bGwgZGVzY3JpcHRpb24gb2YgSlBFRyBpcyB0aGUgdGV4dGJvb2sgIkpQRUcgU3RpbGwgSW1hZ2UgRGF0YQotQ29tcHJlc3Npb24gU3RhbmRhcmQiIGJ5IFdpbGxpYW0gQi4gUGVubmViYWtlciBhbmQgSm9hbiBMLiBNaXRjaGVsbCwgcHVibGlzaGVkCi1ieSBWYW4gTm9zdHJhbmQgUmVpbmhvbGQsIDE5OTMsIElTQk4gMC00NDItMDEyNzItMS4gIFByaWNlIFVTJDU5Ljk1LCA2MzggcHAuCi1UaGUgYm9vayBpbmNsdWRlcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgSVNPIEpQRUcgc3RhbmRhcmRzIChESVMgMTA5MTgtMQotYW5kIGRyYWZ0IERJUyAxMDkxOC0yKS4gIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsZXRlIGV4cG9zaXRpb24gb2YgSlBFRwotaW4gZXhpc3RlbmNlLCBhbmQgd2UgaGlnaGx5IHJlY29tbWVuZCBpdC4KLQotVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUgZWxlY3Ryb25pY2FsbHk7IHlvdSBtdXN0IG9yZGVyIGEKLXBhcGVyIGNvcHkgdGhyb3VnaCBJU08gb3IgSVRVLiAgKFVubGVzcyB5b3UgZmVlbCBhIG5lZWQgdG8gb3duIGEgY2VydGlmaWVkCi1vZmZpY2lhbCBjb3B5LCB3ZSByZWNvbW1lbmQgYnV5aW5nIHRoZSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbCBib29rIGluc3RlYWQ7Ci1pdCdzIG11Y2ggY2hlYXBlciBhbmQgaW5jbHVkZXMgYSBncmVhdCBkZWFsIG9mIHVzZWZ1bCBleHBsYW5hdG9yeSBtYXRlcmlhbC4pCi1JbiB0aGUgVVNBLCBjb3BpZXMgb2YgdGhlIHN0YW5kYXJkIG1heSBiZSBvcmRlcmVkIGZyb20gQU5TSSBTYWxlcyBhdCAoMjEyKQotNjQyLTQ5MDAsIG9yIGZyb20gR2xvYmFsIEVuZ2luZWVyaW5nIERvY3VtZW50cyBhdCAoODAwKSA4NTQtNzE3OS4gIChBTlNJCi1kb2Vzbid0IHRha2UgY3JlZGl0IGNhcmQgb3JkZXJzLCBidXQgR2xvYmFsIGRvZXMuKSAgSXQncyBub3QgY2hlYXA6IGFzIG9mCi0xOTkyLCBBTlNJIHdhcyBjaGFyZ2luZyAkOTUgZm9yIFBhcnQgMSBhbmQgJDQ3IGZvciBQYXJ0IDIsIHBsdXMgNyUKLXNoaXBwaW5nL2hhbmRsaW5nLiAgVGhlIHN0YW5kYXJkIGlzIGRpdmlkZWQgaW50byB0d28gcGFydHMsIFBhcnQgMSBiZWluZyB0aGUKLWFjdHVhbCBzcGVjaWZpY2F0aW9uLCB3aGlsZSBQYXJ0IDIgY292ZXJzIGNvbXBsaWFuY2UgdGVzdGluZyBtZXRob2RzLiAgUGFydCAxCi1pcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZiBDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLAotUGFydCAxOiBSZXF1aXJlbWVudHMgYW5kIGd1aWRlbGluZXMiIGFuZCBoYXMgZG9jdW1lbnQgbnVtYmVycyBJU08vSUVDIElTCi0xMDkxOC0xLCBJVFUtVCBULjgxLiAgUGFydCAyIGlzIHRpdGxlZCAiRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQgQ29kaW5nIG9mCi1Db250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLCBQYXJ0IDI6IENvbXBsaWFuY2UgdGVzdGluZyIgYW5kIGhhcyBkb2N1bWVudAotbnVtYmVycyBJU08vSUVDIElTIDEwOTE4LTIsIElUVS1UIFQuODMuCi0KLVNvbWUgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgSlBFRyBzdGFuZGFyZCBhcmUgZGVmaW5lZCBpbiBKUEVHIFBhcnQgMywKLWEgbmV3ZXIgSVNPIHN0YW5kYXJkIG51bWJlcmVkIElTTy9JRUMgSVMgMTA5MTgtMyBhbmQgSVRVLVQgVC44NC4gIElKRwotY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgYW55IFBhcnQgMyBleHRlbnNpb25zLgotCi1UaGUgSlBFRyBzdGFuZGFyZCBkb2VzIG5vdCBzcGVjaWZ5IGFsbCBkZXRhaWxzIG9mIGFuIGludGVyY2hhbmdlYWJsZSBmaWxlCi1mb3JtYXQuICBGb3IgdGhlIG9taXR0ZWQgZGV0YWlscyB3ZSBmb2xsb3cgdGhlICJKRklGIiBjb252ZW50aW9ucywgcmV2aXNpb24KLTEuMDIuICBBIGNvcHkgb2YgdGhlIEpGSUYgc3BlYyBpcyBhdmFpbGFibGUgZnJvbToKLQlMaXRlcmF0dXJlIERlcGFydG1lbnQKLQlDLUN1YmUgTWljcm9zeXN0ZW1zLCBJbmMuCi0JMTc3OCBNY0NhcnRoeSBCbHZkLgotCU1pbHBpdGFzLCBDQSA5NTAzNQotCXBob25lICg0MDgpIDk0NC02MzAwLCAgZmF4ICg0MDgpIDk0NC02MzE0Ci1BIFBvc3RTY3JpcHQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBieSBGVFAgYXQKLWZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy9qZmlmLnBzLmd6LiAgVGhlcmUgaXMgYWxzbyBhIHBsYWluIHRleHQKLXZlcnNpb24gYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pmaWYudHh0Lmd6LCBidXQgaXQgaXMgbWlzc2luZwotdGhlIGZpZ3VyZXMuCi0KLVRoZSBUSUZGIDYuMCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBGVFAgZnJvbQotZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi9USUZGNi5wcy5nei4gIFRoZSBKUEVHIGluY29ycG9yYXRpb24gc2NoZW1lCi1mb3VuZCBpbiB0aGUgVElGRiA2LjAgc3BlYyBvZiAzLUp1bmUtOTIgaGFzIGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCi1JSkcgZG9lcyBub3QgcmVjb21tZW5kIHVzZSBvZiB0aGUgVElGRiA2LjAgZGVzaWduIChUSUZGIENvbXByZXNzaW9uIHRhZyA2KS4KLUluc3RlYWQsIHdlIHJlY29tbWVuZCB0aGUgSlBFRyBkZXNpZ24gcHJvcG9zZWQgYnkgVElGRiBUZWNobmljYWwgTm90ZSAjMgotKENvbXByZXNzaW9uIHRhZyA3KS4gIENvcGllcyBvZiB0aGlzIE5vdGUgY2FuIGJlIG9idGFpbmVkIGZyb20gZnRwLnNnaS5jb20gb3IKLWZyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnLy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIG5leHQgcmV2aXNpb24KLW9mIHRoZSBUSUZGIHNwZWMgd2lsbCByZXBsYWNlIHRoZSA2LjAgSlBFRyBkZXNpZ24gd2l0aCB0aGUgTm90ZSdzIGRlc2lnbi4KLUFsdGhvdWdoIElKRydzIG93biBjb2RlIGRvZXMgbm90IHN1cHBvcnQgVElGRi9KUEVHLCB0aGUgZnJlZSBsaWJ0aWZmIGxpYnJhcnkKLXVzZXMgb3VyIGxpYnJhcnkgdG8gaW1wbGVtZW50IFRJRkYvSlBFRyBwZXIgdGhlIE5vdGUuICBsaWJ0aWZmIGlzIGF2YWlsYWJsZQotZnJvbSBmdHA6Ly9mdHAuc2dpLmNvbS9ncmFwaGljcy90aWZmLy4KLQotCi1BUkNISVZFIExPQ0FUSU9OUwotPT09PT09PT09PT09PT09PT0KLQotVGhlICJvZmZpY2lhbCIgYXJjaGl2ZSBzaXRlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGZ0cC51dS5uZXQgKEludGVybmV0Ci1hZGRyZXNzIDE5Mi40OC45Ni45KS4gIFRoZSBtb3N0IHJlY2VudCByZWxlYXNlZCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQKLXRoZXJlIGluIGRpcmVjdG9yeSBncmFwaGljcy9qcGVnLiAgVGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gd2lsbCBiZSBhcmNoaXZlZAotYXMgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pwZWdzcmMudjZiLnRhci5nei4gIElmIHlvdSBkb24ndCBoYXZlCi1kaXJlY3QgSW50ZXJuZXQgYWNjZXNzLCBVVU5FVCdzIGFyY2hpdmVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgVVVDUDsgY29udGFjdAotaGVscEB1dW5ldC51dS5uZXQgZm9yIGluZm9ybWF0aW9uIG9uIHJldHJpZXZpbmcgZmlsZXMgdGhhdCB3YXkuCi0KLU51bWVyb3VzIEludGVybmV0IHNpdGVzIG1haW50YWluIGNvcGllcyBvZiB0aGUgVVVORVQgZmlsZXMuICBIb3dldmVyLCBvbmx5Ci1mdHAudXUubmV0IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IG9mZmljaWFsIHZlcnNpb24uCi0KLVlvdSBjYW4gYWxzbyBvYnRhaW4gdGhpcyBzb2Z0d2FyZSBpbiBET1MtY29tcGF0aWJsZSAiemlwIiBhcmNoaXZlIGZvcm1hdCBmcm9tCi10aGUgU2ltVGVsIGFyY2hpdmVzIChmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L21zZG9zL2dyYXBoaWNzLyksIG9yCi1vbiBDb21wdVNlcnZlIGluIHRoZSBHcmFwaGljcyBTdXBwb3J0IGZvcnVtIChHTyBDSVM6R1JBUEhTVVApLCBsaWJyYXJ5IDEyCi0iSlBFRyBUb29scyIuICBBZ2FpbiwgdGhlc2UgdmVyc2lvbnMgbWF5IHNvbWV0aW1lcyBsYWcgYmVoaW5kIHRoZSBmdHAudXUubmV0Ci1yZWxlYXNlLgotCi1UaGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlIGlzIGEgdXNlZnVsIHNvdXJjZSBvZgotZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBKUEVHLiAgSXQgaXMgdXBkYXRlZCBjb25zdGFudGx5IGFuZCB0aGVyZWZvcmUgaXMKLW5vdCBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBGQVEgaXMgcG9zdGVkIGV2ZXJ5IHR3byB3ZWVrcyB0bwotVXNlbmV0IG5ld3Nncm91cHMgY29tcC5ncmFwaGljcy5taXNjLCBuZXdzLmFuc3dlcnMsIGFuZCBvdGhlciBncm91cHMuCi1JdCBpcyBhdmFpbGFibGUgb24gdGhlIFdvcmxkIFdpZGUgV2ViIGF0IGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9qcGVnLWZhcS8KLWFuZCBvdGhlciBuZXdzLmFuc3dlcnMgYXJjaGl2ZSBzaXRlcywgaW5jbHVkaW5nIHRoZSBvZmZpY2lhbCBuZXdzLmFuc3dlcnMKLWFyY2hpdmUgYXQgcnRmbS5taXQuZWR1OiBmdHA6Ly9ydGZtLm1pdC5lZHUvcHViL3VzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvLgotSWYgeW91IGRvbid0IGhhdmUgV2ViIG9yIEZUUCBhY2Nlc3MsIHNlbmQgZS1tYWlsIHRvIG1haWwtc2VydmVyQHJ0Zm0ubWl0LmVkdQotd2l0aCBib2R5Ci0Jc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQxCi0Jc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQyCi0KLQotUkVMQVRFRCBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PQotCi1OdW1lcm91cyB2aWV3aW5nIGFuZCBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMgbm93IHN1cHBvcnQgSlBFRy4gIChRdWl0ZSBhCi1mZXcgb2YgdGhlbSB1c2UgdGhpcyBsaWJyYXJ5IHRvIGRvIHNvLikgIFRoZSBKUEVHIEZBUSBkZXNjcmliZWQgYWJvdmUgbGlzdHMKLXNvbWUgb2YgdGhlIG1vcmUgcG9wdWxhciBmcmVlIGFuZCBzaGFyZXdhcmUgdmlld2VycywgYW5kIHRlbGxzIHdoZXJlIHRvCi1vYnRhaW4gdGhlbSBvbiBJbnRlcm5ldC4KLQotSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgd2UgaGlnaGx5IHJlY29tbWVuZCBKZWYgUG9za2FuemVyJ3MgZnJlZQotUEJNUExVUyBzb2Z0d2FyZSwgd2hpY2ggcHJvdmlkZXMgbWFueSB1c2VmdWwgb3BlcmF0aW9ucyBvbiBQUE0tZm9ybWF0IGltYWdlCi1maWxlcy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBjb252ZXJ0IFBQTSBpbWFnZXMgdG8gYW5kIGZyb20gYSB3aWRlIHJhbmdlIG9mCi1vdGhlciBmb3JtYXRzLCB0aHVzIG1ha2luZyBjanBlZy9kanBlZyBjb25zaWRlcmFibHkgbW9yZSB1c2VmdWwuICBUaGUgbGF0ZXN0Ci12ZXJzaW9uIGlzIGRpc3RyaWJ1dGVkIGJ5IHRoZSBOZXRQQk0gZ3JvdXAsIGFuZCBpcyBhdmFpbGFibGUgZnJvbSBudW1lcm91cwotc2l0ZXMsIG5vdGFibHkgZnRwOi8vd3VhcmNoaXZlLnd1c3RsLmVkdS9ncmFwaGljcy9ncmFwaGljcy9wYWNrYWdlcy9OZXRQQk0vLgotVW5mb3J0dW5hdGVseSBQQk1QTFVTL05FVFBCTSBpcyBub3QgbmVhcmx5IGFzIHBvcnRhYmxlIGFzIHRoZSBJSkcgc29mdHdhcmUgaXM7Ci15b3UgYXJlIGxpa2VseSB0byBoYXZlIGRpZmZpY3VsdHkgbWFraW5nIGl0IHdvcmsgb24gYW55IG5vbi1Vbml4IG1hY2hpbmUuCi0KLUEgZGlmZmVyZW50IGZyZWUgSlBFRyBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSB0aGUgUFZSRyBncm91cCBhdCBTdGFuZm9yZCwKLWlzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2hhdmVmdW4uc3RhbmZvcmQuZWR1L3B1Yi9qcGVnLy4gIFRoaXMgcHJvZ3JhbQotaXMgZGVzaWduZWQgZm9yIHJlc2VhcmNoIGFuZCBleHBlcmltZW50YXRpb24gcmF0aGVyIHRoYW4gcHJvZHVjdGlvbiB1c2U7Ci1pdCBpcyBzbG93ZXIsIGhhcmRlciB0byB1c2UsIGFuZCBsZXNzIHBvcnRhYmxlIHRoYW4gdGhlIElKRyBjb2RlLCBidXQgaXQKLWlzIGVhc2llciB0byByZWFkIGFuZCBtb2RpZnkuICBBbHNvLCB0aGUgUFZSRyBjb2RlIHN1cHBvcnRzIGxvc3NsZXNzIEpQRUcsCi13aGljaCB3ZSBkbyBub3QuICAoT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXNuJ3QgZG8gcHJvZ3Jlc3NpdmUgSlBFRy4pCi0KLQotRklMRSBGT1JNQVQgV0FSUwotPT09PT09PT09PT09PT09PQotCi1Tb21lIEpQRUcgcHJvZ3JhbXMgcHJvZHVjZSBmaWxlcyB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG91ciBsaWJyYXJ5LgotVGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgSVNPIEpQRUcgY29tbWl0dGVlIGZhaWxlZCB0byBzcGVjaWZ5IGEKLWNvbmNyZXRlIGZpbGUgZm9ybWF0LiAgU29tZSB2ZW5kb3JzICJmaWxsZWQgaW4gdGhlIGJsYW5rcyIgb24gdGhlaXIgb3duLAotY3JlYXRpbmcgcHJvcHJpZXRhcnkgZm9ybWF0cyB0aGF0IG5vIG9uZSBlbHNlIGNvdWxkIHJlYWQuICAoRm9yIGV4YW1wbGUsIG5vbmUKLW9mIHRoZSBlYXJseSBjb21tZXJjaWFsIEpQRUcgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgTWFjaW50b3NoIHdlcmUgYWJsZSB0bwotZXhjaGFuZ2UgY29tcHJlc3NlZCBmaWxlcy4pCi0KLVRoZSBmaWxlIGZvcm1hdCB3ZSBoYXZlIGFkb3B0ZWQgaXMgY2FsbGVkIEpGSUYgKHNlZSBSRUZFUkVOQ0VTKS4gIFRoaXMgZm9ybWF0Ci1oYXMgYmVlbiBhZ3JlZWQgdG8gYnkgYSBudW1iZXIgb2YgbWFqb3IgY29tbWVyY2lhbCBKUEVHIHZlbmRvcnMsIGFuZCBpdCBoYXMKLWJlY29tZSB0aGUgZGUgZmFjdG8gc3RhbmRhcmQuICBKRklGIGlzIGEgbWluaW1hbCBvciAibG93IGVuZCIgcmVwcmVzZW50YXRpb24uCi1XZSByZWNvbW1lbmQgdGhlIHVzZSBvZiBUSUZGL0pQRUcgKFRJRkYgcmV2aXNpb24gNi4wIGFzIG1vZGlmaWVkIGJ5IFRJRkYKLVRlY2huaWNhbCBOb3RlICMyKSBmb3IgImhpZ2ggZW5kIiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIHJlY29yZCBhIGxvdCBvZgotYWRkaXRpb25hbCBkYXRhIGFib3V0IGFuIGltYWdlLiAgVElGRi9KUEVHIGlzIGZhaXJseSBuZXcgYW5kIG5vdCB5ZXQgd2lkZWx5Ci1zdXBwb3J0ZWQsIHVuZm9ydHVuYXRlbHkuCi0KLVRoZSB1cGNvbWluZyBKUEVHIFBhcnQgMyBzdGFuZGFyZCBkZWZpbmVzIGEgZmlsZSBmb3JtYXQgY2FsbGVkIFNQSUZGLgotU1BJRkYgaXMgaW50ZXJvcGVyYWJsZSB3aXRoIEpGSUYsIGluIHRoZSBzZW5zZSB0aGF0IG1vc3QgSkZJRiBkZWNvZGVycyBzaG91bGQKLWJlIGFibGUgdG8gcmVhZCB0aGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiBTUElGRi4gIFNQSUZGIGhhcyBzb21lIHRlY2huaWNhbAotYWR2YW50YWdlcyBvdmVyIEpGSUYsIGJ1dCBpdHMgbWFqb3IgY2xhaW0gdG8gZmFtZSBpcyBzaW1wbHkgdGhhdCBpdCBpcyBhbgotb2ZmaWNpYWwgc3RhbmRhcmQgcmF0aGVyIHRoYW4gYW4gaW5mb3JtYWwgb25lLiAgQXQgdGhpcyBwb2ludCBpdCBpcyB1bmNsZWFyCi13aGV0aGVyIFNQSUZGIHdpbGwgc3VwZXJzZWRlIEpGSUYgb3Igd2hldGhlciBKRklGIHdpbGwgcmVtYWluIHRoZSBkZS1mYWN0bwotc3RhbmRhcmQuICBJSkcgaW50ZW5kcyB0byBzdXBwb3J0IFNQSUZGIG9uY2UgdGhlIHN0YW5kYXJkIGlzIGZyb3plbiwgYnV0IHdlCi1oYXZlIG5vdCBkZWNpZGVkIHdoZXRoZXIgaXQgc2hvdWxkIGJlY29tZSBvdXIgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IG9yIG5vdC4KLShJbiBhbnkgY2FzZSwgb3VyIGRlY29kZXIgd2lsbCByZW1haW4gY2FwYWJsZSBvZiByZWFkaW5nIEpGSUYgaW5kZWZpbml0ZWx5LikKLQotVmFyaW91cyBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdHMgaW5jb3Jwb3JhdGluZyBKUEVHIGNvbXByZXNzaW9uIGFsc28gZXhpc3QuCi1XZSBoYXZlIGxpdHRsZSBvciBubyBzeW1wYXRoeSBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBmb3JtYXRzLiAgSW5kZWVkLAotb25lIG9mIHRoZSBvcmlnaW5hbCByZWFzb25zIGZvciBkZXZlbG9waW5nIHRoaXMgZnJlZSBzb2Z0d2FyZSB3YXMgdG8gaGVscAotZm9yY2UgY29udmVyZ2VuY2Ugb24gY29tbW9uLCBvcGVuIGZvcm1hdCBzdGFuZGFyZHMgZm9yIEpQRUcgZmlsZXMuICBEb24ndAotdXNlIGEgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXQhCi0KLQotVE8gRE8KLT09PT09Ci0KLVRoZSBtYWpvciB0aHJ1c3QgZm9yIHY3IHdpbGwgcHJvYmFibHkgYmUgaW1wcm92ZW1lbnQgb2YgdmlzdWFsIHF1YWxpdHkuCi1UaGUgY3VycmVudCBtZXRob2QgZm9yIHNjYWxpbmcgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgaXMga25vd24gbm90IHRvIGJlCi12ZXJ5IGdvb2QgYXQgbG93IFEgdmFsdWVzLiAgV2UgYWxzbyBpbnRlbmQgdG8gaW52ZXN0aWdhdGUgYmxvY2sgYm91bmRhcnkKLXNtb290aGluZywgInBvb3IgbWFuJ3MgdmFyaWFibGUgcXVhbnRpemF0aW9uIiwgYW5kIG90aGVyIG1lYW5zIG9mIGltcHJvdmluZwotcXVhbGl0eS12cy1maWxlLXNpemUgcGVyZm9ybWFuY2Ugd2l0aG91dCBzYWNyaWZpY2luZyBjb21wYXRpYmlsaXR5LgotCi1JbiBmdXR1cmUgdmVyc2lvbnMsIHdlIGFyZSBjb25zaWRlcmluZyBzdXBwb3J0aW5nIHNvbWUgb2YgdGhlIHVwY29taW5nIEpQRUcKLVBhcnQgMyBleHRlbnNpb25zIC0tLSBwcmluY2lwYWxseSwgdmFyaWFibGUgcXVhbnRpemF0aW9uIGFuZCB0aGUgU1BJRkYgZmlsZQotZm9ybWF0LgotCi1BcyBhbHdheXMsIHNwZWVkaW5nIHRoaW5ncyB1cCBpcyBvZiBncmVhdCBpbnRlcmVzdC4KLQotUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIG9mZmVycyBvZiBoZWxwLCBldGMuIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9SRUFETUUtVmVOdW0gYi9saWJqcGVndHdycC9SRUFETUUtVmVOdW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNTE0NDkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvUkVBRE1FLVZlTnVtCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotUkVBRE1FLVZlTnVtCi1RdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBpcyBhIG1lbWJlciBvZiBDb2RlIEF1cm9yYSBGb3J1bQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29uc3VtZXJzIGFyZSBpbmNyZWFzaW5nbHkgYnJvd3NpbmcgV2ViIGJhc2VkIHBob3RvIGdhbGxlcmllcyBpbmNvcnBvcmF0aW5nCi1oaWdoLXJlc29sdXRpb24gSlBFRyBpbWFnZXMgd2l0aCB0aGVpciBtb2JpbGUgZGV2aWNlcy4gVGhlc2UgaW1hZ2VzIGFyZQotZGVjb2RlZCBieSB0aGUgbW9iaWxlIGRldmljZSwgYW5kIHR5cGljYWxseSBhbHNvIHNjYWxlZCBkb3duIHRvIGZpdCB0aGUgdXNlcidzCi16b29tIHNlbGVjdGlvbiBvbiB0aGUgZGV2aWNlJ3MgYnJvd3Nlci4KLQotSW4gb3JkZXIgdG8gaW1wcm92ZSBib3RoIGRlY29kZSBhbmQgZG93bmxvYWQgdGltZXMsIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyCi1oYXMgb3B0aW1pemVkIHRoZSBKUEVHIGxpYnJhcnkgZm91bmQgb24gbWFueSBjb21tb24gT1MgcGxhdGZvcm1zIHN1Y2ggYXMgV2ViCi1PUywgQW5kcm9pZCwgYW5kIENocm9tZSBPUy4gT3VyIHRlYW0gcmUtaW1wbGVtZW50ZWQgc2V2ZXJhbCByb3V0aW5lcyB0byB1dGlsaXplIHRoZQotRFNQLWxpa2UgU0lNRCBjYXBhYmlsaXRpZXMgb2YgdGhlIEFSTSBORU9OIGluc3RydWN0aW9uIHNldC4gVGhlc2Ugd2VyZSB0aGVuCi10dW5lZCBhbmQgdGVzdGVkIG9uIFF1YWxjb21tJ3MgU25hcGRyYWdvbiBwbGF0Zm9ybSB3aGljaCBpbXBsZW1lbnRzIHRoZSBWZU51bQotaW1wbGVtZW50YXRpb24gb2YgdGhlc2Ugc2FtZSBpbnN0cnVjdGlvbnMuCi0KLVRoZSBzcGVjaWZpYyBhcmVhcyBvZiBmb2N1cyBjb3ZlciBWZU51bS9ORU9OIGFjY2VsZXJhdGlvbiBvZiBJbnZlcnNlIERpc2NyZXRlCi1Db3NpbmUgVHJhbnNmb3JtIChpRENUKSBmb3IgOHg4LCA0eDQsIDJ4MiwgYW5kIDF4MSBibG9jayBzaXplcyBhbmQgWVVWIHRvIFJHQgotY29sb3Igc3BhY2UgY29udmVyc2lvbi4gVGhpcyByZXN1bHRlZCBpbiBhIHJhbmdlIG9mIDE4LTMyJSBpbXByb3ZlbWVudCBpbiBKUEVHCi1kZWNvZGUgYW5kIGRvd25zY2FsZSB0aW1lcyBmb3IgaW1hZ2VzIGdyZWF0ZXIgdGhhbiAyTXBpeGVscy4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL1RoaXJkUGFydHlQcm9qZWN0LnByb3AgYi9saWJqcGVndHdycC9UaGlyZFBhcnR5UHJvamVjdC5wcm9wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhjYzYzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL1RoaXJkUGFydHlQcm9qZWN0LnByb3AKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSNGcmkgSnVsIDE2IDEwOjAzOjA5IFBEVCAyMDEwCi1jdXJyZW50VmVyc2lvbj04YQotdmVyc2lvbj02YgotaXNOYXRpdmU9dHJ1ZQotbmFtZT1qcGVnCi1rZXl3b3Jkcz1qcGVnCi1vbkRldmljZT10cnVlCi1ob21lcGFnZT1odHRwXDovL3d3dy5pamcub3JnLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvYW5zaTJrbnIuMSBiL2xpYmpwZWd0d3JwL2Fuc2kya25yLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZWU1YTYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvYW5zaTJrbnIuMQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS5USCBBTlNJMktOUiAxICIxOSBKYW4gMTk5NiIKLS5TSCBOQU1FCi1hbnNpMmtuciBcLSBjb252ZXJ0IEFOU0kgQyB0byBLZXJuaWdoYW4gJiBSaXRjaGllIEMKLS5TSCBTWU5PUFNJUwotLkkgYW5zaTJrbnIKLVstLXZhcmFyZ3NdIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQotLlNIIERFU0NSSVBUSU9OCi1JZiBubyBvdXRwdXRfZmlsZSBpcyBzdXBwbGllZCwgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0LgotLmJyCi1UaGVyZSBhcmUgbm8gZXJyb3IgbWVzc2FnZXMuCi0uc3AKLS5JIGFuc2kya25yCi1yZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkIGlkZW50aWZpZXIgYXQgdGhlIGxlZnQKLW1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLCB3aXRoIGEgcmlnaHQgcGFyZW50aGVzaXMgYXMgdGhlIGxhc3QKLWNoYXJhY3RlciBvbiB0aGUgbGluZSwgYW5kIHdpdGggYSBsZWZ0IGJyYWNlIGFzIHRoZSBmaXJzdCB0b2tlbiBvbiB0aGUKLWZvbGxvd2luZyBsaW5lIChpZ25vcmluZyBwb3NzaWJsZSBpbnRlcnZlbmluZyBjb21tZW50cykuICBJdCB3aWxsIHJlY29nbml6ZSBhCi1tdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nIGxpbmUgZW5kcyB3aXRoIGEgbGVmdCBvciByaWdodAotYnJhY2Ugb3IgYSBzZW1pY29sb24uICBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0Ci10aGF0IHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgotLnNwCi1UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgd2lsbCBjb25mdXNlIGl0OgotLmJyCi0gICAgIC0gQW55IG90aGVyIGNvbnN0cnVjdCB0aGF0IHN0YXJ0cyBhdCB0aGUgbGVmdCBtYXJnaW4gYW5kIGZvbGxvd3MgdGhlCi1hYm92ZSBzeW50YXggKHN1Y2ggYXMgYSBtYWNybyBvciBmdW5jdGlvbiBjYWxsKS4KLS5icgotICAgICAtIFNvbWUgbWFjcm9zIHRoYXQgdGlua2VyIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgZnVuY3Rpb24gaGVhZGVyLgotLnNwCi1UaGUgLS12YXJhcmdzIHN3aXRjaCBpcyBvYnNvbGV0ZSwgYW5kIGlzIHJlY29nbml6ZWQgb25seSBmb3IKLWJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgVGhlIHByZXNlbnQgdmVyc2lvbiBvZgotLkkgYW5zaTJrbnIKLXdpbGwgYWx3YXlzIGF0dGVtcHQgdG8gY29udmVydCBhIC4uLiBhcmd1bWVudCB0byB2YV9hbGlzdCBhbmQgdmFfZGNsLgotLlNIIEFVVEhPUgotTC4gUGV0ZXIgRGV1dHNjaCA8Z2hvc3RAYWxhZGRpbi5jb20+IHdyb3RlIHRoZSBvcmlnaW5hbCBhbnNpMmtuciBhbmQKLWNvbnRpbnVlcyB0byBtYWludGFpbiB0aGUgY3VycmVudCB2ZXJzaW9uOyBtb3N0IG9mIHRoZSBjb2RlIGluIHRoZSBjdXJyZW50Ci12ZXJzaW9uIGlzIGhpcyB3b3JrLiAgYW5zaTJrbnIgYWxzbyBpbmNsdWRlcyBjb250cmlidXRpb25zIGJ5IEZyYW5jb2lzCi1QaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiBhbmQgSmltIEF2ZXJhIDxqaW1hQG5ldGNvbS5jb20+LgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvYW5zaTJrbnIuYyBiL2xpYmpwZWd0d3JwL2Fuc2kya25yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDVmYzIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvYW5zaTJrbnIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKiBhbnNpMmtuci5jICovCi0vKiBDb252ZXJ0IEFOU0kgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBLJlIgKCJ0cmFkaXRpb25hbCBDIikgc3ludGF4ICovCi0KLS8qCi1hbnNpMmtuciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLVdBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yIGFjY2VwdHMgcmVzcG9uc2liaWxpdHkgdG8gYW55b25lIGZvciB0aGUKLWNvbnNlcXVlbmNlcyBvZiB1c2luZyBpdCBvciBmb3Igd2hldGhlciBpdCBzZXJ2ZXMgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvcgotd29ya3MgYXQgYWxsLCB1bmxlc3MgaGUgc2F5cyBzbyBpbiB3cml0aW5nLiAgUmVmZXIgdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSAodGhlICJHUEwiKSBmb3IgZnVsbCBkZXRhaWxzLgotCi1FdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgYW5zaTJrbnIsCi1idXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlIEdQTC4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UKLWlzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCBhbnNpMmtuciBzbyB5b3UgY2FuIGtub3cKLXlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlIGluIGEgZmlsZSBuYW1lZCBDT1BZTEVGVC4KLVtJbiB0aGUgSUpHIGRpc3RyaWJ1dGlvbiwgdGhlIEdQTCBhcHBlYXJzIGJlbG93LCBub3QgaW4gYSBzZXBhcmF0ZSBmaWxlLl0KLUFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkCi1vbiBhbGwgY29waWVzLgotCi1XZSBleHBsaWNpdGx5IHN0YXRlIGhlcmUgd2hhdCB3ZSBiZWxpZXZlIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgR1BMOiBpZgotdGhlIGFuc2kya25yIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygc291cmNlcyBhbmQgYQotc2VwYXJhdGUgZXhlY3V0YWJsZSBmaWxlIHdoaWNoIGFyZSBhZ2dyZWdhdGVkIG9uIGEgc3RvcmFnZSBtZWRpdW0gdG9nZXRoZXIKLXdpdGggYW5vdGhlciBwcm9ncmFtLCB0aGlzIGluIGl0c2VsZiBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgcHJvZ3JhbSB1bmRlcgotdGhlIEdQTCwgbm9yIGRvZXMgdGhlIG1lcmUgZmFjdCB0aGF0IHN1Y2ggYSBwcm9ncmFtIG9yIHRoZSBwcm9jZWR1cmVzIGZvcgotY29uc3RydWN0aW5nIGl0IGludm9rZSB0aGUgYW5zaTJrbnIgZXhlY3V0YWJsZSBicmluZyBhbnkgb3RoZXIgcGFydCBvZiB0aGUKLXByb2dyYW0gdW5kZXIgdGhlIEdQTC4KLSovCi0KLS8qCi0tLS0tLS0tLS0tIEhlcmUgaXMgdGhlIEdOVSBHUEwgZmlsZSBDT1BZTEVGVCwgcmVmZXJyZWQgdG8gYWJvdmUgLS0tLS0tLS0tLQotLS0tLS0gVGhlc2UgdGVybXMgZG8gTk9UIGFwcGx5IHRvIHRoZSBKUEVHIHNvZnR3YXJlIGl0c2VsZjsgc2VlIFJFQURNRSAtLS0tLS0KLQotCQkgICAgR0hPU1RTQ1JJUFQgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgKENsYXJpZmllZCAxMSBGZWIgMTk4OCkKLQotIENvcHlyaWdodCAoQykgMTk4OCBSaWNoYXJkIE0uIFN0YWxsbWFuCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMKLSBsaWNlbnNlLCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd29yZGluZwotIHRvIG1ha2UgdGhlIHRlcm1zIGZvciBvdGhlciBwcm9ncmFtcy4KLQotICBUaGUgbGljZW5zZSBhZ3JlZW1lbnRzIG9mIG1vc3Qgc29mdHdhcmUgY29tcGFuaWVzIGtlZXAgeW91IGF0IHRoZQotbWVyY3kgb2YgdGhvc2UgY29tcGFuaWVzLiAgQnkgY29udHJhc3QsIG91ciBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGlzCi1pbnRlbmRlZCB0byBnaXZlIGV2ZXJ5b25lIHRoZSByaWdodCB0byBzaGFyZSBHaG9zdHNjcmlwdC4gIFRvIG1ha2Ugc3VyZQotdGhhdCB5b3UgZ2V0IHRoZSByaWdodHMgd2Ugd2FudCB5b3UgdG8gaGF2ZSwgd2UgbmVlZCB0byBtYWtlCi1yZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91Ci10byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIEhlbmNlIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQuCi0KLSAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCi1hd2F5IGNvcGllcyBvZiBHaG9zdHNjcmlwdCwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBlbHNlIGNhbiBnZXQKLWl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIEdob3N0c2NyaXB0IG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBtYWtlIHN1cmUgdGhhdCBldmVyeW9uZSBoYXMgc3VjaCByaWdodHMsIHdlIGhhdmUgdG8gZm9yYmlkIHlvdSB0bwotZGVwcml2ZSBhbnlvbmUgZWxzZSBvZiB0aGVzZSByaWdodHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUKLWNvcGllcyBvZiBHaG9zdHNjcmlwdCwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy4KLQotICBBbHNvLCBmb3Igb3VyIG93biBwcm90ZWN0aW9uLCB3ZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIGZpbmRzCi1vdXQgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgR2hvc3RzY3JpcHQuICBJZiBHaG9zdHNjcmlwdCBpcwotbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdwotdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwgc28gdGhhdCBhbnkgcHJvYmxlbXMKLWludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyIHJlcHV0YXRpb24uCi0KLSAgVGhlcmVmb3JlIHdlIChSaWNoYXJkIE0uIFN0YWxsbWFuIGFuZCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotSW5jLikgbWFrZSB0aGUgZm9sbG93aW5nIHRlcm1zIHdoaWNoIHNheSB3aGF0IHlvdSBtdXN0IGRvIHRvIGJlIGFsbG93ZWQKLXRvIGRpc3RyaWJ1dGUgb3IgY2hhbmdlIEdob3N0c2NyaXB0LgotCi0KLQkJCUNPUFlJTkcgUE9MSUNJRVMKLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIEdob3N0c2NyaXB0IHNvdXJjZQotY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQotYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYSB2YWxpZCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UKLW5vdGljZSAiQ29weXJpZ2h0IChDKSAxOTg5IEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotRGlzdHJpYnV0ZWQgYnkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIiAob3Igd2l0aCB3aGF0ZXZlciB5ZWFyIGlzCi1hcHByb3ByaWF0ZSk7IGtlZXAgaW50YWN0IHRoZSBub3RpY2VzIG9uIGFsbCBmaWxlcyB0aGF0IHJlZmVyIHRvIHRoaXMKLUxpY2Vuc2UgQWdyZWVtZW50IGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlcgotcmVjaXBpZW50cyBvZiB0aGUgR2hvc3RzY3JpcHQgcHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudAotYWxvbmcgd2l0aCB0aGUgcHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZGlzdHJpYnV0aW9uIGZlZSBmb3IgdGhlCi1waHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIEdob3N0c2NyaXB0IG9yIGFueSBwb3J0aW9uIG9mCi1pdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZgotUGFyYWdyYXBoIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCi0gICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2U7IGFuZAotCi0gICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwKLSAgICB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgYSBkZXJpdmF0aXZlIG9mIEdob3N0c2NyaXB0Ci0gICAgb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgb24gdGVybXMgaWRlbnRpY2FsIHRvIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzIExpY2Vuc2UKLSAgICBBZ3JlZW1lbnQgKGV4Y2VwdCB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IG1vcmUgZXh0ZW5zaXZlCi0gICAgd2FycmFudHkgcHJvdGVjdGlvbiB0byBzb21lIG9yIGFsbCB0aGlyZCBwYXJ0aWVzLCBhdCB5b3VyIG9wdGlvbikuCi0KLSAgICBjKSBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YKLSAgICB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eQotICAgIHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi1NZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgdW5yZWxhdGVkIHByb2dyYW0gd2l0aCB0aGlzIHByb2dyYW0gKG9yIGl0cwotZGVyaXZhdGl2ZSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcKLXRoZSBvdGhlciBwcm9ncmFtIHVuZGVyIHRoZSBzY29wZSBvZiB0aGVzZSB0ZXJtcy4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgR2hvc3RzY3JpcHQgKG9yIGEgcG9ydGlvbiBvciBkZXJpdmF0aXZlCi1vZiBpdCwgdW5kZXIgUGFyYWdyYXBoIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUKLXRlcm1zIG9mIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUKLWZvbGxvd2luZzoKLQotICAgIGEpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLSAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAotCi0gICAgYikgYWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwKLSAgICBzaGlwcGluZyBjaGFyZ2UpIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCi0KLSAgICBjKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHdoZXJlIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSBhbG9uZS4pCi0KLUZvciBhbiBleGVjdXRhYmxlIGZpbGUsIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yCi1hbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpdCBuZWVkIG5vdCBpbmNsdWRlCi1zb3VyY2UgY29kZSBmb3IgbW9kdWxlcyB3aGljaCBhcmUgc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBmaWxlIHJ1bnMuCi0KLSAgNC4gWW91IG1heSBub3QgY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciBHaG9zdHNjcmlwdAotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIEdob3N0c2NyaXB0IGlzCi12b2lkIGFuZCB5b3VyIHJpZ2h0cyB0byB1c2UgdGhlIHByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIGFncmVlbWVudAotc2hhbGwgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZAotY29tcHV0ZXIgc29mdHdhcmUgcHJvZ3JhbXMgZnJvbSB5b3Ugd2l0aCB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgbm90Ci1oYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwKLWNvbXBsaWFuY2UuCi0KLSAgNS4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgR2hvc3RzY3JpcHQgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiBhdCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzkuICBXZSBoYXZlIG5vdAoteWV0IHdvcmtlZCBvdXQgYSBzaW1wbGUgcnVsZSB0aGF0IGNhbiBiZSBzdGF0ZWQgaGVyZSwgYnV0IHdlIHdpbGwgb2Z0ZW4KLXBlcm1pdCB0aGlzLiAgV2Ugd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlCi1zdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlCi1zaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZS4KLQotWW91ciBjb21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgYWJvdXQgb3VyIGxpY2Vuc2luZyBwb2xpY2llcyBhbmQgb3VyCi1zb2Z0d2FyZSBhcmUgd2VsY29tZSEgIFBsZWFzZSBjb250YWN0IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIG9yIGNhbGwgKDYxNykgODc2LTMyOTYuCi0KLQkJICAgICAgIE5PIFdBUlJBTlRZCi0KLSAgQkVDQVVTRSBHSE9TVFNDUklQVCBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgV0UgUFJPVklERSBBQlNPTFVURUxZCi1OTyBXQVJSQU5UWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBTVEFURSBMQVcuICBFWENFUFQKLVdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HLCBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQywgUklDSEFSRAotTS4gU1RBTExNQU4sIEFMQURESU4gRU5URVJQUklTRVMsIEwuIFBFVEVSIERFVVRTQ0gsIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIEdIT1NUU0NSSVBUICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCi1FWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUKLUVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBHSE9TVFNDUklQVCBJUyBXSVRICi1ZT1UuICBTSE9VTEQgR0hPU1RTQ1JJUFQgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAotTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIFdJTEwgUklDSEFSRCBNLgotU1RBTExNQU4sIFRIRSBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4sIEwuIFBFVEVSIERFVVRTQ0gsIEFMQURESU4KLUVOVEVSUFJJU0VTLCBBTkQvT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORCBSRURJU1RSSUJVVEUKLUdIT1NUU0NSSVBUIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HCi1BTlkgTE9TVCBQUk9GSVRTLCBMT1NUIE1PTklFUywgT1IgT1RIRVIgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRQotKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKLUlOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUKLVBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUykgR0hPU1RTQ1JJUFQsIEVWRU4gSUYgWU9VCi1IQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLCBPUiBGT1IgQU5ZIENMQUlNCi1CWSBBTlkgT1RIRVIgUEFSVFkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBmaWxlIENPUFlMRUZUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyoKLSAqIFVzYWdlOgotCWFuc2kya25yIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQotICogSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KLSAqIFRoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KLSAqCi0gKiBhbnNpMmtuciByZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkCi0gKiBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0IG1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLAotICogd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZSwKLSAqIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlIGZvbGxvd2luZyBsaW5lCi0gKiAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLgotICogSXQgd2lsbCByZWNvZ25pemUgYSBtdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nCi0gKiBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQgYnJhY2Ugb3IgYSBzZW1pY29sb24uCi0gKiBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0IHRoYXQKLSAqIHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgotICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKLSAqCS0gQW55IG90aGVyIGNvbnN0cnVjdCB0aGF0IHN0YXJ0cyBhdCB0aGUgbGVmdCBtYXJnaW4gYW5kCi0gKgkgICAgZm9sbG93cyB0aGUgYWJvdmUgc3ludGF4IChzdWNoIGFzIGEgbWFjcm8gb3IgZnVuY3Rpb24gY2FsbCkuCi0gKgktIFNvbWUgbWFjcm9zIHRoYXQgdGlua2VyIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgZnVuY3Rpb24gaGVhZGVyLgotICovCi0KLS8qCi0gKiBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgYW5zaTJrbnIgaXMgTC4gUGV0ZXIgRGV1dHNjaAotICogPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICogdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgotCWxwZCA5Ni0wMS0yMSBhZGRlZCBjb2RlIHRvIGNvcGUgd2l0aCBub3QgSEFWRV9DT05GSUdfSCBhbmQgd2l0aAotCQljb21waWxlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHZvaWQsIGFzIHN1Z2dlc3RlZCBieQotCQlUb20gTGFuZQotCWxwZCA5Ni0wMS0xNSBjaGFuZ2VkIHRvIHJlcXVpcmUgdGhhdCB0aGUgZmlyc3Qgbm9uLWNvbW1lbnQgdG9rZW4KLQkJb24gdGhlIGxpbmUgZm9sbG93aW5nIGEgZnVuY3Rpb24gaGVhZGVyIGJlIGEgbGVmdCBicmFjZSwKLQkJdG8gcmVkdWNlIHNlbnNpdGl2aXR5IHRvIG1hY3JvcywgYXMgc3VnZ2VzdGVkIGJ5IFRvbSBMYW5lCi0JCTx0Z2xAc3NzLnBnaC5wYS51cz4KLQlscGQgOTUtMDYtMjIgcmVtb3ZlZCAjaWZuZGVmcyB3aG9zZSBzb2xlIHB1cnBvc2Ugd2FzIHRvIGRlZmluZQotCQl1bmRlZmluZWQgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXMgMDsgY2hhbmdlZCBhbGwgI2lmZGVmcwotCQlmb3IgY29uZmlndXJhdGlvbiBzeW1ib2xzIHRvICNpZnMKLQlscGQgOTUtMDQtMDUgY2hhbmdlZCBjb3B5cmlnaHQgbm90aWNlIHRvIG1ha2UgaXQgY2xlYXIgdGhhdAotCQlpbmNsdWRpbmcgYW5zaTJrbnIgaW4gYSBwcm9ncmFtIGRvZXMgbm90IGJyaW5nIHRoZSBlbnRpcmUKLQkJcHJvZ3JhbSB1bmRlciB0aGUgR1BMCi0JbHBkIDk0LTEyLTE4IGFkZGVkIGNvbmRpdGlvbmFscyBmb3Igc3lzdGVtcyB3aGVyZSBjdHlwZSBtYWNyb3MKLQkJZG9uJ3QgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgcHJvcGVybHksIHN1Z2dlc3RlZCBieQotCQlGcmFuY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPjsKLQkJcmVtb3ZlZCAtLXZhcmFyZ3Mgc3dpdGNoICh0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCkKLQlscGQgOTQtMTAtMTAgcmVtb3ZlZCBDT05GSUdfQlJPS0VUUyBjb25kaXRpb25hbAotCWxwZCA5NC0wNy0xNiBhZGRlZCBzb21lIGNvbmRpdGlvbmFscyB0byBoZWxwIEdOVSBgY29uZmlndXJlJywKLQkJc3VnZ2VzdGVkIGJ5IEZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OwotCQlwcm9wZXJseSBlcmFzZSBwcm90b3R5cGUgYXJncyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzLAotCQljb250cmlidXRlZCBieSBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT47Ci0JCWNvcnJlY3QgZXJyb3IgaW4gd3JpdGVibGFua3MgKGl0IHNob3VsZG4ndCBlcmFzZSBFT0xzKQotCWxwZCA4OS14eC14eCBvcmlnaW5hbCB2ZXJzaW9uCi0gKi8KLQotLyogTW9zdCBvZiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHRvIG1ha2UgYW5zaTJrbnIgd29yayB3aXRoICovCi0vKiBvciB3aXRob3V0IHRoZSBHTlUgY29uZmlndXJlIG1hY2hpbmVyeS4gKi8KLQotI2lmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmIEhBVkVfQ09ORklHX0gKLQotLyoKLSAgIEZvciBwcm9wZXJseSBhdXRvY29uZmlndXJpbmcgYW5zaTJrbnIsIHVzZSBBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKS4KLSAgIFRoaXMgd2lsbCBkZWZpbmUgSEFWRV9DT05GSUdfSCBhbmQgc28sIGFjdGl2YXRlIHRoZSBmb2xsb3dpbmcgbGluZXMuCi0gKi8KLQotIyBpZiBTVERDX0hFQURFUlMgfHwgSEFWRV9TVFJJTkdfSAotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGVsc2UKLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgZW5kaWYKLQotI2Vsc2UgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KLQotLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwotCi0jIGlmZGVmIEJTRAotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBlbHNlCi0jICBpZmRlZiBWTVMKLSAgICBleHRlcm4gaW50IHN0cmxlbigpLCBzdHJuY21wKCk7Ci0jICBlbHNlCi0jICAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBlbmRpZgotIyBlbmRpZgotCi0jZW5kaWYgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KLQotI2lmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0vKgotICAgbWFsbG9jIGFuZCBmcmVlIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBzdGRsaWIuaCwKLSAgIGJ1dCBpZiB5b3UndmUgZ290IGEgSyZSIGNvbXBpbGVyLCB0aGV5IHByb2JhYmx5IGFyZW4ndC4KLSAqLwotIyBpZmRlZiBNU0RPUwotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIFZNUwotICAgICBleHRlcm4gY2hhciAqbWFsbG9jKCk7Ci0gICAgIGV4dGVybiB2b2lkIGZyZWUoKTsKLSMgIGVsc2UKLSAgICAgZXh0ZXJuIGNoYXIgKm1hbGxvYygpOwotICAgICBleHRlcm4gaW50IGZyZWUoKTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSNlbmRpZgotCi0vKgotICogVGhlIGN0eXBlIG1hY3JvcyBkb24ndCBhbHdheXMgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgY29ycmVjdGx5LgotICogQ29tcGVuc2F0ZSBmb3IgdGhpcyBoZXJlLgotICovCi0jaWZkZWYgaXNhc2NpaQotIyAgdW5kZWYgSEFWRV9JU0FTQ0lJCQkvKiBqdXN0IGluIGNhc2UgKi8KLSMgIGRlZmluZSBIQVZFX0lTQVNDSUkgMQotI2Vsc2UKLSNlbmRpZgotI2lmIFNURENfSEVBREVSUyB8fCAhSEFWRV9JU0FTQ0lJCi0jICBkZWZpbmUgaXNfYXNjaWkoYykgMQotI2Vsc2UKLSMgIGRlZmluZSBpc19hc2NpaShjKSBpc2FzY2lpKGMpCi0jZW5kaWYKLQotI2RlZmluZSBpc19zcGFjZShjKSAoaXNfYXNjaWkoYykgJiYgaXNzcGFjZShjKSkKLSNkZWZpbmUgaXNfYWxwaGEoYykgKGlzX2FzY2lpKGMpICYmIGlzYWxwaGEoYykpCi0jZGVmaW5lIGlzX2FsbnVtKGMpIChpc19hc2NpaShjKSAmJiBpc2FsbnVtKGMpKQotCi0vKiBTY2FubmluZyBtYWNyb3MgKi8KLSNkZWZpbmUgaXNpZGNoYXIoY2gpIChpc19hbG51bShjaCkgfHwgKGNoKSA9PSAnXycpCi0jZGVmaW5lIGlzaWRmaXJzdGNoYXIoY2gpIChpc19hbHBoYShjaCkgfHwgKGNoKSA9PSAnXycpCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlcyAqLwotY2hhciAqc2tpcHNwYWNlKCk7Ci1pbnQgd3JpdGVibGFua3MoKTsKLWludCB0ZXN0MSgpOwotaW50IGNvbnZlcnQxKCk7Ci0KLS8qIFRoZSBtYWluIHByb2dyYW0gKi8KLWludAotbWFpbihhcmdjLCBhcmd2KQotICAgIGludCBhcmdjOwotICAgIGNoYXIgKmFyZ3ZbXTsKLXsJRklMRSAqaW4sICpvdXQ7Ci0jZGVmaW5lIGJ1ZnNpemUgNTAwMAkJCS8qIGFyYml0cmFyeSBzaXplICovCi0JY2hhciAqYnVmOwotCWNoYXIgKmxpbmU7Ci0JY2hhciAqbW9yZTsKLQkvKgotCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCBhbnNpMmtuciByZWNvZ25pemVkIGEgLS12YXJhcmdzIHN3aXRjaC4KLQkgKiBJZiB0aGlzIHN3aXRjaCB3YXMgc3VwcGxpZWQsIGFuc2kya25yIHdvdWxkIGF0dGVtcHQgdG8gY29udmVydAotCSAqIGEgLi4uIGFyZ3VtZW50IHRvIHZhX2FsaXN0IGFuZCB2YV9kY2w7IGlmIHRoaXMgc3dpdGNoIHdhcyBub3QKLQkgKiBzdXBwbGllZCwgYW5zaTJrbnIgd291bGQgc2ltcGx5IGRyb3AgYW55IHN1Y2ggYXJndW1lbnRzLgotCSAqIE5vdywgYW5zaTJrbnIgYWx3YXlzIGRvZXMgdGhpcyBjb252ZXJzaW9uLCBhbmQgd2Ugb25seQotCSAqIGNoZWNrIGZvciB0aGlzIHN3aXRjaCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQkgKi8KLQlpbnQgY29udmVydF92YXJhcmdzID0gMTsKLQotCWlmICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKQotCSAgewlpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tdmFyYXJncyIpICkKLQkJICB7CWNvbnZlcnRfdmFyYXJncyA9IDE7Ci0JCQlhcmdjLS07Ci0JCQlhcmd2Kys7Ci0JCSAgfQotCQllbHNlCi0JCSAgewlmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBzd2l0Y2g6ICVzXG4iLCBhcmd2WzFdKTsKLQkJCWV4aXQoMSk7Ci0JCSAgfQotCSAgfQotCXN3aXRjaCAoIGFyZ2MgKQotCSAgIHsKLQlkZWZhdWx0OgotCQlwcmludGYoIlVzYWdlOiBhbnNpMmtuciBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV1cbiIpOwotCQlleGl0KDApOwotCWNhc2UgMjoKLQkJb3V0ID0gc3Rkb3V0OwotCQlicmVhazsKLQljYXNlIDM6Ci0JCW91dCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7Ci0JCWlmICggb3V0ID09IE5VTEwgKQotCQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOwotCQkJZXhpdCgxKTsKLQkJICAgfQotCSAgIH0KLQlpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7Ci0JaWYgKCBpbiA9PSBOVUxMICkKLQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgYXJndlsxXSk7Ci0JCWV4aXQoMSk7Ci0JICAgfQotCWZwcmludGYob3V0LCAiI2xpbmUgMSBcIiVzXCJcbiIsIGFyZ3ZbMV0pOwotCWJ1ZiA9IG1hbGxvYyhidWZzaXplKTsKLQlsaW5lID0gYnVmOwotCXdoaWxlICggZmdldHMobGluZSwgKHVuc2lnbmVkKShidWYgKyBidWZzaXplIC0gbGluZSksIGluKSAhPSBOVUxMICkKLQkgICB7Ci10ZXN0OgkJbGluZSArPSBzdHJsZW4obGluZSk7Ci0JCXN3aXRjaCAoIHRlc3QxKGJ1ZikgKQotCQkgICB7Ci0JCWNhc2UgMjoJCQkvKiBhIGZ1bmN0aW9uIGhlYWRlciAqLwotCQkJY29udmVydDEoYnVmLCBvdXQsIDEsIGNvbnZlcnRfdmFyYXJncyk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgkJCS8qIGEgZnVuY3Rpb24gKi8KLQkJCS8qIENoZWNrIGZvciBhIHsgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUuICovCi0JCQltb3JlID0gKytsaW5lOwotZjoJCQlpZiAoIGxpbmUgPj0gYnVmICsgKGJ1ZnNpemUgLSAxKSApIC8qIG92ZXJmbG93IGNoZWNrICovCi0JCQkgIGdvdG8gd2w7Ci0JCQlpZiAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgPT0gTlVMTCApCi0JCQkgIGdvdG8gd2w7Ci0JCQlzd2l0Y2ggKCAqc2tpcHNwYWNlKG1vcmUsIDEpICkKLQkJCSAgewotCQkJICBjYXNlICd7JzoKLQkJCSAgICAvKiBEZWZpbml0ZWx5IGEgZnVuY3Rpb24gaGVhZGVyLiAqLwotCQkJICAgIGNvbnZlcnQxKGJ1Ziwgb3V0LCAwLCBjb252ZXJ0X3ZhcmFyZ3MpOwotCQkJICAgIGZwdXRzKG1vcmUsIG91dCk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMDoKLQkJCSAgICAvKiBUaGUgbmV4dCBsaW5lIHdhcyBibGFuayBvciBhIGNvbW1lbnQ6ICovCi0JCQkgICAgLyoga2VlcCBzY2FubmluZyBmb3IgYSBub24tY29tbWVudC4gKi8KLQkJCSAgICBsaW5lICs9IHN0cmxlbihsaW5lKTsKLQkJCSAgICBnb3RvIGY7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgLyogYnVmIGlzbid0IGEgZnVuY3Rpb24gaGVhZGVyLCBidXQgKi8KLQkJCSAgICAvKiBtb3JlIG1pZ2h0IGJlLiAqLwotCQkJICAgIGZwdXRzKGJ1Ziwgb3V0KTsKLQkJCSAgICBzdHJjcHkoYnVmLCBtb3JlKTsKLQkJCSAgICBsaW5lID0gYnVmOwotCQkJICAgIGdvdG8gdGVzdDsKLQkJCSAgfQotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6CQkvKiBtYXliZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiAqLwotCQkJaWYgKCBsaW5lICE9IGJ1ZiArIChidWZzaXplIC0gMSkgKSAvKiBvdmVyZmxvdyBjaGVjayAqLwotCQkJICBjb250aW51ZTsKLQkJCS8qIGZhbGxzIHRocm91Z2ggKi8KLQkJZGVmYXVsdDoJCS8qIG5vdCBhIGZ1bmN0aW9uICovCi13bDoJCQlmcHV0cyhidWYsIG91dCk7Ci0JCQlicmVhazsKLQkJICAgfQotCQlsaW5lID0gYnVmOwotCSAgIH0KLQlpZiAoIGxpbmUgIT0gYnVmICkKLQkgIGZwdXRzKGJ1Ziwgb3V0KTsKLQlmcmVlKGJ1Zik7Ci0JZmNsb3NlKG91dCk7Ci0JZmNsb3NlKGluKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogU2tpcCBvdmVyIHNwYWNlIGFuZCBjb21tZW50cywgaW4gZWl0aGVyIGRpcmVjdGlvbi4gKi8KLWNoYXIgKgotc2tpcHNwYWNlKHAsIGRpcikKLSAgICByZWdpc3RlciBjaGFyICpwOwotICAgIHJlZ2lzdGVyIGludCBkaXI7CQkJLyogMSBmb3IgZm9yd2FyZCwgLTEgZm9yIGJhY2t3YXJkICovCi17CWZvciAoIDsgOyApCi0JICAgewl3aGlsZSAoIGlzX3NwYWNlKCpwKSApCi0JCSAgcCArPSBkaXI7Ci0JCWlmICggISgqcCA9PSAnLycgJiYgcFtkaXJdID09ICcqJykgKQotCQkgIGJyZWFrOwotCQlwICs9IGRpcjsgIHAgKz0gZGlyOwotCQl3aGlsZSAoICEoKnAgPT0gJyonICYmIHBbZGlyXSA9PSAnLycpICkKLQkJICAgewlpZiAoICpwID09IDAgKQotCQkJICByZXR1cm4gcDsJLyogbXVsdGktbGluZSBjb21tZW50Pz8gKi8KLQkJCXAgKz0gZGlyOwotCQkgICB9Ci0JCXAgKz0gZGlyOyAgcCArPSBkaXI7Ci0JICAgfQotCXJldHVybiBwOwotfQotCi0vKgotICogV3JpdGUgYmxhbmtzIG92ZXIgcGFydCBvZiBhIHN0cmluZy4KLSAqIERvbid0IG92ZXJ3cml0ZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLgotICovCi1pbnQKLXdyaXRlYmxhbmtzKHN0YXJ0LCBlbmQpCi0gICAgY2hhciAqc3RhcnQ7Ci0gICAgY2hhciAqZW5kOwotewljaGFyICpwOwotCWZvciAoIHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrICkKLQkgIGlmICggKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nICkKLQkgICAgKnAgPSAnICc7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUZXN0IHdoZXRoZXIgdGhlIHN0cmluZyBpbiBidWYgaXMgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgotICogVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbmQvb3IgZW5kIHdpdGggYSBuZXdsaW5lLgotICogUmV0dXJuIGFzIGZvbGxvd3M6Ci0gKgkwIC0gZGVmaW5pdGVseSBub3QgYSBmdW5jdGlvbiBkZWZpbml0aW9uOwotICoJMSAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBkZWZpbml0aW9uOwotICoJMiAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBwcm90b3R5cGUgKE5PVCBVU0VEKTsKLSAqCS0xIC0gbWF5IGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbiBkZWZpbml0aW9uLAotICoJCWFwcGVuZCBhbm90aGVyIGxpbmUgYW5kIGxvb2sgYWdhaW4uCi0gKiBUaGUgcmVhc29uIHdlIGRvbid0IGF0dGVtcHQgdG8gY29udmVydCBmdW5jdGlvbiBwcm90b3R5cGVzIGlzIHRoYXQKLSAqIEdob3N0c2NyaXB0J3MgZGVjbGFyYXRpb24tZ2VuZXJhdGluZyBtYWNyb3MgbG9vayB0b28gbXVjaCBsaWtlCi0gKiBwcm90b3R5cGVzLCBhbmQgY29uZnVzZSB0aGUgYWxnb3JpdGhtcy4KLSAqLwotaW50Ci10ZXN0MShidWYpCi0gICAgY2hhciAqYnVmOwotewlyZWdpc3RlciBjaGFyICpwID0gYnVmOwotCWNoYXIgKmJlbmQ7Ci0JY2hhciAqZW5kZm47Ci0JaW50IGNvbnRpbjsKLQotCWlmICggIWlzaWRmaXJzdGNoYXIoKnApICkKLQkgIHJldHVybiAwOwkJLyogbm8gbmFtZSBhdCBsZWZ0IG1hcmdpbiAqLwotCWJlbmQgPSBza2lwc3BhY2UoYnVmICsgc3RybGVuKGJ1ZikgLSAxLCAtMSk7Ci0Jc3dpdGNoICggKmJlbmQgKQotCSAgIHsKLQkgICBjYXNlICc7JzogY29udGluID0gMCAvKjIqLzsgYnJlYWs7Ci0JICAgY2FzZSAnKSc6IGNvbnRpbiA9IDE7IGJyZWFrOwotCSAgIGNhc2UgJ3snOiByZXR1cm4gMDsJCS8qIG5vdCBhIGZ1bmN0aW9uICovCi0JICAgY2FzZSAnfSc6IHJldHVybiAwOwkJLyogbm90IGEgZnVuY3Rpb24gKi8KLQkgICBkZWZhdWx0OiBjb250aW4gPSAtMTsKLQkgICB9Ci0Jd2hpbGUgKCBpc2lkY2hhcigqcCkgKQotCSAgcCsrOwotCWVuZGZuID0gcDsKLQlwID0gc2tpcHNwYWNlKHAsIDEpOwotCWlmICggKnArKyAhPSAnKCcgKQotCSAgcmV0dXJuIDA7CQkvKiBub3QgYSBmdW5jdGlvbiAqLwotCXAgPSBza2lwc3BhY2UocCwgMSk7Ci0JaWYgKCAqcCA9PSAnKScgKQotCSAgcmV0dXJuIDA7CQkvKiBubyBwYXJhbWV0ZXJzICovCi0JLyogQ2hlY2sgdGhhdCB0aGUgYXBwYXJlbnQgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGtleXdvcmQuICovCi0JLyogV2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvciBrZXl3b3JkcyB0aGF0IGNvdWxkIGJlIGZvbGxvd2VkICovCi0JLyogYnkgYSBsZWZ0IHBhcmVudGhlc2lzICh3aGljaCwgdW5mb3J0dW5hdGVseSwgaXMgbW9zdCBvZiB0aGVtKS4gKi8KLQkgICB7CXN0YXRpYyBjaGFyICp3b3Jkc1tdID0KLQkJICAgewkiYXNtIiwgImF1dG8iLCAiY2FzZSIsICJjaGFyIiwgImNvbnN0IiwgImRvdWJsZSIsCi0JCQkiZXh0ZXJuIiwgImZsb2F0IiwgImZvciIsICJpZiIsICJpbnQiLCAibG9uZyIsCi0JCQkicmVnaXN0ZXIiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLAotCQkJInN0YXRpYyIsICJzd2l0Y2giLCAidHlwZWRlZiIsICJ1bnNpZ25lZCIsCi0JCQkidm9pZCIsICJ2b2xhdGlsZSIsICJ3aGlsZSIsIDAKLQkJICAgfTsKLQkJY2hhciAqKmtleSA9IHdvcmRzOwotCQljaGFyICprcDsKLQkJaW50IGxlbiA9IGVuZGZuIC0gYnVmOwotCi0JCXdoaWxlICggKGtwID0gKmtleSkgIT0gMCApCi0JCSAgIHsJaWYgKCBzdHJsZW4oa3ApID09IGxlbiAmJiAhc3RybmNtcChrcCwgYnVmLCBsZW4pICkKLQkJCSAgcmV0dXJuIDA7CS8qIG5hbWUgaXMgYSBrZXl3b3JkICovCi0JCQlrZXkrKzsKLQkJICAgfQotCSAgIH0KLQlyZXR1cm4gY29udGluOwotfQotCi0vKiBDb252ZXJ0IGEgcmVjb2duaXplZCBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGhlYWRlciB0byBLJlIgc3ludGF4LiAqLwotaW50Ci1jb252ZXJ0MShidWYsIG91dCwgaGVhZGVyLCBjb252ZXJ0X3ZhcmFyZ3MpCi0gICAgY2hhciAqYnVmOwotICAgIEZJTEUgKm91dDsKLSAgICBpbnQgaGVhZGVyOwkJCS8qIEJvb2xlYW4gKi8KLSAgICBpbnQgY29udmVydF92YXJhcmdzOwkvKiBCb29sZWFuICovCi17CWNoYXIgKmVuZGZuOwotCXJlZ2lzdGVyIGNoYXIgKnA7Ci0JY2hhciAqKmJyZWFrczsKLQl1bnNpZ25lZCBudW1fYnJlYWtzID0gMjsJLyogZm9yIHRlc3RpbmcgKi8KLQljaGFyICoqYnRvcDsKLQljaGFyICoqYnA7Ci0JY2hhciAqKmFwOwotCWNoYXIgKnZhcmFyZyA9IDA7Ci0KLQkvKiBQcmUtQU5TSSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWdyZWUgb24gd2hldGhlciBzdHJjaHIgKi8KLQkvKiBpcyBjYWxsZWQgc3RyY2hyIG9yIGluZGV4LCBzbyB3ZSBvcGVuLWNvZGUgaXQgaGVyZS4gKi8KLQlmb3IgKCBlbmRmbiA9IGJ1ZjsgKihlbmRmbisrKSAhPSAnKCc7ICkKLQkgIDsKLXRvcDoJcCA9IGVuZGZuOwotCWJyZWFrcyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIG51bV9icmVha3MgKiAyKTsKLQlpZiAoIGJyZWFrcyA9PSAwICkKLQkgICB7CS8qIENvdWxkbid0IGFsbG9jYXRlIGJyZWFrIHRhYmxlLCBnaXZlIHVwICovCi0JCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJyZWFrIHRhYmxlIVxuIik7Ci0JCWZwdXRzKGJ1Ziwgb3V0KTsKLQkJcmV0dXJuIC0xOwotCSAgIH0KLQlidG9wID0gYnJlYWtzICsgbnVtX2JyZWFrcyAqIDIgLSAyOwotCWJwID0gYnJlYWtzOwotCS8qIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0ICovCi0JZG8KLQkgICB7CWludCBsZXZlbCA9IDA7Ci0JCWNoYXIgKmxwID0gTlVMTDsKLQkJY2hhciAqcnA7Ci0JCWNoYXIgKmVuZCA9IE5VTEw7Ci0KLQkJaWYgKCBicCA+PSBidG9wICkKLQkJICAgewkvKiBGaWxsZWQgdXAgYnJlYWsgdGFibGUuICovCi0JCQkvKiBBbGxvY2F0ZSBhIGJpZ2dlciBvbmUgYW5kIHN0YXJ0IG92ZXIuICovCi0JCQlmcmVlKChjaGFyICopYnJlYWtzKTsKLQkJCW51bV9icmVha3MgPDw9IDE7Ci0JCQlnb3RvIHRvcDsKLQkJICAgfQotCQkqYnArKyA9IHA7Ci0JCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgKi8KLQkJZm9yICggOyBlbmQgPT0gTlVMTDsgcCsrICkKLQkJICAgewlzd2l0Y2goKnApCi0JCQkgICB7Ci0JCQkgICBjYXNlICcsJzoKLQkJCQlpZiAoICFsZXZlbCApIGVuZCA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlICcoJzoKLQkJCQlpZiAoICFsZXZlbCApIGxwID0gcDsKLQkJCQlsZXZlbCsrOwotCQkJCWJyZWFrOwotCQkJICAgY2FzZSAnKSc6Ci0JCQkJaWYgKCAtLWxldmVsIDwgMCApIGVuZCA9IHA7Ci0JCQkJZWxzZSBycCA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlICcvJzoKLQkJCQlwID0gc2tpcHNwYWNlKHAsIDEpIC0gMTsKLQkJCQlicmVhazsKLQkJCSAgIGRlZmF1bHQ6Ci0JCQkJOwotCQkJICAgfQotCQkgICB9Ci0JCS8qIEVyYXNlIGFueSBlbWJlZGRlZCBwcm90b3R5cGUgcGFyYW1ldGVycy4gKi8KLQkJaWYgKCBscCApCi0JCSAgd3JpdGVibGFua3MobHAgKyAxLCBycCk7Ci0JCXAtLTsJCQkvKiBiYWNrIHVwIG92ZXIgdGVybWluYXRvciAqLwotCQkvKiBGaW5kIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkLiAqLwotCQkvKiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJlY2F1c2Ugb2YgcHJvY2VkdXJlIGFuZCAqLwotCQkvKiBhcnJheSBtb2RpZmllcnMuICovCi0JCWZvciAoIDsgOyApCi0JCSAgIHsJcCA9IHNraXBzcGFjZShwIC0gMSwgLTEpOwotCQkJc3dpdGNoICggKnAgKQotCQkJICAgewotCQkJICAgY2FzZSAnXSc6CS8qIHNraXAgYXJyYXkgZGltZW5zaW9uKHMpICovCi0JCQkgICBjYXNlICcpJzoJLyogc2tpcCBwcm9jZWR1cmUgYXJncyBPUiBuYW1lICovCi0JCQkgICB7CWludCBsZXZlbCA9IDE7Ci0JCQkJd2hpbGUgKCBsZXZlbCApCi0JCQkJIHN3aXRjaCAoICotLXAgKQotCQkJCSAgIHsKLQkJCQkgICBjYXNlICddJzogY2FzZSAnKSc6IGxldmVsKys7IGJyZWFrOwotCQkJCSAgIGNhc2UgJ1snOiBjYXNlICcoJzogbGV2ZWwtLTsgYnJlYWs7Ci0JCQkJICAgY2FzZSAnLyc6IHAgPSBza2lwc3BhY2UocCwgLTEpICsgMTsgYnJlYWs7Ci0JCQkJICAgZGVmYXVsdDogOwotCQkJCSAgIH0KLQkJCSAgIH0KLQkJCQlpZiAoICpwID09ICcoJyAmJiAqc2tpcHNwYWNlKHAgKyAxLCAxKSA9PSAnKicgKQotCQkJCSAgIHsJLyogV2UgZm91bmQgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgKi8KLQkJCQkJd2hpbGUgKCAhaXNpZGZpcnN0Y2hhcigqcCkgKQotCQkJCQkgIHAgPSBza2lwc3BhY2UocCwgMSkgKyAxOwotCQkJCQlnb3RvIGZvdW5kOwotCQkJCSAgIH0KLQkJCQlicmVhazsKLQkJCSAgIGRlZmF1bHQ6Ci0JCQkJZ290byBmb3VuZDsKLQkJCSAgIH0KLQkJICAgfQotZm91bmQ6CQlpZiAoICpwID09ICcuJyAmJiBwWy0xXSA9PSAnLicgJiYgcFstMl0gPT0gJy4nICkKLQkJICB7CWlmICggY29udmVydF92YXJhcmdzICkKLQkJCSAgewkqYnArKyA9ICJ2YV9hbGlzdCI7Ci0JCQkJdmFyYXJnID0gcC0yOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsJcCsrOwotCQkJCWlmICggYnAgPT0gYnJlYWtzICsgMSApCS8qIHNvbGUgYXJndW1lbnQgKi8KLQkJCQkgIHdyaXRlYmxhbmtzKGJyZWFrc1swXSwgcCk7Ci0JCQkJZWxzZQotCQkJCSAgd3JpdGVibGFua3MoYnBbLTFdIC0gMSwgcCk7Ci0JCQkJYnAtLTsKLQkJCSAgfQotCQkgICB9Ci0JCWVsc2UKLQkJICAgewl3aGlsZSAoIGlzaWRjaGFyKCpwKSApIHAtLTsKLQkJCSpicCsrID0gcCsxOwotCQkgICB9Ci0JCXAgPSBlbmQ7Ci0JICAgfQotCXdoaWxlICggKnArKyA9PSAnLCcgKTsKLQkqYnAgPSBwOwotCS8qIE1ha2UgYSBzcGVjaWFsIGNoZWNrIGZvciAndm9pZCcgYXJnbGlzdCAqLwotCWlmICggYnAgPT0gYnJlYWtzKzIgKQotCSAgIHsJcCA9IHNraXBzcGFjZShicmVha3NbMF0sIDEpOwotCQlpZiAoICFzdHJuY21wKHAsICJ2b2lkIiwgNCkgKQotCQkgICB7CXAgPSBza2lwc3BhY2UocCs0LCAxKTsKLQkJCWlmICggcCA9PSBicmVha3NbMl0gLSAxICkKLQkJCSAgIHsJYnAgPSBicmVha3M7CS8qIHl1cCwgcHJldGVuZCBhcmdsaXN0IGlzIGVtcHR5ICovCi0JCQkJd3JpdGVibGFua3MoYnJlYWtzWzBdLCBwICsgMSk7Ci0JCQkgICB9Ci0JCSAgIH0KLQkgICB9Ci0JLyogUHV0IG91dCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgbGVmdCBwYXJlbnRoZXNpcy4gKi8KLQlwID0gYnVmOwotCXdoaWxlICggcCAhPSBlbmRmbiApIHB1dGMoKnAsIG91dCksIHArKzsKLQkvKiBQdXQgb3V0IHRoZSBkZWNsYXJhdGlvbi4gKi8KLQlpZiAoIGhlYWRlciApCi0JICB7CWZwdXRzKCIpOyIsIG91dCk7Ci0JCWZvciAoIHAgPSBicmVha3NbMF07ICpwOyBwKysgKQotCQkgIGlmICggKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nICkKLQkJICAgIHB1dGMoKnAsIG91dCk7Ci0JICB9Ci0JZWxzZQotCSAgewlmb3IgKCBhcCA9IGJyZWFrcysxOyBhcCA8IGJwOyBhcCArPSAyICkKLQkJICB7CXAgPSAqYXA7Ci0JCQl3aGlsZSAoIGlzaWRjaGFyKCpwKSApCi0JCQkgIHB1dGMoKnAsIG91dCksIHArKzsKLQkJCWlmICggYXAgPCBicCAtIDEgKQotCQkJICBmcHV0cygiLCAiLCBvdXQpOwotCQkgIH0KLQkJZnB1dHMoIikgICIsIG91dCk7Ci0JCS8qIFB1dCBvdXQgdGhlIGFyZ3VtZW50IGRlY2xhcmF0aW9ucyAqLwotCQlmb3IgKCBhcCA9IGJyZWFrcysyOyBhcCA8PSBicDsgYXAgKz0gMiApCi0JCSAgKCphcClbLTFdID0gJzsnOwotCQlpZiAoIHZhcmFyZyAhPSAwICkKLQkJICB7CSp2YXJhcmcgPSAwOwotCQkJZnB1dHMoYnJlYWtzWzBdLCBvdXQpOwkJLyogYW55IHByaW9yIGFyZ3MgKi8KLQkJCWZwdXRzKCJ2YV9kY2wiLCBvdXQpOwkJLyogdGhlIGZpbmFsIGFyZyAqLwotCQkJZnB1dHMoYnBbMF0sIG91dCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgZnB1dHMoYnJlYWtzWzBdLCBvdXQpOwotCSAgfQotCWZyZWUoKGNoYXIgKilicmVha3MpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvYXJtdjZfaWRjdC5TIGIvbGlianBlZ3R3cnAvYXJtdjZfaWRjdC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU0ZThhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2FybXY2X2lkY3QuUworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgaXMgYSBmYXN0LWFuZC1hY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnZlcnNlIERpc2NyZXRlIENvc2luZQotICogVHJhbnNmb3JtIChJRENUKSBmb3IgQVJNdjYrLiBJdCBhbHNvIHBlcmZvcm1zIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dAotICogY29lZmZpY2llbnRzIGp1c3QgbGlrZSBvdGhlciBtZXRob2RzLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIHNjYWxlZCAxLUQgRENUIGFsZ29yaXRobSBwcm9wb3NlZCBieQotICogQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgb24gdGhlIGZpZ3VyZSA0LTgKLSAqIG9uIHBhZ2UgNTIgb2YgdGhlIEpQRUcgdGV4dGJvb2sgYnkgUGVubmViYWtlciBhbmQgTWl0Y2hlbGwuIENvZWZmaWNpZW50cwotICogYXJlIChhbG1vc3QpIGRpcmVjdGx5IG1hcHBlZCBpbnRvIHJlZ2lzdGVycy4KLSAqCi0gKiBUaGUgYWNjdXJhY3kgaXMgYWNoaWV2ZWQgYnkgdXNpbmcgU01VTFd5IGFuZCBTTUxBV3kgaW5zdHJ1Y3Rpb25zLiBCb3RoCi0gKiBtdWx0aXBseSAzMiBiaXRzIGJ5IDE2IGJpdHMgYW5kIHN0b3JlIHRoZSB0b3AgMzIgYml0cyBvZiB0aGUgcmVzdWx0LiBJdAotICogbWFrZXMgMzItYml0IGZpeGVkLXBvaW50IGFyaXRobWV0aWMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdy4gVGhhdCBpcwotICogd2h5IGpwZWdfaWRjdF9pZmFzdCgpLCB3aGljaCBpcyB3cml0dGVuIGluIEMsIGNhbm5vdCBiZSBpbXByb3ZlZC4KLSAqCi0gKiBNb3JlIHRyaWNrcyBhcmUgdXNlZCB0byBnYWluIG1vcmUgc3BlZWQuIEZpcnN0IG9mIGFsbCwgd2UgdXNlIGFzIG1hbnkKLSAqIHJlZ2lzdGVycyBhcyBwb3NzaWJsZS4gQVJNIHByb2Nlc3NvciBoYXMgMTYgcmVnaXN0ZXJzIGluY2x1ZGluZyBzcCAocjEzKQotICogYW5kIHBjIChyMTUpLCBzbyBvbmx5IDE0IHJlZ2lzdGVycyBjYW4gYmUgdXNlZCB3aXRob3V0IGxpbWl0YXRpb25zLiBJbgotICogZ2VuZXJhbCwgd2UgbGV0IHIwIHRvIHI3IGhvbGQgdGhlIGNvZWZmaWNpZW50czsgcjEwIGFuZCByMTEgaG9sZCBmb3VyCi0gKiAxNi1iaXQgY29uc3RhbnRzOyByMTIgYW5kIHIxNCBob2xkIHR3byBvZiB0aGUgZm91ciBhcmd1bWVudHM7IGFuZCByOCBob2xkCi0gKiBpbnRlcm1lZGlhdGUgdmFsdWUuIEluIHRoZSBzZWNvbmQgcGFzcywgcjkgaXMgdGhlIGxvb3AgY291bnRlci4gSW4gdGhlCi0gKiBmaXJzdCBwYXNzLCByOCB0byByMTEgYXJlIHVzZWQgdG8gaG9sZCBxdWFudGl6YXRpb24gdmFsdWVzLCBzbyB0aGUgbG9vcAotICogY291bnRlciBpcyBoZWxkIGJ5IHNwLiBZZXMsIHRoZSBzdGFjayBwb2ludGVyLiBTaW5jZSBpdCBtdXN0IGJlIGFsaWduZWQKLSAqIHRvIDQtYnl0ZSBib3VuZGFyeSBhbGwgdGhlIHRpbWUsIHdlIGFsaWduIGl0IHRvIDMyLWJ5dGUgYm91bmRhcnkgYW5kIHVzZQotICogYml0IDMgdG8gYml0IDUuIEFzIHRoZSByZXN1bHQsIHdlIGFjdHVhbGx5IHVzZSAxNC4xIHJlZ2lzdGVycy4gOi0pCi0gKgotICogU2Vjb25kLCB3ZSByZWFycmFuZ2UgcXVhbnRpemF0aW9uIHZhbHVlcyB0byBhY2Nlc3MgdGhlbSBzZXF1ZW50aWFsbHkuIFRoZQotICogdGFibGUgaXMgZmlyc3QgdHJhbnNwb3NlZCwgYW5kIHRoZSBuZXcgY29sdW1ucyBhcmUgcGxhY2VkIGluIHRoZSBvcmRlciBvZgotICogNywgNSwgMSwgMywgMCwgMiwgNCwgNi4gVGh1cyB3ZSBjYW4gdXNlIExETURCIHRvIGxvYWQgZm91ciB2YWx1ZXMgYXQgYQotICogdGltZS4gUmVhcnJhbmdpbmcgY29lZmZpY2llbnRzIGFsc28gaGVscHMsIGJ1dCB0aGF0IHJlcXVpcmVzIHRvIGNoYW5nZSBhCi0gKiBkb3plbiBvZiBmaWxlcywgd2hpY2ggc2VlbXMgbm90IHdvcnRoIGl0LiBJbiBhZGRpdGlvbiwgd2UgY2hvb3NlIHRvIHNjYWxlCi0gKiB1cCBxdWFudGl6YXRpb24gdmFsdWVzIGJ5IDEzIGJpdHMsIHNvIHRoZSBjb2VmZmljaWVudHMgYXJlIHNjYWxlZCB1cCBieQotICogMTYgYml0cyBhZnRlciBib3RoIHBhc3Nlcy4gVGhlbiB3ZSBjYW4gcGFjayBhbmQgc2F0dXJhdGUgdGhlbSB0d28gYXQgYQotICogdGltZSB1c2luZyBQS0hUQiBhbmQgVVNBVDE2IGluc3RydWN0aW9ucy4KLSAqCi0gKiBUaGlyZCwgd2UgcmVvcmRlciB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGF2b2lkIGJ1YmJsZXMgaW4gdGhlIHBpcGVsaW5lLiBUaGlzCi0gKiBpcyBkb25lIGJ5IGhhbmQgYWNjcm9kaW5nIHRvIHRoZSBjeWNsZSB0aW1pbmdzIGFuZCB0aGUgaW50ZXJsb2NrIGJlaGF2aW9yCi0gKiBkZXNjcmliZWQgaW4gdGhlIHRlY2huaWNhbCByZWZlcmVuY2UgbWFudWFsIG9mIEFSTTExMzZKRi1TLiBXZSBhbHNvIHRha2UKLSAqIGFkdmFudGFnZSBvZiBkdWFsIGlzc3VlIHByb2Nlc3NvcnMgYnkgaW50ZXJsZWF2aW5nIGluc3RydWN0aW9ucyB3aXRoCi0gKiBkZXBlbmRlbmNpZXMuIEl0IGhhcyBiZWVuIGJlbmNobWFya2VkIG9uIGZvdXIgZGV2aWNlcyBhbmQgYWxsIHRoZSByZXN1bHRzCi0gKiBzaG93ZWQgZGlzdGluZ3Vpc2hhYmxlIGltcHJvdmVtZW50cy4gTm90ZSB0aGF0IFBMRCBpbnN0cnVjdGlvbnMgYWN0dWFsbHkKLSAqIHNsb3cgdGhpbmdzIGRvd24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYXQgdGhlIGxhc3QgbWludXRlLiBJbiB0aGUgZnV0dXJlLAotICogdGhpcyBtaWdodCBiZSBmdXRoZXIgaW1wcm92ZWQgdXNpbmcgYSBzeXN0ZW0gcHJvZmlsZXIuCi0gKi8KLQotI2lmZGVmIF9fYXJtX18KLSNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgotI2VuZGlmCi0KLSNpZiBfX0FSTV9BUkNIX18gPj0gNgotCi0vLyB2b2lkIGFybXY2X2lkY3Qoc2hvcnQgKmNvZWZzLCBpbnQgKnF1YW5zLCB1bnNpZ25lZCBjaGFyICpyb3dzLCBpbnQgY29sKQotICAgIC5hcm0KLSAgICAudGV4dAotICAgIC5hbGlnbgotICAgIC5nbG9iYWwgYXJtdjZfaWRjdAotICAgIC5mdW5jICAgYXJtdjZfaWRjdAotCi1hcm12Nl9pZGN0OgotICAgIC8vIFB1c2ggZXZlcnl0aGluZyBleGNlcHQgc3AgKHIxMykgYW5kIHBjIChyMTUpLgotICAgIHN0bWRiICAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjE0fQotCi0gICAgLy8gcjEyID0gcXVhbnMsIHIxNCA9IGNvZWZzLgotICAgIHN1YiAgICAgcjQsIHNwLCAjMjM2Ci0gICAgYmljICAgICBzcCwgcjQsICMzMQotICAgIGFkZCAgICAgcjUsIHNwLCAjMjI0Ci0gICAgYWRkICAgICByMTIsIHIxLCAjMjU2Ci0gICAgc3RtICAgICByNSwge3IyLCByMywgcjR9Ci0gICAgYWRkICAgICByMTQsIHIwLCAjMTYKLQotcGFzczFfaGVhZDoKLSAgICAvLyBMb2FkIHF1YW50aXphdGlvbiB2YWx1ZXMuIChxWzAsIDIsIDQsIDZdKQotICAgIGxkbWRiICAgcjEyISwge3I4LCByOSwgcjEwLCByMTF9Ci0KLSAgICAvLyBMb2FkIGNvZWZmaWNpZW50cy4gKGNbNCwgMSwgMiwgMywgMCwgNSwgNiwgN10pCi0gICAgbGRyc2ggICByNCwgW3IxNCwgIy0yXSAhCi0gICAgbGRyc2ggICByMSwgW3IxNCwgIzE2XQotICAgIGxkcnNoICAgcjIsIFtyMTQsICMzMl0KLSAgICBsZHJzaCAgIHIzLCBbcjE0LCAjNDhdCi0gICAgbGRyc2ggICByMCwgW3IxNCwgIzY0XQotICAgIGxkcnNoICAgcjUsIFtyMTQsICM4MF0KLSAgICBsZHJzaCAgIHI2LCBbcjE0LCAjOTZdCi0gICAgbGRyc2ggICByNywgW3IxNCwgIzExMl0KLQotICAgIC8vIHI0ID0gcVswXSAqIGNbMF07Ci0gICAgbXVsICAgICByNCwgcjgsIHI0Ci0KLSAgICAvLyBDaGVjayBpZiBBQ3MgYXJlIGFsbCB6ZXJvLgotICAgIGNtcCAgICAgcjAsICMwCi0gICAgb3JyZXFzICByOCwgcjEsIHIyCi0gICAgb3JyZXFzICByOCwgcjMsIHI1Ci0gICAgb3JyZXFzICByOCwgcjYsIHI3Ci0gICAgYmVxICAgICBwYXNzMV96ZXJvCi0KLSAgICAvLyBTdGVwIDE6IERlcXVhbnRpemF0aW9ucy4KLQotICAgIC8vIHIyID0gcVsyXSAqIGNbMl07Ci0gICAgLy8gcjAgPSBxWzRdICogY1s0XSArIHI0OwotICAgIC8vIHI2ID0gcVs2XSAqIGNbNl0gKyByMjsKLSAgICBtdWwgICAgIHIyLCByOSwgcjIKLSAgICBtbGEgICAgIHIwLCByMTAsIHIwLCByNAotICAgIG1sYSAgICAgcjYsIHIxMSwgcjYsIHIyCi0KLSAgICAvLyBMb2FkIHF1YW50aXphdGlvbiB2YWx1ZXMuIChxWzcsIDUsIDEsIDNdKQotICAgIGxkbWRiICAgcjEyISwge3I4LCByOSwgcjEwLCByMTF9Ci0KLSAgICAvLyByNCA9IHI0ICogMiAtIHIwID0gLShyMCAtIHI0ICogMik7Ci0gICAgLy8gcjIgPSByMiAqIDIgLSByNiA9IC0ocjYgLSByMiAqIDIpOwotICAgIHJzYiAgICAgcjQsIHIwLCByNCwgbHNsICMxCi0gICAgcnNiICAgICByMiwgcjYsIHIyLCBsc2wgIzEKLQotICAgIC8vIHI3ID0gcVs3XSAqIGNbN107Ci0gICAgLy8gcjUgPSBxWzVdICogY1s1XTsKLSAgICAvLyByMSA9IHFbMV0gKiBjWzFdICsgcjc7Ci0gICAgLy8gcjMgPSBxWzNdICogY1szXSArIHI1OwotICAgIG11bCAgICAgcjcsIHI4LCByNwotICAgIG11bCAgICAgcjUsIHI5LCByNQotICAgIG1sYSAgICAgcjEsIHIxMCwgcjEsIHI3Ci0gICAgbWxhICAgICByMywgcjExLCByMywgcjUKLQotICAgIC8vIExvYWQgY29uc3RhbnRzLgotICAgIGxkcmQgICAgcjEwLCBjb25zdGFudHMKLQotICAgIC8vIFN0ZXAgMjogUm90YXRpb25zIGFuZCBCdXR0ZXJmbGllcy4KLQotICAgIC8vIHI3ID0gcjEgLSByNyAqIDI7Ci0gICAgLy8gcjEgPSByMSAtIHIzOwotICAgIC8vIHI1ID0gcjUgKiAyIC0gcjMgPSAtKHIzIC0gcjUgKiAyKTsKLSAgICAvLyByMyA9IHIxICsgcjMgKiAyOwotICAgIC8vIHI4ID0gcjUgKyByNzsKLSAgICBzdWIgICAgIHI3LCByMSwgcjcsIGxzbCAjMQotICAgIHN1YiAgICAgcjEsIHIxLCByMwotICAgIHJzYiAgICAgcjUsIHIzLCByNSwgbHNsICMxCi0gICAgYWRkICAgICByMywgcjEsIHIzLCBsc2wgIzEKLSAgICBhZGQgICAgIHI4LCByNSwgcjcKLQotICAgIC8vIHIyID0gcjIgKiAxLjQxNDIxID0gcjIgKiAyNzE0NiAvIDY1NTM2ICsgcjI7Ci0gICAgLy8gcjggPSByOCAqIDEuODQ3NzYgLyA4ID0gcjggKiAxNTEzNyAvIDY1NTM2OwotICAgIC8vIHIxID0gcjEgKiAxLjQxNDIxID0gcjEgKiAyNzE0NiAvIDY1NTM2ICsgcjE7Ci0gICAgc21sYXd0ICByMiwgcjIsIHIxMCwgcjIKLSAgICBzbXVsd2IgIHI4LCByOCwgcjEwCi0gICAgc21sYXd0ICByMSwgcjEsIHIxMCwgcjEKLQotICAgIC8vIHIwID0gcjAgKyByNjsKLSAgICAvLyByMiA9IHIyIC0gcjY7Ci0gICAgLy8gcjYgPSByMCAtIHI2ICogMjsKLSAgICBhZGQgICAgIHIwLCByMCwgcjYKLSAgICBzdWIgICAgIHIyLCByMiwgcjYKLSAgICBzdWIgICAgIHI2LCByMCwgcjYsIGxzbCAjMQotCi0gICAgLy8gcjUgPSByNSAqIC0yLjYxMzEzIC8gOCArIHI4ID0gcjUgKiAtMjE0MDcgLyA2NTUzNiArIHI4OwotICAgIC8vIHI4ID0gcjcgKiAtMS4wODIzOSAvIDggKyByOCA9IHI3ICogLTg4NjcgLyA2NTUzNiArIHI4OwotICAgIHNtbGF3dCAgcjUsIHI1LCByMTEsIHI4Ci0gICAgc21sYXdiICByOCwgcjcsIHIxMSwgcjgKLQotICAgIC8vIHI0ID0gcjQgKyByMjsKLSAgICAvLyByMCA9IHIwICsgcjM7Ci0gICAgLy8gcjIgPSByNCAtIHIyICogMjsKLSAgICBhZGQgICAgIHI0LCByNCwgcjIKLSAgICBhZGQgICAgIHIwLCByMCwgcjMKLSAgICBzdWIgICAgIHIyLCByNCwgcjIsIGxzbCAjMQotCi0gICAgLy8gcjcgPSByNSAqIDggLSByMyA9IC0ocjMgLSByNSAqIDgpOwotICAgIC8vIHIzID0gcjAgLSByMyAqIDI7Ci0gICAgLy8gcjEgPSByMSAtIHI3OwotICAgIC8vIHI0ID0gcjQgKyByNzsKLSAgICAvLyByNSA9IHI4ICogOCAtIHIxID0gLShyMSAtIHI4ICogOCk7Ci0gICAgLy8gcjcgPSByNCAtIHI3ICogMjsKLSAgICByc2IgICAgIHI3LCByMywgcjUsIGxzbCAjMwotICAgIHN1YiAgICAgcjMsIHIwLCByMywgbHNsICMxCi0gICAgc3ViICAgICByMSwgcjEsIHI3Ci0gICAgYWRkICAgICByNCwgcjQsIHI3Ci0gICAgcnNiICAgICByNSwgcjEsIHI4LCBsc2wgIzMKLSAgICBzdWIgICAgIHI3LCByNCwgcjcsIGxzbCAjMQotCi0gICAgLy8gcjIgPSByMiArIHIxOwotICAgIC8vIHI2ID0gcjYgKyByNTsKLSAgICAvLyByMSA9IHIyIC0gcjEgKiAyOwotICAgIC8vIHI1ID0gcjYgLSByNSAqIDI7Ci0gICAgYWRkICAgICByMiwgcjIsIHIxCi0gICAgYWRkICAgICByNiwgcjYsIHI1Ci0gICAgc3ViICAgICByMSwgcjIsIHIxLCBsc2wgIzEKLSAgICBzdWIgICAgIHI1LCByNiwgcjUsIGxzbCAjMQotCi0gICAgLy8gU3RlcCAzOiBSZW9yZGVyIGFuZCBTYXZlLgotCi0gICAgc3RyICAgICByMCwgW3NwLCAjLTRdICEKLSAgICBzdHIgICAgIHI0LCBbc3AsICMzMl0KLSAgICBzdHIgICAgIHIyLCBbc3AsICM2NF0KLSAgICBzdHIgICAgIHI2LCBbc3AsICM5Nl0KLSAgICBzdHIgICAgIHI1LCBbc3AsICMxMjhdCi0gICAgc3RyICAgICByMSwgW3NwLCAjMTYwXQotICAgIHN0ciAgICAgcjcsIFtzcCwgIzE5Ml0KLSAgICBzdHIgICAgIHIzLCBbc3AsICMyMjRdCi0gICAgYiAgICAgICBwYXNzMV90YWlsCi0KLSAgICAvLyBQcmVjb21wdXRlZCAxNi1iaXQgY29uc3RhbnRzOiAyNzE0NiwgMTUxMzcsIC0yMTQwNywgLTg4NjcuCi0gICAgLy8gUHV0IHRoZW0gaW4gdGhlIG1pZGRsZSBzaW5jZSBMRFJEIG9ubHkgYWNjZXB0cyBvZmZzZXRzIGZyb20gLTI1NSB0byAyNTUuCi0gICAgLmFsaWduICAzCi1jb25zdGFudHM6Ci0gICAgLndvcmQgICAweDZhMGEzYjIxCi0gICAgLndvcmQgICAweGFjNjFkZDVkCi0KLXBhc3MxX3plcm86Ci0gICAgc3RyICAgICByNCwgW3NwLCAjLTRdICEKLSAgICBzdHIgICAgIHI0LCBbc3AsICMzMl0KLSAgICBzdHIgICAgIHI0LCBbc3AsICM2NF0KLSAgICBzdHIgICAgIHI0LCBbc3AsICM5Nl0KLSAgICBzdHIgICAgIHI0LCBbc3AsICMxMjhdCi0gICAgc3RyICAgICByNCwgW3NwLCAjMTYwXQotICAgIHN0ciAgICAgcjQsIFtzcCwgIzE5Ml0KLSAgICBzdHIgICAgIHI0LCBbc3AsICMyMjRdCi0gICAgc3ViICAgICByMTIsIHIxMiwgIzE2Ci0KLXBhc3MxX3RhaWw6Ci0gICAgYW5kcyAgICByOSwgc3AsICMzMQotICAgIGJuZSAgICAgcGFzczFfaGVhZAotCi0gICAgLy8gcjEyID0gcm93cywgcjE0ID0gY29sLgotICAgIGxkciAgICAgcjEyLCBbc3AsICMyNTZdCi0gICAgbGRyICAgICByMTQsIFtzcCwgIzI2MF0KLQotICAgIC8vIExvYWQgY29uc3RhbnRzLgotICAgIGxkcmQgICAgcjEwLCBjb25zdGFudHMKLQotcGFzczJfaGVhZDoKLSAgICAvLyBMb2FkIGNvZWZmaWNpZW50cy4gKGNbMCwgMSwgMiwgMywgNCwgNSwgNiwgN10pCi0gICAgbGRtaWEgICBzcCEsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjd9Ci0KLSAgICAvLyByMCA9IHIwICsgMHgwMDgwODAwMDsKLSAgICBhZGQgICAgIHIwLCByMCwgIzB4MDA4MDAwMDAKLSAgICBhZGQgICAgIHIwLCByMCwgIzB4MDAwMDgwMDAKLQotICAgIC8vIFN0ZXAgMTogQW5hbG9nIHRvIHRoZSBmaXJzdCBwYXNzLgotCi0gICAgLy8gcjAgPSByMCArIHI0OwotICAgIC8vIHI2ID0gcjYgKyByMjsKLSAgICBhZGQgICAgIHIwLCByMCwgcjQKLSAgICBhZGQgICAgIHI2LCByNiwgcjIKLQotICAgIC8vIHI0ID0gcjAgLSByNCAqIDI7Ci0gICAgLy8gcjIgPSByMiAqIDIgLSByNiA9IC0ocjYgLSByMiAqIDIpOwotICAgIHN1YiAgICAgcjQsIHIwLCByNCwgbHNsICMxCi0gICAgcnNiICAgICByMiwgcjYsIHIyLCBsc2wgIzEKLQotICAgIC8vIHIxID0gcjEgKyByNzsKLSAgICAvLyByMyA9IHIzICsgcjU7Ci0gICAgYWRkICAgICByMSwgcjEsIHI3Ci0gICAgYWRkICAgICByMywgcjMsIHI1Ci0KLSAgICAvLyBTdGVwIDI6IFJvdGF0aW9ucyBhbmQgQnV0dGVyZmxpZXMuCi0KLSAgICAvLyByNyA9IHIxIC0gcjcgKiAyOwotICAgIC8vIHIxID0gcjEgLSByMzsKLSAgICAvLyByNSA9IHI1ICogMiAtIHIzID0gLShyMyAtIHI1ICogMik7Ci0gICAgLy8gcjMgPSByMSArIHIzICogMjsKLSAgICAvLyByOCA9IHI1ICsgcjc7Ci0gICAgc3ViICAgICByNywgcjEsIHI3LCBsc2wgIzEKLSAgICBzdWIgICAgIHIxLCByMSwgcjMKLSAgICByc2IgICAgIHI1LCByMywgcjUsIGxzbCAjMQotICAgIGFkZCAgICAgcjMsIHIxLCByMywgbHNsICMxCi0gICAgYWRkICAgICByOCwgcjUsIHI3Ci0KLSAgICAvLyByMiA9IHIyICogMS40MTQyMSA9IHIyICogMjcxNDYgLyA2NTUzNiArIHIyOwotICAgIC8vIHI4ID0gcjggKiAxLjg0Nzc2IC8gOCA9IHI4ICogMTUxMzcgLyA2NTUzNjsKLSAgICAvLyByMSA9IHIxICogMS40MTQyMSA9IHIxICogMjcxNDYgLyA2NTUzNiArIHIxOwotICAgIHNtbGF3dCAgcjIsIHIyLCByMTAsIHIyCi0gICAgc211bHdiICByOCwgcjgsIHIxMAotICAgIHNtbGF3dCAgcjEsIHIxLCByMTAsIHIxCi0KLSAgICAvLyByMCA9IHIwICsgcjY7Ci0gICAgLy8gcjIgPSByMiAtIHI2OwotICAgIC8vIHI2ID0gcjAgLSByNiAqIDI7Ci0gICAgYWRkICAgICByMCwgcjAsIHI2Ci0gICAgc3ViICAgICByMiwgcjIsIHI2Ci0gICAgc3ViICAgICByNiwgcjAsIHI2LCBsc2wgIzEKLQotICAgIC8vIHI1ID0gcjUgKiAtMi42MTMxMyAvIDggKyByOCA9IHI1ICogLTIxNDA3IC8gNjU1MzYgKyByODsKLSAgICAvLyByOCA9IHI3ICogLTEuMDgyMzkgLyA4ICsgcjggPSByNyAqIC04ODY3IC8gNjU1MzYgKyByODsKLSAgICBzbWxhd3QgIHI1LCByNSwgcjExLCByOAotICAgIHNtbGF3YiAgcjgsIHI3LCByMTEsIHI4Ci0KLSAgICAvLyByNCA9IHI0ICsgcjI7Ci0gICAgLy8gcjAgPSByMCArIHIzOwotICAgIC8vIHIyID0gcjQgLSByMiAqIDI7Ci0gICAgYWRkICAgICByNCwgcjQsIHIyCi0gICAgYWRkICAgICByMCwgcjAsIHIzCi0gICAgc3ViICAgICByMiwgcjQsIHIyLCBsc2wgIzEKLQotICAgIC8vIHI3ID0gcjUgKiA4IC0gcjMgPSAtKHIzIC0gcjUgKiA4KTsKLSAgICAvLyByMyA9IHIwIC0gcjMgKiAyOwotICAgIC8vIHIxID0gcjEgLSByNzsKLSAgICAvLyByNCA9IHI0ICsgcjc7Ci0gICAgLy8gcjUgPSByOCAqIDggLSByMSA9IC0ocjEgLSByOCAqIDgpOwotICAgIC8vIHI3ID0gcjQgLSByNyAqIDI7Ci0gICAgcnNiICAgICByNywgcjMsIHI1LCBsc2wgIzMKLSAgICBzdWIgICAgIHIzLCByMCwgcjMsIGxzbCAjMQotICAgIHN1YiAgICAgcjEsIHIxLCByNwotICAgIGFkZCAgICAgcjQsIHI0LCByNwotICAgIHJzYiAgICAgcjUsIHIxLCByOCwgbHNsICMzCi0gICAgc3ViICAgICByNywgcjQsIHI3LCBsc2wgIzEKLQotICAgIC8vIHIyID0gcjIgKyByMTsKLSAgICAvLyByNiA9IHI2ICsgcjU7Ci0gICAgLy8gcjEgPSByMiAtIHIxICogMjsKLSAgICAvLyByNSA9IHI2IC0gcjUgKiAyOwotICAgIGFkZCAgICAgcjIsIHIyLCByMQotICAgIGFkZCAgICAgcjYsIHI2LCByNQotICAgIHN1YiAgICAgcjEsIHIyLCByMSwgbHNsICMxCi0gICAgc3ViICAgICByNSwgcjYsIHI1LCBsc2wgIzEKLQotICAgIC8vIFN0ZXAgMzogUmVvcmRlciBhbmQgU2F2ZS4KLQotICAgIC8vIExvYWQgb3V0cHV0IHBvaW50ZXIuCi0gICAgbGRyICAgICByOCwgW3IxMl0sICM0Ci0KLSAgICAvLyBGb3IgbGl0dGxlIGVuZGlhbjogcjYsIHIyLCByNCwgcjAsIHIzLCByNywgcjEsIHI1LgotICAgIHBraHRiICAgcjYsIHI2LCByNCwgYXNyICMxNgotICAgIHBraHRiICAgcjIsIHIyLCByMCwgYXNyICMxNgotICAgIHBraHRiICAgcjMsIHIzLCByMSwgYXNyICMxNgotICAgIHBraHRiICAgcjcsIHI3LCByNSwgYXNyICMxNgotICAgIHVzYXQxNiAgcjYsICM4LCByNgotICAgIHVzYXQxNiAgcjIsICM4LCByMgotICAgIHVzYXQxNiAgcjMsICM4LCByMwotICAgIHVzYXQxNiAgcjcsICM4LCByNwotICAgIG9yciAgICAgcjAsIHIyLCByNiwgbHNsICM4Ci0gICAgb3JyICAgICByMSwgcjcsIHIzLCBsc2wgIzgKLQotI2lmZGVmIF9fQVJNRUJfXwotICAgIC8vIFJldmVyc2UgYnl0ZXMgZm9yIGJpZyBlbmRpYW4uCi0gICAgcmV2ICAgICByMCwgcjAKLSAgICByZXYgICAgIHIxLCByMQotI2VuZGlmCi0KLSAgICAvLyBVc2UgU1RSIGluc3RlYWQgb2YgU1RSRCB0byBzdXBwb3J0IHVuYWxpZ25lZCBhY2Nlc3MuCi0gICAgc3RyICAgICByMCwgW3I4LCByMTRdICEKLSAgICBzdHIgICAgIHIxLCBbcjgsICM0XQotCi1wYXNzMl90YWlsOgotICAgIGFkZHMgICAgcjksIHI5LCAjMHgxMDAwMDAwMAotICAgIGJwbCAgICAgcGFzczJfaGVhZAotCi0gICAgbGRyICAgICBzcCwgW3NwLCAjOF0KLSAgICBhZGQgICAgIHNwLCBzcCwgIzIzNgotCi0gICAgbGRtaWEgICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCByMTR9Ci0gICAgYnggICAgICBscgotICAgIC5lbmRmdW5jCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkY29sb3ItYW5kcm9pZC1hcm12Ny5TIGIvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkY29sb3ItYW5kcm9pZC1hcm12Ny5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWJkNGJmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2FzbS9hcm12Ny9qZGNvbG9yLWFuZHJvaWQtYXJtdjcuUworKysgL2Rldi9udWxsCkBAIC0xLDEyMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogamRjb2xvci1hbmRyb2lkLWFybXY3LlMKLSoKLSogIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSogIG1ldDoKLSogICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0qICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0qICAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0qICAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0qICAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSogICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSogIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSogIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSogIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotKiAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSogIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSogIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DVElPTiBMSVNUCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogLSB5dnVwMnJnYjU2NV92ZW51bQotKiAtIHl5dnVwMnJnYjU2NV92ZW51bQotKiAtIHl2dXAyYWJncjg4ODhfdmVudW0KLSogLSB5eXZ1cDJhYmdyODg4OF92ZW51bQotKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0gICAgLnNlY3Rpb24geXZ1X3BsYWluX3RvX3JnYl9hbmRyb2lkLCAieCIgIEAgQVJFQQotICAgIC50ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB8LnRleHR8LCBDT0RFLCBSRUFET05MWQotICAgIC5hbGlnbiAyCi0gICAgLmNvZGUgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICBAIENPREUzMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIEFSTSBSZWdpc3RlcnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXBfeSAgICAgICAucmVxIHIwCi1wX2NyICAgICAgLnJlcSByMQotcF9jYiAgICAgIC5yZXEgcjIKLXBfcmdiICAgICAucmVxIHIzCi1wX2JnciAgICAgLnJlcSByMwotbGVuZ3RoICAgIC5yZXEgcjEyCi0KLSAgICAuZ2xvYmFsIHl2dXAycmdiNTY1X3ZlbnVtCi0gICAgLmdsb2JhbCB5eXZ1cDJyZ2I1NjVfdmVudW0KLSAgICAuZ2xvYmFsIHl2dXAyYWJncjg4ODhfdmVudW0KLSAgICAuZ2xvYmFsIHl5dnVwMmFiZ3I4ODg4X3ZlbnVtCi0KLUAgY29lZmZpY2llbnRzIGluIGNvbG9yIGNvbnZlcnNpb24gbWF0cml4IG11bHRpcGxpY2F0aW9uCi0uZXF1IENPRUZGX1ksICAgICAgICAgIDI1NiAgICAgICAgICAgICBAIGNvbnRyaWJ1dGlvbiBvZiBZCi0uZXF1IENPRUZGX1ZfUkVELCAgICAgIDM1OSAgICAgICAgICAgICBAIGNvbnRyaWJ1dGlvbiBvZiBWIGZvciByZWQKLS5lcXUgQ09FRkZfVV9HUkVFTiwgICAgLTg4ICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFUgZm9yIGdyZWVuCi0uZXF1IENPRUZGX1ZfR1JFRU4sICAgLTE4MyAgICAgICAgICAgICBAIGNvbnRyaWJ1dGlvbiBvZiBWIGZvciBncmVlbgotLmVxdSBDT0VGRl9VX0JMVUUsICAgICA0NTQgICAgICAgICAgICAgQCBjb250cmlidXRpb24gb2YgVSBmb3IgYmx1ZQotCi1AIENsYW1waW5nIGNvbnN0YW50cyAweDAgYW5kIDB4RkYKLS5lcXUgQ09FRkZfMCwgICAgICAgICAgMAotLmVxdSBDT0VGRl8yNTUsICAgICAgICAyNTUKLQotQCBCaWFzIGNvZWZmaWNpZW50cyBmb3IgcmVkLCBncmVlbiBhbmQgYmx1ZQotLmVxdSBDT0VGRl9CSUFTX1IsICAgLTQ1ODI0ICAgICAgICAgICAgQCBSZWQgICBiaWFzID0gICAgIC0zNTkqMTI4ICsgMTI4Ci0uZXF1IENPRUZGX0JJQVNfRywgICAgMzQ4MTYgICAgICAgICAgICBAIEdyZWVuIGJpYXMgPSAoODgrMTgzKSoxMjggKyAxMjgKLS5lcXUgQ09FRkZfQklBU19CLCAgIC01Nzk4NCAgICAgICAgICAgIEAgQmx1ZSAgYmlhcyA9ICAgICAtNDU0KjEyOCArIDEyOAotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogRlVOQ1RJT04gICAgIDogeXZ1cDJyZ2I1NjVfdmVudW0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBERVNDUklQVElPTiAgOiBQZXJmb3JtIFlWVSBwbGFuYXIgdG8gUkdCNTY1IGNvbnZlcnNpb24uCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQyBQUk9UT1RZUEUgIDogdm9pZCB5dnVwMnJnYjU2NV92ZW51bSh1aW50OF90ICAqcF95LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NiLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX3JnYjU2NSwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgbGVuZ3RoKQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBJTlBVVCAgICA6IFIwOiB1aW50OF90ICAqcF95Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IFkgTGluZQotKiAgICAgICAgICAgICAgICBSMTogdWludDhfdCAgKnBfY3IKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgQ3IgTGluZQotKiAgICAgICAgICAgICAgICBSMjogdWludDhfdCAgKnBfY2IKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgQ2IgTGluZQotKiAgICAgICAgICAgICAgICBSMzogdWludDhfdCAgKnBfcmdiNTY1Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBSR0IgTGluZQotKiAgICAgICAgICAgICAgICBSMTI6IHVpbnQzMl90ICBsZW5ndGgKLSogICAgICAgICAgICAgICAgICAgICAgd2lkdGggb2YgTGluZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIEFSRyAgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgT1VUUFVUICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIElOUFVUICAgIDogcF95ICAgICAgLSBhIGxpbmUgb2YgWSBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jciAgICAgLSBhIGxpbmUgb2YgQ3IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY2IgICAgIC0gYSBsaW5lIG9mIENiIHBpeGVscwotKiAgICAgICAgICAgICAgICBsZW5ndGggICAtIHRoZSB3aWR0aCBvZiB0aGUgaW5wdXQgbGluZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBPVVRQVVQgICA6IHBfcmdiNTY1IC0gdGhlIGNvbnZlcnRlZCByZ2IgcGl4ZWxzCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIEFGRkVDVEVEIDogQVJNOiAgUjAtUjQsIFIxMgotKiAgICAgICAgICAgICAgICBORU9OOiBRMC1RMTUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBVU0FHRSAgOiBub25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQ1lDTEVTICAgICAgIDogbm9uZQotKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE5PVEVTICAgICAgICA6Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0udHlwZSB5dnVwMnJnYjU2NV92ZW51bSwgJWZ1bmN0aW9uCi15dnVwMnJnYjU2NV92ZW51bToKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgU3RvcmUgc3RhY2sgcmVnaXN0ZXJzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgU1RNRkQgU1AhLCB7TFJ9Ci0KLSAgICBWUFVTSCB7RDgtRDE1fQotCi0gICAgUExEIFtSMCwgUjNdICAgICAgICAgICAgICAgICAgICAgICBAIHByZWxvYWQgbHVtYSBsaW5lCi0KLSAgICBBRFIgICBSMTIsIGNvbnN0YW50cwotCi0gICAgVkxEMS5TMTYgIHtENiwgRDd9LCBbUjEyXSEgICAgICAgICBAIEQ2LCBENzogMzU5IHwgIC04OCB8IC0xODMgfCA0NTQgfCAyNTYgfCAwIHwgMjU1IHwgMAotICAgIFZMRDEuUzMyICB7RDMwLCBEMzF9LCBbUjEyXSAgICAgICAgQCBRMTUgICA6ICAtNDU4MjQgICAgfCAgICAzNDgxNiAgIHwgIC01Nzk4NCB8ICAgICBYCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCB0aGUgNXRoIHBhcmFtZXRlciB2aWEgc3RhY2sKLSAgICAgKiAgUjAgfiBSMyBhcmUgdXNlZCB0byBwYXNzIHRoZSBmaXJzdCA0IHBhcmFtZXRlcnMsIHRoZSA1dGggYW5kIGFib3ZlCi0gICAgICogIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB2aWEgc3RhY2sKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBMRFIgUjEyLCBbU1AsICM2OF0gICAgICAgICAgICAgICAgIEAgTFIgaXMgcHVzaGVkIGludG8gdGhlIHN0YWNrIHNvIFNQIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRlY3JlYXNlZCBieSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEOC1EMTUgYXJlIGFsc28gcHVzaGVkIGludG8gdGhlIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIGlzIGRlY3JlYXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA4LWJ5dGUvRC1SZWdpc3RlciAqIDggRC1SZWdpc3RlcnMgPSA2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGJ5IDY0KzQ9NjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdG8gZ2V0IHRoZSB2YWx1ZSB0aGF0IHdhcyBmaXJzdCBwdXNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW50byBzdGFjayAodGhlIDV0aCBwYXJhbWV0ZXIgcGFzc2VkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRocm91Z2h0IHN0YWNrKQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgY2xhbXBpbmcgcGFyYW1ldGVycyB0byBkdXBsaWNhdGUgdmVjdG9yIGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkRVUC5TMTYgIFE0LCAgRDdbMV0gICAgICAgICAgICAgICBAIFE0OiAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMAotICAgIFZEVVAuUzE2ICBRNSwgIEQ3WzJdICAgICAgICAgICAgICAgQCBRNTogMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmVhZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkRVUC5TMzIgIFEwLCAgIEQzMFswXSAgICAgICAgICAgICBAIFEwOiAgLTQ1ODI0IHwgLTQ1ODI0IHwgLTQ1ODI0IHwgLTQ1ODI0Ci0gICAgVkRVUC5TMzIgIFExLCAgIEQzMFsxXSAgICAgICAgICAgICBAIFExOiAgIDM0ODE2IHwgIDM0ODE2IHwgIDM0ODE2IHwgIDM0ODE2Ci0gICAgVkRVUC5TMzIgIFEyLCAgIEQzMVswXSAgICAgICAgICAgICBAIFEyOiAgLTcwNjg4IHwgLTcwNjg4IHwgLTcwNjg4IHwgLTcwNjg4Ci0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGUgbWFpbiBsb29wCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1sb29wX3l2dXAycmdiNTY1OgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgaW5wdXQgZnJvbSBZLCBWIGFuZCBVCi0gICAgICogIEQxMiAgOiBZMCAgWTEgIFkyICBZMyAgWTQgIFk1ICBZNiAgWTcKLSAgICAgKiAgRDE0ICA6IFYwICBWMSAgVjIgIFYzICBWNCAgVjUgIFY2ICBWNwotICAgICAqICBEMTUgIDogVTAgIFUxICBVMiAgVTMgIFU0ICBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkxEMS5VOCAge0QxMn0sICBbcF95XSEgICAgICAgICAgICBAIExvYWQgOCBZICBlbGVtZW50cyAodWludDgpIHRvIEQxMgotICAgIFZMRDEuVTggIHtEMTR9LCAgW3BfY3JdISAgICAgICAgICAgQCBMb2FkIDggQ3IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTQKLSAgICBWTEQxLlU4ICB7RDE1fSwgIFtwX2NiXSEgICAgICAgICAgIEAgTG9hZCA4IENiIGVsZW1lbnRzICh1aW50OCkgdG8gRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRXhwYW5kIHVpbnQ4IHZhbHVlIHRvIHVpbnQxNgotICAgICAqICBEMTgsIEQxOTogWTAgWTEgWTIgWTMgWTQgWTUgWTYgWTcKLSAgICAgKiAgRDIwLCBEMjE6IFYwIFYxIFYyIFYzIFY0IFY1IFY2IFY3Ci0gICAgICogIEQyMiwgRDIzOiBVMCBVMSBVMiBVMyBVNCBVNSBVNiBVNwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1ZMLlU4IFE5LCAgRDEyCi0gICAgVk1PVkwuVTggUTEwLCBEMTQKLSAgICBWTU9WTC5VOCBRMTEsIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFExMiwgRDIwLCBENlswXSAgICAgICAgIEAgUTEyOiAgMzU5KihWMCxWMSxWMixWMykgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTEzLCBEMjIsIEQ2WzFdICAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFExMywgRDIwLCBENlsyXSAgICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTE0LCBEMjIsIEQ2WzNdICAgICAgICAgQCBRMTQ6ICA0NTQqKFUwLFUxLFUyLFUzKSAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFExMiwgUTAgICAgICAgICAgICAgICAgICBAIFExMiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTEzLCBRMSAgICAgICAgICAgICAgICAgIEAgUTEzIGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBRMTQsIFEyICAgICAgICAgICAgICAgICAgQCBRMTQgYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUxBTC5TMTYgIFExMiwgRDE4LCBEN1swXSAgICAgICAgIEAgUTEyOiBSMCwgUjEsIFIyLCBSMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTMsIEQxOCwgRDdbMF0gICAgICAgICBAIFExMzogRzAsIEcxLCBHMiwgRzMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTE0LCBEMTgsIEQ3WzBdICAgICAgICAgQCBRMTQ6IEIwLCBCMSwgQjIsIEIzIGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSaWdodCBzaGlmdCBlaWdodCBiaXRzIHdpdGggcm91bmRpbmcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWU0hSTi5TMzIgICBEMTggLCBRMTIsICM4ICAgICAgICAgIEAgRDE4OiBSMCwgUjEsIFIyLCBSMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIwICwgUTEzLCAjOCAgICAgICAgICBAIEQyMDogRzAsIEcxLCBHMiwgRzMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMiwgIFExNCwgIzggICAgICAgICAgQCBEMjI6IEIwLCBCMSwgQjIsIEIzIGluIDE2LWJpdCBRMCBmb3JtYXQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBEb25lIHdpdGggdGhlIGZpcnN0IDQgZWxlbWVudHMsIGNvbnRpbnVlIG9uIHRoZSBuZXh0IDQgZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBNdWx0aXBseSBjb250cmlidXRpb24gZnJvbSBjaHJvbWluYW5jZSwgcmVzdWx0cyBhcmUgaW4gMzItYml0Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1VTEwuUzE2ICBRMTIsIEQyMSwgRDZbMF0gICAgICAgICBAIFExMjogIDM1OSooVjAsVjEsVjIsVjMpICAgICBSZWQKLSAgICBWTVVMTC5TMTYgIFExMywgRDIzLCBENlsxXSAgICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRMTMsIEQyMSwgRDZbMl0gICAgICAgICBAIFExMzogIC04OCooVTAsVTEsVTIsVTMpIC0gMTgzKihWMCxWMSxWMixWMykKLSAgICBWTVVMTC5TMTYgIFExNCwgRDIzLCBENlszXSAgICAgICAgIEAgUTE0OiAgNDU0KihVMCxVMSxVMixVMykgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRMTIsIFEwICAgICAgICAgICAgICAgICAgQCBRMTIgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFExMywgUTEgICAgICAgICAgICAgICAgICBAIFExMyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTE0LCBRMiAgICAgICAgICAgICAgICAgIEAgUTE0IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1MQUwuUzE2ICBRMTIsIEQxOSwgRDdbMF0gICAgICAgICBAIFExMjogUjAsIFIxLCBSMiwgUjMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEzLCBEMTksIEQ3WzBdICAgICAgICAgQCBRMTM6IEcwLCBHMSwgRzIsIEczIGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExNCwgRDE5LCBEN1swXSAgICAgICAgIEAgUTE0OiBCMCwgQjEsIEIyLCBCMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDE5ICwgUTEyLCAjOCAgICAgICAgICBAIEQxODogUjAsIFIxLCBSMiwgUjMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSAsIFExMywgIzggICAgICAgICAgQCBEMjA6IEcwLCBHMSwgRzIsIEczIGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjMsICBRMTQsICM4ICAgICAgICAgIEAgRDIyOiBCMCwgQjEsIEIyLCBCMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFE5LCBROSwgUTQgICAgICAgICAgICAgICBAIGlmIFE5IDwgICAwLCBROSA9ICAgMAotICAgIFZNSU4uUzE2ICBROSwgUTksIFE1ICAgICAgICAgICAgICAgQCBpZiBROSA+IDI1NSwgUTkgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDI4LCBROSAgICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyOCwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRMTAsIFExMCwgUTQgICAgICAgICAgICAgQCBpZiBRMTAgPCAgIDAsIFExMCA9ICAgMAotICAgIFZNSU4uUzE2ICBRMTAsIFExMCwgUTUgICAgICAgICAgICAgQCBpZiBRMTAgPiAyNTUsIFExMCA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDI3LCBRMTAgICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjcsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTExLCBRMTEsIFE0ICAgICAgICAgICAgIEAgaWYgUTExIDwgICAwLCBRMTEgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTExLCBRMTEsIFE1ICAgICAgICAgICAgIEAgaWYgUTExID4gMjU1LCBRMTEgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyNiwgUTExICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjYsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4LgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEQyNzogIDMgYml0cyBvZiBHcmVlbiArIDUgYml0cyBvZiBCbHVlCi0gICAgICogIEQyODogIDUgYml0cyBvZiBSZWQgICArIDMgYml0cyBvZiBHcmVlbgotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTUkkuOCAgIEQyOCwgRDI3LCAjNSAgICAgICAgICAgICAgQCByaWdodCBzaGlmdCBHIGJ5IDUgYW5kIGluc2VydCB0byBSCi0gICAgVlNITC5VOCAgRDI3LCBEMjcsICMzICAgICAgICAgICAgICBAIGxlZnQgIHNoaWZ0IEcgYnkgMwotICAgIFZTUkkuOCAgIEQyNywgRDI2LCAjMyAgICAgICAgICAgICAgQCByaWdodCBzaGlmdCBCIGJ5IDMgYW5kIGluc2VydCB0byBHCi0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195dnVwMnJnYjU2NSAgICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1QyLlU4ICB7RDI3LCBEMjh9LCBbcF9yZ2JdISAgICAgIEAgdmVjdG9yIHN0b3JlIFJlZCwgR3JlZW4sIEJsdWUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmx1ZSBhdCBMU0IKLQotICAgIEJISSBsb29wX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBsb29wIGlmIG1vcmUgdGhhbiA4IHBpeGVscyBsZWZ0Ci0KLSAgICBCRVEgIGVuZF95dnVwMnJnYjU2NSAgICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLQotdHJhaWxpbmdfeXZ1cDJyZ2I1NjU6Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZXJlIGFyZSBmcm9tIDEgfiA3IHBpeGVscyBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LgotICAgICAqICBGaXJzdCBhZGRpbmcgNyB0byB0aGUgbGVuZ3RoIHNvIHRoZSBsZW5ndGggd291bGQgYmUgZnJvbSAwIH4gNi4KLSAgICAgKiAgZWc6IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydCwgc28gMS04KzcgPSAwLgotICAgICAqICBUaGVuIHNhdmUgMSBwaXhlbCB1bmNvbmRpdGlvbmFsbHkgc2luY2UgYXQgbGVhc3QgMSBwaXhlbHMgbGVmdCBpbiB0aGUKLSAgICAgKiAgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBBRERTIGxlbmd0aCwgbGVuZ3RoLCAjNyAgICAgICAgICAgIEAgdGhlcmUgYXJlIDcgb3IgbGVzcyBpbiB0aGUgdHJhaWxpbmcgcGFydAotCi0gICAgVlNUMi5VOCB7RDI3WzBdLCBEMjhbMF19LCBbcF9yZ2JdISBAIGF0IGxlYXN0IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydAotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDIuVTgge0QyN1sxXSwgRDI4WzFdfSwgW3BfcmdiXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDIuVTgge0QyN1syXSwgRDI4WzJdfSwgW3BfcmdiXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDIuVTgge0QyN1szXSwgRDI4WzNdfSwgW3BfcmdiXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDIuVTgge0QyN1s0XSwgRDI4WzRdfSwgW3BfcmdiXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDIuVTgge0QyN1s1XSwgRDI4WzVdfSwgW3BfcmdiXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAycmdiNTY1ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDIuVTgge0QyN1s2XSwgRDI4WzZdfSwgW3BfcmdiXSEgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotCi1lbmRfeXZ1cDJyZ2I1NjU6Ci0gICAgVlBPUCAge0Q4LUQxNX0KLSAgICBMRE1GRCBTUCEsIHtQQ30KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgeXZ1cDJyZ2I1NjUKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIEZVTkNUSU9OICAgICA6IHl5dnVwMnJnYjU2NV92ZW51bQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIERFU0NSSVBUSU9OICA6IFBlcmZvcm0gWVlWVSBwbGFuYXIgdG8gUkdCNTY1IGNvbnZlcnNpb24uCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQyBQUk9UT1RZUEUgIDogdm9pZCB5eXZ1cDJyZ2I1NjVfdmVudW0odWludDhfdCAgKnBfeSwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NiLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqcF9yZ2I1NjUsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBsZW5ndGgpCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIElOUFVUICAgIDogUjA6IHVpbnQ4X3QgICpwX3kKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgWSBMaW5lCi0qICAgICAgICAgICAgICAgIFIxOiB1aW50OF90ICAqcF9jcgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDciBMaW5lCi0qICAgICAgICAgICAgICAgIFIyOiB1aW50OF90ICAqcF9jYgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDYiBMaW5lCi0qICAgICAgICAgICAgICAgIFIzOiB1aW50OF90ICAqcF9yZ2I1NjUKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IFJHQiBMaW5lCi0qICAgICAgICAgICAgICAgIFIxMjogdWludDMyX3QgIGxlbmd0aAotKiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvZiBMaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgQVJHICAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBPVVRQVVQgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gSU5QVVQgICAgOiBwX3kgICAgICAtIGEgbGluZSBvZiBZIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NyICAgICAtIGEgbGluZSBvZiBDciBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jYiAgICAgLSBhIGxpbmUgb2YgQ2IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIGxlbmd0aCAgIC0gdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCBsaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIE9VVFBVVCAgIDogcF9yZ2I1NjUgLSB0aGUgY29udmVydGVkIHJnYiBwaXhlbHMKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgQUZGRUNURUQgOiBBUk06ICBSMC1SNCwgUjEyCi0qICAgICAgICAgICAgICAgIE5FT046IFEwLVExNQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIFVTQUdFICA6IG5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDWUNMRVMgICAgICAgOiBub25lCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTk9URVMgICAgICAgIDoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLS50eXBlIHl5dnVwMnJnYjU2NV92ZW51bSwgJWZ1bmN0aW9uCi15eXZ1cDJyZ2I1NjVfdmVudW06Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFN0b3JlIHN0YWNrIHJlZ2lzdGVycwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFNUTUZEIFNQISwge0xSfQotCi0gICAgVlBVU0gge0Q4LUQxNX0KLQotICAgIFBMRCBbUjAsIFIzXSAgICAgICAgICAgICAgICAgICAgICAgQCBwcmVsb2FkIGx1bWEgbGluZQotCi0gICAgQURSICAgUjEyLCBjb25zdGFudHMKLQotICAgIFZMRDEuUzE2ICB7RDYsIEQ3fSwgW1IxMl0hICAgICAgICAgQCBENiwgRDc6IDM1OSB8ICAtODggfCAtMTgzIHwgNDU0IHwgMjU2IHwgMCB8IDI1NSB8IDAKLSAgICBWTEQxLlMzMiAge0QzMCwgRDMxfSwgW1IxMl0gICAgICAgIEAgUTE1ICAgOiAgLTQ1ODI0ICAgIHwgICAgMzQ4MTYgICB8ICAtNTc5ODQgfCAgICAgWAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgdGhlIDV0aCBwYXJhbWV0ZXIgdmlhIHN0YWNrCi0gICAgICogIFIwIH4gUjMgYXJlIHVzZWQgdG8gcGFzcyB0aGUgZmlyc3QgNCBwYXJhbWV0ZXJzLCB0aGUgNXRoIGFuZCBhYm92ZQotICAgICAqICBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIHN0YWNrCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgTERSIFIxMiwgW1NQLCAjNjhdICAgICAgICAgICAgICAgICBAIExSIGlzIHB1c2hlZCBpbnRvIHRoZSBzdGFjayBzbyBTUCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkZWNyZWFzZWQgYnkgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRDgtRDE1IGFyZSBhbHNvIHB1c2hlZCBpbnRvIHRoZSBzdGFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBpcyBkZWNyZWFzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOC1ieXRlL0QtUmVnaXN0ZXIgKiA4IEQtUmVnaXN0ZXJzID0gNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIG5lZWRzIHRvIGJlIGluY3JlYXNlZCBieSA2NCs0PTY4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRvIGdldCB0aGUgdmFsdWUgdGhhdCB3YXMgZmlyc3QgcHVzaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGludG8gc3RhY2sgKHRoZSA1dGggcGFyYW1ldGVyIHBhc3NlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aHJvdWdodCBzdGFjaykKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGNsYW1waW5nIHBhcmFtZXRlcnMgdG8gZHVwbGljYXRlIHZlY3RvciBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzE2ICBRNCwgIEQ3WzFdICAgICAgICAgICAgICAgQCBRNDogIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDAKLSAgICBWRFVQLlMxNiAgUTUsICBEN1syXSAgICAgICAgICAgICAgIEAgUTU6IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJlYWQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzMyICBRMCwgICBEMzBbMF0gICAgICAgICAgICAgQCBRMDogIC00NTgyNCB8IC00NTgyNCB8IC00NTgyNCB8IC00NTgyNAotICAgIFZEVVAuUzMyICBRMSwgICBEMzBbMV0gICAgICAgICAgICAgQCBRMTogICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNiB8ICAzNDgxNgotICAgIFZEVVAuUzMyICBRMiwgICBEMzFbMF0gICAgICAgICAgICAgQCBRMjogIC03MDY4OCB8IC03MDY4OCB8IC03MDY4OCB8IC03MDY4OAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlIG1haW4gbG9vcAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotbG9vcF95eXZ1cDJyZ2I1NjU6Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBpbnB1dCBmcm9tIFksIFYgYW5kIFUKLSAgICAgKiAgRDEyLCBEMTM6IFkwIFkyIFk0IFk2IFk4IFkxMCBZMTIgWTE0LCBZMSBZMyBZNSBZNyBZOSBZMTEgWTEzIFkxNQotICAgICAqICBEMTQgICAgIDogVjAgVjEgVjIgVjMgVjQgVjUgIFY2ICBWNwotICAgICAqICBEMTUgICAgIDogVTAgVTEgVTIgVTMgVTQgVTUgIFU2ICBVNwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZMRDIuVTggIHtEMTIsRDEzfSwgW3BfeV0hICAgICAgICAgQCBMb2FkIDE2IEx1bWEgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTIsIEQxMwotICAgIFZMRDEuVTggIHtEMTR9LCAgICAgW3BfY3JdISAgICAgICAgQCBMb2FkIDggQ3IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTQKLSAgICBWTEQxLlU4ICB7RDE1fSwgICAgIFtwX2NiXSEgICAgICAgIEAgTG9hZCA4IENiIGVsZW1lbnRzICh1aW50OCkgdG8gRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRXhwYW5kIHVpbnQ4IHZhbHVlIHRvIHVpbnQxNgotICAgICAqICBEMjQsIEQyNTogWTAgWTIgWTQgWTYgWTggWTEwIFkxMiBZMTQKLSAgICAgKiAgRDI2LCBEMjc6IFkxIFkzIFk1IFk3IFk5IFkxMSBZMTMgWTE1Ci0gICAgICogIEQyOCwgRDI5OiBWMCBWMSBWMiBWMyBWNCBWNSAgVjYgIFY3Ci0gICAgICogIEQzMCwgRDMxOiBVMCBVMSBVMiBVMyBVNCBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVkwuVTggUTEyLCBEMTIKLSAgICBWTU9WTC5VOCBRMTMsIEQxMwotICAgIFZNT1ZMLlU4IFExNCwgRDE0Ci0gICAgVk1PVkwuVTggUTE1LCBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBNdWx0aXBseSBjb250cmlidXRpb24gZnJvbSBjaHJvbWluYW5jZSwgcmVzdWx0cyBhcmUgaW4gMzItYml0Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1VTEwuUzE2ICBRNiwgRDI4LCBENlswXSAgICAgICAgICBAIFE2OiAgMzU5KihWMCxWMSxWMixWMykgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTcsIEQzMCwgRDZbMV0gICAgICAgICAgQCBRNzogIC04OCooVTAsVTEsVTIsVTMpICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTcsIEQyOCwgRDZbMl0gICAgICAgICAgQCBxNzogIC04OCooVTAsVTEsVTIsVTMpIC0gMTgzKihWMCxWMSxWMixWMykKLSAgICBWTVVMTC5TMTYgIFE4LCBEMzAsIEQ2WzNdICAgICAgICAgIEAgcTg6ICA0NTQqKFUwLFUxLFUyLFUzKSAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFE2LCBRMCAgICAgICAgICAgICAgICAgICBAIFE2IGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRNywgUTEgICAgICAgICAgICAgICAgICAgQCBRNyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTgsIFEyICAgICAgICAgICAgICAgICAgIEAgUTggYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WLlMzMiAgIFE5LCBRNgotICAgIFZNTEFMLlMxNiAgUTYsIEQyNCwgRDdbMF0gICAgICAgICAgQCBRNjogUjAsIFIyLCBSNCwgUjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTksIEQyNiwgRDdbMF0gICAgICAgICAgQCBROTogUjEsIFIzLCBSNSwgUjcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTAsIFE3Ci0gICAgVk1MQUwuUzE2ICBRNywgIEQyNCwgRDdbMF0gICAgICAgICBAIFE3OiAgRzAsIEcyLCBHNCwgRzYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEwLCBEMjYsIEQ3WzBdICAgICAgICAgQCBRMTA6IEcxLCBHMywgRzUsIEc3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTExLCBROAotICAgIFZNTEFMLlMxNiAgUTgsICBEMjQsIEQ3WzBdICAgICAgICAgQCBRODogIEIwLCBCMiwgQjQsIEI2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMSwgRDI2LCBEN1swXSAgICAgICAgIEAgUTExOiBCMSwgQjMsIEI1LCBCNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDEyLCBRNiwgICM4ICAgICAgICAgICBAIEQxMjogUjAgUjIgUjQgUjYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxMywgUTksICAjOCAgICAgICAgICAgQCBEMTM6IFIxIFIzIFI1IFI3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTIsIEQxMyAgICAgICAgICAgICAgIEAgUTYgOiBSMCBSMSBSMiBSMyBSNCBSNSBSNiBSNwotCi0gICAgVlNIUk4uUzMyICAgRDE4LCBRNywgICM4ICAgICAgICAgICBAIEQxODogRzAgRzIgRzQgRzYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxOSwgUTEwLCAjOCAgICAgICAgICAgQCBEMTk6IEcxIEczIEc1IEc3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTgsIEQxOSAgICAgICAgICAgICAgIEAgUTkgOiBHMCBHMSBHMiBHMyBHNCBHNSBHNiBHNwotCi0gICAgVlNIUk4uUzMyICAgRDIwLCBROCwgICM4ICAgICAgICAgICBAIEQyMDogQjAgQjIgQjQgQjYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSwgUTExLCAjOCAgICAgICAgICAgQCBEMjE6IEIxIEIzIEI1IEI3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMjAsIEQyMSAgICAgICAgICAgICAgIEAgUTEwOiBCMCBCMSBCMiBCMyBCNCBCNSBCNiBCNwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENsYW1wIHRoZSB2YWx1ZSB0byBiZSB3aXRoaW4gWzB+MjU1XQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNQVguUzE2ICBRNiwgUTYsIFE0ICAgICAgICAgICAgICAgQCBpZiBRNiA8ICAgMCwgUTYgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTYsIFE2LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTYgPiAyNTUsIFE2ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMywgUTYgICAgICAgICAgICAgICBAIHN0b3JlIFJlZCB0byBEMjMsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTksIFE5LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTkgPCAgIDAsIFE5ID0gICAwCi0gICAgVk1JTi5TMTYgIFE5LCBROSwgUTUgICAgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjIsIFE5ICAgICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjIsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTEwLCBRMTAsIFE0ICAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyMSwgUTEwICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjEsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRDIyOiAgMyBiaXRzIG9mIEdyZWVuICsgNSBiaXRzIG9mIEJsdWUKLSAgICAgKiAgRDIzOiAgNSBiaXRzIG9mIFJlZCAgICsgMyBiaXRzIG9mIEdyZWVuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNSSS44ICAgRDIzLCBEMjIsICM1ICAgICAgICAgICAgICBAIHJpZ2h0IHNoaWZ0IEcgYnkgNSBhbmQgaW5zZXJ0IHRvIFIKLSAgICBWU0hMLlU4ICBEMjIsIEQyMiwgIzMgICAgICAgICAgICAgIEAgbGVmdCBzaGlmdCBHIGJ5IDMKLSAgICBWU1JJLjggICBEMjIsIEQyMSwgIzMgICAgICAgICAgICAgIEAgcmlnaHQgc2hpZnQgQiBieSAzIGFuZCBpbnNlcnQgdG8gRwotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzggICAgICAgICAgICBAIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIEJNSSAgdHJhaWxpbmdfeXl2dXAycmdiNTY1ICAgICAgICAgQCBqdW1wIHRvIHRyYWlsaW5nIHByb2Nlc3NpbmcgaWYgcmVtYWluaW5nIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgVlNUMi5VOCAge0QyMixEMjN9LCBbcF9yZ2JdISAgICAgICBAIHZlY3RvciBzdG9yZSBSZWQsIEdyZWVuLCBCbHVlIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEJsdWUgYXQgTFNCCi0KLSAgICBCRVEgIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBEb25lIHdpdGggdGhlIGZpcnN0IDggZWxlbWVudHMsIGNvbnRpbnVlIG9uIHRoZSBuZXh0IDggZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBNdWx0aXBseSBjb250cmlidXRpb24gZnJvbSBjaHJvbWluYW5jZSwgcmVzdWx0cyBhcmUgaW4gMzItYml0Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1VTEwuUzE2ICBRNiwgRDI5LCBENlswXSAgICAgICAgICBAIFE2OiAzNTkqKFY0LFY1LFY2LFY3KSAgICAgICBSZWQKLSAgICBWTVVMTC5TMTYgIFE3LCBEMzEsIEQ2WzFdICAgICAgICAgIEAgUTc6IC04OCooVTQsVTUsVTYsVTcpICAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFE3LCBEMjksIEQ2WzJdICAgICAgICAgIEAgUTc6IC04OCooVTQsVTUsVTYsVTcpIC0gMTgzKihWNCxWNSxWNixWNykKLSAgICBWTVVMTC5TMTYgIFE4LCBEMzEsIEQ2WzNdICAgICAgICAgIEAgUTg6IDQ1NCooVTQsVTUsVTYsVTcpICAgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRNiwgUTAgICAgICAgICAgICAgICAgICAgQCBRNiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTcsIFExICAgICAgICAgICAgICAgICAgIEAgUTcgYWRkIEdyZWVuIGJpYXMgIDM0ODE2Ci0gICAgVkFERC5TMzIgIFE4LCBRMiAgICAgICAgICAgICAgICAgICBAIFE4IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVi5TMzIgICBROSwgUTYKLSAgICBWTUxBTC5TMTYgIFE2LCBEMjUsIEQ3WzBdICAgICAgICAgIEAgUTY6IFI4IFIxMCBSMTIgUjE0IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFE5LCBEMjcsIEQ3WzBdICAgICAgICAgIEAgUTk6IFI5IFIxMSBSMTMgUjE1IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTEwLCBRNwotICAgIFZNTEFMLlMxNiAgUTcsICBEMjUsIEQ3WzBdICAgICAgICAgQCBRNzogRzAsIEcyLCBHNCwgRzYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEwLCBEMjcsIEQ3WzBdICAgICAgICAgQCBRMTAgOiBHMSwgRzMsIEc1LCBHNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICBWTU9WLlMzMiAgIFExMSwgUTgKLSAgICBWTUxBTC5TMTYgIFE4LCAgRDI1LCBEN1swXSAgICAgICAgIEAgUTg6IEIwLCBCMiwgQjQsIEI2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMSwgRDI3LCBEN1swXSAgICAgICAgIEAgUTExIDogQjEsIEIzLCBCNSwgQjcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJpZ2h0IHNoaWZ0IGVpZ2h0IGJpdHMgd2l0aCByb3VuZGluZwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTSFJOLlMzMiAgIEQxMiwgUTYsICAjOCAgICAgICAgICAgQCBEMTI6IFI4IFIxMCBSMTIgUjE0IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMTMsIFE5LCAgIzggICAgICAgICAgIEAgRDEzOiBSOSBSMTEgUjEzIFIxNSBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDEyLCBEMTMgICAgICAgICAgICAgICBAIFE2OiBSOCBSOSBSMTAgUjExIFIxMiBSMTMgUjE0IFIxNQotCi0gICAgVlNIUk4uUzMyICAgRDE4LCBRNywgICM4ICAgICAgICAgICBAIEQxODogRzggRzEwIEcxMiBHMTQgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxOSwgUTEwLCAjOCAgICAgICAgICAgQCBEMTk6IEc5IEcxMSBHMTMgRzE1IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTgsIEQxOSAgICAgICAgICAgICAgIEAgUTk6ICBHOCBHOSBHMTAgRzExIEcxMiBHMTMgRzE0IEcxNQotCi0gICAgVlNIUk4uUzMyICAgRDIwLCBROCwgICM4ICAgICAgICAgICBAIEQyMDogQjggQjEwIEIxMiBCMTQgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSwgUTExLCAjOCAgICAgICAgICAgQCBEMjE6IEI5IEIxMSBCMTMgQjE1IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMjAsIEQyMSAgICAgICAgICAgICAgIEAgUTEwOiBCOCBCOSBCMTAgQjExIEIxMiBCMTMgQjE0IEIxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENsYW1wIHRoZSB2YWx1ZSB0byBiZSB3aXRoaW4gWzB+MjU1XQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNQVguUzE2ICBRNiwgUTYsIFE0ICAgICAgICAgICAgICAgQCBpZiBRNiA8ICAgMCwgUTYgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTYsIFE2LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTYgPiAyNTUsIFE2ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMywgUTYgICAgICAgICAgICAgICBAIHN0b3JlIFJlZCB0byBEMjMsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTksIFE5LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTkgPCAgIDAsIFE5ID0gICAwCi0gICAgVk1JTi5TMTYgIFE5LCBROSwgUTUgICAgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjIsIFE5ICAgICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjIsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTEwLCBRMTAsIFE0ICAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyMSwgUTEwICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjEsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRDIyOiAgMyBiaXRzIG9mIEdyZWVuICsgNSBiaXRzIG9mIEJsdWUKLSAgICAgKiAgRDIzOiAgNSBiaXRzIG9mIFJlZCAgICsgMyBiaXRzIG9mIEdyZWVuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNSSS44ICAgRDIzLCBEMjIsICM1ICAgICAgICAgICAgICBAIHJpZ2h0IHNoaWZ0IEcgYnkgNSBhbmQgaW5zZXJ0IHRvIFIKLSAgICBWU0hMLlU4ICBEMjIsIEQyMiwgIzMgICAgICAgICAgICAgIEAgbGVmdCBzaGlmdCBHIGJ5IDMKLSAgICBWU1JJLjggICBEMjIsIEQyMSwgIzMgICAgICAgICAgICAgIEAgcmlnaHQgc2hpZnQgQiBieSAzIGFuZCBpbnNlcnQgdG8gRwotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzggICAgICAgICAgICBAIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIEJNSSAgdHJhaWxpbmdfeXl2dXAycmdiNTY1ICAgICAgICAgQCBqdW1wIHRvIHRyYWlsaW5nIHByb2Nlc3NpbmcgaWYgcmVtYWluaW5nIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgVlNUMi5VOCAge0QyMixEMjN9LCBbcF9yZ2JdISAgICAgICBAIHZlY3RvciBzdG9yZSBSZWQsIEdyZWVuLCBCbHVlIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEJsdWUgYXQgTFNCCi0KLSAgICBCSEkgbG9vcF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgIEAgbG9vcCBpZiBtb3JlIHRoYW4gOCBwaXhlbHMgbGVmdAotCi0gICAgQkVRICBlbmRfeXl2dXAycmdiNTY1ICAgICAgICAgICAgICBAIGRvbmUgaWYgZXhhY3RseSA4IHBpeGVsIHByb2Nlc3NlZCBpbiB0aGUgbG9vcAotCi0KLXRyYWlsaW5nX3l5dnVwMnJnYjU2NToKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlcmUgYXJlIGZyb20gMSB+IDcgcGl4ZWxzIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQuCi0gICAgICogIEZpcnN0IGFkZGluZyA3IHRvIHRoZSBsZW5ndGggc28gdGhlIGxlbmd0aCB3b3VsZCBiZSBmcm9tIDAgfiA2LgotICAgICAqICBlZzogMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LCBzbyAxLTgrNyA9IDAuCi0gICAgICogIFRoZW4gc2F2ZSAxIHBpeGVsIHVuY29uZGl0aW9uYWxseSBzaW5jZSBhdCBsZWFzdCAxIHBpeGVscyBsZWZ0IGluIHRoZQotICAgICAqICB0cmFpbGluZyBwYXJ0LgotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIEFERFMgbGVuZ3RoLCBsZW5ndGgsICM3ICAgICAgICAgICAgQCB0aGVyZSBhcmUgNyBvciBsZXNzIGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0KLSAgICBWU1QyLlU4IHtEMjJbMF0sRDIzWzBdfSwgW3BfcmdiXSEgIEAgYXQgbGVhc3QgMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0gICAgQkVRIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDIyWzFdLEQyM1sxXX0sIFtwX3JnYl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDIyWzJdLEQyM1syXX0sIFtwX3JnYl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDIyWzNdLEQyM1szXX0sIFtwX3JnYl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDIyWzRdLEQyM1s0XX0sIFtwX3JnYl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDIyWzVdLEQyM1s1XX0sIFtwX3JnYl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJyZ2I1NjUgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMi5VOCB7RDIyWzZdLEQyM1s2XX0sIFtwX3JnYl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0KLWVuZF95eXZ1cDJyZ2I1NjU6Ci0gICAgVlBPUCAge0Q4LUQxNX0KLSAgICBMRE1GRCBTUCEsIHtQQ30KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgeXl2dXAycmdiNTY1Ci0KLWNvbnN0YW50czoKLSAgICAuaHdvcmQgKENPRUZGX1ZfUkVEKSwgIChDT0VGRl9VX0dSRUVOKSwgKENPRUZGX1ZfR1JFRU4pLCAoQ09FRkZfVV9CTFVFKSBAICAgMzU5ICB8IC04OCAgIHwgIC0xODMgIHwgNDU0Ci0gICAgLmh3b3JkIChDT0VGRl9ZKSwgICAgICAoQ09FRkZfMCksICAgICAgIChDT0VGRl8yNTUpICAgICwgKENPRUZGXzApICAgICAgQCAgIDI1NiAgfCAgIDAgICB8ICAgMjU1ICB8ICAwCi0gICAgLndvcmQgIChDT0VGRl9CSUFTX1IpLCAoQ09FRkZfQklBU19HKSwgIChDT0VGRl9CSUFTX0IpICAgICAgICAgICAgICAgICAgQCAtNDU4MjQgfCAzNDgxNiB8IC01Nzk4NCB8ICBYCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogRlVOQ1RJT04gICAgIDogeXZ1cDJhYmdyODg4OF92ZW51bQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIERFU0NSSVBUSU9OICA6IFBlcmZvcm0gWVZVIHBsYW5hciB0byBBQkdSODg4OCBjb252ZXJzaW9uLgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIEMgUFJPVE9UWVBFICA6IHZvaWQgeXZ1cDJhYmdyODg4OF92ZW51bSh1aW50OF90ICAqcF95LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqcF9jYiwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2FiZ3I4ODg4LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIGxlbmd0aCkKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgSU5QVVQgICAgOiBSMDogdWludDhfdCAgKnBfeQotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBZIExpbmUKLSogICAgICAgICAgICAgICAgUjE6IHVpbnQ4X3QgICpwX2NyCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENyIExpbmUKLSogICAgICAgICAgICAgICAgUjI6IHVpbnQ4X3QgICpwX2NiCi0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IENiIExpbmUKLSogICAgICAgICAgICAgICAgUjM6IHVpbnQ4X3QgICpwX2FiZ3I4ODg4Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBBQkdSIExpbmUKLSogICAgICAgICAgICAgICAgUjEyOiB1aW50MzJfdCAgbGVuZ3RoCi0qICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIG9mIExpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBBUkcgICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIE9VVFBVVCAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBJTlBVVCAgICA6IHBfeSAgICAgIC0gYSBsaW5lIG9mIFkgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY3IgICAgIC0gYSBsaW5lIG9mIENyIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NiICAgICAtIGEgbGluZSBvZiBDYiBwaXhlbHMKLSogICAgICAgICAgICAgICAgbGVuZ3RoICAgLSB0aGUgd2lkdGggb2YgdGhlIGlucHV0IGxpbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gT1VUUFVUICAgOiBwX2FiZ3I4ODg4IC0gdGhlIGNvbnZlcnRlZCBBQkdSIHBpeGVscwotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBBRkZFQ1RFRCA6IEFSTTogIFIwLVI0LCBSMTIKLSogICAgICAgICAgICAgICAgTkVPTjogUTAtUTE1Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgVVNBR0UgIDogbm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIENZQ0xFUyAgICAgICA6IG5vbmUKLSoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBOT1RFUyAgICAgICAgOgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotLnR5cGUgeXZ1cDJhYmdyODg4OF92ZW51bSwgJWZ1bmN0aW9uCi15dnVwMmFiZ3I4ODg4X3ZlbnVtOgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBTdG9yZSBzdGFjayByZWdpc3RlcnMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBTVE1GRCBTUCEsIHtMUn0KLQotICAgIFZQVVNIIHtEOC1EMTV9Ci0KLSAgICBQTEQgW1IwLCBSM10gICAgICAgICAgICAgICAgICAgICAgIEAgcHJlbG9hZCBsdW1hIGxpbmUKLQotICAgIEFEUiAgIFIxMiwgY29uc3RhbnRzCi0KLSAgICBWTEQxLlMxNiAge0Q2LCBEN30sIFtSMTJdISAgICAgICAgIEAgRDYsIEQ3OiAzNTkgfCAgLTg4IHwgLTE4MyB8IDQ1NCB8IDI1NiB8IDAgfCAyNTUgfCAwCi0gICAgVkxEMS5TMzIgIHtEMzAsIEQzMX0sIFtSMTJdICAgICAgICBAIFExNSAgIDogIC00NTgyNCAgICB8ICAgIDM0ODE2ICAgfCAgLTU3OTg0IHwgICAgIFgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIHRoZSA1dGggcGFyYW1ldGVyIHZpYSBzdGFjawotICAgICAqICBSMCB+IFIzIGFyZSB1c2VkIHRvIHBhc3MgdGhlIGZpcnN0IDQgcGFyYW1ldGVycywgdGhlIDV0aCBhbmQgYWJvdmUKLSAgICAgKiAgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHZpYSBzdGFjawotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIExEUiBSMTIsIFtTUCwgIzY4XSAgICAgICAgICAgICAgICAgQCBMUiBpcyBwdXNoZWQgaW50byB0aGUgc3RhY2sgc28gU1AgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGVjcmVhc2VkIGJ5IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEQ4LUQxNSBhcmUgYWxzbyBwdXNoZWQgaW50byB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgaXMgZGVjcmVhc2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDgtYnl0ZS9ELVJlZ2lzdGVyICogOCBELVJlZ2lzdGVycyA9IDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBuZWVkcyB0byBiZSBpbmNyZWFzZWQgYnkgNjQrND02OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIGZpcnN0IHB1c2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbnRvIHN0YWNrICh0aGUgNXRoIHBhcmFtZXRlciBwYXNzZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhyb3VnaHQgc3RhY2spCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBjbGFtcGluZyBwYXJhbWV0ZXJzIHRvIGR1cGxpY2F0ZSB2ZWN0b3IgZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMxNiAgUTQsICBEN1sxXSAgICAgICAgICAgICAgIEAgUTQ6ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwCi0gICAgVkRVUC5TMTYgIFE1LCAgRDdbMl0gICAgICAgICAgICAgICBAIFE1OiAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSZWFkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMzMiAgUTAsICAgRDMwWzBdICAgICAgICAgICAgIEAgUTA6ICAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQKLSAgICBWRFVQLlMzMiAgUTEsICAgRDMwWzFdICAgICAgICAgICAgIEAgUTE6ICAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYKLSAgICBWRFVQLlMzMiAgUTIsICAgRDMxWzBdICAgICAgICAgICAgIEAgUTI6ICAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODgKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZSBtYWluIGxvb3AKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWxvb3BfeXZ1cDJhYmdyOgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgaW5wdXQgZnJvbSBZLCBWIGFuZCBVCi0gICAgICogIEQxMiAgOiBZMCAgWTEgIFkyICBZMyAgWTQgIFk1ICBZNiAgWTcKLSAgICAgKiAgRDE0ICA6IFYwICBWMSAgVjIgIFYzICBWNCAgVjUgIFY2ICBWNwotICAgICAqICBEMTUgIDogVTAgIFUxICBVMiAgVTMgIFU0ICBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkxEMS5VOCAge0QxMn0sICBbcF95XSEgICAgICAgICAgICBAIExvYWQgOCBMdW1hIGVsZW1lbnRzICh1aW50OCkgdG8gRDEyCi0gICAgVkxEMS5VOCAge0QxNH0sICBbcF9jcl0hICAgICAgICAgICBAIExvYWQgOCBDciBlbGVtZW50cyAodWludDgpIHRvIEQxNAotICAgIFZMRDEuVTggIHtEMTV9LCAgW3BfY2JdISAgICAgICAgICAgQCBMb2FkIDggQ2IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBFeHBhbmQgdWludDggdmFsdWUgdG8gdWludDE2Ci0gICAgICogIEQxOCwgRDE5OiBZMCBZMSBZMiBZMyBZNCBZNSBZNiBZNwotICAgICAqICBEMjAsIEQyMTogVjAgVjEgVjIgVjMgVjQgVjUgVjYgVjcKLSAgICAgKiAgRDIyLCBEMjM6IFUwIFUxIFUyIFUzIFU0IFU1IFU2IFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVkwuVTggUTksICBEMTIKLSAgICBWTU9WTC5VOCBRMTAsIEQxNAotICAgIFZNT1ZMLlU4IFExMSwgRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTXVsdGlwbHkgY29udHJpYnV0aW9uIGZyb20gY2hyb21pbmFuY2UsIHJlc3VsdHMgYXJlIGluIDMyLWJpdAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNVUxMLlMxNiAgUTEyLCBEMjAsIEQ2WzBdICAgICAgICAgQCBRMTI6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRMTMsIEQyMiwgRDZbMV0gICAgICAgICBAIFExMzogIC04OCooVTAsVTEsVTIsVTMpICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTEzLCBEMjAsIEQ2WzJdICAgICAgICAgQCBRMTM6ICAtODgqKFUwLFUxLFUyLFUzKSAtIDE4MyooVjAsVjEsVjIsVjMpCi0gICAgVk1VTEwuUzE2ICBRMTQsIEQyMiwgRDZbM10gICAgICAgICBAIFExNDogIDQ1NCooVTAsVTEsVTIsVTMpICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTEyLCBRMCAgICAgICAgICAgICAgICAgIEAgUTEyIGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRMTMsIFExICAgICAgICAgICAgICAgICAgQCBRMTMgYWRkIEdyZWVuIGJpYXMgIDM0ODE2Ci0gICAgVkFERC5TMzIgIFExNCwgUTIgICAgICAgICAgICAgICAgICBAIFExNCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNTEFMLlMxNiAgUTEyLCBEMTgsIEQ3WzBdICAgICAgICAgQCBRMTI6IFIwLCBSMSwgUjIsIFIzIGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMywgRDE4LCBEN1swXSAgICAgICAgIEAgUTEzOiBHMCwgRzEsIEcyLCBHMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTQsIEQxOCwgRDdbMF0gICAgICAgICBAIFExNDogQjAsIEIxLCBCMiwgQjMgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJpZ2h0IHNoaWZ0IGVpZ2h0IGJpdHMgd2l0aCByb3VuZGluZwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTSFJOLlMzMiAgIEQxOCAsIFExMiwgIzggICAgICAgICAgQCBEMTg6IFIwLCBSMSwgUjIsIFIzIGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjAgLCBRMTMsICM4ICAgICAgICAgIEAgRDIwOiBHMCwgRzEsIEcyLCBHMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIyLCAgUTE0LCAjOCAgICAgICAgICBAIEQyMjogQjAsIEIxLCBCMiwgQjMgaW4gMTYtYml0IFEwIGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIERvbmUgd2l0aCB0aGUgZmlyc3QgNCBlbGVtZW50cywgY29udGludWUgb24gdGhlIG5leHQgNCBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFExMiwgRDIxLCBENlswXSAgICAgICAgIEAgUTEyOiAgMzU5KihWMCxWMSxWMixWMykgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTEzLCBEMjMsIEQ2WzFdICAgICAgICAgQCBRMTM6IC04OCooVTAsVTEsVTIsVTMpICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTEzLCBEMjEsIEQ2WzJdICAgICAgICAgQCBRMTM6IC04OCooVTAsVTEsVTIsVTMpIC0gMTgzKihWMCxWMSxWMixWMykKLSAgICBWTVVMTC5TMTYgIFExNCwgRDIzLCBENlszXSAgICAgICAgIEAgUTE0OiAgNDU0KihVMCxVMSxVMixVMykgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRMTIsIFEwICAgICAgICAgICAgICAgICAgQCBRMTIgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFExMywgUTEgICAgICAgICAgICAgICAgICBAIFExMyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTE0LCBRMiAgICAgICAgICAgICAgICAgIEAgUTE0IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1MQUwuUzE2ICBRMTIsIEQxOSwgRDdbMF0gICAgICAgICBAIFExMjogUjAsIFIxLCBSMiwgUjMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEzLCBEMTksIEQ3WzBdICAgICAgICAgQCBRMTM6IEcwLCBHMSwgRzIsIEczIGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExNCwgRDE5LCBEN1swXSAgICAgICAgIEAgUTE0OiBCMCwgQjEsIEIyLCBCMyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDE5ICwgUTEyLCAjOCAgICAgICAgICBAIEQxODogUjAsIFIxLCBSMiwgUjMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSAsIFExMywgIzggICAgICAgICAgQCBEMjA6IEcwLCBHMSwgRzIsIEczIGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjMsICBRMTQsICM4ICAgICAgICAgIEAgRDIyOiBCMCwgQjEsIEIyLCBCMyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFExMSwgUTExLCBRNCAgICAgICAgICAgICBAIGlmIFExMSA8ICAgMCwgUTExID0gICAwCi0gICAgVk1JTi5TMTYgIFExMSwgUTExLCBRNSAgICAgICAgICAgICBAIGlmIFExMSA+IDI1NSwgUTExID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICBEMjgsIFExMSAgICAgICAgICAgICBAIHN0b3JlIEJsdWUgdG8gRDI4LCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFExMCwgUTEwLCBRNCAgICAgICAgICAgICBAIGlmIFExMCA8ICAgMCwgUTEwID0gICAwCi0gICAgVk1JTi5TMTYgIFExMCwgUTEwLCBRNSAgICAgICAgICAgICBAIGlmIFExMCA+IDI1NSwgUTEwID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICBEMjcsIFExMCAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyNywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICAgIFE5LCBROSwgUTQgICAgICAgICAgICAgQCBpZiBROSA8ICAgMCwgUTkgPSAgIDAKLSAgICBWTUlOLlMxNiAgICBROSwgUTksIFE1ICAgICAgICAgICAgIEAgaWYgUTkgPiAyNTUsIFE5ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICAgRDI2LCBROSAgICAgICAgICAgICBAIHN0b3JlIFJlZCB0byBEMjYsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgYWJnciBmb3JtYXQgd2l0aCBsZWFkaW5nIDB4RkYgYnl0ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1ZOLkkxNiAgRDI5LCBRNSAgICAgICAgICAgICAgICAgQCBEMjk6ICAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICM4ICAgICAgICAgICAgQCBjaGVjayBpZiB0aGUgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBCTUkgIHRyYWlsaW5nX3l2dXAyYWJnciAgICAgICAgICAgIEAganVtcCB0byB0cmFpbGluZyBwcm9jZXNzaW5nIGlmIHJlbWFpbmluZyBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIFZTVDQuVTggIHtEMjYsRDI3LEQyOCxEMjl9LCBbcF9iZ3JdISAgIEAgdmVjdG9yIHN0b3JlIFJlZCwgR3JlZW4sIEJsdWUgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmx1ZSBhdCBMU0IKLQotICAgIEJISSBsb29wX3l2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBsb29wIGlmIG1vcmUgdGhhbiA4IHBpeGVscyBsZWZ0Ci0KLSAgICBCRVEgIGVuZF95dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLQotdHJhaWxpbmdfeXZ1cDJhYmdyOgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGVyZSBhcmUgZnJvbSAxIH4gNyBwaXhlbHMgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAgRmlyc3QgYWRkaW5nIDcgdG8gdGhlIGxlbmd0aCBzbyB0aGUgbGVuZ3RoIHdvdWxkIGJlIGZyb20gMCB+IDYuCi0gICAgICogIGVnOiAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQsIHNvIDEtOCs3ID0gMC4KLSAgICAgKiAgVGhlbiBzYXZlIDEgcGl4ZWwgdW5jb25kaXRpb25hbGx5IHNpbmNlIGF0IGxlYXN0IDEgcGl4ZWxzIGxlZnQgaW4gdGhlCi0gICAgICogIHRyYWlsaW5nIHBhcnQuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgQUREUyBsZW5ndGgsIGxlbmd0aCwgIzcgICAgICAgICAgICBAIHRoZXJlIGFyZSA3IG9yIGxlc3MgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLQotICAgIFZTVDQuVTgge0QyNlswXSwgRDI3WzBdLCBEMjhbMF0sIEQyOVswXX0sIFtwX2Jncl0hIEAgYXQgbGVhc3QgMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0Ci0gICAgQkVRICBlbmRfeXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDI2WzFdLCBEMjdbMV0sIEQyOFsxXSwgRDI5WzFdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgIGVuZF95dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjZbMl0sIEQyN1syXSwgRDI4WzJdLCBEMjlbMl19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyNlszXSwgRDI3WzNdLCBEMjhbM10sIEQyOVszXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDI2WzRdLCBEMjdbNF0sIEQyOFs0XSwgRDI5WzRdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgIGVuZF95dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjZbNV0sIEQyN1s1XSwgRDI4WzVdLCBEMjlbNV19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyNls2XSwgRDI3WzZdLCBEMjhbNl0sIEQyOVs2XX0sIFtwX2Jncl0hIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLQotZW5kX3l2dXAyYWJncjoKLSAgICBWUE9QICB7RDgtRDE1fQotICAgIExETUZEIFNQISwge1BDfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgeXZ1cDJhYmdyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogRlVOQ1RJT04gICAgIDogeXl2dXAyYWJncjg4ODhfdmVudW0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBERVNDUklQVElPTiAgOiBQZXJmb3JtIFlZVlUgcGxhbmFyIHRvIEFCR1I4ODg4IGNvbnZlcnNpb24uCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQyBQUk9UT1RZUEUgIDogdm9pZCB5eXZ1cDJhYmdyODg4OF92ZW51bSh1aW50OF90ICAqcF95LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NiLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2FiZ3I4ODg4LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBsZW5ndGgpCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIElOUFVUICAgIDogUjA6IHVpbnQ4X3QgICpwX3kKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgWSBMaW5lCi0qICAgICAgICAgICAgICAgIFIxOiB1aW50OF90ICAqcF9jcgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDciBMaW5lCi0qICAgICAgICAgICAgICAgIFIyOiB1aW50OF90ICAqcF9jYgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDYiBMaW5lCi0qICAgICAgICAgICAgICAgIFIzOiB1aW50OF90ICAqcF9hYmdyODg4OAotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgQUJHUiBMaW5lCi0qICAgICAgICAgICAgICAgIFIxMjogdWludDMyX3QgIGxlbmd0aAotKiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvZiBMaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgQVJHICAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBPVVRQVVQgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gSU5QVVQgICAgOiBwX3kgICAgICAtIGEgbGluZSBvZiBZIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NyICAgICAtIGEgbGluZSBvZiBDciBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jYiAgICAgLSBhIGxpbmUgb2YgQ2IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIGxlbmd0aCAgIC0gdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCBsaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIE9VVFBVVCAgIDogcF9hYmdyODg4OCAtIHRoZSBjb252ZXJ0ZWQgQUJHUiBwaXhlbHMKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgQUZGRUNURUQgOiBBUk06ICBSMC1SNCwgUjEyCi0qICAgICAgICAgICAgICAgIE5FT046IFEwLVExNQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIFVTQUdFICA6IG5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDWUNMRVMgICAgICAgOiBub25lCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTk9URVMgICAgICAgIDoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLS50eXBlIHl5dnVwMmFiZ3I4ODg4X3ZlbnVtLCAlZnVuY3Rpb24KLXl5dnVwMmFiZ3I4ODg4X3ZlbnVtOgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBTdG9yZSBzdGFjayByZWdpc3RlcnMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBTVE1GRCBTUCEsIHtMUn0KLQotICAgIFZQVVNIIHtEOC1EMTV9Ci0KLSAgICBQTEQgW1IwLCBSM10gICAgICAgICAgICAgICAgICAgICAgIEAgcHJlbG9hZCBsdW1hIGxpbmUKLQotICAgIEFEUiAgIFIxMiwgY29uc3RhbnRzCi0KLSAgICBWTEQxLlMxNiAge0Q2LCBEN30sIFtSMTJdISAgICAgICAgIEAgRDYsIEQ3OiAzNTkgfCAgLTg4IHwgLTE4MyB8IDQ1NCB8IDI1NiB8IDAgfCAyNTUgfCAwCi0gICAgVkxEMS5TMzIgIHtEMzAsIEQzMX0sIFtSMTJdICAgICAgICBAIFExNSAgIDogIC00NTgyNCAgICB8ICAgIDM0ODE2ICAgfCAgLTU3OTg0IHwgICAgIFgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIHRoZSA1dGggcGFyYW1ldGVyIHZpYSBzdGFjawotICAgICAqICBSMCB+IFIzIGFyZSB1c2VkIHRvIHBhc3MgdGhlIGZpcnN0IDQgcGFyYW1ldGVycywgdGhlIDV0aCBhbmQgYWJvdmUKLSAgICAgKiAgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHZpYSBzdGFjawotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIExEUiBSMTIsIFtTUCwgIzY4XSAgICAgICAgICAgICAgICAgQCBMUiBpcyBwdXNoZWQgaW50byB0aGUgc3RhY2sgc28gU1AgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGVjcmVhc2VkIGJ5IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEQ4LUQxNSBhcmUgYWxzbyBwdXNoZWQgaW50byB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgaXMgZGVjcmVhc2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDgtYnl0ZS9ELVJlZ2lzdGVyICogOCBELVJlZ2lzdGVycyA9IDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBuZWVkcyB0byBiZSBpbmNyZWFzZWQgYnkgNjQrND02OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIGZpcnN0IHB1c2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbnRvIHN0YWNrICh0aGUgNXRoIHBhcmFtZXRlciBwYXNzZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhyb3VnaHQgc3RhY2spCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBjbGFtcGluZyBwYXJhbWV0ZXJzIHRvIGR1cGxpY2F0ZSB2ZWN0b3IgZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMxNiAgUTQsICBEN1sxXSAgICAgICAgICAgICAgIEAgUTQ6ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwCi0gICAgVkRVUC5TMTYgIFE1LCAgRDdbMl0gICAgICAgICAgICAgICBAIFE1OiAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSZWFkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMzMiAgUTAsICAgRDMwWzBdICAgICAgICAgICAgIEAgUTA6ICAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQKLSAgICBWRFVQLlMzMiAgUTEsICAgRDMwWzFdICAgICAgICAgICAgIEAgUTE6ICAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYKLSAgICBWRFVQLlMzMiAgUTIsICAgRDMxWzBdICAgICAgICAgICAgIEAgUTI6ICAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODgKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZSBtYWluIGxvb3AKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWxvb3BfeXl2dXAyYWJncjoKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGlucHV0IGZyb20gWSwgViBhbmQgVQotICAgICAqICBEMTIsIEQxMzogWTAgWTIgWTQgWTYgWTggWTEwIFkxMiBZMTQsIFkxIFkzIFk1IFk3IFk5IFkxMSBZMTMgWTE1Ci0gICAgICogIEQxNCAgOiBWMCAgVjEgIFYyICBWMyAgVjQgIFY1ICBWNiAgVjcKLSAgICAgKiAgRDE1ICA6IFUwICBVMSAgVTIgIFUzICBVNCAgVTUgIFU2ICBVNwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZMRDIuVTggIHtEMTIsRDEzfSwgW3BfeV0hICAgICAgICAgQCBMb2FkIDE2IEx1bWEgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTIsIEQxMwotICAgIFZMRDEuVTggIHtEMTR9LCAgW3BfY3JdISAgICAgICAgICAgQCBMb2FkIDggQ3IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTQKLSAgICBWTEQxLlU4ICB7RDE1fSwgIFtwX2NiXSEgICAgICAgICAgIEAgTG9hZCA4IENiIGVsZW1lbnRzICh1aW50OCkgdG8gRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRXhwYW5kIHVpbnQ4IHZhbHVlIHRvIHVpbnQxNgotICAgICAqICBEMjQsIEQyNTogWTAgWTIgWTQgWTYgWTggWTEwIFkxMiBZMTQKLSAgICAgKiAgRDI2LCBEMjc6IFkxIFkzIFk1IFk3IFk5IFkxMSBZMTMgWTE1Ci0gICAgICogIEQyOCwgRDI5OiBWMCBWMSBWMiBWMyBWNCBWNSAgVjYgIFY3Ci0gICAgICogIEQzMCwgRDMxOiBVMCBVMSBVMiBVMyBVNCBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVkwuVTggUTEyLCBEMTIKLSAgICBWTU9WTC5VOCBRMTMsIEQxMwotICAgIFZNT1ZMLlU4IFExNCwgRDE0Ci0gICAgVk1PVkwuVTggUTE1LCBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBNdWx0aXBseSBjb250cmlidXRpb24gZnJvbSBjaHJvbWluYW5jZSwgcmVzdWx0cyBhcmUgaW4gMzItYml0Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1VTEwuUzE2ICBRNiwgRDI4LCBENlswXSAgICAgICAgICBAIFE2OiAgMzU5KihWMCxWMSxWMixWMykgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTcsIEQzMCwgRDZbMV0gICAgICAgICAgQCBRNzogLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRNywgRDI4LCBENlsyXSAgICAgICAgICBAIFE3OiAtODgqKFUwLFUxLFUyLFUzKSAtIDE4MyooVjAsVjEsVjIsVjMpCi0gICAgVk1VTEwuUzE2ICBROCwgRDMwLCBENlszXSAgICAgICAgICBAIFE4OiAgNDU0KihVMCxVMSxVMixVMykgICAgIEJsdWUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBBZGQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZBREQuUzMyICBRNiwgUTAgICAgICAgICAgICAgICAgICAgQCBRNiBhZGQgUmVkICAgYmlhcyAtNDU4MjQKLSAgICBWQURELlMzMiAgUTcsIFExICAgICAgICAgICAgICAgICAgIEAgUTcgYWRkIEdyZWVuIGJpYXMgIDM0ODE2Ci0gICAgVkFERC5TMzIgIFE4LCBRMiAgICAgICAgICAgICAgICAgICBAIFE4IGFkZCBCbHVlICBiaWFzIC01Nzk4NAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENhbGN1bGF0ZSBSZWQsIEdyZWVuLCBCbHVlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVi5TMzIgICBROSwgUTYKLSAgICBWTUxBTC5TMTYgIFE2LCBEMjQsIEQ3WzBdICAgICAgICAgIEAgUTY6IFIwLCBSMiwgUjQsIFI2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFE5LCBEMjYsIEQ3WzBdICAgICAgICAgIEAgUTk6IFIxLCBSMywgUjUsIFI3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTEwLCBRNwotICAgIFZNTEFMLlMxNiAgUTcsICBEMjQsIEQ3WzBdICAgICAgICAgQCBRNzogIEcwLCBHMiwgRzQsIEc2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMCwgRDI2LCBEN1swXSAgICAgICAgIEAgUTEwOiBHMSwgRzMsIEc1LCBHNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICBWTU9WLlMzMiAgIFExMSwgUTgKLSAgICBWTUxBTC5TMTYgIFE4LCAgRDI0LCBEN1swXSAgICAgICAgIEAgUTg6ICBCMCwgQjIsIEI0LCBCNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTEsIEQyNiwgRDdbMF0gICAgICAgICBAIFExMTogQjEsIEIzLCBCNSwgQjcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJpZ2h0IHNoaWZ0IGVpZ2h0IGJpdHMgd2l0aCByb3VuZGluZwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTSFJOLlMzMiAgIEQxMiwgUTYsICAjOCAgICAgICAgICAgQCBEMTI6IFIwIFIyIFI0IFI2IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMTMsIFE5LCAgIzggICAgICAgICAgIEAgRDEzOiBSMSBSMyBSNSBSNyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDEyLCBEMTMgICAgICAgICAgICAgICBAIFE2IDogUjAgUjEgUjIgUjMgUjQgUjUgUjYgUjcKLQotICAgIFZTSFJOLlMzMiAgIEQxOCwgUTcsICAjOCAgICAgICAgICAgQCBEMTg6IEcwIEcyIEc0IEc2IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMTksIFExMCwgIzggICAgICAgICAgIEAgRDE5OiBHMSBHMyBHNSBHNyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDE4LCBEMTkgICAgICAgICAgICAgICBAIFE5IDogRzAgRzEgRzIgRzMgRzQgRzUgRzYgRzcKLQotICAgIFZTSFJOLlMzMiAgIEQyMCwgUTgsICAjOCAgICAgICAgICAgQCBEMjA6IEIwIEIyIEI0IEI2IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWU0hSTi5TMzIgICBEMjEsIFExMSwgIzggICAgICAgICAgIEAgRDIxOiBCMSBCMyBCNSBCNyBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlpJUC4xNiAgICAgRDIwLCBEMjEgICAgICAgICAgICAgICBAIFExMDogQjAgQjEgQjIgQjMgQjQgQjUgQjYgQjcKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDbGFtcCB0aGUgdmFsdWUgdG8gYmUgd2l0aGluIFswfjI1NV0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTUFYLlMxNiAgUTEwLCBRMTAsIFE0ICAgICAgICAgICAgIEAgaWYgUTEwIDwgICAwLCBRMTAgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTEwLCBRMTAsIFE1ICAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyMywgUTEwICAgICAgICAgICAgIEAgc3RvcmUgQmx1ZSB0byBEMjMsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTksIFE5LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTkgPCAgIDAsIFE5ID0gICAwCi0gICAgVk1JTi5TMTYgIFE5LCBROSwgUTUgICAgICAgICAgICAgICBAIGlmIFE5ID4gMjU1LCBROSA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjIsIFE5ICAgICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjIsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgUTYsIFE2LCBRNCAgICAgICAgICAgICAgIEAgaWYgUTYgPCAgIDAsIFE2ID0gICAwCi0gICAgVk1JTi5TMTYgIFE2LCBRNiwgUTUgICAgICAgICAgICAgICBAIGlmIFE2ID4gMjU1LCBRNiA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICBEMjEsIFE2ICAgICAgICAgICAgICAgQCBzdG9yZSBSZWQgdG8gRDIxLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIGFiZ3IgZm9ybWF0IHdpdGggbGVhZGluZyAweEZGIGJ5dGUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WTi5JMTYgIEQyNCwgUTUgICAgICAgICAgICAgICAgIEAgRDI0OiAgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1IHwgMjU1Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195eXZ1cDJhYmdyICAgICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1Q0LlU4ICB7RDIxLEQyMixEMjMsRDI0fSwgW3BfYmdyXSEgICBAIHZlY3RvciBzdG9yZSBCbHVlLCBHcmVlbiwgUmVkIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJlZCBhdCBMU0IKLQotICAgIEJFUSAgZW5kX3l5dnVwMmFiZ3IgICAgICAgICAgICAgICAgQCBkb25lIGlmIGV4YWN0bHkgOCBwaXhlbCBwcm9jZXNzZWQgaW4gdGhlIGxvb3AKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIERvbmUgd2l0aCB0aGUgZmlyc3QgOCBlbGVtZW50cywgY29udGludWUgb24gdGhlIG5leHQgOCBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFE2LCBEMjksIEQ2WzBdICAgICAgICAgIEAgUTY6IDM1OSooVjQsVjUsVjYsVjcpICAgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTcsIEQzMSwgRDZbMV0gICAgICAgICAgQCBRNzogLTg4KihVNCxVNSxVNixVNykgICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTcsIEQyOSwgRDZbMl0gICAgICAgICAgQCBRNzogLTg4KihVNCxVNSxVNixVNykgLSAxODMqKFY0LFY1LFY2LFY3KQotICAgIFZNVUxMLlMxNiAgUTgsIEQzMSwgRDZbM10gICAgICAgICAgQCBRODogNDU0KihVNCxVNSxVNixVNykgICAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFE2LCBRMCAgICAgICAgICAgICAgICAgICBAIFE2IGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRNywgUTEgICAgICAgICAgICAgICAgICAgQCBRNyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTgsIFEyICAgICAgICAgICAgICAgICAgIEAgUTggYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WLlMzMiAgIFE5LCBRNgotICAgIFZNTEFMLlMxNiAgUTYsIEQyNSwgRDdbMF0gICAgICAgICAgQCBRNjogUjggUjEwIFIxMiBSMTQgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTksIEQyNywgRDdbMF0gICAgICAgICAgQCBROTogUjkgUjExIFIxMyBSMTUgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTAsIFE3Ci0gICAgVk1MQUwuUzE2ICBRNywgIEQyNSwgRDdbMF0gICAgICAgICBAIFE3OiBHMCwgRzIsIEc0LCBHNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTAsIEQyNywgRDdbMF0gICAgICAgICBAIFExMCA6IEcxLCBHMywgRzUsIEc3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTExLCBROAotICAgIFZNTEFMLlMxNiAgUTgsICBEMjUsIEQ3WzBdICAgICAgICAgQCBRODogQjAsIEIyLCBCNCwgQjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTExLCBEMjcsIEQ3WzBdICAgICAgICAgQCBRMTEgOiBCMSwgQjMsIEI1LCBCNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDEyLCBRNiwgICM4ICAgICAgICAgICBAIEQxMjogUjggUjEwIFIxMiBSMTQgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxMywgUTksICAjOCAgICAgICAgICAgQCBEMTM6IFI5IFIxMSBSMTMgUjE1IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTIsIEQxMyAgICAgICAgICAgICAgIEAgUTY6IFI4IFI5IFIxMCBSMTEgUjEyIFIxMyBSMTQgUjE1Ci0KLSAgICBWU0hSTi5TMzIgICBEMTgsIFE3LCAgIzggICAgICAgICAgIEAgRDE4OiBHOCBHMTAgRzEyIEcxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDE5LCBRMTAsICM4ICAgICAgICAgICBAIEQxOTogRzkgRzExIEcxMyBHMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxOCwgRDE5ICAgICAgICAgICAgICAgQCBROTogIEc4IEc5IEcxMCBHMTEgRzEyIEcxMyBHMTQgRzE1Ci0KLSAgICBWU0hSTi5TMzIgICBEMjAsIFE4LCAgIzggICAgICAgICAgIEAgRDIwOiBCOCBCMTAgQjEyIEIxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxLCBRMTEsICM4ICAgICAgICAgICBAIEQyMTogQjkgQjExIEIxMyBCMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQyMCwgRDIxICAgICAgICAgICAgICAgQCBRMTA6IEI4IEI5IEIxMCBCMTEgQjEyIEIxMyBCMTQgQjE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFExMCwgUTEwLCBRNCAgICAgICAgICAgICBAIGlmIFExMCA8ICAgMCwgUTEwID0gICAwCi0gICAgVk1JTi5TMTYgIFExMCwgUTEwLCBRNSAgICAgICAgICAgICBAIGlmIFExMCA+IDI1NSwgUTEwID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICBEMjMsIFExMCAgICAgICAgICAgICBAIHN0b3JlIEJsdWUgdG8gRDIzLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFE5LCBROSwgUTQgICAgICAgICAgICAgICBAIGlmIFE5IDwgICAwLCBROSA9ICAgMAotICAgIFZNSU4uUzE2ICBROSwgUTksIFE1ICAgICAgICAgICAgICAgQCBpZiBROSA+IDI1NSwgUTkgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIyLCBROSAgICAgICAgICAgICAgIEAgc3RvcmUgR3JlZW4gdG8gRDIyLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFE2LCBRNiwgUTQgICAgICAgICAgICAgICBAIGlmIFE2IDwgICAwLCBRNiA9ICAgMAotICAgIFZNSU4uUzE2ICBRNiwgUTYsIFE1ICAgICAgICAgICAgICAgQCBpZiBRNiA+IDI1NSwgUTYgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIxLCBRNiAgICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyMSwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBhYmdyIGZvcm1hdCB3aXRoIGxlYWRpbmcgMHhGRiBieXRlCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1PVk4uSTE2ICBEMjQsIFE1ICAgICAgICAgICAgICAgICBAIEQyNDogIDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzggICAgICAgICAgICBAIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIEJNSSAgdHJhaWxpbmdfeXl2dXAyYWJnciAgICAgICAgICAgQCBqdW1wIHRvIHRyYWlsaW5nIHByb2Nlc3NpbmcgaWYgcmVtYWluaW5nIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgVlNUNC5VOCAge0QyMSxEMjIsRDIzLEQyNH0sIFtwX2Jncl0hICAgQCB2ZWN0b3Igc3RvcmUgQmx1ZSwgR3JlZW4sIFJlZCB0byBkZXN0aW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSZWQgYXQgTFNCCi0KLSAgICBCSEkgbG9vcF95eXZ1cDJhYmdyICAgICAgICAgICAgICAgIEAgbG9vcCBpZiBtb3JlIHRoYW4gOCBwaXhlbHMgbGVmdAotCi0gICAgQkVRICBlbmRfeXl2dXAyYWJnciAgICAgICAgICAgICAgICBAIGRvbmUgaWYgZXhhY3RseSA4IHBpeGVsIHByb2Nlc3NlZCBpbiB0aGUgbG9vcAotCi0KLXRyYWlsaW5nX3l5dnVwMmFiZ3I6Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZXJlIGFyZSBmcm9tIDEgfiA3IHBpeGVscyBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LgotICAgICAqICBGaXJzdCBhZGRpbmcgNyB0byB0aGUgbGVuZ3RoIHNvIHRoZSBsZW5ndGggd291bGQgYmUgZnJvbSAwIH4gNi4KLSAgICAgKiAgZWc6IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydCwgc28gMS04KzcgPSAwLgotICAgICAqICBUaGVuIHNhdmUgMSBwaXhlbCB1bmNvbmRpdGlvbmFsbHkgc2luY2UgYXQgbGVhc3QgMSBwaXhlbHMgbGVmdCBpbiB0aGUKLSAgICAgKiAgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBBRERTIGxlbmd0aCwgbGVuZ3RoLCAjNyAgICAgICAgICAgIEAgdGhlcmUgYXJlIDcgb3IgbGVzcyBpbiB0aGUgdHJhaWxpbmcgcGFydAotCi0gICAgVlNUNC5VOCB7RDIxWzBdLEQyMlswXSxEMjNbMF0sRDI0WzBdfSwgW3BfYmdyXSEgQCBhdCBsZWFzdCAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLSAgICBCRVEgZW5kX3l5dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjFbMV0sRDIyWzFdLEQyM1sxXSxEMjRbMV19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSBlbmRfeXl2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyMVsyXSxEMjJbMl0sRDIzWzJdLEQyNFsyXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDIxWzNdLEQyMlszXSxEMjNbM10sRDI0WzNdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMmFiZ3IgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1Q0LlU4IHtEMjFbNF0sRDIyWzRdLEQyM1s0XSxEMjRbNF19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSBlbmRfeXl2dXAyYWJnciAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDQuVTgge0QyMVs1XSxEMjJbNV0sRDIzWzVdLEQyNFs1XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJhYmdyICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUNC5VOCB7RDIxWzZdLEQyMls2XSxEMjNbNl0sRDI0WzZdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLQotZW5kX3l5dnVwMmFiZ3I6Ci0gICAgVlBPUCAge0Q4LUQxNX0KLSAgICBMRE1GRCBTUCEsIHtQQ30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZW5kIG9mIHl5dnVwMmFiZ3IKLQotLmVuZAotCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9hc20vYXJtdjcvamRjb2xvci1hcm12Ny5TIGIvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkY29sb3ItYXJtdjcuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkYTZkNS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9hc20vYXJtdjcvamRjb2xvci1hcm12Ny5TCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGpkY29sb3ItYXJtdjcuUwotKgotKiAgQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotKiAgbWV0OgotKiAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSogICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0qICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSogICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZSBBdXJvcmEgRm9ydW0sIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSogICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotKiAgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0qICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotKiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotKiAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotKiAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0qICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotKiAgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotKiAgSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIExJU1QKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiAtIHl2dXAyYmdyODg4X3ZlbnVtCi0qIC0geXl2dXAyYmdyODg4X3ZlbnVtCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSAgICAuc2VjdGlvbiB5dnVfcGxhaW5fdG9fYmdyLCAieCIgICAgIEAgQVJFQQotICAgIC50ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB8LnRleHR8LCBDT0RFLCBSRUFET05MWQotICAgIC5hbGlnbiAyCi0gICAgLmNvZGUgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICBAIENPREUzMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIEFSTSBSZWdpc3RlcnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXBfeSAgICAgICAucmVxIHIwCi1wX2NyICAgICAgLnJlcSByMQotcF9jYiAgICAgIC5yZXEgcjIKLXBfcmdiICAgICAucmVxIHIzCi1wX2JnciAgICAgLnJlcSByMwotbGVuZ3RoICAgIC5yZXEgcjEyCi0KLSAgICAuZ2xvYmFsIHl2dXAyYmdyODg4X3ZlbnVtCi0gICAgLmdsb2JhbCB5eXZ1cDJiZ3I4ODhfdmVudW0KLQotQCBjb2VmZmljaWVudHMgaW4gY29sb3IgY29udmVyc2lvbiBtYXRyaXggbXVsdGlwbGljYXRpb24KLS5lcXUgQ09FRkZfWSwgICAgICAgICAgMjU2ICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFkKLS5lcXUgQ09FRkZfVl9SRUQsICAgICAgMzU5ICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFYgZm9yIHJlZAotLmVxdSBDT0VGRl9VX0dSRUVOLCAgICAtODggICAgICAgICAgICAgQCBjb250cmlidXRpb24gb2YgVSBmb3IgZ3JlZW4KLS5lcXUgQ09FRkZfVl9HUkVFTiwgICAtMTgzICAgICAgICAgICAgIEAgY29udHJpYnV0aW9uIG9mIFYgZm9yIGdyZWVuCi0uZXF1IENPRUZGX1VfQkxVRSwgICAgIDQ1NCAgICAgICAgICAgICBAIGNvbnRyaWJ1dGlvbiBvZiBVIGZvciBibHVlCi0KLUAgQ2xhbXBpbmcgY29uc3RhbnRzIDB4MCBhbmQgMHhGRgotLmVxdSBDT0VGRl8wLCAgICAgICAgICAwCi0uZXF1IENPRUZGXzI1NSwgICAgICAgIDI1NQotCi1AIEJpYXMgY29lZmZpY2llbnRzIGZvciByZWQsIGdyZWVuIGFuZCBibHVlCi0uZXF1IENPRUZGX0JJQVNfUiwgICAtNDU4MjQgICAgICAgICAgICBAIFJlZCAgIGJpYXMgPSAgICAgLTM1OSoxMjggKyAxMjgKLS5lcXUgQ09FRkZfQklBU19HLCAgICAzNDgxNiAgICAgICAgICAgIEAgR3JlZW4gYmlhcyA9ICg4OCsxODMpKjEyOCArIDEyOAotLmVxdSBDT0VGRl9CSUFTX0IsICAgLTU3OTg0ICAgICAgICAgICAgQCBCbHVlICBiaWFzID0gICAgIC00NTQqMTI4ICsgMTI4Ci0KLWNvbnN0YW50czoKLSAgICAuaHdvcmQgKENPRUZGX1ZfUkVEKSwgIChDT0VGRl9VX0dSRUVOKSwgKENPRUZGX1ZfR1JFRU4pLCAoQ09FRkZfVV9CTFVFKSBAICAgMzU5ICB8IC04OCAgIHwgIC0xODMgIHwgNDU0Ci0gICAgLmh3b3JkIChDT0VGRl9ZKSwgICAgICAoQ09FRkZfMCksICAgICAgIChDT0VGRl8yNTUpICAgICwgKENPRUZGXzApICAgICAgQCAgIDI1NiAgfCAgIDAgICB8ICAgMjU1ICB8ICAwCi0gICAgLndvcmQgIChDT0VGRl9CSUFTX1IpLCAoQ09FRkZfQklBU19HKSwgIChDT0VGRl9CSUFTX0IpICAgICAgICAgICAgICAgICAgQCAtNDU4MjQgfCAzNDgxNiB8IC01Nzk4NCB8ICBYCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogRlVOQ1RJT04gICAgIDogeXZ1cDJiZ3I4ODhfdmVudW0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBERVNDUklQVElPTiAgOiBQZXJmb3JtIFlWVSBwbGFuYXIgdG8gQkdSODg4IGNvbnZlcnNpb24uCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQyBQUk9UT1RZUEUgIDogdm9pZCB5dnVwMmJncjg4OF92ZW51bSh1aW50OF90ICAqcF95LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NiLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2Jncjg4OCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgbGVuZ3RoKQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBJTlBVVCAgICA6IFIwOiB1aW50OF90ICAqcF95Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IFkgTGluZQotKiAgICAgICAgICAgICAgICBSMTogdWludDhfdCAgKnBfY3IKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgQ3IgTGluZQotKiAgICAgICAgICAgICAgICBSMjogdWludDhfdCAgKnBfY2IKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgQ2IgTGluZQotKiAgICAgICAgICAgICAgICBSMzogdWludDhfdCAgKnBfYmdyODg4Ci0qICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBCR1IgTGluZQotKiAgICAgICAgICAgICAgICBSMTI6IHVpbnQzMl90ICBsZW5ndGgKLSogICAgICAgICAgICAgICAgICAgICAgd2lkdGggb2YgTGluZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIEFSRyAgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgT1VUUFVUICAgOiBOb25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIElOUFVUICAgIDogcF95ICAgICAgLSBhIGxpbmUgb2YgWSBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jciAgICAgLSBhIGxpbmUgb2YgQ3IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIHBfY2IgICAgIC0gYSBsaW5lIG9mIENiIHBpeGVscwotKiAgICAgICAgICAgICAgICBsZW5ndGggICAtIHRoZSB3aWR0aCBvZiB0aGUgaW5wdXQgbGluZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE1FTSBPVVRQVVQgICA6IHBfYmdyODg4IC0gdGhlIGNvbnZlcnRlZCBiZ3IgcGl4ZWxzCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIEFGRkVDVEVEIDogQVJNOiAgUjAtUjQsIFIxMgotKiAgICAgICAgICAgICAgICBORU9OOiBRMC1RMTUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBTVEFDSyBVU0FHRSAgOiBub25lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQ1lDTEVTICAgICAgIDogbm9uZQotKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIE5PVEVTICAgICAgICA6Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0udHlwZSB5dnVwMmJncjg4OF92ZW51bSwgJWZ1bmN0aW9uCi15dnVwMmJncjg4OF92ZW51bToKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBTdG9yZSBzdGFjayByZWdpc3RlcnMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBTVE1GRCBTUCEsIHtMUn0KLQotICAgIFZQVVNIIHtEOC1EMTV9Ci0KLSAgICBQTEQgW1IwLCBSM10gICAgICAgICAgICAgICAgICAgICAgQCBwcmVsb2FkIGx1bWEgbGluZQotCi0gICAgQURSICAgUjEyLCBjb25zdGFudHMKLQotICAgIFZMRDEuUzE2ICB7RDYsIEQ3fSwgW1IxMl0hICAgICAgICBAIEQ2LCBENzogMzU5IHwgLTg4IHwgLTE4MyB8IDQ1NCB8IDI1NiB8IDAgfCAyNTUgfCAwCi0gICAgVkxEMS5TMzIgIHtEMzAsIEQzMX0sIFtSMTJdICAgICAgIEAgUTE1ICAgOiAgLTQ1ODI0ICAgfCAgICAzNDgxNiAgIHwgIC01Nzk4NCB8ICAgICBYCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCB0aGUgNXRoIHBhcmFtZXRlciB2aWEgc3RhY2sKLSAgICAgKiAgUjAgfiBSMyBhcmUgdXNlZCB0byBwYXNzIHRoZSBmaXJzdCA0IHBhcmFtZXRlcnMsIHRoZSA1dGggYW5kIGFib3ZlCi0gICAgICogIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB2aWEgc3RhY2sKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBMRFIgUjEyLCBbU1AsICM2OF0gICAgICAgICAgICAgICAgIEAgTFIgaXMgcHVzaGVkIGludG8gdGhlIHN0YWNrIHNvIFNQIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRlY3JlYXNlZCBieSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEOC1EMTUgYXJlIGFsc28gcHVzaGVkIGludG8gdGhlIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNvIFNQIGlzIGRlY3JlYXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA4LWJ5dGUvRC1SZWdpc3RlciAqIDggRC1SZWdpc3RlcnMgPSA2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGJ5IDY0KzQ9NjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdG8gZ2V0IHRoZSB2YWx1ZSB0aGF0IHdhcyBmaXJzdCBwdXNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW50byBzdGFjayAodGhlIDV0aCBwYXJhbWV0ZXIgcGFzc2VkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRocm91Z2h0IHN0YWNrKQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgY2xhbXBpbmcgcGFyYW1ldGVycyB0byBkdXBsaWNhdGUgdmVjdG9yIGVsZW1lbnRzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkRVUC5TMTYgIFE0LCAgRDdbMV0gICAgICAgICAgICAgIEAgUTQ6ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwCi0gICAgVkRVUC5TMTYgIFE1LCAgRDdbMl0gICAgICAgICAgICAgIEAgUTU6IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NSB8IDI1NQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJlYWQgYmlhcwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZEVVAuUzMyICBRMCwgICBEMzBbMF0gICAgICAgICAgICBAIFEwOiAgLTQ1ODI0IHwgLTQ1ODI0IHwgLTQ1ODI0IHwgLTQ1ODI0Ci0gICAgVkRVUC5TMzIgIFExLCAgIEQzMFsxXSAgICAgICAgICAgIEAgUTE6ICAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYKLSAgICBWRFVQLlMzMiAgUTIsICAgRDMxWzBdICAgICAgICAgICAgQCBRMjogIC01Nzk4NCB8IC01Nzk4NCB8IC01Nzk4NCB8IC01Nzk4NAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlIG1haW4gbG9vcAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotbG9vcF95dnVwMmJncjg4ODoKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIGlucHV0IGZyb20gWSwgViBhbmQgVQotICAgICAqICBEMTIgIDogWTAgIFkxICBZMiAgWTMgIFk0ICBZNSAgWTYgIFk3Ci0gICAgICogIEQxNCAgOiBWMCAgVjEgIFYyICBWMyAgVjQgIFY1ICBWNiAgVjcKLSAgICAgKiAgRDE1ICA6IFUwICBVMSAgVTIgIFUzICBVNCAgVTUgIFU2ICBVNwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZMRDEuVTggIHtEMTJ9LCAgW3BfeV0hICAgICAgICAgICBAIExvYWQgOCBMdW1hIGVsZW1lbnRzICh1aW50OCkgdG8gRDEyCi0gICAgVkxEMS5VOCAge0QxNH0sICBbcF9jcl0hICAgICAgICAgIEAgTG9hZCA4IENyIGVsZW1lbnRzICh1aW50OCkgdG8gRDE0Ci0gICAgVkxEMS5VOCAge0QxNX0sICBbcF9jYl0hICAgICAgICAgIEAgTG9hZCA4IENiIGVsZW1lbnRzICh1aW50OCkgdG8gRDE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgRXhwYW5kIHVpbnQ4IHZhbHVlIHRvIHVpbnQxNgotICAgICAqICBEMTgsIEQxOTogWTAgWTEgWTIgWTMgWTQgWTUgWTYgWTcKLSAgICAgKiAgRDIwLCBEMjE6IFYwIFYxIFYyIFYzIFY0IFY1IFY2IFY3Ci0gICAgICogIEQyMiwgRDIzOiBVMCBVMSBVMiBVMyBVNCBVNSBVNiBVNwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNT1ZMLlU4IFE5LCAgRDEyCi0gICAgVk1PVkwuVTggUTEwLCBEMTQKLSAgICBWTU9WTC5VOCBRMTEsIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFExMiwgRDIwLCBENlswXSAgICAgICAgQCBRMTI6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRMTMsIEQyMiwgRDZbMV0gICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRMTMsIEQyMCwgRDZbMl0gICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTE0LCBEMjIsIEQ2WzNdICAgICAgICBAIFExNDogIDQ1NCooVTAsVTEsVTIsVTMpICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTEyLCBRMCAgICAgICAgICAgICAgICAgQCBRMTIgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFExMywgUTEgICAgICAgICAgICAgICAgIEAgUTEzIGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBRMTQsIFEyICAgICAgICAgICAgICAgICBAIFExNCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNTEFMLlMxNiAgUTEyLCBEMTgsIEQ3WzBdICAgICAgICBAIFExMjogUjAsIFIxLCBSMiwgUjMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEzLCBEMTgsIEQ3WzBdICAgICAgICBAIFExMzogRzAsIEcxLCBHMiwgRzMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTE0LCBEMTgsIEQ3WzBdICAgICAgICBAIFExNDogQjAsIEIxLCBCMiwgQjMgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJpZ2h0IHNoaWZ0IGVpZ2h0IGJpdHMgd2l0aCByb3VuZGluZwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTSFJOLlMzMiAgIEQxOCAsIFExMiwgIzggICAgICAgICBAIEQxODogUjAsIFIxLCBSMiwgUjMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMCAsIFExMywgIzggICAgICAgICBAIEQyMDogRzAsIEcxLCBHMiwgRzMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMiwgIFExNCwgIzggICAgICAgICBAIEQyMjogQjAsIEIxLCBCMiwgQjMgaW4gMTYtYml0IFEwIGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIERvbmUgd2l0aCB0aGUgZmlyc3QgNCBlbGVtZW50cywgY29udGludWUgb24gdGhlIG5leHQgNCBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFExMiwgRDIxLCBENlswXSAgICAgICAgQCBRMTI6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRMTMsIEQyMywgRDZbMV0gICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgICAgIEdyZWVuCi0gICAgVk1MQUwuUzE2ICBRMTMsIEQyMSwgRDZbMl0gICAgICAgIEAgUTEzOiAgLTg4KihVMCxVMSxVMixVMykgLSAxODMqKFYwLFYxLFYyLFYzKQotICAgIFZNVUxMLlMxNiAgUTE0LCBEMjMsIEQ2WzNdICAgICAgICBAIFExNDogIDQ1NCooVTAsVTEsVTIsVTMpICAgICBCbHVlCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQWRkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWQURELlMzMiAgUTEyLCBRMCAgICAgICAgICAgICAgICAgQCBRMTIgYWRkIFJlZCAgIGJpYXMgLTQ1ODI0Ci0gICAgVkFERC5TMzIgIFExMywgUTEgICAgICAgICAgICAgICAgIEAgUTEzIGFkZCBHcmVlbiBiaWFzICAzNDgxNgotICAgIFZBREQuUzMyICBRMTQsIFEyICAgICAgICAgICAgICAgICBAIFExNCBhZGQgQmx1ZSAgYmlhcyAtNTc5ODQKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBDYWxjdWxhdGUgUmVkLCBHcmVlbiwgQmx1ZQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNTEFMLlMxNiAgUTEyLCBEMTksIEQ3WzBdICAgICAgICBAIFExMjogUjAsIFIxLCBSMiwgUjMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEzLCBEMTksIEQ3WzBdICAgICAgICBAIFExMzogRzAsIEcxLCBHMiwgRzMgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTE0LCBEMTksIEQ3WzBdICAgICAgICBAIFExNDogQjAsIEIxLCBCMiwgQjMgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFJpZ2h0IHNoaWZ0IGVpZ2h0IGJpdHMgd2l0aCByb3VuZGluZwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZTSFJOLlMzMiAgIEQxOSAsIFExMiwgIzggICAgICAgICBAIEQxODogUjAsIFIxLCBSMiwgUjMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSAsIFExMywgIzggICAgICAgICBAIEQyMDogRzAsIEcxLCBHMiwgRzMgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMywgIFExNCwgIzggICAgICAgICBAIEQyMjogQjAsIEIxLCBCMiwgQjMgaW4gMTYtYml0IFEwIGZvcm1hdAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENsYW1wIHRoZSB2YWx1ZSB0byBiZSB3aXRoaW4gWzB+MjU1XQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNQVguUzE2ICBRMTEsIFExMSwgUTQgICAgICAgICAgICBAIGlmIFExMSA8ICAgMCwgUTExID0gICAwCi0gICAgVk1JTi5TMTYgIFExMSwgUTExLCBRNSAgICAgICAgICAgIEAgaWYgUTExID4gMjU1LCBRMTEgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyOCwgUTExICAgICAgICAgICAgQCBzdG9yZSBCbHVlIHRvIEQyOCwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRMTAsIFExMCwgUTQgICAgICAgICAgICBAIGlmIFExMCA8ICAgMCwgUTEwID0gICAwCi0gICAgVk1JTi5TMTYgIFExMCwgUTEwLCBRNSAgICAgICAgICAgIEAgaWYgUTEwID4gMjU1LCBRMTAgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgIEQyNywgUTEwICAgICAgICAgICAgQCBzdG9yZSBHcmVlbiB0byBEMjcsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBWTUFYLlMxNiAgICBROSwgUTksIFE0ICAgICAgICAgICAgQCBpZiBROSA8ICAgMCwgUTkgPSAgIDAKLSAgICBWTUlOLlMxNiAgICBROSwgUTksIFE1ICAgICAgICAgICAgQCBpZiBROSA+IDI1NSwgUTkgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgICBEMjYsIFE5ICAgICAgICAgICAgQCBzdG9yZSBSZWQgdG8gRDI2LCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OC4KLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICM4ICAgICAgICAgICBAIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIEJNSSAgdHJhaWxpbmdfeXZ1cDJiZ3I4ODggICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1QzLlU4ICB7RDI2LEQyNyxEMjh9LCBbcF9iZ3JdISAgQCB2ZWN0b3Igc3RvcmUgUmVkLCBHcmVlbiwgQmx1ZSB0byBkZXN0aW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEJsdWUgYXQgTFNCCi0KLSAgICBCSEkgbG9vcF95dnVwMmJncjg4OCAgICAgICAgICAgICAgQCBsb29wIGlmIG1vcmUgdGhhbiA4IHBpeGVscyBsZWZ0Ci0KLSAgICBCRVEgIGVuZF95dnVwMmJncjg4OCAgICAgICAgICAgICAgQCBkb25lIGlmIGV4YWN0bHkgOCBwaXhlbCBwcm9jZXNzZWQgaW4gdGhlIGxvb3AKLQotCi10cmFpbGluZ195dnVwMmJncjg4ODoKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgVGhlcmUgYXJlIGZyb20gMSB+IDcgcGl4ZWxzIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQuCi0gICAgICogIEZpcnN0IGFkZGluZyA3IHRvIHRoZSBsZW5ndGggc28gdGhlIGxlbmd0aCB3b3VsZCBiZSBmcm9tIDAgfiA2LgotICAgICAqICBlZzogMSBwaXhlbCBsZWZ0IGluIHRoZSB0cmFpbGluZyBwYXJ0LCBzbyAxLTgrNyA9IDAuCi0gICAgICogIFRoZW4gc2F2ZSAxIHBpeGVsIHVuY29uZGl0aW9uYWxseSBzaW5jZSBhdCBsZWFzdCAxIHBpeGVscyBsZWZ0IGluIHRoZQotICAgICAqICB0cmFpbGluZyBwYXJ0LgotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIEFERFMgbGVuZ3RoLCBsZW5ndGgsICM3ICAgICAgICAgICBAIHRoZXJlIGFyZSA3IG9yIGxlc3MgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLQotICAgIFZTVDMuVTgge0QyNlswXSwgRDI3WzBdLCBEMjhbMF19LCBbcF9iZ3JdISBAIGF0IGxlYXN0IDEgcGl4ZWwgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydAotICAgIEJFUSAgZW5kX3l2dXAyYmdyODg4ICAgICAgICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjZbMV0sIEQyN1sxXSwgRDI4WzFdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgIGVuZF95dnVwMmJncjg4OCAgICAgICAgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyNlsyXSwgRDI3WzJdLCBEMjhbMl19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYmdyODg4ICAgICAgICAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDI2WzNdLCBEMjdbM10sIEQyOFszXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRICBlbmRfeXZ1cDJiZ3I4ODggICAgICAgICAgICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjZbNF0sIEQyN1s0XSwgRDI4WzRdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgIGVuZF95dnVwMmJncjg4OCAgICAgICAgICAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyNls1XSwgRDI3WzVdLCBEMjhbNV19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSAgZW5kX3l2dXAyYmdyODg4ICAgICAgICAgICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDI2WzZdLCBEMjdbNl0sIEQyOFs2XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0KLWVuZF95dnVwMmJncjg4ODoKLSAgICBWUE9QICB7RDgtRDE1fQotICAgIExETUZEIFNQISwge1BDfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZW5kIG9mIHl2dXAyYmdyODg4Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIEZVTkNUSU9OICAgICA6IHl5dnVwMmJncjg4OF92ZW51bQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIERFU0NSSVBUSU9OICA6IFBlcmZvcm0gWVlWVSBwbGFuYXIgdG8gQkdSODg4IGNvbnZlcnNpb24uCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogQyBQUk9UT1RZUEUgIDogdm9pZCB5eXZ1cDJiZ3I4ODhfdmVudW0odWludDhfdCAgKnBfeSwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfY3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICpwX2NiLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqcF9iZ3I4ODgsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBsZW5ndGgpCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUkVHIElOUFVUICAgIDogUjA6IHVpbnQ4X3QgICpwX3kKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgWSBMaW5lCi0qICAgICAgICAgICAgICAgIFIxOiB1aW50OF90ICAqcF9jcgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDciBMaW5lCi0qICAgICAgICAgICAgICAgIFIyOiB1aW50OF90ICAqcF9jYgotKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBDYiBMaW5lCi0qICAgICAgICAgICAgICAgIFIzOiB1aW50OF90ICAqcF9iZ3I4ODgKLSogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IEJHUiBMaW5lCi0qICAgICAgICAgICAgICAgIFIxMjogdWludDMyX3QgIGxlbmd0aAotKiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvZiBMaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogU1RBQ0sgQVJHICAgIDogTm9uZQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJFRyBPVVRQVVQgICA6IE5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBNRU0gSU5QVVQgICAgOiBwX3kgICAgICAtIGEgbGluZSBvZiBZIHBpeGVscwotKiAgICAgICAgICAgICAgICBwX2NyICAgICAtIGEgbGluZSBvZiBDciBwaXhlbHMKLSogICAgICAgICAgICAgICAgcF9jYiAgICAgLSBhIGxpbmUgb2YgQ2IgcGl4ZWxzCi0qICAgICAgICAgICAgICAgIGxlbmd0aCAgIC0gdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCBsaW5lCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTUVNIE9VVFBVVCAgIDogcF9iZ3I4ODggLSB0aGUgY29udmVydGVkIGJnciBwaXhlbHMKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSRUcgQUZGRUNURUQgOiBBUk06ICBSMC1SNCwgUjEyCi0qICAgICAgICAgICAgICAgIE5FT046IFEwLVExNQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFNUQUNLIFVTQUdFICA6IG5vbmUKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBDWUNMRVMgICAgICAgOiBub25lCi0qCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogTk9URVMgICAgICAgIDoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLS50eXBlIHl5dnVwMmJncjg4OF92ZW51bSwgJWZ1bmN0aW9uCi15eXZ1cDJiZ3I4ODhfdmVudW06Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFN0b3JlIHN0YWNrIHJlZ2lzdGVycwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFNUTUZEIFNQISwge0xSfQotCi0gICAgVlBVU0gge0Q4LUQxNX0KLQotICAgIFBMRCBbUjAsIFIzXSAgICAgICAgICAgICAgICAgICAgICAgQCBwcmVsb2FkIGx1bWEgbGluZQotCi0gICAgQURSICAgUjEyLCBjb25zdGFudHMKLQotICAgIFZMRDEuUzE2ICB7RDYsIEQ3fSwgW1IxMl0hICAgICAgICAgQCBENiwgRDc6IDM1OSB8IC04OCB8IC0xODMgfCA0NTQgfCAyNTYgfCAwIHwgMjU1IHwgMAotICAgIFZMRDEuUzMyICB7RDMwLCBEMzF9LCBbUjEyXSAgICAgICAgQCBRMTUgICA6ICAtNDU4MjQgICB8ICAgIDM0ODE2ICAgfCAgLTU3OTg0IHwgICAgIFgKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBMb2FkIHRoZSA1dGggcGFyYW1ldGVyIHZpYSBzdGFjawotICAgICAqICBSMCB+IFIzIGFyZSB1c2VkIHRvIHBhc3MgdGhlIGZpcnN0IDQgcGFyYW1ldGVycywgdGhlIDV0aCBhbmQgYWJvdmUKLSAgICAgKiAgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHZpYSBzdGFjawotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIExEUiBSMTIsIFtTUCwgIzY4XSAgICAgICAgICAgICAgICAgQCBMUiBpcyBwdXNoZWQgaW50byB0aGUgc3RhY2sgc28gU1AgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGVjcmVhc2VkIGJ5IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEQ4LUQxNSBhcmUgYWxzbyBwdXNoZWQgaW50byB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc28gU1AgaXMgZGVjcmVhc2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDgtYnl0ZS9ELVJlZ2lzdGVyICogOCBELVJlZ2lzdGVycyA9IDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzbyBTUCBuZWVkcyB0byBiZSBpbmNyZWFzZWQgYnkgNjQrND02OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIGZpcnN0IHB1c2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbnRvIHN0YWNrICh0aGUgNXRoIHBhcmFtZXRlciBwYXNzZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhyb3VnaHQgc3RhY2spCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgTG9hZCBjbGFtcGluZyBwYXJhbWV0ZXJzIHRvIGR1cGxpY2F0ZSB2ZWN0b3IgZWxlbWVudHMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMxNiAgUTQsICBEN1sxXSAgICAgICAgICAgICAgIEAgUTQ6ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwICB8ICAwCi0gICAgVkRVUC5TMTYgIFE1LCAgRDdbMl0gICAgICAgICAgICAgICBAIFE1OiAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUgfCAyNTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBSZWFkIGJpYXMKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWRFVQLlMzMiAgUTAsICAgRDMwWzBdICAgICAgICAgICAgIEAgUTA6ICAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQgfCAtNDU4MjQKLSAgICBWRFVQLlMzMiAgUTEsICAgRDMwWzFdICAgICAgICAgICAgIEAgUTE6ICAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYgfCAgMzQ4MTYKLSAgICBWRFVQLlMzMiAgUTIsICAgRDMxWzBdICAgICAgICAgICAgIEAgUTI6ICAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODggfCAtNzA2ODgKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIFRoZSBtYWluIGxvb3AKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWxvb3BfeXl2dXAyYmdyODg4OgotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIExvYWQgaW5wdXQgZnJvbSBZLCBWIGFuZCBVCi0gICAgICogIEQxMiwgRDEzOiBZMCBZMiBZNCBZNiBZOCBZMTAgWTEyIFkxNCwgWTEgWTMgWTUgWTcgWTkgWTExIFkxMyBZMTUKLSAgICAgKiAgRDE0ICA6IFYwICBWMSAgVjIgIFYzICBWNCAgVjUgIFY2ICBWNwotICAgICAqICBEMTUgIDogVTAgIFUxICBVMiAgVTMgIFU0ICBVNSAgVTYgIFU3Ci0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkxEMi5VOCAge0QxMixEMTN9LCBbcF95XSEgICAgICAgICBAIExvYWQgMTYgTHVtYSBlbGVtZW50cyAodWludDgpIHRvIEQxMiwgRDEzCi0gICAgVkxEMS5VOCAge0QxNH0sICBbcF9jcl0hICAgICAgICAgICBAIExvYWQgOCBDciBlbGVtZW50cyAodWludDgpIHRvIEQxNAotICAgIFZMRDEuVTggIHtEMTV9LCAgW3BfY2JdISAgICAgICAgICAgQCBMb2FkIDggQ2IgZWxlbWVudHMgKHVpbnQ4KSB0byBEMTUKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBFeHBhbmQgdWludDggdmFsdWUgdG8gdWludDE2Ci0gICAgICogIEQyNCwgRDI1OiBZMCBZMiBZNCBZNiBZOCBZMTAgWTEyIFkxNAotICAgICAqICBEMjYsIEQyNzogWTEgWTMgWTUgWTcgWTkgWTExIFkxMyBZMTUKLSAgICAgKiAgRDI4LCBEMjk6IFYwIFYxIFYyIFYzIFY0IFY1ICBWNiAgVjcKLSAgICAgKiAgRDMwLCBEMzE6IFUwIFUxIFUyIFUzIFU0IFU1ICBVNiAgVTcKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WTC5VOCBRMTIsIEQxMgotICAgIFZNT1ZMLlU4IFExMywgRDEzCi0gICAgVk1PVkwuVTggUTE0LCBEMTQKLSAgICBWTU9WTC5VOCBRMTUsIEQxNQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFE2LCBEMjgsIEQ2WzBdICAgICAgICAgIEAgUTY6ICAzNTkqKFYwLFYxLFYyLFYzKSAgICAgUmVkCi0gICAgVk1VTEwuUzE2ICBRNywgRDMwLCBENlsxXSAgICAgICAgICBAIFE3OiAtODgqKFUwLFUxLFUyLFUzKSAgICAgR3JlZW4KLSAgICBWTUxBTC5TMTYgIFE3LCBEMjgsIEQ2WzJdICAgICAgICAgIEAgcTc6IC04OCooVTAsVTEsVTIsVTMpIC0gMTgzKihWMCxWMSxWMixWMykKLSAgICBWTVVMTC5TMTYgIFE4LCBEMzAsIEQ2WzNdICAgICAgICAgIEAgcTg6ICA0NTQqKFUwLFUxLFUyLFUzKSAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFE2LCBRMCAgICAgICAgICAgICAgICAgICBAIFE2IGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRNywgUTEgICAgICAgICAgICAgICAgICAgQCBRNyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTgsIFEyICAgICAgICAgICAgICAgICAgIEAgUTggYWRkIEJsdWUgIGJpYXMgLTU3OTg0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WLlMzMiAgIFE5LCBRNgotICAgIFZNTEFMLlMxNiAgUTYsIEQyNCwgRDdbMF0gICAgICAgICAgQCBRNjogUjAsIFIyLCBSNCwgUjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTksIEQyNiwgRDdbMF0gICAgICAgICAgQCBROTogUjEsIFIzLCBSNSwgUjcgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTAsIFE3Ci0gICAgVk1MQUwuUzE2ICBRNywgIEQyNCwgRDdbMF0gICAgICAgICBAIFE3OiAgRzAsIEcyLCBHNCwgRzYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTEwLCBEMjYsIEQ3WzBdICAgICAgICAgQCBRMTA6IEcxLCBHMywgRzUsIEc3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTExLCBROAotICAgIFZNTEFMLlMxNiAgUTgsICBEMjQsIEQ3WzBdICAgICAgICAgQCBRODogIEIwLCBCMiwgQjQsIEI2IGluIDMyLWJpdCBROCBmb3JtYXQKLSAgICBWTUxBTC5TMTYgIFExMSwgRDI2LCBEN1swXSAgICAgICAgIEAgUTExOiBCMSwgQjMsIEI1LCBCNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDEyLCBRNiwgICM4ICAgICAgICAgICBAIEQxMjogUjAgUjIgUjQgUjYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxMywgUTksICAjOCAgICAgICAgICAgQCBEMTM6IFIxIFIzIFI1IFI3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTIsIEQxMyAgICAgICAgICAgICAgIEAgUTYgOiBSMCBSMSBSMiBSMyBSNCBSNSBSNiBSNwotCi0gICAgVlNIUk4uUzMyICAgRDE4LCBRNywgICM4ICAgICAgICAgICBAIEQxODogRzAgRzIgRzQgRzYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxOSwgUTEwLCAjOCAgICAgICAgICAgQCBEMTk6IEcxIEczIEc1IEc3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTgsIEQxOSAgICAgICAgICAgICAgIEAgUTkgOiBHMCBHMSBHMiBHMyBHNCBHNSBHNiBHNwotCi0gICAgVlNIUk4uUzMyICAgRDIwLCBROCwgICM4ICAgICAgICAgICBAIEQyMDogQjAgQjIgQjQgQjYgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQyMSwgUTExLCAjOCAgICAgICAgICAgQCBEMjE6IEIxIEIzIEI1IEI3IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMjAsIEQyMSAgICAgICAgICAgICAgIEAgUTEwOiBCMCBCMSBCMiBCMyBCNCBCNSBCNiBCNwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIENsYW1wIHRoZSB2YWx1ZSB0byBiZSB3aXRoaW4gWzB+MjU1XQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIFZNQVguUzE2ICBRMTAsIFExMCwgUTQgICAgICAgICAgICAgQCBpZiBRMTAgPCAgIDAsIFExMCA9ICAgMAotICAgIFZNSU4uUzE2ICBRMTAsIFExMCwgUTUgICAgICAgICAgICAgQCBpZiBRMTAgPiAyNTUsIFExMCA9IDI1NQotICAgIFZRTU9WVU4uUzE2ICAgRDIzLCBRMTAgICAgICAgICAgICAgQCBzdG9yZSBCbHVlIHRvIEQyMywgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBROSwgUTksIFE0ICAgICAgICAgICAgICAgQCBpZiBROSA8ICAgMCwgUTkgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTksIFE5LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTkgPiAyNTUsIFE5ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMiwgUTkgICAgICAgICAgICAgICBAIHN0b3JlIEdyZWVuIHRvIEQyMiwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotICAgIFZNQVguUzE2ICBRNiwgUTYsIFE0ICAgICAgICAgICAgICAgQCBpZiBRNiA8ICAgMCwgUTYgPSAgIDAKLSAgICBWTUlOLlMxNiAgUTYsIFE2LCBRNSAgICAgICAgICAgICAgIEAgaWYgUTYgPiAyNTUsIFE2ID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgIEQyMSwgUTYgICAgICAgICAgICAgICBAIHN0b3JlIFJlZCB0byBEMjEsIG5hcnJvdyB0aGUgdmFsdWUgZnJvbSBpbnQxNiB0byBpbnQ4Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjOCAgICAgICAgICAgIEAgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgQk1JICB0cmFpbGluZ195eXZ1cDJiZ3I4ODggICAgICAgICBAIGp1bXAgdG8gdHJhaWxpbmcgcHJvY2Vzc2luZyBpZiByZW1haW5pbmcgbGVuZ3RoIGlzIGxlc3MgdGhhbiA4Ci0KLSAgICBWU1QzLlU4ICB7RDIxLEQyMixEMjN9LCBbcF9iZ3JdISAgIEAgdmVjdG9yIHN0b3JlIEJsdWUsIEdyZWVuLCBSZWQgdG8gZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUmVkIGF0IExTQgotCi0gICAgQkVRICBlbmRfeXl2dXAyYmdyODg4ICAgICAgICAgICAgICBAIGRvbmUgaWYgZXhhY3RseSA4IHBpeGVsIHByb2Nlc3NlZCBpbiB0aGUgbG9vcAotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIERvbmUgd2l0aCB0aGUgZmlyc3QgOCBlbGVtZW50cywgY29udGludWUgb24gdGhlIG5leHQgOCBlbGVtZW50cwotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIE11bHRpcGx5IGNvbnRyaWJ1dGlvbiBmcm9tIGNocm9taW5hbmNlLCByZXN1bHRzIGFyZSBpbiAzMi1iaXQKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTVVMTC5TMTYgIFE2LCBEMjksIEQ2WzBdICAgICAgICAgIEAgUTY6IDM1OSooVjQsVjUsVjYsVjcpICAgICAgIFJlZAotICAgIFZNVUxMLlMxNiAgUTcsIEQzMSwgRDZbMV0gICAgICAgICAgQCBRNzogLTg4KihVNCxVNSxVNixVNykgICAgICBHcmVlbgotICAgIFZNTEFMLlMxNiAgUTcsIEQyOSwgRDZbMl0gICAgICAgICAgQCBRNzogLTg4KihVNCxVNSxVNixVNykgLSAxODMqKFY0LFY1LFY2LFY3KQotICAgIFZNVUxMLlMxNiAgUTgsIEQzMSwgRDZbM10gICAgICAgICAgQCBRODogNDU0KihVNCxVNSxVNixVNykgICAgICAgQmx1ZQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIEFkZCBiaWFzCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVkFERC5TMzIgIFE2LCBRMCAgICAgICAgICAgICAgICAgICBAIFE2IGFkZCBSZWQgICBiaWFzIC00NTgyNAotICAgIFZBREQuUzMyICBRNywgUTEgICAgICAgICAgICAgICAgICAgQCBRNyBhZGQgR3JlZW4gYmlhcyAgMzQ4MTYKLSAgICBWQURELlMzMiAgUTgsIFEyICAgICAgICAgICAgICAgICAgIEAgUTggYWRkIEJsdWUgIGJpYXMgLTcwNjg4Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2FsY3VsYXRlIFJlZCwgR3JlZW4sIEJsdWUKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBWTU9WLlMzMiAgIFE5LCBRNgotICAgIFZNTEFMLlMxNiAgUTYsIEQyNSwgRDdbMF0gICAgICAgICAgQCBRNjogUjggUjEwIFIxMiBSMTQgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTksIEQyNywgRDdbMF0gICAgICAgICAgQCBROTogUjkgUjExIFIxMyBSMTUgaW4gMzItYml0IFE4IGZvcm1hdAotCi0gICAgVk1PVi5TMzIgICBRMTAsIFE3Ci0gICAgVk1MQUwuUzE2ICBRNywgIEQyNSwgRDdbMF0gICAgICAgICBAIFE3OiBHMCwgRzIsIEc0LCBHNiBpbiAzMi1iaXQgUTggZm9ybWF0Ci0gICAgVk1MQUwuUzE2ICBRMTAsIEQyNywgRDdbMF0gICAgICAgICBAIFExMCA6IEcxLCBHMywgRzUsIEc3IGluIDMyLWJpdCBROCBmb3JtYXQKLQotICAgIFZNT1YuUzMyICAgUTExLCBROAotICAgIFZNTEFMLlMxNiAgUTgsICBEMjUsIEQ3WzBdICAgICAgICAgQCBRODogQjAsIEIyLCBCNCwgQjYgaW4gMzItYml0IFE4IGZvcm1hdAotICAgIFZNTEFMLlMxNiAgUTExLCBEMjcsIEQ3WzBdICAgICAgICAgQCBRMTEgOiBCMSwgQjMsIEI1LCBCNyBpbiAzMi1iaXQgUTggZm9ybWF0Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgUmlnaHQgc2hpZnQgZWlnaHQgYml0cyB3aXRoIHJvdW5kaW5nCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVlNIUk4uUzMyICAgRDEyLCBRNiwgICM4ICAgICAgICAgICBAIEQxMjogUjggUjEwIFIxMiBSMTQgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZTSFJOLlMzMiAgIEQxMywgUTksICAjOCAgICAgICAgICAgQCBEMTM6IFI5IFIxMSBSMTMgUjE1IGluIDE2LWJpdCBRMCBmb3JtYXQKLSAgICBWWklQLjE2ICAgICBEMTIsIEQxMyAgICAgICAgICAgICAgIEAgUTY6IFI4IFI5IFIxMCBSMTEgUjEyIFIxMyBSMTQgUjE1Ci0KLSAgICBWU0hSTi5TMzIgICBEMTgsIFE3LCAgIzggICAgICAgICAgIEAgRDE4OiBHOCBHMTAgRzEyIEcxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDE5LCBRMTAsICM4ICAgICAgICAgICBAIEQxOTogRzkgRzExIEcxMyBHMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQxOCwgRDE5ICAgICAgICAgICAgICAgQCBROTogIEc4IEc5IEcxMCBHMTEgRzEyIEcxMyBHMTQgRzE1Ci0KLSAgICBWU0hSTi5TMzIgICBEMjAsIFE4LCAgIzggICAgICAgICAgIEAgRDIwOiBCOCBCMTAgQjEyIEIxNCBpbiAxNi1iaXQgUTAgZm9ybWF0Ci0gICAgVlNIUk4uUzMyICAgRDIxLCBRMTEsICM4ICAgICAgICAgICBAIEQyMTogQjkgQjExIEIxMyBCMTUgaW4gMTYtYml0IFEwIGZvcm1hdAotICAgIFZaSVAuMTYgICAgIEQyMCwgRDIxICAgICAgICAgICAgICAgQCBRMTA6IEI4IEI5IEIxMCBCMTEgQjEyIEIxMyBCMTQgQjE1Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgQ2xhbXAgdGhlIHZhbHVlIHRvIGJlIHdpdGhpbiBbMH4yNTVdCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgVk1BWC5TMTYgIFExMCwgUTEwLCBRNCAgICAgICAgICAgICBAIGlmIFExMCA8ICAgMCwgUTEwID0gICAwCi0gICAgVk1JTi5TMTYgIFExMCwgUTEwLCBRNSAgICAgICAgICAgICBAIGlmIFExMCA+IDI1NSwgUTEwID0gMjU1Ci0gICAgVlFNT1ZVTi5TMTYgICBEMjMsIFExMCAgICAgICAgICAgICBAIHN0b3JlIEJsdWUgdG8gRDIzLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFE5LCBROSwgUTQgICAgICAgICAgICAgICBAIGlmIFE5IDwgICAwLCBROSA9ICAgMAotICAgIFZNSU4uUzE2ICBROSwgUTksIFE1ICAgICAgICAgICAgICAgQCBpZiBROSA+IDI1NSwgUTkgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIyLCBROSAgICAgICAgICAgICAgIEAgc3RvcmUgR3JlZW4gdG8gRDIyLCBuYXJyb3cgdGhlIHZhbHVlIGZyb20gaW50MTYgdG8gaW50OAotCi0gICAgVk1BWC5TMTYgIFE2LCBRNiwgUTQgICAgICAgICAgICAgICBAIGlmIFE2IDwgICAwLCBRNiA9ICAgMAotICAgIFZNSU4uUzE2ICBRNiwgUTYsIFE1ICAgICAgICAgICAgICAgQCBpZiBRNiA+IDI1NSwgUTYgPSAyNTUKLSAgICBWUU1PVlVOLlMxNiAgRDIxLCBRNiAgICAgICAgICAgICAgIEAgc3RvcmUgUmVkIHRvIEQyMSwgbmFycm93IHRoZSB2YWx1ZSBmcm9tIGludDE2IHRvIGludDgKLQotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzggICAgICAgICAgICBAIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIDgKLQotICAgIEJNSSAgdHJhaWxpbmdfeXl2dXAyYmdyODg4ICAgICAgICAgQCBqdW1wIHRvIHRyYWlsaW5nIHByb2Nlc3NpbmcgaWYgcmVtYWluaW5nIGxlbmd0aCBpcyBsZXNzIHRoYW4gOAotCi0gICAgVlNUMy5VOCAge0QyMSxEMjIsRDIzfSwgW3BfYmdyXSEgICBAIHZlY3RvciBzdG9yZSBCbHVlLCBHcmVlbiwgUmVkIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJlZCBhdCBMU0IKLQotICAgIEJISSBsb29wX3l5dnVwMmJncjg4OCAgICAgICAgICAgICAgQCBsb29wIGlmIG1vcmUgdGhhbiA4IHBpeGVscyBsZWZ0Ci0KLSAgICBCRVEgIGVuZF95eXZ1cDJiZ3I4ODggICAgICAgICAgICAgIEAgZG9uZSBpZiBleGFjdGx5IDggcGl4ZWwgcHJvY2Vzc2VkIGluIHRoZSBsb29wCi0KLQotdHJhaWxpbmdfeXl2dXAyYmdyODg4OgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICBUaGVyZSBhcmUgZnJvbSAxIH4gNyBwaXhlbHMgbGVmdCBpbiB0aGUgdHJhaWxpbmcgcGFydC4KLSAgICAgKiAgRmlyc3QgYWRkaW5nIDcgdG8gdGhlIGxlbmd0aCBzbyB0aGUgbGVuZ3RoIHdvdWxkIGJlIGZyb20gMCB+IDYuCi0gICAgICogIGVnOiAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQsIHNvIDEtOCs3ID0gMC4KLSAgICAgKiAgVGhlbiBzYXZlIDEgcGl4ZWwgdW5jb25kaXRpb25hbGx5IHNpbmNlIGF0IGxlYXN0IDEgcGl4ZWxzIGxlZnQgaW4gdGhlCi0gICAgICogIHRyYWlsaW5nIHBhcnQuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgQUREUyBsZW5ndGgsIGxlbmd0aCwgIzcgICAgICAgICAgICBAIHRoZXJlIGFyZSA3IG9yIGxlc3MgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLQotICAgIFZTVDMuVTgge0QyMVswXSxEMjJbMF0sRDIzWzBdfSwgW3BfYmdyXSEgQCBhdCBsZWFzdCAxIHBpeGVsIGxlZnQgaW4gdGhlIHRyYWlsaW5nIHBhcnQKLSAgICBCRVEgZW5kX3l5dnVwMmJncjg4OCAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjFbMV0sRDIyWzFdLEQyM1sxXX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJiZ3I4ODggICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDIxWzJdLEQyMlsyXSxEMjNbMl19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSBlbmRfeXl2dXAyYmdyODg4ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyMVszXSxEMjJbM10sRDIzWzNdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLSAgICBCRVEgZW5kX3l5dnVwMmJncjg4OCAgICAgICAgICAgICAgIEAgZG9uZSBpZiAwIHBpeGVsIGxlZnQKLQotICAgIFNVQlMgbGVuZ3RoLCBsZW5ndGgsICMxICAgICAgICAgICAgQCB1cGRhdGUgbGVuZ3RoIGNvdW50ZXIKLSAgICBWU1QzLlU4IHtEMjFbNF0sRDIyWzRdLEQyM1s0XX0sIFtwX2Jncl0hICBAIHN0b3JlIG9uZSBtb3JlIHBpeGVsCi0gICAgQkVRIGVuZF95eXZ1cDJiZ3I4ODggICAgICAgICAgICAgICBAIGRvbmUgaWYgMCBwaXhlbCBsZWZ0Ci0KLSAgICBTVUJTIGxlbmd0aCwgbGVuZ3RoLCAjMSAgICAgICAgICAgIEAgdXBkYXRlIGxlbmd0aCBjb3VudGVyCi0gICAgVlNUMy5VOCB7RDIxWzVdLEQyMls1XSxEMjNbNV19LCBbcF9iZ3JdISAgQCBzdG9yZSBvbmUgbW9yZSBwaXhlbAotICAgIEJFUSBlbmRfeXl2dXAyYmdyODg4ICAgICAgICAgICAgICAgQCBkb25lIGlmIDAgcGl4ZWwgbGVmdAotCi0gICAgU1VCUyBsZW5ndGgsIGxlbmd0aCwgIzEgICAgICAgICAgICBAIHVwZGF0ZSBsZW5ndGggY291bnRlcgotICAgIFZTVDMuVTgge0QyMVs2XSxEMjJbNl0sRDIzWzZdfSwgW3BfYmdyXSEgIEAgc3RvcmUgb25lIG1vcmUgcGl4ZWwKLQotZW5kX3l5dnVwMmJncjg4ODoKLSAgICBWUE9QICB7RDgtRDE1fQotICAgIExETUZEIFNQISwge1BDfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGVuZCBvZiB5eXZ1cDJiZ3I4ODgKLQotLmVuZApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkaWRjdC1hcm12Ny5TIGIvbGlianBlZ3R3cnAvYXNtL2FybXY3L2pkaWRjdC1hcm12Ny5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjFlMjE5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2FzbS9hcm12Ny9qZGlkY3QtYXJtdjcuUworKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogamRpZGN0LWFybXY3LnMKLSoKLSogIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSogIG1ldDoKLSogICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0qICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0qICAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0qICAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0qICAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSogICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSogIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSogIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSogIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotKiAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSogIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSogIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DVElPTiBMSVNUCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogLSBpZGN0XzF4MV92ZW51bQotKiAtIGlkY3RfMngyX3ZlbnVtCi0qIC0gaWRjdF80eDRfdmVudW0KLSogLSBpZGN0Xzh4OF92ZW51bQotKgotKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgTUFDUk8gREVGSU5JVElPTgotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLm1hY3JvIFRyYW5zcG9zZTh4OAotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgVHJhbnNwb3NlIGFuIDggeCA4IHggMTYgYml0IG1hdHJpeCBpbiBwbGFjZQotICAgICAgICBAIElucHV0OiBxOCB0byBxMTUKLSAgICAgICAgQCBPdXRwdXQ6IHE4IHRvIHExNQotICAgICAgICBAIFJlZ2lzdGVycyB1c2VkOiBxOCB0byBxMTUKLSAgICAgICAgQCBBc3N1bXB0aW9uczogOCB4IDggeCAxNiBiaXQgZGF0YQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgdnN3cCBkMTcsIGQyNCAgICAgICAgICAgICAgICAgIEBxOCwgcTEyCi0gICAgICAgIHZzd3AgZDIzLCBkMzAgICAgICAgICAgICAgICAgICBAcTExLCBxMTUKLSAgICAgICAgdnN3cCBkMjEsIGQyOCAgICAgICAgICAgICAgICAgIEBxMTAsIHExNAotICAgICAgICB2c3dwIGQxOSwgZDI2ICAgICAgICAgICAgICAgICAgQHE5LCBxMTMKLQotICAgICAgICB2dHJuLjMyIHE4LCAgcTEwCi0gICAgICAgIHZ0cm4uMzIgcTksICBxMTEKLSAgICAgICAgdnRybi4zMiBxMTIsIHExNAotICAgICAgICB2dHJuLjMyIHExMywgcTE1Ci0KLSAgICAgICAgdnRybi4xNiBxOCwgIHE5Ci0gICAgICAgIHZ0cm4uMTYgcTEwLCBxMTEKLSAgICAgICAgdnRybi4xNiBxMTIsIHExMwotICAgICAgICB2dHJuLjE2IHExNCwgcTE1Ci0gICAgLmVuZG0KLQotICAgIC5tYWNybyBJRENUMUQKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIE9uZSBkaW1lbnNpb25hbCA2NCBlbGVtZW50IGludmVyc2UgRENUCi0gICAgICAgIEAgSW5wdXQ6IHE4IHRvIHExNSBsb2FkZWQgd2l0aCBkYXRhCi0gICAgICAgIEAgICAgICAgIHEwIGxvYWRlZCB3aXRoIGNvbnN0YW50cwotICAgICAgICBAIE91dHB1dDogcTggdG8gcTE1Ci0gICAgICAgIEAgUmVnaXN0ZXJzIHVzZWQ6IHEwLCBxNCB0byBxMTUKLSAgICAgICAgQCBBc3N1bXB0aW9uczogMTYgYml0IGRhdGEsIGZpcnN0IGVsZW1lbnRzIGluIGxlYXN0IHNpZ25pZmljYW50Ci0gICAgICAgIEAgaGFsZndvcmRzCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBAMXN0IHN0YWdlCi0gICAgICAgIHZxcmRtdWxoLnMxNiBxNCwgIHExNSwgZDBbMl0gICBAcTQgPSBhMSp2eDcKLSAgICAgICAgdnFyZG11bGguczE2IHE1LCAgcTksICBkMFsyXSAgIEBxNSA9IGExKnZ4MQotICAgICAgICB2cXJkbXVsaC5zMTYgcTYsICBxMTMsIGQwWzNdICAgQHE2ID0gYTIqdng1Ci0gICAgICAgIHZxcmRtdWxoLnMxNiBxNywgIHExMSwgZDFbMV0gICBAcTcgPSBtYTIqdngzCi0gICAgICAgIHZxcmRtdWxoLnMxNiBxMiwgIHExNCwgZDBbMV0gICBAcTYgPSBhMCp2eDYKLSAgICAgICAgdnFyZG11bGguczE2IHEzLCAgcTEwLCBkMFsxXSAgIEBxNyA9IGEwKnZ4MgotICAgICAgICB2cWFkZC5zMTYgICBxOSwgIHE0LCAgcTkgICAgICAgQHE5ID0gdDEgPSBhMSp2eDcgKyB2eDEKLSAgICAgICAgdnFzdWIuczE2ICAgcTUsICBxNSwgIHExNSAgICAgIEBxNSA9IHQ4ID0gYTEqdngxIC0gdng3Ci0gICAgICAgIHZxYWRkLnMxNiAgIHExNSwgcTYsICBxMTEgICAgICBAcTE1ID0gdDcgPSBhMip2eDUgKyB2eDMKLSAgICAgICAgdnFhZGQuczE2ICAgcTExLCBxNywgIHExMyAgICAgIEBxMTEgPSB0MyA9IG1hMip2eDMgKyB2eDUKLQotICAgICAgICBAMm5kIHN0YWdlCi0gICAgICAgIHZxYWRkLnMxNiAgIHExMywgcTgsICBxMTIgICAgICBAcTEzID0gdDUgPSB2eDAgKyB2eDQKLSAgICAgICAgdnFzdWIuczE2ICAgcTgsICBxOCwgIHExMiAgICAgIEBxOCA9IHQwID0gdngwIC0gdng0Ci0gICAgICAgIHZxYWRkLnMxNiAgIHExMCwgcTIsICBxMTAgICAgICBAcTEwID0gdDIgPSBhMCp2eDYgKyB2eDIKLSAgICAgICAgdnFzdWIuczE2ICAgcTEyLCBxMywgIHExNCAgICAgIEBxMTIgPSB0NCA9IGEwKnZ4MiAtIHZ4NgotICAgICAgICB2cWFkZC5zMTYgICBxMTQsIHE1LCAgcTExICAgICAgQHExNCA9IHQ2ID0gdDggKyB0MwotICAgICAgICB2cXN1Yi5zMTYgICBxMTEsIHE1LCAgcTExICAgICAgQHExMSA9IHQzID0gdDggLSB0MwotICAgICAgICB2cXN1Yi5zMTYgICBxNSwgIHE5LCAgcTE1ICAgICAgQHE1ID0gdDggPSB0MSAtIHQ3Ci0gICAgICAgIHZxYWRkLnMxNiAgIHE5LCAgcTksICBxMTUgICAgICBAcTkgPSB0MSA9IHQxICsgdDcKLQotICAgICAgICBAM3JkIHN0YWdlCi0gICAgICAgIHZxYWRkLnMxNiAgIHExNSwgcTEzLCBxMTAgICAgICBAcTE1ID0gdDcgPSB0NSArIHQyCi0gICAgICAgIHZxc3ViLnMxNiAgIHExMCwgcTEzLCBxMTAgICAgICBAcTEwID0gdDIgPSB0NSAtIHQyCi0gICAgICAgIHZxYWRkLnMxNiAgIHExMywgcTgsICBxMTIgICAgICBAcTEzID0gdDUgPSB0MCArIHQ0Ci0gICAgICAgIHZxc3ViLnMxNiAgIHE3LCAgcTgsICBxMTIgICAgICBAcTcgPSB0MCA9IHQwIC0gdDQKLSAgICAgICAgdnFzdWIuczE2ICAgcTEyLCBxNSwgIHExMSAgICAgIEBxMTIgPSB0NCA9IHQ4IC0gdDMKLSAgICAgICAgdnFhZGQuczE2ICAgcTExLCBxNSwgIHExMSAgICAgIEBxMTEgPSB0MyA9IHQ4ICsgdDMKLQotICAgICAgICBANHRoIHN0YWdlCi0gICAgICAgIHZxYWRkLnMxNiAgIHE4LCAgcTE1LCBxOSAgICAgICBAcTggPSB2eTAgPSB0NyArIHQxCi0gICAgICAgIHZxc3ViLnMxNiAgIHExNSwgcTE1LCBxOSAgICAgICBAcTE1ID0gdnk3ID0gdDcgLSB0MQotICAgICAgICB2cXJkbXVsaC5zMTYgcTYsICBxMTIsIGQwWzBdICAgQHE2ID0gYzQqdDQKLSAgICAgICAgdnFyZG11bGguczE2IHE0LCAgcTExLCBkMFswXSAgIEBxNCA9IGM0KnQzCi0gICAgICAgIHZxc3ViLnMxNiAgIHExMiwgcTEwLCBxMTQgICAgICBAcTEyID0gdnk0ID0gdDIgLSB0NgotICAgICAgICB2cWFkZC5zMTYgICBxMTEsIHExMCwgcTE0ICAgICAgQHExMSA9IHZ5MyA9IHQyICsgdDYKLSAgICAgICAgdnFhZGQuczE2ICAgcTEwLCBxNywgIHE2ICAgICAgIEBxMTAgPSB2eTIgPSB0MCArIGM0KnQ0Ci0gICAgICAgIHZxc3ViLnMxNiAgIHExNCwgcTEzLCBxNCAgICAgICBAcTE0ID0gdnk2ID0gdDUgLSBjNCp0MwotICAgICAgICB2cWFkZC5zMTYgICBxOSwgIHExMywgcTQgICAgICAgQHE5ID0gdnkxID0gdDUgKyBjNCp0MwotICAgICAgICB2cXN1Yi5zMTYgICBxMTMsIHE3LCAgcTYgICAgICAgQHExMyA9IHZ5NSA9IHQwIC0gYzQqdDQKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIFBBUlQxCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBMb2FkIGlucHV0IGlucHV0IGRhdGEgZnJvbSBtZW1vcnkgYW5kIHNoaWZ0Ci0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgdmxkMS4xNiAgIHtkMTYsIGQxN30sW3IwXSEgICAgIEBxOCA9cm93MAotICAgICAgICB2cXNobC5zMTYgIHE4LCAgcTgsICAjNCAgICAgICAgQElucHV0IGRhdGEgdG9vIGJpZz8hIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE1heGltdW0gTVBFRyBpbnB1dCBpcyAyMDQ3Ly0yMDQ4LgotICAgICAgICB2bGQxLjE2ICAge2QxOCwgZDE5fSxbcjBdISAgICAgQHE5ID1yb3cxCi0gICAgICAgIHZxc2hsLnMxNiAgcTksICBxOSwgICM0ICAgICAgICBAU2hpZnQgMSBpbnN0ZWFkIG9mIDQKLQotICAgICAgICB2bGQxLjE2ICAge2QyMCwgZDIxfSxbcjBdISAgICAgQHExMD1yb3cyCi0gICAgICAgIHZxc2hsLnMxNiAgcTEwLCBxMTAsICM0Ci0KLSAgICAgICAgdmxkMS4xNiAgIHtkMjIsIGQyM30sW3IwXSEgICAgIEBxMTE9cm93MwotICAgICAgICB2cXNobC5zMTYgIHExMSwgcTExLCAjNAotCi0gICAgICAgIHZsZDEuMTYgICB7ZDI0LCBkMjV9LFtyMF0hICAgICBAcTEyPXJvdzQKLSAgICAgICAgdnFzaGwuczE2ICBxMTIsIHExMiwgIzQKLQotICAgICAgICB2bGQxLjE2ICAge2QyNiwgZDI3fSxbcjBdISAgICAgQHExMz1yb3c1Ci0gICAgICAgIHZxc2hsLnMxNiAgcTEzLCBxMTMsICM0Ci0gICAgICAgIHZsZDEuMTYgICB7ZDI4LCBkMjl9LFtyMF0hICAgICBAcTE0PXJvdzYKLSAgICAgICAgdnFzaGwuczE2ICBxMTQsIHExNCwgIzQKLSAgICAgICAgdmxkMS4xNiAgIHtkMzAsIGQzMX0sW3IwXSEgICAgIEBxMTU9cm93NwotICAgICAgICB2cXNobC5zMTYgIHExNSwgcTE1LCAjNAotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCByZWZyZXNoIHRoZSBjb25zdGFudHMgdGhhdCB3YXMgY2xvYmJlcmVkIGxhc3QgdGltZSB0aHJvdWdoIElEQ1QxRAotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIHZsZDEuMTYgICB7ZDQsIGQ1fSxbcjddICAgICAgICBAcTIgPWNvbnN0YW50c1syXQotICAgICAgICB2bGQxLjE2ICAge2Q2LCBkN30sW3I4XSAgICAgICAgQHEzID1jb25zdGFudHNbM10KLSAgICAgICAgdmxkMS4xNiAgIHtkOCwgZDl9LFtyOV0gICAgICAgIEBxNCA9Y29uc3RhbnRzWzRdCi0gICAgLmVuZG0KLQotICAgIC5tYWNybyBQQVJUMgotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgUHJlc2NhbGUgdGhlIGlucHV0Ci0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgdnFyZG11bGguczE2IHExMiwgcTEyLCBxMSAgICAgIEBxMTI9cm93NCAqIGNvbnN0YW50c1sxXSA9IHZ4NAotICAgICAgICB2cXJkbXVsaC5zMTYgcTE1LCBxMTUsIHEyICAgICAgQHExNT1yb3c3ICogY29uc3RhbnRzWzJdID0gdng3Ci0gICAgICAgIHZxcmRtdWxoLnMxNiBxOSwgIHE5LCAgcTIgICAgICBAcTkgPXJvdzEgKiBjb25zdGFudHNbMl0gPSB2eDEKLSAgICAgICAgdnFyZG11bGguczE2IHExMywgcTEzLCBxNCAgICAgIEBxMTM9cm93NSAqIGNvbnN0YW50c1s0XSA9IHZ4NQotICAgICAgICB2cXJkbXVsaC5zMTYgcTExLCBxMTEsIHE0ICAgICAgQHExMT1yb3czICogY29uc3RhbnRzWzRdID0gdngzCi0gICAgICAgIHZxcmRtdWxoLnMxNiBxMTQsIHExNCwgcTMgICAgICBAcTE0PXJvdzYgKiBjb25zdGFudHNbM10gPSB2eDYKLSAgICAgICAgdnFyZG11bGguczE2IHExMCwgcTEwLCBxMyAgICAgIEBxMTA9cm93MiAqIGNvbnN0YW50c1szXSA9IHZ4MgotICAgICAgICB2cXJkbXVsaC5zMTYgcTgsICBxOCwgIHExICAgICAgQHE4ID1yb3cwICogY29uc3RhbnRzWzFdID0gdngwCi0KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIEF0IHRoc2kgcG9pbnQsIHRoZSBpbnB1dCA4eDggeCAxNiBiaXQgY29lZmZpY2llbnRzIGFyZQotICAgICAgICBAIHRyYW5zcG9zZWQsIHByZXNjYWxlZCwgYW5kIGxvYWRlZCBpbiBxOCB0byBxMTUKLSAgICAgICAgQCBxMCBsb2FkZWQgd2l0aCBzY2FsYXIgY29uc3RhbnRzCi0gICAgICAgIEAgUGVyZm9ybSAxRCBJRENUCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgSURDVDFEICAgICAgICAgICAgICAgICAgICAgICAgIEBwZXJmb3JtIDFkIGlkY3QKLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgVHJhbnNwb3NlIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyB0byBnZXQgcmVhZCBmb3IgdmVydGljYWwKLSAgICAgICAgQCB0cmFuc2Zvcm1hdGlvbgotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIHZzd3AgZDE3LCBkMjQgICAgICAgICAgICAgICAgICBAcTgsIHExMgotICAgICAgICB2c3dwIGQyMywgZDMwICAgICAgICAgICAgICAgICAgQHExMSwgcTE1Ci0gICAgICAgIHZzd3AgZDIxLCBkMjggICAgICAgICAgICAgICAgICBAcTEwLCBxMTQKLSAgICAgICAgdnN3cCBkMTksIGQyNiAgICAgICAgICAgICAgICAgIEBxOSwgcTEzCi0KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIExvYWQgdGhlIGJpYXMKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICB2ZHVwLjMyIHE0LCBkMVsxXSAgICAgICAgICAgICAgQGEgY3ljbGUgaXMgc2F2ZWQgYnkgbG9hZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHRoZSBiaWFzIGF0IHRoaXMgcG9pbnQKLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgRmluaXNoIHRoZSB0cmFuc3Bvc2l0aW9uCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgdnRybi4zMiBxOCwgIHExMAotICAgICAgICB2dHJuLjMyIHE5LCAgcTExCi0gICAgICAgIHZ0cm4uMzIgcTEyLCBxMTQKLSAgICAgICAgdnRybi4zMiBxMTMsIHExNQotICAgICAgICB2dHJuLjE2IHE4LCAgcTkKLSAgICAgICAgdnRybi4xNiBxMTAsIHExMQotICAgICAgICB2dHJuLjE2IHExMiwgcTEzCi0gICAgICAgIHZ0cm4uMTYgcTE0LCBxMTUKLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgQWRkIGJpYXMKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICB2cWFkZC5zMTYgcTgsIHE4LCBxNAotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBJRENUIDJuZCBoYWxmCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgSURDVDFEICAgICAgICAgICAgICAgICAgICAgICAgIEBwZXJmb3JtIDFkIGRjdAotCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCBTY2FsZSBhbmQgY2xhbXAgdGhlIG91dHB1dCB0byBjb3JyZWN0IHJhbmdlIGFuZCBzYXZlIHRvIG1lbW9yeQotICAgICAgICBAIDEuIHNjYWxlIHRvIDhiaXRzIGJ5IHJpZ2h0IHNoaWZ0IDYKLSAgICAgICAgQCAyLiBjbGFtcCBvdXRwdXQgdG8gWzAsIDI1NV0gYnkgbWluL21heAotICAgICAgICBAIDMuIHVzZSBtdWx0aXBsZSBzdG9yZS4gRWFjaCBzdG9yZSB3aWxsIHNhdmUgb25lIHJvdyBvZiBvdXRwdXQuCi0gICAgICAgIEAgICAgVGhlIHN0IHF1ZXVlIHNpemUgaXMgNCwgc28gZG8gbm8gbW9yZSB0aGFuIDQgc3RyIGluIHNlcXVlbmNlLgotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIGxkciAgICAgICByNSwgPWNvbnN0YW50cys1KjE2ICBAY29uc3RhbnRzWzVdLAotICAgICAgICB2bGQxLjE2ICAgZDEwLCBbcjVdICAgICAgICAgICAgQGxvYWQgY2xhbXBpbmcgcGFyYW1ldGVycwotICAgICAgICB2ZHVwLnMxNiAgcTYsICBkMTBbMF0gICAgICAgICAgQHE2PVswMDAwMDAwMDAwMDAwMDAwXQotICAgICAgICB2ZHVwLnMxNiAgcTcsICBkMTBbMV0gICAgICAgICAgQHE3PVtGRkZGRkZGRkZGRkZGRkZGXQotCi0gICAgICAgIEBTYXZlIHRoZSByZXN1bHRzCi0gICAgICAgIHZzaHIuczE2ICBxOCwgIHE4LCAgIzYgICAgICAgICBAcTggPSB2eTAKLSAgICAgICAgdm1heC5zMTYgIHE4LCAgcTgsICBxNiAgICAgICAgIEBjbGFtcCA+MAotICAgICAgICB2bWluLnMxNiAgcTgsICBxOCwgIHE3ICAgICAgICAgQGNsYW1wIDwyNTUKLQotICAgICAgICB2c2hyLnMxNiAgcTksICBxOSwgICM2ICAgICAgICAgQHE5ID0gdnkxCi0gICAgICAgIHZtYXguczE2ICBxOSwgIHE5LCAgcTYgICAgICAgICBAY2xhbXAgPjAKLSAgICAgICAgdm1pbi5zMTYgIHE5LCAgcTksICBxNyAgICAgICAgIEBjbGFtcCA8MjU1Ci0KLSAgICAgICAgdnNoci5zMTYgIHExMCwgcTEwLCAjNiAgICAgICAgIEBxMTAgPSB2eTIKLSAgICAgICAgdm1heC5zMTYgIHExMCwgcTEwLCBxNiAgICAgICAgIEBjbGFtcCA+MAotICAgICAgICB2bWluLnMxNiAgcTEwLCBxMTAsIHE3ICAgICAgICAgQGNsYW1wIDwyNTUKLQotICAgICAgICB2c2hyLnMxNiAgcTExLCBxMTEsICM2ICAgICAgICAgQHExMSA9IHZ5MwotICAgICAgICB2bWF4LnMxNiAgcTExLCBxMTEsIHE2ICAgICAgICAgQGNsYW1wID4wCi0gICAgICAgIHZtaW4uczE2ICBxMTEsIHExMSwgcTcgICAgICAgICBAY2xhbXAgPDI1NQotCi0gICAgICAgIHZzdDEuMTYgIHtkMTYsIGQxN30sW3IxXSxyMiAgICBAcTggPXJvdzAKLSAgICAgICAgdnN0MS4xNiAge2QxOCwgZDE5fSxbcjFdLHIyICAgIEBxOSA9cm93MQotICAgICAgICB2c3QxLjE2ICB7ZDIwLCBkMjF9LFtyMV0scjIgICAgQHExMD1yb3cyCi0gICAgICAgIHZzdDEuMTYgIHtkMjIsIGQyM30sW3IxXSxyMiAgICBAcTExPXJvdzMKLQotICAgICAgICB2c2hyLnMxNiAgcTEyLCBxMTIsICM2ICAgICAgICAgQHExMiA9IHZ5NAotICAgICAgICB2bWF4LnMxNiAgcTEyLCBxMTIsIHE2ICAgICAgICAgQGNsYW1wID4wCi0gICAgICAgIHZtaW4uczE2ICBxMTIsIHExMiwgcTcgICAgICAgICBAY2xhbXAgPDI1NQotCi0gICAgICAgIHZzaHIuczE2ICBxMTMsIHExMywgIzYgICAgICAgICBAcTEzID0gdnk1Ci0gICAgICAgIHZtYXguczE2ICBxMTMsIHExMywgcTYgICAgICAgICBAY2xhbXAgPjAKLSAgICAgICAgdm1pbi5zMTYgIHExMywgcTEzLCBxNyAgICAgICAgIEBjbGFtcCA8MjU1Ci0KLSAgICAgICAgdnNoci5zMTYgIHExNCwgcTE0LCAjNiAgICAgICAgIEBxMTQgPSB2eTYKLSAgICAgICAgdm1heC5zMTYgIHExNCwgcTE0LCBxNiAgICAgICAgIEBjbGFtcCA+MAotICAgICAgICB2bWluLnMxNiAgcTE0LCBxMTQsIHE3ICAgICAgICAgQGNsYW1wIDwyNTUKLQotICAgICAgICB2c2hyLnMxNiAgcTE1LCBxMTUsICM2ICAgICAgICAgQHExNSA9IHZ5NwotICAgICAgICB2bWF4LnMxNiAgcTE1LCBxMTUsIHE2ICAgICAgICAgQGNsYW1wID4wCi0gICAgICAgIHZtaW4uczE2ICBxMTUsIHExNSwgcTcgICAgICAgICBAY2xhbXAgPDI1NQotCi0gICAgICAgIHZzdDEuMTYgIHtkMjQsIGQyNX0sW3IxXSxyMiAgICBAcTEyPXJvdzQKLSAgICAgICAgdnN0MS4xNiAge2QyNiwgZDI3fSxbcjFdLHIyICAgIEBxMTM9cm93NQotICAgICAgICB2c3QxLjE2ICB7ZDI4LCBkMjl9LFtyMV0scjIgICAgQHExND1yb3c2Ci0gICAgICAgIHZzdDEuMTYgIHtkMzAsIGQzMX0sW3IxXSAgICAgICBAcTE1PXJvdzcKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIEJJR19CT0RZX1RSQU5TUE9TRV9JTlBVVAotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgTWFpbiBib2R5IG9mIGlkY3QKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBQQVJUMQotICAgICAgICBUcmFuc3Bvc2U4eDgKLSAgICAgICAgUEFSVDIKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIElEQ1RfRU5UUlkKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBAIExvYWQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY29uc3RhbnRzCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgbGRyICByNSwgID1jb25zdGFudHMrMCoxNiAgICAgIEBjb25zdGFudHNbMF0KLSAgICAgICAgbGRyICByNiwgID1jb25zdGFudHMrMSoxNiAgICAgIEBjb25zdGFudHNbMV0KLSAgICAgICAgbGRyICByNywgID1jb25zdGFudHMrMioxNiAgICAgIEBjb25zdGFudHNbMl0KLSAgICAgICAgbGRyICByOCwgID1jb25zdGFudHMrMyoxNiAgICAgIEBjb25zdGFudHNbM10KLSAgICAgICAgbGRyICByOSwgID1jb25zdGFudHMrNCoxNiAgICAgIEBjb25zdGFudHNbNF0KLQotICAgICAgICBAPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIEAgTG9hZCB0aGUgY29lZmZpY2llbnRzCi0gICAgICAgIEAgb25seSBzb21lIGlucHV0IGNvZWZmaWNpZW50cyBhcmUgbG9hZCBkdWUgdG8gcmVnaXN0ZXIgY29uc3RyYWluCi0gICAgICAgIEA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgdmxkMS4xNiAgIHtkMCwgZDF9LFtyNV0gICAgICAgIEBxMCA9Y29uc3RhbnRzWzBdIChzY2FsYXJzKQotICAgICAgICB2bGQxLjE2ICAge2QyLCBkM30sW3I2XSAgICAgICAgQHExID1jb25zdGFudHNbMV0KLSAgICAuZW5kbQotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIEVORCBvZiBNQUNSTyBERUZJTklUSU9OCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0gICAgLnNlY3Rpb24gaWRjdF9mdW5jLCAieCIgICAgICAgICAgICBAIEFSRQotICAgIC50ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpZGN0X2Z1bmMsIENPREUsIFJFQURPTkxZCi0gICAgLmFsaWduIDIKLSAgICAuY29kZSAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ09ERTMyCi0KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBNYWluIFJvdXRpbmUKLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLmdsb2JhbCBpZGN0XzF4MV92ZW51bQotICAgIC5nbG9iYWwgaWRjdF8yeDJfdmVudW0KLSAgICAuZ2xvYmFsIGlkY3RfNHg0X3ZlbnVtCi0gICAgLmdsb2JhbCBpZGN0Xzh4OF92ZW51bQotCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgRlVOQ1RJT04gICAgIDogaWRjdF8xeDFfdmVudW0KLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBESVNDUklQVElPTiAgOiBBUk0gb3B0aW1pemF0aW9uIG9mIG9uZSAxeDEgYmxvY2sgaURDVAotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIEMgUFJPVE9UWVBFICA6IHZvaWQgaWRjdF8xeDFfdmVudW0oaW50MTYgKiBpbnB1dCwKLUAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqIG91dHB1dCwKLUAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiBzdHJpZGUpCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIElOUFVUICAgIDogUjAgcG9pbnRlciB0byBpbnB1dCAoaW50MTYpCi1AICAgICAgICAgICAgICAgIFIxIHBvaW50ZXIgdG8gb3V0cHV0IChpbnQxNikKLUAgICAgICAgICAgICAgICAgUjIgYmxvY2sgc3RyaWRlCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgU1RBQ0sgQVJHICAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE1FTSBJTlBVVCAgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgT1VUUFVUICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTUVNIE9VVFBVVCAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBBRkZFQ1RFRCA6IFIwIC0gUjIKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBTVEFDSyBVU0FHRSAgOiBub25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgQ1lDTEVTICAgICAgIDogMTcgY3ljbGVzCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTk9URVMgICAgICAgIDoKLUAgVGhpcyBpZGN0XzF4MV92ZW51bSBjb2RlIHdhcyBkZXZlbG9wZWQgd2l0aCBBUk0gaW5zdHJ1Y3Rpb24gc2V0LgotQAotQCBBUk0gUkVHSVNURVIgQUxMT0NBVElPTgotQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIHIwICA6IHBvaW50ZXIgdG8gaW5wdXQgZGF0YQotQCByMSAgOiBwb2ludGVyIHRvIG91dHB1dCBhcmVhCi1AIHIyICA6IHN0cmlkZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0udHlwZSBpZGN0XzF4MV92ZW51bSwgJWZ1bmN0aW9uCi1pZGN0XzF4MV92ZW51bToKLQotICAgIGxkcnNoICAgcjMsIFtyMF0gICAgICAgICAgICAgICAgICAgQCBMb2FkIHNpZ25lZCBoYWxmIHdvcmQgKGludDE2KQotICAgIGxkciAgICAgcjIsID0xMDI4ICAgICAgICAgICAgICAgICAgQCAxMDI4ID0gNCArIDEyOCA8PCAzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQgZm9yIHJvdW5kaW5nLCAxMjggZm9yIG9mZnNldAotICAgIGFkZCAgICAgcjIsIHIzLCByMgotICAgIGFzcnMgICAgcjIsIHIyLCAjMyAgICAgICAgICAgICAgICAgQCBEaXZpZGUgYnkgOCwgYW5kIHNldCBzdGF0dXMgYml0Ci0gICAgbW92bWkgICByMiwgIzAgICAgICAgICAgICAgICAgICAgICBAIENsYW1wIHRvIGJlIGdyZWF0ZXIgdGhhbiAwCi0gICAgY21wICAgICByMiwgIzI1NQotICAgIG1vdmd0ICAgcjIsICMyNTUgICAgICAgICAgICAgICAgICAgQCBDbGFtcCB0byBiZSBsZXNzIHRoYW4gMjU1Ci0gICAgc3RyICAgICByMiwgW3IxXSAgICAgICAgICAgICAgICAgICBAIFNhdmUgb3V0cHV0Ci0gICAgYnggICAgICBsciAgICAgICAgICAgICAgICAgICAgICAgICBAIFJldHVybiB0byBjYWxsZXIKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgaWRjdF8xeDFfdmVudW0KLQotCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgRlVOQ1RJT04gICAgIDogaWRjdF8yeDJfdmVudW0KLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBESVNDUklQVElPTiAgOiBWZU51bSBvcHRpbWl6YXRpb24gb2Ygb25lIDJ4MiBibG9jayBpRENUCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgQyBQUk9UT1RZUEUgIDogdm9pZCBpZGN0XzJ4Ml92ZW51bShpbnQxNiAqIGlucHV0LAotQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2ICogb3V0cHV0LAotQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHN0cmlkZSkKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgSU5QVVQgICAgOiBSMCBwb2ludGVyIHRvIGlucHV0IChpbnQxNikKLUAgICAgICAgICAgICAgICAgUjEgcG9pbnRlciB0byBvdXRwdXQgKGludDE2KQotQCAgICAgICAgICAgICAgICBSMiBibG9jayBzdHJpZGUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBTVEFDSyBBUkcgICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTUVNIElOUFVUICAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBPVVRQVVQgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBNRU0gT1VUUFVUICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIEFGRkVDVEVEIDogUjAgLSBSMgotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFNUQUNLIFVTQUdFICA6IG5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBDWUNMRVMgICAgICAgOiAyNyBjeWNsZXMKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBOT1RFUyAgICAgICAgOiBPdXRwdXQgYnVmZmVyIG11c3QgYmUgYW4gOHg4IDE2LWJpdCBidWZmZXIKLUAKLUAgQVJNIFJFR0lTVEVSIEFMTE9DQVRJT04KLUAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIHIwICA6IHBvaW50ZXIgdG8gaW5wdXQgZGF0YQotQCByMSAgOiBwb2ludGVyIHRvIG91dHB1dCBhcmVhCi1AIHIyICA6IHN0cmlkZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ACi1AIFZFTlVNIFJFR0lTVEVSIEFMTE9DQVRJT04KLUAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBxMCAgICAgOiBvdXRwdXQgeDAgLSB4NAotQCBxMSAgICAgOiBub3QgdXNlZAotQCBxMiAgICAgOiBub3QgdXNlZAotQCBxMyAgICAgOiBub3QgdXNlZAotQCBxNCAgICAgOiBub3QgdXNlZAotQCBxNSAgICAgOiBub3QgdXNlZAotQCBxNiAgICAgOiBub3QgdXNlZAotQCBxNyAgICAgOiBub3QgdXNlZAotQCBxOCAgICAgOiBpbnB1dCB5MCAtIHk0Ci1AIHE5ICAgICA6IGludGVybWVkaWF0ZSB2YWx1ZQotQCBxMTAgICAgOiBpbnRlcm1lZGlhdGUgdmFsdWUKLUAgcTExICAgIDogb2Zmc2V0IHZhbHVlCi1AIHExMiAgICA6IGNsYW1wIHZhbHVlCi1AIHExMyAgICA6IG5vdCB1c2VkCi1AIHExNCAgICA6IG5vdCB1c2VkCi1AIHExNSAgICA6IG5vdCB1c2VkCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS50eXBlIGlkY3RfMngyX3ZlbnVtLCAlZnVuY3Rpb24KLWlkY3RfMngyX3ZlbnVtOgotCi0gICAgdmxkNC4zMiAgICB7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3IwXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgZDE2OiB5MCB8IHkxIHwgeTIgfCB5MyAgKExTQiB8IE1TQikKLQotICAgIHZ0cm4uMzIgICAgZDE2LCBkMTcgICAgICAgICAgICAgICAgQCAgZDE2OiB5MCB8IHkxIHwgWCB8IFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgIGQxNzogeTIgfCB5MyB8IFggfCBYCi0KLSAgICB2cWFkZC5zMTYgIGQxOCwgZDE2LCBkMTcgICAgICAgICAgIEAgZDE4OiB5MCt5MiB8IHkxK3kzIHwgWCB8IFggICBxOiBzYXR1cmF0ZWQKLSAgICB2cXN1Yi5zMTYgIGQxOSwgZDE2LCBkMTcgICAgICAgICAgIEAgZDE5OiB5MC15MiB8IHkxLXkzIHwgWCB8IFggICBxOiBzYXR1cmF0ZWQKLQotICAgIHZ0cm4uMTYgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgQCBkMTg6IHkwK3kyIHwgeTAteTIgfCBYIHwgWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMTk6IHkxK3kzIHwgeTEteTMgfCBYIHwgWAotCi0gICAgdnFhZGQuczE2ICBkMjAsIGQxOCwgZDE5ICAgICAgICAgICBAIGQyMDogKHkwK3kyKSsoeTEreTMpIHwgKHkwLXkyKSsoeTEteTMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgIHgwIHwgeDIgfCBYIHwgWAotICAgIHZxc3ViLnMxNiAgZDIxLCBkMTgsIGQxOSAgICAgICAgICAgQCBkMjE6ICh5MCt5MiktKHkxK3kzKSB8ICh5MC15MiktKHkxLXkzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgICAgICB4MSB8IHgzIHwgWCB8IFgKLQotICAgIHZ0cm4uMTYgICAgZDIwLCBkMjEgICAgICAgICAgICAgICAgQCBkMjA6ICB4MCB8IHgxIHwgWCB8IFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDIxOiAgeDIgfCB4MyB8IFggfCBYCi0KLSAgICB2cnNoci5zMTYgIHExMCwgcTEwLCAjMyAgICAgICAgICAgICAgIEAgRGl2aWRlIGJ5IDgKLQotICAgIHZtb3YuaTE2ICAgcTExLCAjMTI4ICAgICAgICAgICAgICAgQCBxMTEgPSAxMjh8MTI4fDEyOHwxMjh8MTI4fDEyOHwxMjh8MTI4Ci0gICAgdnFhZGQuczE2ICBxMCwgcTEwLCBxMTEgICAgICAgICAgICBAIEFkZCBvZmZzZXQgdG8gbWFrZSBvdXRwdXQgaW4gWzAsMjU1XQotCi0gICAgdm1vdi5pMTYgICBxMTIsICMwICAgICAgICAgICAgICAgICAgIEAgcTEyID0gWzAwMDAwMDAwMDAwMDAwMDBdCi0gICAgdm1vdi5pMTYgICBxMTMsICMyNTUgICAgICAgICAgICAgICBAIHExMyA9IFtGRkZGRkZGRkZGRkZGRkZGXSAoaGV4KQotCi0gICAgdm1heC5zMTYgICBxMCwgcTAsIHExMiAgICAgICAgICAgICBAIENsYW1wID4gMAotICAgIHZtaW4uczE2ICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgQCBDbGFtcCA8IDI1NQotCi0gICAgdnN0ciAgICAgICBkMCwgW3IxXSAgICAgICAgICAgICAgICBAIFN0b3JlICB4MCB8IHgxIHwgWCB8IFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUG90ZW50aWFsIG91dCBvZiBib3VuZGFyeSBpc3N1ZQotICAgIGFkZCAgICAgICAgcjEsIHIxLCByMiAgICAgICAgICAgICAgQCBBZGQgdGhlIG9mZnNldCB0byB0aGUgb3V0cHV0IHBvaW50ZXIKLSAgICB2c3RyICAgICAgIGQxLCBbcjFdICAgICAgICAgICAgICAgIEAgU3RvcmUgIHgyIHwgeDMgfCBYIHwgWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBQb3RlbnRpYWwgb3V0IG9mIGJvdW5kYXJ5IGlzc3VlCi0gICAgYnggICAgICAgICBsciAgICAgICAgICAgICAgICAgICAgICBAIFJldHVybiB0byBjYWxsZXIKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgaWRjdF8yeDJfdmVudW0KLQotCi1APT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgRlVOQ1RJT04gICAgIDogaWRjdF80eDRfdmVudW0KLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBESVNDUklQVElPTiAgOiBWZU51bSBvcHRpbWl6YXRpb24gb2Ygb25lIDR4NCBibG9jayBpRENUCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgQyBQUk9UT1RZUEUgIDogdm9pZCBpZGN0XzR4NF92ZW51bShpbnQxNiAqIGlucHV0LAotQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2ICogb3V0cHV0LAotQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHN0cmlkZSkKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgSU5QVVQgICAgOiBSMCBwb2ludGVyIHRvIGlucHV0IChpbnQxNikKLUAgICAgICAgICAgICAgICAgUjEgcG9pbnRlciB0byBvdXRwdXQgKGludDE2KQotQCAgICAgICAgICAgICAgICBSMiBibG9jayBzdHJpZGUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBTVEFDSyBBUkcgICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgTUVNIElOUFVUICAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBPVVRQVVQgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBNRU0gT1VUUFVUICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIEFGRkVDVEVEIDogUjAgLSBSMywgUjEyCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgU1RBQ0sgVVNBR0UgIDogbm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIENZQ0xFUyAgICAgICA6IDU2IGN5Y2xlcwotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE5PVEVTICAgICAgICA6Ci1ACi1AIEFSTSBSRUdJU1RFUiBBTExPQ0FUSU9OCi1AID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCByMCAgOiBwb2ludGVyIHRvIGlucHV0IGRhdGEKLUAgcjEgIDogcG9pbnRlciB0byBvdXRwdXQgYXJlYQotQCByMiAgOiBzdHJpZGUgaW4gdGhlIG91dHB1dCBidWZmZXIKLUAgcjMgIDogcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc2V0Ci1AIHIxMiA6IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHNldAotQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ACi1AIFZFTlVNIFJFR0lTVEVSIEFMTE9DQVRJT04KLUAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBxMCAgICAgOiBjb2VmZmljaWVudHNbMF0KLUAgcTEgICAgIDogY29lZmZpY2llbnRzWzFdCi1AIHEyICAgICA6IGNvZWZmaWNpZW50c1syXQotQCBxMyAgICAgOiBjb2VmZmljaWVudHNbM10KLUAgcTQgICAgIDogbm90IHVzZWQKLUAgcTUgICAgIDogbm90IHVzZWQKLUAgcTYgICAgIDogbm90IHVzZWQKLUAgcTcgICAgIDogbm90IHVzZWQKLUAgcTggICAgIDogaW5wdXQgeTAgLSB5NwotQCBxOSAgICAgOiBpbnB1dCB5OCAtIHkxNQotQCBxMTAgICAgOiBpbnRlcm1lZGlhdGUgdmFsdWUKLUAgcTExICAgIDogaW50ZXJtZWRpYXRlIHZhbHVlCi1AIHExMiAgICA6IGludGVybWVkaWF0ZSB2YWx1ZQotQCBxMTMgICAgOiBpbnRlcm1lZGlhdGUgdmFsdWUKLUAgcTE0ICAgIDogaW50ZXJtZWRpYXRlIHZhbHVlCi1AIHExNSAgICA6IGludGVybWVkaWF0ZSB2YWx1ZQotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0udHlwZSBpZGN0XzR4NF92ZW51bSwgJWZ1bmN0aW9uCi1pZGN0XzR4NF92ZW51bToKLQotICAgICAgICBAIExvYWQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZmlyc3QgMiBzZXRzIG9mIGNvZWZmaWNpZW50cwotICAgICAgICBsZHIgIHIzLCAgID1jb2VmZmljaWVudCswKjE2ICAgQCBjb2VmZmljaWVudFswXQotICAgICAgICBsZHIgIHIxMiwgID1jb2VmZmljaWVudCsxKjE2ICAgQCBjb2VmZmljaWVudFsxXQotCi0gICAgICAgIEAgTG9hZCB0aGUgZmlyc3QgMiBzZXRzIG9mIGNvZWZmaWNpZW50cwotICAgICAgICB2bGQxLjE2ICB7ZDAsIGQxfSxbcjNdICAgICAgICAgQCBxMCA9IEM0IHwgQzIgfCBDNCB8IEM2IHwgQzQgfCBDMiB8IEM0IHwgQzYKLSAgICAgICAgdmxkMS4xNiAge2QyLCBkM30sW3IxMl0gICAgICAgIEAgcTEgPSBDNCB8IEM2IHwgQzQgfCBDMiB8IEM0IHwgQzYgfCBDNCB8IEMyCi0KLSAgICAgICAgQCBMb2FkIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHNlY29uZCAyIHNldHMgb2YgY29lZmZpY2llbnRzCi0gICAgICAgIGxkciAgcjMsICAgPWNvZWZmaWNpZW50KzIqMTYgICBAIGNvZWZmaWNpZW50WzJdCi0gICAgICAgIGxkciAgcjEyLCAgPWNvZWZmaWNpZW50KzMqMTYgICBAIGNvZWZmaWNpZW50WzNdCi0KLSAgICAgICAgQCBMb2FkIHRoZSBzZWNvbmQgMiBzZXRzIG9mIGNvZWZmaWNpZW50cwotICAgICAgICB2bGQxLjE2ICB7ZDQsIGQ1fSxbcjNdICAgICAgICAgQCBxMiA9IEM0IHwgQzQgfCBDNCB8IEM0IHwgQzIgfCBDMiB8IEMyIHwgQzIKLSAgICAgICAgdmxkMS4xNiAge2Q2LCBkN30sW3IxMl0gICAgICAgIEAgcTMgPSBDNCB8IEM0IHwgQzQgfCBDNCB8IEM2IHwgQzYgfCBDNiB8IEM2Ci0KLSAgICAgICAgQCBMb2FkIHRoZSBpbnB1dCB2YWx1ZXMKLSAgICAgICAgdmxkMS4xNiAge2QxNn0sIFtyMF0sIHIyICAgICAgIEAgZDE2OiAgIHkwICB8IHkxICB8IHkyICB8IHkzICAoTFNCIHwgTVNCKQotICAgICAgICB2bGQxLjE2ICB7ZDE3fSwgW3IwXSwgcjIgICAgICAgQCBkMTc6ICAgeTQgIHwgeTUgIHwgeTYgIHwgeTcgIChMU0IgfCBNU0IpCi0gICAgICAgIHZsZDEuMTYgIHtkMTh9LCBbcjBdLCByMiAgICAgICBAIGQxODogICB5OCAgfCB5OSAgfCB5MTAgfCB5MTEgKExTQiB8IE1TQikKLSAgICAgICAgdmxkMS4xNiAge2QxOX0sIFtyMF0sIHIyICAgICAgIEAgZDE5OiAgIHkxMiB8IHkxMyB8IHkxNCB8IHkxNSAoTFNCIHwgTVNCKQotCi0gICAgICAgIEAgQXBwbHkgaURDVCBIb3Jpem9uYWxseQotCi0gICAgICAgIEAgcTg6IHkwIHx5MSB8eTIgfHkzIHx5NCB8eTUgfHk2IHx5NwotICAgICAgICBAIHE5OiB5OCB8eTkgfHkxMHx5MTF8eTEyfHkxM3x5MTR8eTE1Ci0KLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgQCB2cXJkbXVsaCBkb3VibGVzIHRoZSByZXN1bHQgYW5kIHNhdmUgdGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgcmVzdWx0LAotICAgICAgICBAIHRoaXMgaXMgZXF1aXZhbGVudCB0byByaWdodCBzaGlmdCBieSAxNSBiaXRzLgotICAgICAgICBAIHNpbmNlIGNvZWZmaWNpZW50cyBhcmUgaW4gUTE1IGZvcm1hdCwgaXQgY29udHJhZGljdHMgd2l0aCB0aGUgcmlnaHQKLSAgICAgICAgQCBzaGlmdCAxNSBoZXJlLCBzbyB0aGUgZmluYWwgcmVzdWx0IGlzIGluIFEwIGZvcm1hdAotICAgICAgICBACi0gICAgICAgIEAgdnFyZG11bGggd2lsbCBhbHNvIHJvdW5kIHRoZSByZXN1bHQKLSAgICAgICAgQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICB2cXJkbXVsaC5zMTYgIHExMCwgcTgsIHEwICAgICAgQCBxMTA6IEM0KnkwICB8IEMyKnkxICB8IEM0KnkyICB8IEM2KnkzICB8IEM0Knk0ICB8IEMyKnk1ICB8IEM0Knk2ICB8IEM2Knk3Ci0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTExLCBxOCwgcTEgICAgICBAIHExMTogQzQqeTAgIHwgQzYqeTEgIHwgQzQqeTIgIHwgQzIqeTMgIHwgQzQqeTQgIHwgQzYqeTUgIHwgQzQqeTYgIHwgQzIqeTcKLQotICAgICAgICB2cXJkbXVsaC5zMTYgIHExMiwgcTksIHEwICAgICAgQCBxMTI6IEM0Knk4ICB8IEMyKnk5ICB8IEM0KnkxMCB8IEM2KnkxMSB8IEM0KnkxMiB8IEMyKnkxMyB8IEM0KnkxNCB8IEM2KnkxNQotICAgICAgICB2cXJkbXVsaC5zMTYgIHExMywgcTksIHExICAgICAgQCBxMTM6IEM0Knk4ICB8IEM2Knk5ICB8IEM0KnkxMCB8IEMyKnkxMSB8IEM0KnkxMiB8IEM2KnkxMyB8IEM0KnkxNCB8IEMyKnkxNQotCi0gICAgICAgIHZ0cm4uMzIgICAgICAgcTEwLCBxMTIgICAgICAgICBAIHExMDogQzQqeTAgIHwgQzIqeTEgIHwgQzQqeTggIHwgQzIqeTkgIHwgQzQqeTQgIHwgQzIqeTUgIHwgQzQqeTEyIHwgQzIqeTEzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExMjogQzQqeTIgIHwgQzYqeTMgIHwgQzQqeTEwIHwgQzYqeTExIHwgQzQqeTYgIHwgQzYqeTcgIHwgQzQqeTE0IHwgQzYqeTE1Ci0KLSAgICAgICAgdnRybi4zMiAgICAgICBxMTEsIHExMyAgICAgICAgIEAgcTExOiBDNCp5MCAgfCBDNip5MSAgfCBDNCp5OCAgfCBDNip5OSAgfCBDNCp5NCAgfCBDNip5NSAgfCBDNCp5MTIgfCBDNip5MTMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTEzOiBDNCp5MiAgfCBDMip5MyAgfCBDNCp5MTAgfCBDMip5MTEgfCBDNCp5NiAgfCBDMip5NyAgfCBDNCp5MTQgfCBDMip5MTUKLQotICAgICAgICB2cWFkZC5zMTYgICAgIHExNCwgcTEwLCBxMTIgICAgQCBxMTQ6IEM0KnkwICsgQzQqeTIgfCBDMip5MSArIEM2KnkzIHwgQzQqeTggKyBDNCp5MTAgfCBDMip5OSArIEM2KnkxMSB8IEM0Knk0ICsgQzQqeTYgfCBDMip5NSArIEM2Knk3IHwgQzQqeTEyICsgQzQqeTE0IHwgQzIqeTEzICsgQzYqeTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgIFMwIHwgUzIgfCBTOCB8IFMxMCB8IFM0IHwgUzYgfCBTMTIgfCBTMTQKLQotICAgICAgICB2cXN1Yi5zMTYgICAgIHExNSwgcTExLCBxMTMgICAgQCBxMTU6IEM0KnkwIC0gQzQqeTIgfCBDNip5MSAtIEMyKnkzIHwgQzQqeTggLSBDNCp5MTAgfCBDNip5OSAtIEMyKnkxMSB8IEM0Knk0IC0gQzQqeTYgfCBDNip5NSAtIEMyKnk3IHwgQzQqeTEyIC0gQzQqeTE0IHwgQzYqeTEzIC0gQzIqeTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgIFMxIHwgUzMgfCBTOSB8IFMxMSB8IFM1IHwgUzcgfCBTMTMgfCBTMTUKLQotICAgICAgICB2dHJuLjE2ICAgICAgIHExNCwgcTE1ICAgICAgICAgQCBxMTQ6IFMwIHwgUzEgfCBTOCAgfCBTOSAgfCBTNCB8IFM1IHwgUzEyIHwgUzEzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNTogUzIgfCBTMyB8IFMxMCB8IFMxMSB8IFM2IHwgUzcgfCBTMTQgfCBTMTUKLQotICAgICAgICB2cWFkZC5zMTYgICAgIHE4LCBxMTQsIHExNSAgICAgQCBxODogIFowIHwgWjEgfCBaOCAgfCBaOSAgfCBaNCB8IFo1IHwgWjEyIHwgWjEzCi0gICAgICAgIHZxc3ViLnMxNiAgICAgcTksIHExNCwgcTE1ICAgICBAIHE5OiAgWjMgfCBaMiB8IFoxMSB8IFoxMCB8IFo3IHwgWjYgfCBaMTUgfCBaMTQKLSAgICAgICAgdnJldjMyLjE2ICAgICBxOSwgcTkgICAgICAgICAgIEAgcTk6ICBaMiB8IFozIHwgWjEwIHwgWjExIHwgWjYgfCBaNyB8IFoxNCB8IFoxNQotCi0KLSAgICAgICAgQCBBcHBseSBpRENUIFZlcnRpY2FsbHkKLQotICAgICAgICB2dHJuLjMyICAgICAgIHE4LCBxOSAgICAgICAgICAgQCBxODogIFowIHwgWjEgfCBaMiAgfCBaMyAgfCBaNCAgfCBaNSAgfCBaNiAgfCBaNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxOTogIFo4IHwgWjkgfCBaMTAgfCBaMTEgfCBaMTIgfCBaMTMgfCBaMTQgfCBaMTUKLQotCi0gICAgICAgIHZxcmRtdWxoLnMxNiAgcTEwLCBxOCwgcTIgICAgICBAIHExMDogQzQqWjAgfCBDNCpaMSB8IEM0KloyIHwgQzQqWjMgfCBDMipaNCB8IEMyKlo1IHwgQzIqWjYgfCBDMipaNwotICAgICAgICB2cXJkbXVsaC5zMTYgIHExMSwgcTgsIHEzICAgICAgQCBxMTE6IEM0KlowIHwgQzQqWjEgfCBDNCpaMiB8IEM0KlozIHwgQzYqWjQgfCBDNipaNSB8IEM2Klo2IHwgQzYqWjcKLQotICAgICAgICB2cXJkbXVsaC5zMTYgIHExMiwgcTksIHEyICAgICAgQCBxMTI6IEM0Klo4IHwgQzQqWjkgfCBDNCpaMTAgfCBDNCpaMTEgfCBDMipaMTIgfCBDMipaMTMgfCBDMipaMTQgfCBDMipaMTUKLSAgICAgICAgdnFyZG11bGguczE2ICBxMTMsIHE5LCBxMyAgICAgIEAgcTEzOiBDNCpaOCB8IEM0Klo5IHwgQzQqWjEwIHwgQzQqWjExIHwgQzYqWjEyIHwgQzYqWjEzIHwgQzYqWjE0IHwgQzYqWjE1Ci0KLSAgICAgICAgdnFhZGQuczE2ICAgICBxMTQsIHExMCwgcTEzICAgIEAgcTE0OiBDNCpaMCtDNCpaOCB8IEM0KloxK0M0Klo5IHwgQzQqWjIrQzQqWjEwIHwgQzQqWjMrQzQqWjExIHwgQzIqWjQrQzYqWjEyIHwgQzIqWjUrQzYqWjEzIHwgQzIqWjYrQzYqWjE0IHwgQzIqWjcrQzYqWjE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgczAgfCBzNCB8IHM4IHwgczEyIHwgczIgfCBzNiB8IHMxMCB8IHMxNAotCi0gICAgICAgIHZxc3ViLnMxNiAgICAgcTE1LCBxMTEsIHExMiAgICBAIHExNTogQzQqWjAtQzQqWjggfCBDNCpaMS1DNCpaOSB8IEM0KloyLUM0KloxMCB8IEM0KlozLUM0KloxMSB8IEM2Klo0LUMyKloxMiB8IEM2Klo1LUMyKloxMyB8IEM2Klo2LUMyKloxNCB8IEM2Klo3LUMyKloxNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgICAgIHMxIHwgczUgfCBzOSB8IHMxMyB8IHMzIHwgczcgfCBzMTEgfCBzMTUKLQotICAgICAgICB2c3dwICAgICAgICAgIGQyOSwgZDMwICAgICAgICAgQCBxMTQ6IHMwIHwgczQgfCBzOCAgfCBzMTIgfCBzMSB8IHM1IHwgczkgIHwgczEzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNTogczIgfCBzNiB8IHMxMCB8IHMxNCB8IHMzIHwgczcgfCBzMTEgfCBzMTUKLQotICAgICAgICB2cWFkZC5zMTYgICAgIHE4LCBxMTQsIHExNSAgICAgQCBxODogIHgwIHwgeDQgfCB4OCAgfCB4MTIgfCB4MSB8IHg1IHwgeDkgfCB4MTMKLSAgICAgICAgdnFzdWIuczE2ICAgICBxOSwgcTE0LCBxMTUgICAgIEAgcTk6ICB4MyB8IHg3IHwgeDExIHwgeDE1IHwgeDIgfCB4NiB8IHgxMCB8IHgxNAotCi0gICAgICAgIHZtb3YuaTE2ICAgICAgcTEwLCAjMCAgICAgICAgICAgQCBxMTA9WzAwMDAwMDAwMDAwMDAwMDBdCi0gICAgICAgIHZtb3YuaTE2ICAgICAgcTExLCAjMjU1ICAgICAgICBAIHExMT1bRkZGRkZGRkZGRkZGRkZGRl0gKGhleCkKLQotICAgICAgICB2bW92LmkxNiAgICAgIHEwLCAjMTI4ICAgICAgICAgQCBxMCA9IDEyOHwxMjh8MTI4fDEyOHwxMjh8MTI4fDEyOHwxMjgKLQotICAgICAgICB2cWFkZC5zMTYgICAgIHE4LCBxOCwgcTAgICAgICAgQCBBZGQgdGhlIG9mZnNldAotICAgICAgICB2cWFkZC5zMTYgICAgIHE5LCBxOSwgcTAgICAgICAgQCBBZGQgdGhlIG9mZnNldAotCi0gICAgICAgIHZtYXguczE2ICAgICAgcTgsIHE4LCBxMTAgICAgICBAIGNsYW1wID4gMAotICAgICAgICB2bWluLnMxNiAgICAgIHE4LCBxOCwgcTExICAgICAgQCBjbGFtcCA8IDI1NQotCi0gICAgICAgIHZtYXguczE2ICAgICAgcTksIHE5LCBxMTAgICAgICBAIGNsYW1wID4gMAotICAgICAgICB2bWluLnMxNiAgICAgIHE5LCBxOSwgcTExICAgICAgQCBjbGFtcCA8IDI1NQotCi0gICAgICAgIHZzdDEuMTYgICAgICAge2QxNn0sIFtyMV0sIHIyICBAICBkMTY6ICAgeDAgfCB4MSAgfCB4MiAgfCB4MyAgKExTQiB8IE1TQikKLSAgICAgICAgdnN0MS4xNiAgICAgICB7ZDE3fSwgW3IxXSwgcjIgIEAgIGQxNzogICB4NCB8IHg1ICB8IHg2ICB8IHg3ICAoTFNCIHwgTVNCKQotICAgICAgICB2c3QxLjE2ICAgICAgIHtkMTl9LCBbcjFdLCByMiAgQCAgZDE4OiAgIHg4IHwgeDkgIHwgeDEwIHwgeDExIChMU0IgfCBNU0IpCi0gICAgICAgIHZzdDEuMTYgICAgICAge2QxOH0sIFtyMV0sIHIyICBAICBkMTk6ICAgeDEyfCB4MTMgfCB4MTQgfCB4MTUgKExTQiB8IE1TQikKLQotICAgICAgICBieCAgICAgICAgIGxyICAgICAgICAgICAgICAgICAgQCBSZXR1cm4gdG8gY2FsbGVyCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZW5kIG9mIGlkY3RfNHg0X3ZlbnVtCi0KLUA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQCBGVU5DVElPTiAgICAgOiBpZGN0Xzh4OF92ZW51bQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIERJU0NSSVBUSU9OICA6IFZlTnVtIG9wdGltaXphdGlvbiBvZiBvbmUgOHg4IGJsb2NrIGlEQ1QKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBDIFBST1RPVFlQRSAgOiB2b2lkIGlkY3RfOHg4X3ZlbnVtKGludDE2ICogaW5wdXQsCi1AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTYgKiBvdXRwdXQsCi1AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgc3RyaWRlKQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFJFRyBJTlBVVCAgICA6IFIwIHBvaW50ZXIgdG8gaW5wdXQgKGludDE2KQotQCAgICAgICAgICAgICAgICBSMSBwb2ludGVyIHRvIG91dHB1dCAoaW50MTYpCi1AICAgICAgICAgICAgICAgIFIyIGJsb2NrIHN0cmlkZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIFNUQUNLIEFSRyAgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBNRU0gSU5QVVQgICAgOiBOb25lCi1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgUkVHIE9VVFBVVCAgIDogTm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIE1FTSBPVVRQVVQgICA6IE5vbmUKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBSRUcgQUZGRUNURUQgOiBSMCAtIFI5Ci1ALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAgU1RBQ0sgVVNBR0UgIDogbm9uZQotQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AIENZQ0xFUyAgICAgICA6IDE3NyBjeWNsZXMKLUAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCBOT1RFUyAgICAgICAgOgotQAotQCBJdCB3YXMgdGVzdGVkIHRvIGJlIElFRUUgMTE4MCBjb21wbGlhbnQuIFNpbmNlIElFRUUgMTE4MCBjb21wbGlhbmNlIGlzIG1vcmUgc3RyaW5nZW50Ci1AIHRoYW4gTVBFRy00IGNvbXBsaWFuY2UsIHRoaXMgdmVyc2lvbiBpcyBhbHNvIE1QRUctNCBjb21wbGlhbnQuCi1ACi1AIENPREUgU1RSVUNUVVJFOgotQCAoaSkgICBNYWNyb3MgZm9yIHRyYW5zcG9zaW5nIGFuIDh4OCBtYXRyaXggYW5kIGZvciBjb25maWd1cmluZyB0aGUgVkZQIHVuaXQgYXJlIGRlZmluZWQuCi1AIChpaSkgIE1hY3JvIGZvciBJRENUIGluIG9uZSBkaW1lbnNpb24gaXMgZGVmaW5lZCBhcyBmb3VyIHN0YWdlcwotQCAoaWlpKSBUaGUgdHdvIGRpbWVuc2lvbmFsIGNvZGUgYmVnaW5zCi1AIChpdikgIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgYXJlYSBEYXRhQXJlYQotQAotQCBQUk9HUkFNIEZMT1c6Ci1ACi1AIFRoZSBWRlAgaXMgY29uZmlndXJlZAotQCBUaGUgcGFyYW1ldGVycyB0byBJRENUIGFyZSBsb2FkZWQKLUAgdGhlIGNvZWZmaWNpZW50cyBhcmUgbG9hZGVkCi1AIGxvb3A6Ci1AICAgIGRlY3JlbWVudCBsb29wIGNvdW50ZXIKLUAgICAgVGhlIGZpcnN0IGlucHV0IE1hdHJpeCBpcyBsb2FkZWQgYW5kIHByZS1zY2FsZWQKLUAgICAgVGhlIGlucHV0IGlzIHByZXNjYWxlZCB1c2luZyB0aGUgY29uc3RhbnRzCi1AICAgIElEQ1QgaXMgcGVyZm9ybWVkIGluIG9uZSBkaW1lbnNpb24gb24gdGhlIDggY29sdW1ucwotQCAgICBUaGUgbWF0cml4IGlzIHRyYW5zcG9zZWQKLUAgICAgQSBiaWFzIGlzIGxvYWRlZCBhbiBhZGRlZCB0byB0aGUgbWF0cml4Ci1AICAgIElEQ1QgaXMgcGVyZm9ybWVkIGluIG9uZSBkaW1lbnNpb24gb24gdGhlIDggcm93cwotQCAgICBUaGUgbWF0cml4IGlzIHBvc3Qtc2NhbGVkCi1AICAgIFRoZSBtYXRyaXggaXMgc2F2ZWQKLUAgICAgdGVzdCBsb29wIGNvdW50ZXIgYW5kIGxvb3AgaWYgZ3JlYXRlciB0aGFuIHplcm8KLUAgc3RvcAotQAotQAotQCBBUk0gUkVHSVNURVIgQUxMT0NBVElPTgotQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgcjAgOiBwb2ludGVyIHRvIGlucHV0IGRhdGEKLUAgcjEgOiBwb2ludGVyIHRvIG91dHB1dCBhcmUKLUAgcjIgOiBzdHJpZGUgaW4gdGhlIG91dHB1dCBidWZmZXIKLUAgcjMgOgotQCByNCA6Ci1AIHI1IDogcG9pbnRlciB0byBjb25zdGFudHNbMF0gWzVdCi1AIHI2IDogcG9pbnRlciB0byBjb25zdGFudHNbMV0KLUAgcjcgOiBwb2ludGVyIHRvIGNvbnN0YW50c1syXQotQCByOCA6IHBvaW50ZXIgdG8gY29uc3RhbnRzWzNdCi1AIHI5IDogcG9pbnRlciB0byBjb25zdGFudHNbNF0KLUAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQAotQCBWRU5VTSBSRUdJU1RFUiBBTExPQ0FUSU9OCi1AID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUAgcTAgICAgIDogY29uc3RhbnRzWzBdCi1AIHExICAgICA6IGNvbnN0YW50c1sxXQotQCBxMiAgICAgOiBjb25zdGFudHNbMl0sIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHEzICAgICA6IGNvbnN0YW50c1szXSwgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTQgICAgIDogY29uc3RhbnRzWzRdLCBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaCwgYW5kIGJpYXMgY29tcGVuc2F0aW9uCi1AIHE1ICAgICA6ICAgICAgICAgICAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTYgICAgIDogICAgICAgICAgICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxNyAgICAgOiAgICAgICAgICAgICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHE4ICAgICA6IE1hdHJpeFswXSAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTkgICAgIDogTWF0cml4WzFdICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxMTAgICAgOiBNYXRyaXhbMl0gICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHExMSAgICA6IE1hdHJpeFszXSAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTEyICAgIDogTWF0cml4WzRdICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQCBxMTMgICAgOiBNYXRyaXhbNV0gICAgIElEQ1QxRCBpbi1wbGFjZSBzY3JhdGNoCi1AIHExNCAgICA6IE1hdHJpeFs2XSAgICAgSURDVDFEIGluLXBsYWNlIHNjcmF0Y2gKLUAgcTE1ICAgIDogTWF0cml4WzddICAgICBJRENUMUQgaW4tcGxhY2Ugc2NyYXRjaAotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0udHlwZSBpZGN0Xzh4OF92ZW51bSwgJWZ1bmN0aW9uCi1pZGN0Xzh4OF92ZW51bToKLQotICAgICAgICBwdXNoIHtyNS1yOX0KLSAgICAgICAgdnB1c2gge2Q4LWQxNX0KLSAgICAgICAgSURDVF9FTlRSWQotICAgICAgICBCSUdfQk9EWV9UUkFOU1BPU0VfSU5QVVQKLSAgICAgICAgdnBvcCB7ZDgtZDE1fQotICAgICAgICBwb3AgIHtyNS1yOX0KLSAgICAgICAgYnggICBscgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBlbmQgb2YgaWRjdF84eDhfdmVudW0KLQotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1AIENvbnN0YW50cyBEZWZpbml0aW9uIEFSRUE6IGRlZmluZSBpZGN0IGtlcm5lbCwgYmlhcwotQD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLnNlY3Rpb24gcm9fZGF0YV9hcmVhICAgICAgICAgICAgICBAIEFSRUEgIFJPRGF0YUFyZWEKLSAgICAuZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgREFUQSwgUkVBRE9OTFkKLSAgICAuYWxpZ24gNSAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQUxJR049NQotCi1jb25zdGFudHM6Ci0gICAgICAgIC5od29yZCAgMjMxNzAsIDEzNTczLCA2NTE4LCAgMjE4OTUsIC0yMzE3MCwgLTIxODk1LCA4MjIzLCAgODIyNAotICAgICAgICAuaHdvcmQgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgIDE5MjY2LCAgMjE0MDcsIDIyNzI1Ci0gICAgICAgIC5od29yZCAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAgMjY3MjIsICAyOTY5MiwgMzE1MjEKLSAgICAgICAgLmh3b3JkICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsICAyNTE3MiwgIDI3OTY5LCAyOTY5MgotICAgICAgICAuaHdvcmQgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgIDIyNjU0LCAgMjUxNzIsIDI2NzIyCi0gICAgICAgIC5od29yZCAgICAgIDAsICAgMjU1LCAgICAgMCwgICAgIDAKLQotY29lZmZpY2llbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBUaGVzZSBhcmUgdGhlIGNvZWZmaWNlbnQgdXNlZCBieSA0eDQgaURDVCBpbiBRMTUgZm9ybWF0Ci0gICAgICAgIC5od29yZCAxMTU4NSwgMTUxMzcsICAxMTU4NSwgIDYyNzAsIDExNTg1LCAxNTEzNywgIDExNTg1LCAgNjI3MCAgQCBDNCwgQzIsIEM0LCBDNiwgQzQsIEMyLCBDNCwgQzYgLzIKLSAgICAgICAgLmh3b3JkIDExNTg1LCAgNjI3MCwgIDExNTg1LCAxNTEzNywgMTE1ODUsICA2MjcwLCAgMTE1ODUsIDE1MTM3ICBAIEM0LCBDNiwgQzQsIEMyLCBDNCwgQzYsIEM0LCBDMiAvMgotICAgICAgICAuaHdvcmQgMTE1ODUsIDExNTg1LCAgMTE1ODUsIDExNTg1LCAxNTEzNywgMTUxMzcsICAxNTEzNywgMTUxMzcgIEAgQzQsIEM0LCBDNCwgQzQsIEMyLCBDMiwgQzIsIEMyIC8yCi0gICAgICAgIC5od29yZCAxMTU4NSwgMTE1ODUsICAxMTU4NSwgMTE1ODUsICA2MjcwLCAgNjI3MCwgICA2MjcwLCAgNjI3MCAgQCBDNCwgQzQsIEM0LCBDNCwgQzYsIEM2LCBDNiwgQzYgLzIKLQotLmVuZApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY2RlcnJvci5oIGIvbGlianBlZ3R3cnAvY2RlcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQzNWUxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2NkZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogY2RlcnJvci5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZXJyb3IgYW5kIG1lc3NhZ2UgY29kZXMgZm9yIHRoZSBjanBlZy9kanBlZwotICogYXBwbGljYXRpb25zLiAgVGhlc2Ugc3RyaW5ncyBhcmUgbm90IG5lZWRlZCBhcyBwYXJ0IG9mIHRoZSBKUEVHIGxpYnJhcnkKLSAqIHByb3Blci4KLSAqIEVkaXQgdGhpcyBmaWxlIHRvIGFkZCBuZXcgY29kZXMsIG9yIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBzdHJpbmdzIHRvCi0gKiBzb21lIG90aGVyIGxhbmd1YWdlLgotICovCi0KLS8qCi0gKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0Ci0gKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0Ci0gKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KLSAqLwotI2lmbmRlZiBKTUVTU0FHRQotI2lmbmRlZiBDREVSUk9SX0gKLSNkZWZpbmUgQ0RFUlJPUl9ICi0vKiBGaXJzdCB0aW1lIHRocm91Z2gsIGRlZmluZSB0aGUgZW51bSBsaXN0ICovCi0jZGVmaW5lIEpNQUtFX0VOVU1fTElTVAotI2Vsc2UKLS8qIFJlcGVhdGVkIGluY2x1c2lvbnMgb2YgdGhpcyBmaWxlIGFyZSBuby1vcHMgdW5sZXNzIEpNRVNTQUdFIGlzIGRlZmluZWQgKi8KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCi0jZW5kaWYgLyogQ0RFUlJPUl9IICovCi0jZW5kaWYgLyogSk1FU1NBR0UgKi8KLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi10eXBlZGVmIGVudW0gewotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKLQotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi1KTUVTU0FHRShKTVNHX0ZJUlNUQURET05DT0RFPTEwMDAsIE5VTEwpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCi0KLSNpZmRlZiBCTVBfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX0JNUF9CQURDTUFQLCAiVW5zdXBwb3J0ZWQgQk1QIGNvbG9ybWFwIGZvcm1hdCIpCi1KTUVTU0FHRShKRVJSX0JNUF9CQURERVBUSCwgIk9ubHkgOC0gYW5kIDI0LWJpdCBCTVAgZmlsZXMgYXJlIHN1cHBvcnRlZCIpCi1KTUVTU0FHRShKRVJSX0JNUF9CQURIRUFERVIsICJJbnZhbGlkIEJNUCBmaWxlOiBiYWQgaGVhZGVyIGxlbmd0aCIpCi1KTUVTU0FHRShKRVJSX0JNUF9CQURQTEFORVMsICJJbnZhbGlkIEJNUCBmaWxlOiBiaVBsYW5lcyBub3QgZXF1YWwgdG8gMSIpCi1KTUVTU0FHRShKRVJSX0JNUF9DT0xPUlNQQUNFLCAiQk1QIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSkVSUl9CTVBfQ09NUFJFU1NFRCwgIlNvcnJ5LCBjb21wcmVzc2VkIEJNUHMgbm90IHlldCBzdXBwb3J0ZWQiKQotSk1FU1NBR0UoSkVSUl9CTVBfTk9ULCAiTm90IGEgQk1QIGZpbGUgLSBkb2VzIG5vdCBzdGFydCB3aXRoIEJNIikKLUpNRVNTQUdFKEpUUkNfQk1QLCAiJXV4JXUgMjQtYml0IEJNUCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0JNUF9NQVBQRUQsICIldXgldSA4LWJpdCBjb2xvcm1hcHBlZCBCTVAgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19CTVBfT1MyLCAiJXV4JXUgMjQtYml0IE9TMiBCTVAgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19CTVBfT1MyX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIE9TMiBCTVAgaW1hZ2UiKQotI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIEdJRl9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfR0lGX0JVRywgIkdJRiBvdXRwdXQgZ290IGNvbmZ1c2VkIikKLUpNRVNTQUdFKEpFUlJfR0lGX0NPREVTSVpFLCAiQm9ndXMgR0lGIGNvZGVzaXplICVkIikKLUpNRVNTQUdFKEpFUlJfR0lGX0NPTE9SU1BBQ0UsICJHSUYgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCi1KTUVTU0FHRShKRVJSX0dJRl9JTUFHRU5PVEZPVU5ELCAiVG9vIGZldyBpbWFnZXMgaW4gR0lGIGZpbGUiKQotSk1FU1NBR0UoSkVSUl9HSUZfTk9ULCAiTm90IGEgR0lGIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19HSUYsICIldXgldXglZCBHSUYgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19HSUZfQkFEVkVSU0lPTiwKLQkgIldhcm5pbmc6IHVuZXhwZWN0ZWQgR0lGIHZlcnNpb24gbnVtYmVyICclYyVjJWMnIikKLUpNRVNTQUdFKEpUUkNfR0lGX0VYVEVOU0lPTiwgIklnbm9yaW5nIEdJRiBleHRlbnNpb24gYmxvY2sgb2YgdHlwZSAweCUwMngiKQotSk1FU1NBR0UoSlRSQ19HSUZfTk9OU1FVQVJFLCAiQ2F1dGlvbjogbm9uc3F1YXJlIHBpeGVscyBpbiBpbnB1dCIpCi1KTUVTU0FHRShKV1JOX0dJRl9CQUREQVRBLCAiQ29ycnVwdCBkYXRhIGluIEdJRiBmaWxlIikKLUpNRVNTQUdFKEpXUk5fR0lGX0NIQVIsICJCb2d1cyBjaGFyIDB4JTAyeCBpbiBHSUYgZmlsZSwgaWdub3JpbmciKQotSk1FU1NBR0UoSldSTl9HSUZfRU5EQ09ERSwgIlByZW1hdHVyZSBlbmQgb2YgR0lGIGltYWdlIikKLUpNRVNTQUdFKEpXUk5fR0lGX05PTU9SRURBVEEsICJSYW4gb3V0IG9mIEdJRiBiaXRzIikKLSNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQUE1fU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1BQTV9DT0xPUlNQQUNFLCAiUFBNIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSkVSUl9QUE1fTk9OTlVNRVJJQywgIk5vbm51bWVyaWMgZGF0YSBpbiBQUE0gZmlsZSIpCi1KTUVTU0FHRShKRVJSX1BQTV9OT1QsICJOb3QgYSBQUE0vUEdNIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19QR00sICIldXgldSBQR00gaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19QR01fVEVYVCwgIiV1eCV1IHRleHQgUEdNIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfUFBNLCAiJXV4JXUgUFBNIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfUFBNX1RFWFQsICIldXgldSB0ZXh0IFBQTSBpbWFnZSIpCi0jZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotSk1FU1NBR0UoSkVSUl9STEVfQkFERVJST1IsICJCb2d1cyBlcnJvciBjb2RlIGZyb20gUkxFIGxpYnJhcnkiKQotSk1FU1NBR0UoSkVSUl9STEVfQ09MT1JTUEFDRSwgIlJMRSBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKLUpNRVNTQUdFKEpFUlJfUkxFX0RJTUVOU0lPTlMsICJJbWFnZSBkaW1lbnNpb25zICgldXgldSkgdG9vIGxhcmdlIGZvciBSTEUiKQotSk1FU1NBR0UoSkVSUl9STEVfRU1QVFksICJFbXB0eSBSTEUgZmlsZSIpCi1KTUVTU0FHRShKRVJSX1JMRV9FT0YsICJQcmVtYXR1cmUgRU9GIGluIFJMRSBoZWFkZXIiKQotSk1FU1NBR0UoSkVSUl9STEVfTUVNLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgUkxFIGhlYWRlciIpCi1KTUVTU0FHRShKRVJSX1JMRV9OT1QsICJOb3QgYW4gUkxFIGZpbGUiKQotSk1FU1NBR0UoSkVSUl9STEVfVE9PTUFOWUNIQU5ORUxTLCAiQ2Fubm90IGhhbmRsZSAlZCBvdXRwdXQgY2hhbm5lbHMgZm9yIFJMRSIpCi1KTUVTU0FHRShKRVJSX1JMRV9VTlNVUFBPUlRFRCwgIkNhbm5vdCBoYW5kbGUgdGhpcyBSTEUgc2V0dXAiKQotSk1FU1NBR0UoSlRSQ19STEUsICIldXgldSBmdWxsLWNvbG9yIFJMRSBmaWxlIikKLUpNRVNTQUdFKEpUUkNfUkxFX0ZVTExNQVAsICIldXgldSBmdWxsLWNvbG9yIFJMRSBmaWxlIHdpdGggbWFwIG9mIGxlbmd0aCAlZCIpCi1KTUVTU0FHRShKVFJDX1JMRV9HUkFZLCAiJXV4JXUgZ3JheXNjYWxlIFJMRSBmaWxlIikKLUpNRVNTQUdFKEpUUkNfUkxFX01BUEdSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKLUpNRVNTQUdFKEpUUkNfUkxFX01BUFBFRCwgIiV1eCV1IGNvbG9ybWFwcGVkIFJMRSBmaWxlIHdpdGggbWFwIG9mIGxlbmd0aCAlZCIpCi0jZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1RHQV9CQURDTUFQLCAiVW5zdXBwb3J0ZWQgVGFyZ2EgY29sb3JtYXAgZm9ybWF0IikKLUpNRVNTQUdFKEpFUlJfVEdBX0JBRFBBUk1TLCAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBUYXJnYSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfVEdBX0NPTE9SU1BBQ0UsICJUYXJnYSBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKLUpNRVNTQUdFKEpUUkNfVEdBLCAiJXV4JXUgUkdCIFRhcmdhIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfVEdBX0dSQVksICIldXgldSBncmF5c2NhbGUgVGFyZ2EgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19UR0FfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgVGFyZ2EgaW1hZ2UiKQotI2Vsc2UKLUpNRVNTQUdFKEpFUlJfVEdBX05PVENPTVAsICJUYXJnYSBzdXBwb3J0IHdhcyBub3QgY29tcGlsZWQiKQotI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLwotCi1KTUVTU0FHRShKRVJSX0JBRF9DTUFQX0ZJTEUsCi0JICJDb2xvciBtYXAgZmlsZSBpcyBpbnZhbGlkIG9yIG9mIHVuc3VwcG9ydGVkIGZvcm1hdCIpCi1KTUVTU0FHRShKRVJSX1RPT19NQU5ZX0NPTE9SUywKLQkgIk91dHB1dCBmaWxlIGZvcm1hdCBjYW5ub3QgaGFuZGxlICVkIGNvbG9ybWFwIGVudHJpZXMiKQotSk1FU1NBR0UoSkVSUl9VTkdFVENfRkFJTEVELCAidW5nZXRjIGZhaWxlZCIpCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULAotCSAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IC0tLSBwZXJoYXBzIHlvdSBuZWVkIC10YXJnYSIpCi0jZWxzZQotSk1FU1NBR0UoSkVSUl9VTktOT1dOX0ZPUk1BVCwgIlVucmVjb2duaXplZCBpbnB1dCBmaWxlIGZvcm1hdCIpCi0jZW5kaWYKLUpNRVNTQUdFKEpFUlJfVU5TVVBQT1JURURfRk9STUFULCAiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0IikKLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi0gIEpNU0dfTEFTVEFERE9OQ09ERQotfSBBRERPTl9NRVNTQUdFX0NPREU7Ci0KLSN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKLSNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KLQotLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCi0jdW5kZWYgSk1FU1NBR0UKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2NkanBlZy5jIGIvbGlianBlZ3R3cnAvY2RqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjUwZmYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY2RqcGVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIGNkanBlZy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIHN1cHBvcnQgcm91dGluZXMgdXNlZCBieSB0aGUgSUpHIGFwcGxpY2F0aW9uCi0gKiBwcm9ncmFtcyAoY2pwZWcsIGRqcGVnLCBqcGVndHJhbikuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3VwcGVyKCksIHRvbG93ZXIoKSAqLwotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSNpbmNsdWRlIDxzaWduYWwuaD4JCS8qIHRvIGRlY2xhcmUgc2lnbmFsKCkgKi8KLSNlbmRpZgotI2lmZGVmIFVTRV9TRVRNT0RFCi0jaW5jbHVkZSA8ZmNudGwuaD4JCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpJ3MgcGFyYW1ldGVyIG1hY3JvcyAqLwotLyogSWYgeW91IGhhdmUgc2V0bW9kZSgpIGJ1dCBub3QgPGlvLmg+LCBqdXN0IGRlbGV0ZSB0aGlzIGxpbmU6ICovCi0jaW5jbHVkZSA8aW8uaD4JCQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFNpZ25hbCBjYXRjaGVyIHRvIGVuc3VyZSB0aGF0IHRlbXBvcmFyeSBmaWxlcyBhcmUgcmVtb3ZlZCBiZWZvcmUgYWJvcnRpbmcuCi0gKiBOQjogZm9yIEFtaWdhIE1hbnggQyB0aGlzIGlzIGFjdHVhbGx5IGEgZ2xvYmFsIHJvdXRpbmUgbmFtZWQgX2Fib3J0KCk7Ci0gKiB3ZSBwdXQgIiNkZWZpbmUgc2lnbmFsX2NhdGNoZXIgX2Fib3J0IiBpbiBqY29uZmlnLmguICBUYWxrIGFib3V0IGJvZ3VzLi4uCi0gKi8KLQotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLQotc3RhdGljIGpfY29tbW9uX3B0ciBzaWdfY2luZm87Ci0KLXZvaWQJCQkJLyogbXVzdCBiZSBnbG9iYWwgZm9yIE1hbnggQyAqLwotc2lnbmFsX2NhdGNoZXIgKGludCBzaWdudW0pCi17Ci0gIGlmIChzaWdfY2luZm8gIT0gTlVMTCkgewotICAgIGlmIChzaWdfY2luZm8tPmVyciAhPSBOVUxMKSAvKiB0dXJuIG9mZiB0cmFjZSBvdXRwdXQgKi8KLSAgICAgIHNpZ19jaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0gICAganBlZ19kZXN0cm95KHNpZ19jaW5mbyk7CS8qIGNsZWFuIHVwIG1lbW9yeSBhbGxvY2F0aW9uICYgdGVtcCBmaWxlcyAqLwotICB9Ci0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi1HTE9CQUwodm9pZCkKLWVuYWJsZV9zaWduYWxfY2F0Y2hlciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBzaWdfY2luZm8gPSBjaW5mbzsKLSNpZmRlZiBTSUdJTlQJCQkvKiBub3QgYWxsIHN5c3RlbXMgaGF2ZSBTSUdJTlQgKi8KLSAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2NhdGNoZXIpOwotI2VuZGlmCi0jaWZkZWYgU0lHVEVSTQkJCS8qIG5vdCBhbGwgc3lzdGVtcyBoYXZlIFNJR1RFUk0gKi8KLSAgc2lnbmFsKFNJR1RFUk0sIHNpZ25hbF9jYXRjaGVyKTsKLSNlbmRpZgotfQotCi0jZW5kaWYKLQotCi0vKgotICogT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvcjogZGlzcGxheSBhIHBlcmNlbnQtZG9uZSBmaWd1cmUgb24gc3RkZXJyLgotICovCi0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLQotTUVUSE9EREVGKHZvaWQpCi1wcm9ncmVzc19tb25pdG9yIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGNkX3Byb2dyZXNzX3B0ciBwcm9nID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotICBpbnQgdG90YWxfcGFzc2VzID0gcHJvZy0+cHViLnRvdGFsX3Bhc3NlcyArIHByb2ctPnRvdGFsX2V4dHJhX3Bhc3NlczsKLSAgaW50IHBlcmNlbnRfZG9uZSA9IChpbnQpIChwcm9nLT5wdWIucGFzc19jb3VudGVyKjEwMEwvcHJvZy0+cHViLnBhc3NfbGltaXQpOwotCi0gIGlmIChwZXJjZW50X2RvbmUgIT0gcHJvZy0+cGVyY2VudF9kb25lKSB7Ci0gICAgcHJvZy0+cGVyY2VudF9kb25lID0gcGVyY2VudF9kb25lOwotICAgIGlmICh0b3RhbF9wYXNzZXMgPiAxKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlxyUGFzcyAlZC8lZDogJTNkJSUgIiwKLQkgICAgICBwcm9nLT5wdWIuY29tcGxldGVkX3Bhc3NlcyArIHByb2ctPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMgKyAxLAotCSAgICAgIHRvdGFsX3Bhc3NlcywgcGVyY2VudF9kb25lKTsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50ZihzdGRlcnIsICJcciAlM2QlJSAiLCBwZXJjZW50X2RvbmUpOwotICAgIH0KLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgfQotfQotCi0KLUdMT0JBTCh2b2lkKQotc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvciAoal9jb21tb25fcHRyIGNpbmZvLCBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MpCi17Ci0gIC8qIEVuYWJsZSBwcm9ncmVzcyBkaXNwbGF5LCB1bmxlc3MgdHJhY2Ugb3V0cHV0IGlzIG9uICovCi0gIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9PSAwKSB7Ci0gICAgcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yID0gcHJvZ3Jlc3NfbW9uaXRvcjsKLSAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcyA9IDA7Ci0gICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcyA9IDA7Ci0gICAgcHJvZ3Jlc3MtPnBlcmNlbnRfZG9uZSA9IC0xOwotICAgIGNpbmZvLT5wcm9ncmVzcyA9ICZwcm9ncmVzcy0+cHViOwotICB9Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1lbmRfcHJvZ3Jlc3NfbW9uaXRvciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBDbGVhciBhd2F5IHByb2dyZXNzIGRpc3BsYXkgKi8KLSAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID09IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxyICAgICAgICAgICAgICAgIFxyIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gIH0KLX0KLQotI2VuZGlmCi0KLQotLyoKLSAqIENhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb2YgcG9zc2libHktYWJicmV2aWF0ZWQga2V5d29yZCBzd2l0Y2hlcy4KLSAqIGtleXdvcmQgaXMgdGhlIGNvbnN0YW50IGtleXdvcmQgKG11c3QgYmUgbG93ZXIgY2FzZSBhbHJlYWR5KSwKLSAqIG1pbmNoYXJzIGlzIGxlbmd0aCBvZiBtaW5pbXVtIGxlZ2FsIGFiYnJldmlhdGlvbi4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWtleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQotewotICByZWdpc3RlciBpbnQgY2EsIGNrOwotICByZWdpc3RlciBpbnQgbm1hdGNoZWQgPSAwOwotCi0gIHdoaWxlICgoY2EgPSAqYXJnKyspICE9ICdcMCcpIHsKLSAgICBpZiAoKGNrID0gKmtleXdvcmQrKykgPT0gJ1wwJykKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIGFyZyBsb25nZXIgdGhhbiBrZXl3b3JkLCBubyBnb29kICovCi0gICAgaWYgKGlzdXBwZXIoY2EpKQkJLyogZm9yY2UgYXJnIHRvIGxjYXNlIChhc3N1bWUgY2sgaXMgYWxyZWFkeSkgKi8KLSAgICAgIGNhID0gdG9sb3dlcihjYSk7Ci0gICAgaWYgKGNhICE9IGNrKQotICAgICAgcmV0dXJuIEZBTFNFOwkJLyogbm8gZ29vZCAqLwotICAgIG5tYXRjaGVkKys7CQkJLyogY291bnQgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCi0gIH0KLSAgLyogcmVhY2hlZCBlbmQgb2YgYXJndW1lbnQ7IGZhaWwgaWYgaXQncyB0b28gc2hvcnQgZm9yIHVuaXF1ZSBhYmJyZXYgKi8KLSAgaWYgKG5tYXRjaGVkIDwgbWluY2hhcnMpCi0gICAgcmV0dXJuIEZBTFNFOwotICByZXR1cm4gVFJVRTsJCQkvKiBBLU9LICovCi19Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIGVzdGFibGlzaCBiaW5hcnkgSS9PIG1vZGUgZm9yIHN0ZGluIGFuZCBzdGRvdXQuCi0gKiBOb24tVW5peCBzeXN0ZW1zIG9mdGVuIHJlcXVpcmUgc29tZSBoYWNraW5nIHRvIGdldCBvdXQgb2YgdGV4dCBtb2RlLgotICovCi0KLUdMT0JBTChGSUxFICopCi1yZWFkX3N0ZGluICh2b2lkKQotewotICBGSUxFICogaW5wdXRfZmlsZSA9IHN0ZGluOwotCi0jaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCi0gIHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLwotICBpZiAoKGlucHV0X2ZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVvcGVuIHN0ZGluXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gaW5wdXRfZmlsZTsKLX0KLQotCi1HTE9CQUwoRklMRSAqKQotd3JpdGVfc3Rkb3V0ICh2b2lkKQotewotICBGSUxFICogb3V0cHV0X2ZpbGUgPSBzdGRvdXQ7Ci0KLSNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KLSAgc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLwotICBpZiAoKG91dHB1dF9maWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVvcGVuIHN0ZG91dFxuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIG91dHB1dF9maWxlOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY2RqcGVnLmggYi9saWJqcGVndHdycC9jZGpwZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzODdiNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9jZGpwZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogY2RqcGVnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucwotICogY2pwZWcgYW5kIGRqcGVnLiAgSXQgaXMgTk9UIHVzZWQgYnkgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LgotICovCi0KLSNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiBkZWZpbmUgcHJvcGVyIG9wdGlvbnMgaW4gamNvbmZpZy5oICovCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUwkvKiBjanBlZy5jLGRqcGVnLmMgbmVlZCB0byBzZWUgeHh4X1NVUFBPUlRFRCAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImplcnJvci5oIgkJLyogZ2V0IGxpYnJhcnkgZXJyb3IgY29kZXMgdG9vICovCi0jaW5jbHVkZSAiY2RlcnJvci5oIgkJLyogZ2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIGNvZGVzICovCi0KLQotLyoKLSAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGNqcGVnJ3Mgc291cmNlIGZpbGUgZGVjb2RpbmcgbW9kdWxlcwotICovCi0KLXR5cGVkZWYgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgKiBjanBlZ19zb3VyY2VfcHRyOwotCi1zdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLSAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOwotCi0gIEZJTEUgKmlucHV0X2ZpbGU7Ci0KLSAgSlNBTVBBUlJBWSBidWZmZXI7Ci0gIEpESU1FTlNJT04gYnVmZmVyX2hlaWdodDsKLX07Ci0KLQotLyoKLSAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGRqcGVnJ3Mgb3V0cHV0IGZpbGUgZW5jb2RpbmcgbW9kdWxlcwotICovCi0KLXR5cGVkZWYgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0ICogZGpwZWdfZGVzdF9wdHI7Ci0KLXN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCB7Ci0gIC8qIHN0YXJ0X291dHB1dCBpcyBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzIGZpbmlzaGVzLgotICAgKiBUaGUgY29sb3IgbWFwIHdpbGwgYmUgcmVhZHkgYXQgdGhpcyB0aW1lLCBpZiBvbmUgaXMgbmVlZGVkLgotICAgKi8KLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKSk7Ci0gIC8qIEVtaXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGl4ZWwgcm93cyBmcm9tIHRoZSBidWZmZXIuICovCi0gIEpNRVRIT0Qodm9pZCwgcHV0X3BpeGVsX3Jvd3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKSk7Ci0gIC8qIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQlkanBlZ19kZXN0X3B0ciBkaW5mbykpOwotCi0gIC8qIFRhcmdldCBmaWxlIHNwZWM7IGZpbGxlZCBpbiBieSBkanBlZy5jIGFmdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAqLwotICBGSUxFICogb3V0cHV0X2ZpbGU7Ci0KLSAgLyogT3V0cHV0IHBpeGVsLXJvdyBidWZmZXIuICBDcmVhdGVkIGJ5IG1vZHVsZSBpbml0IG9yIHN0YXJ0X291dHB1dC4KLSAgICogV2lkdGggaXMgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgICogaGVpZ2h0IGlzIGJ1ZmZlcl9oZWlnaHQuCi0gICAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcjsKLSAgSkRJTUVOU0lPTiBidWZmZXJfaGVpZ2h0OwotfTsKLQotCi0vKgotICogY2pwZWcvZGpwZWcgbWF5IG5lZWQgdG8gcGVyZm9ybSBleHRyYSBwYXNzZXMgdG8gY29udmVydCB0byBvciBmcm9tCi0gKiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGZpbGUgZm9ybWF0LiAgVGhlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBrbm93Ci0gKiBhYm91dCB0aGVzZSBwYXNzZXMsIGJ1dCB3ZSdkIGxpa2UgdGhlbSB0byBiZSBjb3VudGVkIGJ5IHRoZSBwcm9ncmVzcwotICogbW9uaXRvci4gIFdlIHVzZSBhbiBleHBhbmRlZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdCB0byBob2xkIHRoZQotICogYWRkaXRpb25hbCBwYXNzIGNvdW50LgotICovCi0KLXN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHsKLSAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHB1YjsJLyogZmllbGRzIGtub3duIHRvIEpQRUcgbGlicmFyeSAqLwotICBpbnQgY29tcGxldGVkX2V4dHJhX3Bhc3NlczsJLyogZXh0cmEgcGFzc2VzIGNvbXBsZXRlZCAqLwotICBpbnQgdG90YWxfZXh0cmFfcGFzc2VzOwkvKiB0b3RhbCBleHRyYSAqLwotICAvKiBsYXN0IHByaW50ZWQgcGVyY2VudGFnZSBzdG9yZWQgaGVyZSB0byBhdm9pZCBtdWx0aXBsZSBwcmludG91dHMgKi8KLSAgaW50IHBlcmNlbnRfZG9uZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgKiBjZF9wcm9ncmVzc19wdHI7Ci0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGppbml0X3JlYWRfYm1wCQlqSVJkQk1QCi0jZGVmaW5lIGppbml0X3dyaXRlX2JtcAkJaklXckJNUAotI2RlZmluZSBqaW5pdF9yZWFkX2dpZgkJaklSZEdJRgotI2RlZmluZSBqaW5pdF93cml0ZV9naWYJCWpJV3JHSUYKLSNkZWZpbmUgamluaXRfcmVhZF9wcG0JCWpJUmRQUE0KLSNkZWZpbmUgamluaXRfd3JpdGVfcHBtCQlqSVdyUFBNCi0jZGVmaW5lIGppbml0X3JlYWRfcmxlCQlqSVJkUkxFCi0jZGVmaW5lIGppbml0X3dyaXRlX3JsZQkJaklXclJMRQotI2RlZmluZSBqaW5pdF9yZWFkX3RhcmdhCWpJUmRUYXJnYQotI2RlZmluZSBqaW5pdF93cml0ZV90YXJnYQlqSVdyVGFyZ2EKLSNkZWZpbmUgcmVhZF9xdWFudF90YWJsZXMJUmRRVGFibGVzCi0jZGVmaW5lIHJlYWRfc2Nhbl9zY3JpcHQJUmRTY25TY3JpcHQKLSNkZWZpbmUgc2V0X3F1YW50X3Nsb3RzCQlTZXRRU2xvdHMKLSNkZWZpbmUgc2V0X3NhbXBsZV9mYWN0b3JzCVNldFNGYWN0cwotI2RlZmluZSByZWFkX2NvbG9yX21hcAkJUmRDTWFwCi0jZGVmaW5lIGVuYWJsZV9zaWduYWxfY2F0Y2hlcglFblNpZ0NhdGNoZXIKLSNkZWZpbmUgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcglTdFByb2dNb24KLSNkZWZpbmUgZW5kX3Byb2dyZXNzX21vbml0b3IJRW5Qcm9nTW9uCi0jZGVmaW5lIHJlYWRfc3RkaW4JCVJkU3RkaW4KLSNkZWZpbmUgd3JpdGVfc3Rkb3V0CQlXclN0ZG91dAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogTW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lcyBmb3IgSS9PIG1vZHVsZXMuICovCi0KLUVYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX2JtcCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX2JtcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBib29sZWFuIGlzX29zMikpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfZ2lmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfZ2lmIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcHBtIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcHBtIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcmxlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfdGFyZ2EgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV90YXJnYSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogY2pwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRzd2l0Y2guYykgKi8KLQotRVhURVJOKGJvb2xlYW4pIHJlYWRfcXVhbnRfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKLQkJCQkgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKGJvb2xlYW4pIHJlYWRfc2Nhbl9zY3JpcHQgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKSk7Ci1FWFRFUk4oYm9vbGVhbikgc2V0X3F1YW50X3Nsb3RzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOwotRVhURVJOKGJvb2xlYW4pIHNldF9zYW1wbGVfZmFjdG9ycyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpKTsKLQotLyogZGpwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRjb2xtYXAuYykgKi8KLQotRVhURVJOKHZvaWQpIHJlYWRfY29sb3JfbWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkpOwotCi0vKiBjb21tb24gc3VwcG9ydCByb3V0aW5lcyAoaW4gY2RqcGVnLmMpICovCi0KLUVYVEVSTih2b2lkKSBlbmFibGVfc2lnbmFsX2NhdGNoZXIgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBzdGFydF9wcm9ncmVzc19tb25pdG9yIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKSk7Ci1FWFRFUk4odm9pZCkgZW5kX3Byb2dyZXNzX21vbml0b3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBrZXltYXRjaCBKUFAoKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpKTsKLUVYVEVSTihGSUxFICopIHJlYWRfc3RkaW4gSlBQKCh2b2lkKSk7Ci1FWFRFUk4oRklMRSAqKSB3cml0ZV9zdGRvdXQgSlBQKCh2b2lkKSk7Ci0KLS8qIG1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLwotCi0jaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyIgotI2RlZmluZSBXUklURV9CSU5BUlkJInciCi0jZWxzZQotI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgotI2RlZmluZSBXUklURV9CSU5BUlkJIndiIiwgImN0eD1zdG0iCi0jZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKLSNlbmRpZgotI2lmbmRlZiBFWElUX1NVQ0NFU1MKLSNpZmRlZiBWTVMKLSNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2Vsc2UKLSNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCi0jZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBFWElUX1dBUk5JTkcKLSNpZmRlZiBWTVMKLSNkZWZpbmUgRVhJVF9XQVJOSU5HICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2Vsc2UKLSNkZWZpbmUgRVhJVF9XQVJOSU5HICAyCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY2hhbmdlLmxvZyBiL2xpYmpwZWd0d3JwL2NoYW5nZS5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTAyYzAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY2hhbmdlLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi1DSEFOR0UgTE9HIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotCi0KLVZlcnNpb24gNmIgIDI3LU1hci0xOTk4Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1qcGVndHJhbiBoYXMgbmV3IGZlYXR1cmVzIGZvciBsb3NzbGVzcyBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgKHJvdGF0aW9uCi1hbmQgZmxpcHBpbmcpIGFzIHdlbGwgYXMgImxvc3NsZXNzIiByZWR1Y3Rpb24gdG8gZ3JheXNjYWxlLgotCi1qcGVndHJhbiBub3cgY29waWVzIGNvbW1lbnRzIGJ5IGRlZmF1bHQ7IGl0IGhhcyBhIC1jb3B5IHN3aXRjaCB0byBlbmFibGUKLWNvcHlpbmcgYWxsIEFQUG4gYmxvY2tzIGFzIHdlbGwsIG9yIHRvIHN1cHByZXNzIGNvbW1lbnRzLiAgKEZvcm1lcmx5IGl0Ci1hbHdheXMgc3VwcHJlc3NlZCBjb21tZW50cyBhbmQgQVBQbiBibG9ja3MuKSAganBlZ3RyYW4gbm93IGFsc28gcHJlc2VydmVzCi1KRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24uCi0KLU5ldyBkZWNvbXByZXNzb3IgbGlicmFyeSBmZWF0dXJlOiBDT00gYW5kIEFQUG4gbWFya2VycyBmb3VuZCBpbiB0aGUgaW5wdXQKLWZpbGUgY2FuIGJlIHNhdmVkIGluIG1lbW9yeSBmb3IgbGF0ZXIgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIChCZWZvcmUsCi15b3UgaGFkIHRvIGNvZGUgdGhpcyB1cCB5b3Vyc2VsZiB3aXRoIGEgY3VzdG9tIG1hcmtlciBwcm9jZXNzb3IuKQotCi1UaGVyZSBpcyBhbiB1bnVzZWQgZmllbGQgInZvaWQgKiBjbGllbnRfZGF0YSIgbm93IGluIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzCi1wYXJhbWV0ZXIgc3RydWN0czsgdGhpcyBtYXkgYmUgdXNlZnVsIGluIHNvbWUgYXBwbGljYXRpb25zLgotCi1KRklGIHZlcnNpb24gbnVtYmVyIGluZm9ybWF0aW9uIGlzIG5vdyBzYXZlZCBieSB0aGUgZGVjb2RlciBhbmQgYWNjZXB0ZWQgYnkKLXRoZSBlbmNvZGVyLiAganBlZ3RyYW4gdXNlcyB0aGlzIHRvIGNvcHkgdGhlIHNvdXJjZSBmaWxlJ3MgdmVyc2lvbiBudW1iZXIsCi10byBlbnN1cmUgImpwZWd0cmFuIC1jb3B5IGFsbCIgd29uJ3QgY3JlYXRlIGJvZ3VzIGZpbGVzIHRoYXQgY29udGFpbiBKRlhYCi1leHRlbnNpb25zIGJ1dCBjbGFpbSB0byBiZSB2ZXJzaW9uIDEuMDEuICBBcHBsaWNhdGlvbnMgdGhhdCBnZW5lcmF0ZSB0aGVpcgotb3duIEpGWFggZXh0ZW5zaW9uIG1hcmtlcnMgYWxzbyAoZmluYWxseSkgaGF2ZSBhIHN1cHBvcnRlZCB3YXkgdG8gY2F1c2UgdGhlCi1lbmNvZGVyIHRvIGVtaXQgSkZJRiB2ZXJzaW9uIG51bWJlciAxLjAyLgotCi1kanBlZydzIHRyYWNlIG1vZGUgcmVwb3J0cyBKRklGIDEuMDIgdGh1bWJuYWlsIGltYWdlcyBhcyBzdWNoLCByYXRoZXIKLXRoYW4gYXMgdW5rbm93biBBUFAwIG1hcmtlcnMuCi0KLUluIC12ZXJib3NlIG1vZGUsIGRqcGVnIGFuZCByZGpwZ2NvbSB3aWxsIHRyeSB0byBwcmludCB0aGUgY29udGVudHMgb2YKLUFQUDEyIG1hcmtlcnMgYXMgdGV4dC4gIFNvbWUgZGlnaXRhbCBjYW1lcmFzIHN0b3JlIHVzZWZ1bCB0ZXh0IGluZm9ybWF0aW9uCi1pbiBBUFAxMiBtYXJrZXJzLgotCi1IYW5kbGluZyBvZiB0cnVuY2F0ZWQgZGF0YSBzdHJlYW1zIGlzIG1vcmUgcm9idXN0OiBibG9ja3MgYmV5b25kIHRoZSBvbmUgaW4KLXdoaWNoIHRoZSBlcnJvciBvY2N1cnMgd2lsbCBiZSBvdXRwdXQgYXMgdW5pZm9ybSBncmF5LCBvciBsZWZ0IHVuY2hhbmdlZAotaWYgZGVjb2RpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHLiAgVGhlIGFwcGVhcmFuY2Ugbm8gbG9uZ2VyIGRlcGVuZHMgb24gdGhlCi1IdWZmbWFuIHRhYmxlcyBiZWluZyB1c2VkLgotCi1IdWZmbWFuIHRhYmxlcyBhcmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgbXVjaCBtb3JlIGNhcmVmdWxseSB0aGFuIGJlZm9yZS4KLQotVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBkanBlZydzIEdJRiBvdXRwdXQgY2FwYWJpbGl0eSBoYXMgYmVlbgotY2hhbmdlZCB0byBwcm9kdWNlICJ1bmNvbXByZXNzZWQgR0lGcyIsIGFuZCBjanBlZydzIEdJRiBpbnB1dCBjYXBhYmlsaXR5Ci1oYXMgYmVlbiByZW1vdmVkIGFsdG9nZXRoZXIuICBXZSdyZSBub3QgaGFwcHkgYWJvdXQgaXQgZWl0aGVyLCBidXQgdGhlcmUKLXNlZW1zIHRvIGJlIG5vIGdvb2QgYWx0ZXJuYXRpdmUuCi0KLVRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBzdXBwb3J0cyBidWlsZGluZyBsaWJqcGVnIGFzIGEgc2hhcmVkIGxpYnJhcnkKLW9uIG1hbnkgZmxhdm9ycyBvZiBVbml4IChhbGwgdGhlIG9uZXMgdGhhdCBHTlUgbGlidG9vbCBrbm93cyBob3cgdG8KLWJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZm9yKS4gIFVzZSAiLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIiB0bwotdHJ5IHRoaXMgb3V0LgotCi1OZXcgamNvbmZpZyBmaWxlIGFuZCBtYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGFuZCBEZXZlbG9wZXIgU3R1ZGlvLgotQWxzbywgYSBqY29uZmlnIGZpbGUgYW5kIGEgYnVpbGQgc2NyaXB0IGZvciBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCi1vbiBBcHBsZSBNYWNpbnRvc2guICBtYWtlZmlsZS5kaiBoYXMgYmVlbiB1cGRhdGVkIGZvciBESkdQUCB2MiwgYW5kIHRoZXJlCi1hcmUgbWlzY2VsbGFuZW91cyBvdGhlciBtaW5vciBpbXByb3ZlbWVudHMgaW4gdGhlIG1ha2VmaWxlcy4KLQotam1lbW1hYy5jIG5vdyBrbm93cyBob3cgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBmb2xsb3dpbmcgTWFjIFN5c3RlbSA3Ci1jb252ZW50aW9ucy4KLQotZGpwZWcncyAtbWFwIHN3aXRjaCBpcyBub3cgYWJsZSB0byByZWFkIHJhdy1mb3JtYXQgUFBNIGZpbGVzIHJlbGlhYmx5LgotCi1janBlZyAtcHJvZ3Jlc3NpdmUgLXJlc3RhcnQgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhbnkgdW5uZWNlc3NhcnkgRFJJIG1hcmtlcnMuCi0KLU11bHRpcGxlIGNhbGxzIHRvIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGZvciBhIHNpbmdsZSBKUEVHIG9iamVjdAotbm8gbG9uZ2VyIGxlYWsgbWVtb3J5LgotCi0KLVZlcnNpb24gNmEgIDctRmViLTk2Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MaWJyYXJ5IGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIG1vZGlmaWVkIHRvIGRldGVjdCB2ZXJzaW9uIG1pc21hdGNoZXMKLWFuZCBzdHJ1Y3QgZmllbGQgcGFja2luZyBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGluZyBhcHBsaWNhdGlvbi4KLVRoaXMgY2hhbmdlIHJlcXVpcmVzIGFwcGxpY2F0aW9ucyB0byBiZSByZWNvbXBpbGVkLCBidXQgZG9lcyBub3QgcmVxdWlyZQotYW55IGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlIGNoYW5nZS4KLQotQWxsIHJvdXRpbmUgZGVjbGFyYXRpb25zIGNoYW5nZWQgdG8gdGhlIHN0eWxlICJHTE9CQUwodHlwZSkgbmFtZSAuLi4iLAotdGhhdCBpcywgR0xPQkFMLCBMT0NBTCwgTUVUSE9EREVGLCBFWFRFUk4gYXJlIG5vdyBtYWNyb3MgdGFraW5nIHRoZQotcm91dGluZSdzIHJldHVybiB0eXBlIGFzIGFuIGFyZ3VtZW50LiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBhZGQKLU1pY3Jvc29mdC1zdHlsZSBsaW5rYWdlIGtleXdvcmRzIHRvIGFsbCB0aGUgcm91dGluZXMgYnkgY2hhbmdpbmcganVzdAotdGhlc2UgbWFjcm9zLiAgTm90ZSB0aGF0IGFueSBhcHBsaWNhdGlvbiBjb2RlIHRoYXQgd2FzIHVzaW5nIHRoZXNlIG1hY3Jvcwotd2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQuCi0KLURDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzIGFyZSBub3cgc3RvcmVkIGluIG5vcm1hbCBhcnJheSBvcmRlcgotcmF0aGVyIHRoYW4gemlnemFnIG9yZGVyLiAgQXBwbGljYXRpb24gY29kZSB0aGF0IGNhbGxzIGpwZWdfYWRkX3F1YW50X3RhYmxlLAotb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVzIHF1YW50aXphdGlvbiB0YWJsZXMgZGlyZWN0bHksIHdpbGwgbmVlZCB0byBiZQotY2hhbmdlZC4gIElmIHlvdSBuZWVkIHRvIG1ha2Ugc3VjaCBjb2RlIHdvcmsgd2l0aCBlaXRoZXIgb2xkZXIgb3IgbmV3ZXIKLXZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LCBhIHRlc3QgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjEiIGlzCi1yZWNvbW1lbmRlZC4KLQotZGpwZWcncyB0cmFjZSBjYXBhYmlsaXR5IG5vdyBkdW1wcyBEUVQgdGFibGVzIGluIG5hdHVyYWwgb3JkZXIsIG5vdCB6aWd6YWcKLW9yZGVyLiAgVGhpcyBhbGxvd3MgdGhlIHRyYWNlIG91dHB1dCB0byBiZSBtYWRlIGludG8gYSAiLXF0YWJsZXMiIGZpbGUKLW1vcmUgZWFzaWx5LgotCi1OZXcgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlciBtb2R1bGUgZm9yIHVzZSBvbiBBcHBsZSBNYWNpbnRvc2guCi0KLUZpeCBidWcgaW4gY2pwZWcncyAtc21vb3RoIG9wdGlvbjogbGFzdCBvbmUgb3IgdHdvIHNjYW5saW5lcyB3b3VsZCBiZQotZHVwbGljYXRlcyBvZiB0aGUgcHJpb3IgbGluZSB1bmxlc3MgdGhlIGltYWdlIGhlaWdodCBtb2QgMTYgd2FzIDEgb3IgMi4KLQotUmVwYWlyIG1pbm9yIHByb2JsZW1zIGluIFZNUywgQkNDLCBNQzYgbWFrZWZpbGVzLgotCi1OZXcgY29uZmlndXJlIHNjcmlwdCBiYXNlZCBvbiBsYXRlc3QgR05VIEF1dG9jb25mLgotCi1Db3JyZWN0IHRoZSBsaXN0IG9mIGluY2x1ZGUgZmlsZXMgbmVlZGVkIGJ5IE1ldHJvV2Vya3MgQyBmb3IgY2NvbW1hbmQoKS4KLQotTnVtZXJvdXMgc21hbGwgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgotCi0KLVZlcnNpb24gNiAgMi1BdWctOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0OiBsaWJyYXJ5IGNhbiByZWFkIGFuZCB3cml0ZSBmdWxsIHByb2dyZXNzaXZlIEpQRUcKLWZpbGVzLiAgQSAiYnVmZmVyZWQgaW1hZ2UiIG1vZGUgc3VwcG9ydHMgaW5jcmVtZW50YWwgZGVjb2RpbmcgZm9yIG9uLXRoZS1mbHkKLWRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgaW1hZ2VzLiAgU2ltcGx5IHJlY29tcGlsaW5nIGFuIGV4aXN0aW5nIElKRy12NS1iYXNlZAotZGVjb2RlciB3aXRoIHY2IHNob3VsZCBhbGxvdyBpdCB0byByZWFkIHByb2dyZXNzaXZlIGZpbGVzLCB0aG91Z2ggb2YgY291cnNlCi13aXRob3V0IGFueSBzcGVjaWFsIHByb2dyZXNzaXZlIGRpc3BsYXkuCi0KLU5ldyAianBlZ3RyYW4iIGFwcGxpY2F0aW9uIHBlcmZvcm1zIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50Ci1KUEVHIGZvcm1hdHM7IHByaW1hcmlseSwgaXQgY2FuIGJlIHVzZWQgdG8gY29udmVydCBiYXNlbGluZSB0byBwcm9ncmVzc2l2ZQotSlBFRyBhbmQgdmljZSB2ZXJzYS4gIEluIHN1cHBvcnQgb2YganBlZ3RyYW4sIHRoZSBsaWJyYXJ5IG5vdyBhbGxvd3MgbG9zc2xlc3MKLXJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgSlBFRyBmaWxlcyBhcyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzLiAgVGhpcyBhYmlsaXR5Ci1tYXkgYmUgb2YgdXNlIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KLQotTm90ZXMgZm9yIHByb2dyYW1tZXJzOgotKiBXZSBjaGFuZ2VkIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRvIGJlIGFibGUgdG8gc3VzcGVuZDsgdGhpcyBtYWtlcyBhbGwKLWRlY29kaW5nIG1vZGVzIGF2YWlsYWJsZSB0byBzdXNwZW5kaW5nLWlucHV0IGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIsCi1leGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCB1c2Ugc3VzcGVuZGluZyBpbnB1dCB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZAotdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgWW91IGRvbid0IG5lZWQgdG8KLWRvIGFueXRoaW5nIGlmIHlvdSBkb24ndCB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLgotKiBXZSBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHZpcnR1YWwgYXJyYXkgcm91dGluZXM6IGFjY2Vzc192aXJ0X2FycmF5Ci1yb3V0aW5lcyBub3cgdGFrZSBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhY2Nlc3MgdGhpcyB0aW1lLiAgVGhlCi1sYXN0IHBhcmFtZXRlciB0byByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgaXMgbm93IGludGVycHJldGVkIGFzIHRoZQotbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IG1heSBiZSBhY2Nlc3NlZCBhdCBvbmNlLCBidXQgbm90IG5lY2Vzc2FyaWx5Ci10aGUgaGVpZ2h0IG9mIGV2ZXJ5IGFjY2Vzcy4KLQotCi1WZXJzaW9uIDViICAxNS1NYXItOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3JyZWN0IGJ1Z3Mgd2l0aCBncmF5c2NhbGUgaW1hZ2VzIGhhdmluZyB2X3NhbXBfZmFjdG9yID4gMS4KLQotanBlZ193cml0ZV9yYXdfZGF0YSgpIG5vdyBzdXBwb3J0cyBvdXRwdXQgc3VzcGVuc2lvbi4KLQotQ29ycmVjdCBidWdzIGluICJjb25maWd1cmUiIHNjcmlwdCBmb3IgY2FzZSBvZiBjb21waWxpbmcgaW4KLWEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIG9uZSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMuCi0KLVJlcGFpciBidWcgaW4ganF1YW50MS5jOiBzb21ldGltZXMgZGlkbid0IHVzZSBhcyBtYW55IGNvbG9ycyBhcyBpdCBjb3VsZC4KLQotQm9ybGFuZCBDIG1ha2VmaWxlIGFuZCBqY29uZmlnIGZpbGUgd29yayB1bmRlciBlaXRoZXIgTVMtRE9TIG9yIE9TLzIuCi0KLU1pc2NlbGxhbmVvdXMgaW1wcm92ZW1lbnRzIHRvIGRvY3VtZW50YXRpb24uCi0KLQotVmVyc2lvbiA1YSAgNy1EZWMtOTQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZWQgY29sb3IgY29udmVyc2lvbiByb3VuZG9mZiBiZWhhdmlvciBzbyB0aGF0IGdyYXlzY2FsZSB2YWx1ZXMgYXJlCi1yZXByZXNlbnRlZCBleGFjdGx5LiAgKFRoaXMgY2F1c2VzIHRlc3QgaW1hZ2UgZmlsZXMgdG8gY2hhbmdlLikKLQotTWFrZSBvcmRlcmVkIGRpdGhlciB1c2UgMTZ4MTYgaW5zdGVhZCBvZiA0eDQgcGF0dGVybiBmb3IgYSBzbWFsbCBxdWFsaXR5Ci1pbXByb3ZlbWVudC4KLQotTmV3IGNvbmZpZ3VyZSBzY3JpcHQgYmFzZWQgb24gbGF0ZXN0IEdOVSBBdXRvY29uZi4KLUZpeCBjb25maWd1cmUgc2NyaXB0IHRvIGhhbmRsZSBDRkxBR1MgY29ycmVjdGx5LgotUmVuYW1lICouYXV0byBmaWxlcyB0byAqLmNmZywgc28gdGhhdCBjb25maWd1cmUgc2NyaXB0IHN0aWxsIHdvcmtzIGlmCi1maWxlIG5hbWVzIGhhdmUgYmVlbiB0cnVuY2F0ZWQgZm9yIERPUy4KLQotRml4IGJ1ZyBpbiByZGJtcC5jOiBkaWRuJ3QgYWxsb3cgZm9yIGV4dHJhIGRhdGEgYmV0d2VlbiBoZWFkZXIgYW5kIGltYWdlLgotCi1Nb2RpZnkgcmRwcG0uYy93cnBwbS5jIHRvIGhhbmRsZSAyLWJ5dGUgcmF3IFBQTS9QR00gZm9ybWF0cyBmb3IgMTItYml0IGRhdGEuCi0KLUZpeCBzZXZlcmFsIGJ1Z3MgaW4gcmRybGUuYy4KLQotTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyBvcHRpb24gd2FzIGJyb2tlbi4KLQotUmV2aXNlIGplcnJvci5oL2plcnJvci5jIGZvciBtb3JlIGZsZXhpYmlsaXR5IGluIG1lc3NhZ2UgdGFibGUuCi0KLVJlcGFpciBvdmVyc2lnaHQgaW4gam1lbW5hbWUuYyBOT19NS1RFTVAgY2FzZTogZmlsZSBjb3VsZCBiZSB0aGVyZQotYnV0IHVucmVhZGFibGUuCi0KLQotVmVyc2lvbiA1ICAyNC1TZXAtOTQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVZlcnNpb24gNSByZXByZXNlbnRzIGEgbmVhcmx5IGNvbXBsZXRlIHJlZGVzaWduIGFuZCByZXdyaXRlIG9mIHRoZSBJSkcKLXNvZnR3YXJlLiAgTWFqb3IgdXNlci12aXNpYmxlIGNoYW5nZXMgaW5jbHVkZToKLSAgKiBBdXRvbWF0aWMgY29uZmlndXJhdGlvbiBzaW1wbGlmaWVzIGluc3RhbGxhdGlvbiBmb3IgbW9zdCBVbml4IHN5c3RlbXMuCi0gICogQSByYW5nZSBvZiBzcGVlZCB2cy4gaW1hZ2UgcXVhbGl0eSB0cmFkZW9mZnMgYXJlIHN1cHBvcnRlZC4KLSAgICBUaGlzIGluY2x1ZGVzIHJlc2l6aW5nIG9mIGFuIGltYWdlIGR1cmluZyBkZWNvbXByZXNzaW9uOiBzY2FsaW5nIGRvd24KLSAgICBieSBhIGZhY3RvciBvZiAxLzIsIDEvNCwgb3IgMS84IGlzIGhhbmRsZWQgdmVyeSBlZmZpY2llbnRseS4KLSAgKiBOZXcgcHJvZ3JhbXMgcmRqcGdjb20gYW5kIHdyanBnY29tIGFsbG93IGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbgotICAgIG9mIHRleHQgY29tbWVudHMgaW4gYSBKUEVHIGZpbGUuCi0KLVRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyJ3MgaW50ZXJmYWNlIHRvIHRoZSBsaWJyYXJ5IGhhcyBjaGFuZ2VkIGNvbXBsZXRlbHkuCi1Ob3RhYmxlIGltcHJvdmVtZW50cyBpbmNsdWRlOgotICAqIFdlIGhhdmUgZWxpbWluYXRlZCB0aGUgdXNlIG9mIGNhbGxiYWNrIHJvdXRpbmVzIGZvciBoYW5kbGluZyB0aGUKLSAgICB1bmNvbXByZXNzZWQgaW1hZ2UgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBub3cgc2VlcyB0aGUgbGlicmFyeSBhcyBhCi0gICAgc2V0IG9mIHJvdXRpbmVzIHRoYXQgaXQgY2FsbHMgdG8gcmVhZCBvciB3cml0ZSBpbWFnZSBkYXRhIG9uIGEKLSAgICBzY2FubGluZS1ieS1zY2FubGluZSBiYXNpcy4KLSAgKiBUaGUgYXBwbGljYXRpb24gaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBpbiBhIGNvbnZlbnRpb25hbCBpbnRlcmxlYXZlZC0KLSAgICBwaXhlbCBmb3JtYXQsIHJhdGhlciB0aGFuIGFzIGEgc2VwYXJhdGUgYXJyYXkgZm9yIGVhY2ggY29sb3IgY2hhbm5lbC4KLSAgICBUaGlzIGNhbiBzYXZlIGEgY29weWluZyBzdGVwIGluIG1hbnkgcHJvZ3JhbXMuCi0gICogVGhlIGhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBjbGVhbmVkIHVwOiB0aGUgYXBwbGljYXRpb24gY2FuCi0gICAgc3VwcGx5IHJvdXRpbmVzIHRvIHNvdXJjZSBvciBzaW5rIHRoZSBjb21wcmVzc2VkIGRhdGEuICBJdCBpcyBwb3NzaWJsZSB0bwotICAgIHN1c3BlbmQgcHJvY2Vzc2luZyBvbiBzb3VyY2Uvc2luayBidWZmZXIgb3ZlcnJ1biwgYWx0aG91Z2ggdGhpcyBpcyBub3QKLSAgICBzdXBwb3J0ZWQgaW4gYWxsIG9wZXJhdGluZyBtb2Rlcy4KLSAgKiBBbGwgc3RhdGljIHN0YXRlIGhhcyBiZWVuIGVsaW1pbmF0ZWQgZnJvbSB0aGUgbGlicmFyeSwgc28gdGhhdCBtdWx0aXBsZQotICAgIGluc3RhbmNlcyBvZiBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGNhbiBiZSBhY3RpdmUgY29uY3VycmVudGx5LgotICAqIEpQRUcgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGllLCBxdWFudGl6YXRpb24gYW5kCi0gICAgSHVmZm1hbiB0YWJsZXMgY2FuIGJlIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGltYWdlIGRhdGEuCi0gICogQW5kIG5vdCBvbmx5IHRoYXQsIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBoYXMgaW1wcm92ZWQKLSAgICBjb25zaWRlcmFibHkhCi0KLQotVGhlIGxhc3Qgd2lkZWx5IHVzZWQgcmVsZWFzZSBiZWZvcmUgdGhlIHZlcnNpb24gNSByZXdyaXRlIHdhcyB2ZXJzaW9uIDRBIG9mCi0xOC1GZWItOTMuICBDaGFuZ2UgbG9ncyBiZWZvcmUgdGhhdCBwb2ludCBoYXZlIGJlZW4gZGlzY2FyZGVkLCBzaW5jZSB0aGV5Ci1hcmUgbm90IG9mIG11Y2ggaW50ZXJlc3QgYWZ0ZXIgdGhlIHJld3JpdGUuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9janBlZy4xIGIvbGlianBlZ3R3cnAvY2pwZWcuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3NWE5Ni4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9janBlZy4xCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS5USCBDSlBFRyAxICIyMCBNYXJjaCAxOTk4IgotLlNIIE5BTUUKLWNqcGVnIFwtIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgdG8gYSBKUEVHIGZpbGUKLS5TSCBTWU5PUFNJUwotLkIgY2pwZWcKLVsKLS5JIG9wdGlvbnMKLV0KLVsKLS5JIGZpbGVuYW1lCi1dCi0uTFAKLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiBjanBlZwotY29tcHJlc3NlcyB0aGUgbmFtZWQgaW1hZ2UgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMKLW5hbWVkLCBhbmQgcHJvZHVjZXMgYSBKUEVHL0pGSUYgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW5wdXQgZmlsZSBmb3JtYXRzIGFyZTogUFBNIChQQk1QTFVTIGNvbG9yCi1mb3JtYXQpLCBQR00gKFBCTVBMVVMgZ3JheS1zY2FsZSBmb3JtYXQpLCBCTVAsIFRhcmdhLCBhbmQgUkxFIChVdGFoIFJhc3RlcgotVG9vbGtpdCBmb3JtYXQpLiAgKFJMRSBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgVVJUIGxpYnJhcnkgaXMgYXZhaWxhYmxlLikKLS5TSCBPUFRJT05TCi1BbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsCi0uQiBcLWdyYXlzY2FsZQotbWF5IGJlIHdyaXR0ZW4KLS5CIFwtZ3JheQotb3IKLS5CUiBcLWdyIC4KLU1vc3Qgb2YgdGhlICJiYXNpYyIgc3dpdGNoZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFzIGxpdHRsZSBhcyBvbmUgbGV0dGVyLgotVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQgKHRodXMKLS5CIFwtQk1QCi1pcyB0aGUgc2FtZSBhcwotLkJSIFwtYm1wICkuCi1Ccml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwKLS5CUiBcLWdyZXlzY2FsZSApLAotdGhvdWdoIGZvciBicmV2aXR5IHRoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgotLlBQCi1UaGUgYmFzaWMgc3dpdGNoZXMgYXJlOgotLlRQCi0uQkkgXC1xdWFsaXR5ICIgTiIKLVNjYWxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYWRqdXN0IGltYWdlIHF1YWxpdHkuICBRdWFsaXR5IGlzIDAgKHdvcnN0KSB0bwotMTAwIChiZXN0KTsgZGVmYXVsdCBpcyA3NS4gIChTZWUgYmVsb3cgZm9yIG1vcmUgaW5mby4pCi0uVFAKLS5CIFwtZ3JheXNjYWxlCi1DcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGUgZnJvbSBjb2xvciBpbnB1dC4gIEJlIHN1cmUgdG8gdXNlIHRoaXMgc3dpdGNoIHdoZW4KLWNvbXByZXNzaW5nIGEgZ3JheXNjYWxlIEJNUCBmaWxlLCBiZWNhdXNlCi0uQiBjanBlZwotaXNuJ3QgYnJpZ2h0IGVub3VnaCB0byBub3RpY2Ugd2hldGhlciBhIEJNUCBmaWxlIHVzZXMgb25seSBzaGFkZXMgb2YgZ3JheS4KLUJ5IHNheWluZwotLkJSIFwtZ3JheXNjYWxlICwKLXlvdSdsbCBnZXQgYSBzbWFsbGVyIEpQRUcgZmlsZSB0aGF0IHRha2VzIGxlc3MgdGltZSB0byBwcm9jZXNzLgotLlRQCi0uQiBcLW9wdGltaXplCi1QZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuICBXaXRob3V0IHRoaXMsIGRlZmF1bHQKLWVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCi0uQiBcLW9wdGltaXplCi11c3VhbGx5IG1ha2VzIHRoZSBKUEVHIGZpbGUgYSBsaXR0bGUgc21hbGxlciwgYnV0Ci0uQiBjanBlZwotcnVucyBzb21ld2hhdCBzbG93ZXIgYW5kIG5lZWRzIG11Y2ggbW9yZSBtZW1vcnkuICBJbWFnZSBxdWFsaXR5IGFuZCBzcGVlZCBvZgotZGVjb21wcmVzc2lvbiBhcmUgdW5hZmZlY3RlZCBieQotLkJSIFwtb3B0aW1pemUgLgotLlRQCi0uQiBcLXByb2dyZXNzaXZlCi1DcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIChzZWUgYmVsb3cpLgotLlRQCi0uQiBcLXRhcmdhCi1JbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdC4gIFRhcmdhIGZpbGVzIHRoYXQgY29udGFpbiBhbiAiaWRlbnRpZmljYXRpb24iCi1maWVsZCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZWQgYnkKLS5CUiBjanBlZyA7Ci1mb3Igc3VjaCBmaWxlcyB5b3UgbXVzdCBzcGVjaWZ5Ci0uQiBcLXRhcmdhCi10byBtYWtlCi0uQiBjanBlZwotdHJlYXQgdGhlIGlucHV0IGFzIFRhcmdhIGZvcm1hdC4KLUZvciBtb3N0IFRhcmdhIGZpbGVzLCB5b3Ugd29uJ3QgbmVlZCB0aGlzIHN3aXRjaC4KLS5QUAotVGhlCi0uQiBcLXF1YWxpdHkKLXN3aXRjaCBsZXRzIHlvdSB0cmFkZSBvZmYgY29tcHJlc3NlZCBmaWxlIHNpemUgYWdhaW5zdCBxdWFsaXR5IG9mIHRoZQotcmVjb25zdHJ1Y3RlZCBpbWFnZTogdGhlIGhpZ2hlciB0aGUgcXVhbGl0eSBzZXR0aW5nLCB0aGUgbGFyZ2VyIHRoZSBKUEVHIGZpbGUsCi1hbmQgdGhlIGNsb3NlciB0aGUgb3V0cHV0IGltYWdlIHdpbGwgYmUgdG8gdGhlIG9yaWdpbmFsIGlucHV0LiAgTm9ybWFsbHkgeW91Ci13YW50IHRvIHVzZSB0aGUgbG93ZXN0IHF1YWxpdHkgc2V0dGluZyAoc21hbGxlc3QgZmlsZSkgdGhhdCBkZWNvbXByZXNzZXMgaW50bwotc29tZXRoaW5nIHZpc3VhbGx5IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIG9yaWdpbmFsIGltYWdlLiAgRm9yIHRoaXMKLXB1cnBvc2UgdGhlIHF1YWxpdHkgc2V0dGluZyBzaG91bGQgYmUgYmV0d2VlbiA1MCBhbmQgOTU7IHRoZSBkZWZhdWx0IG9mIDc1IGlzCi1vZnRlbiBhYm91dCByaWdodC4gIElmIHlvdSBzZWUgZGVmZWN0cyBhdAotLkIgXC1xdWFsaXR5Ci03NSwgdGhlbiBnbyB1cCA1IG9yIDEwIGNvdW50cyBhdCBhIHRpbWUgdW50aWwgeW91IGFyZSBoYXBweSB3aXRoIHRoZSBvdXRwdXQKLWltYWdlLiAgKFRoZSBvcHRpbWFsIHNldHRpbmcgd2lsbCB2YXJ5IGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuKQotLlBQCi0uQiBcLXF1YWxpdHkKLTEwMCB3aWxsIGdlbmVyYXRlIGEgcXVhbnRpemF0aW9uIHRhYmxlIG9mIGFsbCAxJ3MsIG1pbmltaXppbmcgbG9zcyBpbiB0aGUKLXF1YW50aXphdGlvbiBzdGVwIChidXQgdGhlcmUgaXMgc3RpbGwgaW5mb3JtYXRpb24gbG9zcyBpbiBzdWJzYW1wbGluZywgYXMgd2VsbAotYXMgcm91bmRvZmYgZXJyb3IpLiAgVGhpcyBzZXR0aW5nIGlzIG1haW5seSBvZiBpbnRlcmVzdCBmb3IgZXhwZXJpbWVudGFsCi1wdXJwb3Nlcy4gIFF1YWxpdHkgdmFsdWVzIGFib3ZlIGFib3V0IDk1IGFyZQotLkIgbm90Ci1yZWNvbW1lbmRlZCBmb3Igbm9ybWFsIHVzZTsgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGdvZXMgdXAgZHJhbWF0aWNhbGx5IGZvcgotaGFyZGx5IGFueSBnYWluIGluIG91dHB1dCBpbWFnZSBxdWFsaXR5LgotLlBQCi1JbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBxdWFsaXR5IHZhbHVlcyBiZWxvdyA1MCB3aWxsIHByb2R1Y2UgdmVyeSBzbWFsbCBmaWxlcwotb2YgbG93IGltYWdlIHF1YWxpdHkuICBTZXR0aW5ncyBhcm91bmQgNSB0byAxMCBtaWdodCBiZSB1c2VmdWwgaW4gcHJlcGFyaW5nIGFuCi1pbmRleCBvZiBhIGxhcmdlIGltYWdlIGxpYnJhcnksIGZvciBleGFtcGxlLiAgVHJ5Ci0uQiBcLXF1YWxpdHkKLTIgKG9yIHNvKSBmb3Igc29tZSBhbXVzaW5nIEN1YmlzdCBlZmZlY3RzLiAgKE5vdGU6IHF1YWxpdHkKLXZhbHVlcyBiZWxvdyBhYm91dCAyNSBnZW5lcmF0ZSAyLWJ5dGUgcXVhbnRpemF0aW9uIHRhYmxlcywgd2hpY2ggYXJlCi1jb25zaWRlcmVkIG9wdGlvbmFsIGluIHRoZSBKUEVHIHN0YW5kYXJkLgotLkIgY2pwZWcKLWVtaXRzIGEgd2FybmluZyBtZXNzYWdlIHdoZW4geW91IGdpdmUgc3VjaCBhIHF1YWxpdHkgdmFsdWUsIGJlY2F1c2Ugc29tZQotb3RoZXIgSlBFRyBwcm9ncmFtcyBtYXkgYmUgdW5hYmxlIHRvIGRlY29kZSB0aGUgcmVzdWx0aW5nIGZpbGUuICBVc2UKLS5CIFwtYmFzZWxpbmUKLWlmIHlvdSBuZWVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGF0IGxvdyBxdWFsaXR5IHZhbHVlcy4pCi0uUFAKLVRoZQotLkIgXC1wcm9ncmVzc2l2ZQotc3dpdGNoIGNyZWF0ZXMgYSAicHJvZ3Jlc3NpdmUgSlBFRyIgZmlsZS4gIEluIHRoaXMgdHlwZSBvZiBKUEVHIGZpbGUsIHRoZSBkYXRhCi1pcyBzdG9yZWQgaW4gbXVsdGlwbGUgc2NhbnMgb2YgaW5jcmVhc2luZyBxdWFsaXR5LiAgSWYgdGhlIGZpbGUgaXMgYmVpbmcKLXRyYW5zbWl0dGVkIG92ZXIgYSBzbG93IGNvbW11bmljYXRpb25zIGxpbmssIHRoZSBkZWNvZGVyIGNhbiB1c2UgdGhlIGZpcnN0Ci1zY2FuIHRvIGRpc3BsYXkgYSBsb3ctcXVhbGl0eSBpbWFnZSB2ZXJ5IHF1aWNrbHksIGFuZCBjYW4gdGhlbiBpbXByb3ZlIHRoZQotZGlzcGxheSB3aXRoIGVhY2ggc3Vic2VxdWVudCBzY2FuLiAgVGhlIGZpbmFsIGltYWdlIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byBhCi1zdGFuZGFyZCBKUEVHIGZpbGUgb2YgdGhlIHNhbWUgcXVhbGl0eSBzZXR0aW5nLCBhbmQgdGhlIHRvdGFsIGZpbGUgc2l6ZSBpcwotYWJvdXQgdGhlIHNhbWUgLS0tIG9mdGVuIGEgbGl0dGxlIHNtYWxsZXIuCi0uQiBDYXV0aW9uOgotcHJvZ3Jlc3NpdmUgSlBFRyBpcyBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZCwgc28gbWFueSBkZWNvZGVycyB3aWxsIGJlCi11bmFibGUgdG8gdmlldyBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSBhdCBhbGwuCi0uUFAKLVN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKLS5UUAotLkIgXC1kY3QgaW50Ci1Vc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KLS5UUAotLkIgXC1kY3QgZmFzdAotVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgotLlRQCi0uQiBcLWRjdCBmbG9hdAotVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCi1UaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBpbnQgbWV0aG9kLCBidXQgaXMKLW11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUgaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28KLW5vdGUgdGhhdCByZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzCi1tYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuCi1UaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZCBpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgotLlRQCi0uQkkgXC1yZXN0YXJ0ICIgTiIKLUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5IE4gTUNVIGJsb2NrcyBpZiAiQiIgaXMKLWF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0uQiBcLXJlc3RhcnQgMAotKHRoZSBkZWZhdWx0KSBtZWFucyBubyByZXN0YXJ0IG1hcmtlcnMuCi0uVFAKLS5CSSBcLXNtb290aCAiIE4iCi1TbW9vdGggdGhlIGlucHV0IGltYWdlIHRvIGVsaW1pbmF0ZSBkaXRoZXJpbmcgbm9pc2UuICBOLCByYW5naW5nIGZyb20gMSB0bwotMTAwLCBpbmRpY2F0ZXMgdGhlIHN0cmVuZ3RoIG9mIHNtb290aGluZy4gIDAgKHRoZSBkZWZhdWx0KSBtZWFucyBubyBzbW9vdGhpbmcuCi0uVFAKLS5CSSBcLW1heG1lbW9yeSAiIE4iCi1TZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKLWluIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQotbnVtYmVyLiAgRm9yIGV4YW1wbGUsCi0uQiBcLW1heCA0bQotc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0uVFAKLS5CSSBcLW91dGZpbGUgIiBuYW1lIgotU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCi0uVFAKLS5CIFwtdmVyYm9zZQotRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQotLkJSIFwtdiAncwotZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotLlRQCi0uQiBcLWRlYnVnCi1TYW1lIGFzCi0uQlIgXC12ZXJib3NlIC4KLS5QUAotVGhlCi0uQiBcLXJlc3RhcnQKLW9wdGlvbiBpbnNlcnRzIGV4dHJhIG1hcmtlcnMgdGhhdCBhbGxvdyBhIEpQRUcgZGVjb2RlciB0byByZXN5bmNocm9uaXplIGFmdGVyCi1hIHRyYW5zbWlzc2lvbiBlcnJvci4gIFdpdGhvdXQgcmVzdGFydCBtYXJrZXJzLCBhbnkgZGFtYWdlIHRvIGEgY29tcHJlc3NlZAotZmlsZSB3aWxsIHVzdWFsbHkgcnVpbiB0aGUgaW1hZ2UgZnJvbSB0aGUgcG9pbnQgb2YgdGhlIGVycm9yIHRvIHRoZSBlbmQgb2YgdGhlCi1pbWFnZTsgd2l0aCByZXN0YXJ0IG1hcmtlcnMsIHRoZSBkYW1hZ2UgaXMgdXN1YWxseSBjb25maW5lZCB0byB0aGUgcG9ydGlvbiBvZgotdGhlIGltYWdlIHVwIHRvIHRoZSBuZXh0IHJlc3RhcnQgbWFya2VyLiAgT2YgY291cnNlLCB0aGUgcmVzdGFydCBtYXJrZXJzCi1vY2N1cHkgZXh0cmEgc3BhY2UuICBXZSByZWNvbW1lbmQKLS5CIFwtcmVzdGFydCAxCi1mb3IgaW1hZ2VzIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCBhY3Jvc3MgdW5yZWxpYWJsZSBuZXR3b3JrcyBzdWNoIGFzIFVzZW5ldC4KLS5QUAotVGhlCi0uQiBcLXNtb290aAotb3B0aW9uIGZpbHRlcnMgdGhlIGlucHV0IHRvIGVsaW1pbmF0ZSBmaW5lLXNjYWxlIG5vaXNlLiAgVGhpcyBpcyBvZnRlbiB1c2VmdWwKLXdoZW4gY29udmVydGluZyBkaXRoZXJlZCBpbWFnZXMgdG8gSlBFRzogYSBtb2RlcmF0ZSBzbW9vdGhpbmcgZmFjdG9yIG9mIDEwIHRvCi01MCBnZXRzIHJpZCBvZiBkaXRoZXJpbmcgcGF0dGVybnMgaW4gdGhlIGlucHV0IGZpbGUsIHJlc3VsdGluZyBpbiBhIHNtYWxsZXIKLUpQRUcgZmlsZSBhbmQgYSBiZXR0ZXItbG9va2luZyBpbWFnZS4gIFRvbyBsYXJnZSBhIHNtb290aGluZyBmYWN0b3Igd2lsbAotdmlzaWJseSBibHVyIHRoZSBpbWFnZSwgaG93ZXZlci4KLS5QUAotU3dpdGNoZXMgZm9yIHdpemFyZHM6Ci0uVFAKLS5CIFwtYmFzZWxpbmUKLUZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBiZSBnZW5lcmF0ZWQuICBUaGlzIGNsYW1wcwotcXVhbnRpemF0aW9uIHZhbHVlcyB0byA4IGJpdHMgZXZlbiBhdCBsb3cgcXVhbGl0eSBzZXR0aW5ncy4gIChUaGlzIHN3aXRjaCBpcwotcG9vcmx5IG5hbWVkLCBzaW5jZSBpdCBkb2VzIG5vdCBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGlzIGFjdHVhbGx5IGJhc2VsaW5lCi1KUEVHLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlCi0uQiBcLWJhc2VsaW5lCi1hbmQKLS5CIFwtcHJvZ3Jlc3NpdmUKLXRvZ2V0aGVyLikKLS5UUAotLkJJIFwtcXRhYmxlcyAiIGZpbGUiCi1Vc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi0uVFAKLS5CSSBcLXFzbG90cyAiIE5bLC4uLl0iCi1TZWxlY3Qgd2hpY2ggcXVhbnRpemF0aW9uIHRhYmxlIHRvIHVzZSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCi0uVFAKLS5CSSBcLXNhbXBsZSAiIEh4VlssLi4uXSIKLVNldCBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgotLlRQCi0uQkkgXC1zY2FucyAiIGZpbGUiCi1Vc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgotLlBQCi1UaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHLiAgSWYgeW91Ci1kb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgXGZCZG9uJ3QgdXNlIHRoZW1cZlIuICBUaGVzZSBzd2l0Y2hlcyBhcmUKLWRvY3VtZW50ZWQgZnVydGhlciBpbiB0aGUgZmlsZSB3aXphcmQuZG9jLgotLlNIIEVYQU1QTEVTCi0uTFAKLVRoaXMgZXhhbXBsZSBjb21wcmVzc2VzIHRoZSBQUE0gZmlsZSBmb28ucHBtIHdpdGggYSBxdWFsaXR5IGZhY3RvciBvZgotNjAgYW5kIHNhdmVzIHRoZSBvdXRwdXQgYXMgZm9vLmpwZzoKLS5JUAotLkIgY2pwZWcgXC1xdWFsaXR5Ci0uSSA2MCBmb28ucHBtCi0uQiA+Ci0uSSBmb28uanBnCi0uU0ggSElOVFMKLUNvbG9yIEdJRiBmaWxlcyBhcmUgbm90IHRoZSBpZGVhbCBpbnB1dCBmb3IgSlBFRzsgSlBFRyBpcyByZWFsbHkgaW50ZW5kZWQgZm9yCi1jb21wcmVzc2luZyBmdWxsLWNvbG9yICgyNC1iaXQpIGltYWdlcy4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHRyeSB0byBjb252ZXJ0Ci1jYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyIGltYWdlcyB0aGF0IGhhdmUgb25seSBhIGZldyBkaXN0aW5jdAotY29sb3JzLiAgR0lGIHdvcmtzIGdyZWF0IG9uIHRoZXNlLCBKUEVHIGRvZXMgbm90LiAgSWYgeW91IHdhbnQgdG8gY29udmVydCBhCi1HSUYgdG8gSlBFRywgeW91IHNob3VsZCBleHBlcmltZW50IHdpdGgKLS5CUiBjanBlZyAncwotLkIgXC1xdWFsaXR5Ci1hbmQKLS5CIFwtc21vb3RoCi1vcHRpb25zIHRvIGdldCBhIHNhdGlzZmFjdG9yeSBjb252ZXJzaW9uLgotLkIgXC1zbW9vdGggMTAKLW9yIHNvIGlzIG9mdGVuIGhlbHBmdWwuCi0uUFAKLUF2b2lkIHJ1bm5pbmcgYW4gaW1hZ2UgdGhyb3VnaCBhIHNlcmllcyBvZiBKUEVHIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24KLWN5Y2xlcy4gIEltYWdlIHF1YWxpdHkgbG9zcyB3aWxsIGFjY3VtdWxhdGU7IGFmdGVyIHRlbiBvciBzbyBjeWNsZXMgdGhlIGltYWdlCi1tYXkgYmUgbm90aWNlYWJseSB3b3JzZSB0aGFuIGl0IHdhcyBhZnRlciBvbmUgY3ljbGUuICBJdCdzIGJlc3QgdG8gdXNlIGEKLWxvc3NsZXNzIGZvcm1hdCB3aGlsZSBtYW5pcHVsYXRpbmcgYW4gaW1hZ2UsIHRoZW4gY29udmVydCB0byBKUEVHIGZvcm1hdCB3aGVuCi15b3UgYXJlIHJlYWR5IHRvIGZpbGUgdGhlIGltYWdlIGF3YXkuCi0uUFAKLVRoZQotLkIgXC1vcHRpbWl6ZQotb3B0aW9uIHRvCi0uQiBjanBlZwotaXMgd29ydGggdXNpbmcgd2hlbiB5b3UgYXJlIG1ha2luZyBhICJmaW5hbCIgdmVyc2lvbiBmb3IgcG9zdGluZyBvciBhcmNoaXZpbmcuCi1JdCdzIGFsc28gYSB3aW4gd2hlbiB5b3UgYXJlIHVzaW5nIGxvdyBxdWFsaXR5IHNldHRpbmdzIHRvIG1ha2UgdmVyeSBzbWFsbAotSlBFRyBmaWxlczsgdGhlIHBlcmNlbnRhZ2UgaW1wcm92ZW1lbnQgaXMgb2Z0ZW4gYSBsb3QgbW9yZSB0aGFuIGl0IGlzIG9uCi1sYXJnZXIgZmlsZXMuICAoQXQgcHJlc2VudCwKLS5CIFwtb3B0aW1pemUKLW1vZGUgaXMgYWx3YXlzIHNlbGVjdGVkIHdoZW4gZ2VuZXJhdGluZyBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLikKLS5TSCBFTlZJUk9OTUVOVAotLlRQCi0uQiBKUEVHTUVNCi1JZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KLVRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKLS5CIFwtbWF4bWVtb3J5Ci1zd2l0Y2guCi0uQiBKUEVHTUVNCi1vdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKLWl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0Ci0uQlIgXC1tYXhtZW1vcnkgLgotLlNIIFNFRSBBTFNPCi0uQlIgZGpwZWcgKDEpLAotLkJSIGpwZWd0cmFuICgxKSwKLS5CUiByZGpwZ2NvbSAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uYnIKLS5CUiBwcG0gKDUpLAotLkJSIHBnbSAoNSkKLS5icgotV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAotQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCi0uU0ggQlVHUwotQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KLS5QUAotR0lGIGlucHV0IGZpbGVzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLCB0byBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQuCi1Vc2UgYSBVbmlzeXMtbGljZW5zZWQgcHJvZ3JhbSBpZiB5b3UgbmVlZCB0byByZWFkIGEgR0lGIGZpbGUuICAoQ29udmVyc2lvbgotb2YgR0lGIGZpbGVzIHRvIEpQRUcgaXMgdXN1YWxseSBhIGJhZCBpZGVhIGFueXdheS4pCi0uUFAKLU5vdCBhbGwgdmFyaWFudHMgb2YgQk1QIGFuZCBUYXJnYSBmaWxlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KLS5QUAotVGhlCi0uQiBcLXRhcmdhCi1zd2l0Y2ggaXMgbm90IGEgYnVnLCBpdCdzIGEgZmVhdHVyZS4gIChJdCB3b3VsZCBiZSBhIGJ1ZyBpZiB0aGUgVGFyZ2EgZm9ybWF0Ci1kZXNpZ25lcnMgaGFkIG5vdCBiZWVuIGNsdWVsZXNzLikKLS5QUAotU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY2pwZWcuYyBiL2xpYmpwZWd0d3JwL2NqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTkyOWYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY2pwZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKgotICogY2pwZWcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogSXQgc2hvdWxkIHdvcmsgb24gYW55IHN5c3RlbSB3aXRoIFVuaXgtIG9yIE1TLURPUy1zdHlsZSBjb21tYW5kIGxpbmVzLgotICoKLSAqIFR3byBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIHN0eWxlcyBhcmUgcGVybWl0dGVkLCBkZXBlbmRpbmcgb24gdGhlCi0gKiBjb21waWxlLXRpbWUgc3dpdGNoIFRXT19GSUxFX0NPTU1BTkRMSU5FOgotICoJY2pwZWcgW29wdGlvbnNdICBpbnB1dGZpbGUgb3V0cHV0ZmlsZQotICoJY2pwZWcgW29wdGlvbnNdICBbaW5wdXRmaWxlXQotICogSW4gdGhlIHNlY29uZCBzdHlsZSwgb3V0cHV0IGlzIGFsd2F5cyB0byBzdGFuZGFyZCBvdXRwdXQsIHdoaWNoIHlvdSdkCi0gKiBub3JtYWxseSByZWRpcmVjdCB0byBhIGZpbGUgb3IgcGlwZSB0byBzb21lIG90aGVyIHByb2dyYW0uICBJbnB1dCBpcwotICogZWl0aGVyIGZyb20gYSBuYW1lZCBmaWxlIG9yIGZyb20gc3RhbmRhcmQgaW5wdXQgKHR5cGljYWxseSByZWRpcmVjdGVkKS4KLSAqIFRoZSBzZWNvbmQgc3R5bGUgaXMgY29udmVuaWVudCBvbiBVbml4IGJ1dCBpcyB1bmhlbHBmdWwgb24gc3lzdGVtcyB0aGF0Ci0gKiBkb24ndCBzdXBwb3J0IHBpcGVzLiAgQWxzbywgeW91IE1VU1QgdXNlIHRoZSBmaXJzdCBzdHlsZSBpZiB5b3VyIHN5c3RlbQotICogZG9lc24ndCBkbyBiaW5hcnkgSS9PIHRvIHN0ZGluL3N0ZG91dC4KLSAqIFRvIHNpbXBsaWZ5IHNjcmlwdCB3cml0aW5nLCB0aGUgIi1vdXRmaWxlIiBzd2l0Y2ggaXMgcHJvdmlkZWQuICBUaGUgc3ludGF4Ci0gKgljanBlZyBbb3B0aW9uc10gIC1vdXRmaWxlIG91dHB1dGZpbGUgIGlucHV0ZmlsZQotICogd29ya3MgcmVnYXJkbGVzcyBvZiB3aGljaCBjb21tYW5kIGxpbmUgc3R5bGUgaXMgdXNlZC4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCi0KLSNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLwotI2lmZGVmIF9fTVdFUktTX18KLSNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCi0jZW5kaWYKLSNpZmRlZiBUSElOS19DCi0jaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KLQotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0gewotI2luY2x1ZGUgImNkZXJyb3IuaCIKLSAgTlVMTAotfTsKLQotCi0vKgotICogVGhpcyByb3V0aW5lIGRldGVybWluZXMgd2hhdCBmb3JtYXQgdGhlIGlucHV0IGZpbGUgaXMsCi0gKiBhbmQgc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgaW5wdXQtcmVhZGluZyBtb2R1bGUuCi0gKgotICogVG8gZGV0ZXJtaW5lIHdoaWNoIGZhbWlseSBvZiBpbnB1dCBmb3JtYXRzIHRoZSBmaWxlIGJlbG9uZ3MgdG8sCi0gKiB3ZSBtYXkgbG9vayBvbmx5IGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlLCBzaW5jZSBDIGRvZXMgbm90Ci0gKiBndWFyYW50ZWUgdGhhdCBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBjYW4gYmUgcHVzaGVkIGJhY2sgd2l0aCB1bmdldGMuCi0gKiBMb29raW5nIGF0IGFkZGl0aW9uYWwgYnl0ZXMgd291bGQgcmVxdWlyZSBvbmUgb2YgdGhlc2UgYXBwcm9hY2hlczoKLSAqICAgICAxKSBhc3N1bWUgd2UgY2FuIGZzZWVrKCkgdGhlIGlucHV0IGZpbGUgKGZhaWxzIGZvciBwaXBlZCBpbnB1dCk7Ci0gKiAgICAgMikgYXNzdW1lIHdlIGNhbiBwdXNoIGJhY2sgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgKHdvcmtzIGluCi0gKiAgICAgICAgc29tZSBDIGltcGxlbWVudGF0aW9ucywgYnV0IHVucG9ydGFibGUpOwotICogICAgIDMpIHByb3ZpZGUgb3VyIG93biBidWZmZXJpbmcgKGJyZWFrcyBpbnB1dCByZWFkZXJzIHRoYXQgd2FudCB0byB1c2UKLSAqICAgICAgICBzdGRpbyBkaXJlY3RseSwgc3VjaCBhcyB0aGUgUkxFIGxpYnJhcnkpOwotICogb3IgIDQpIGRvbid0IHB1dCBiYWNrIHRoZSBkYXRhLCBhbmQgbW9kaWZ5IHRoZSBpbnB1dF9pbml0IG1ldGhvZHMgdG8gYXNzdW1lCi0gKiAgICAgICAgdGhleSBzdGFydCByZWFkaW5nIGFmdGVyIHRoZSBzdGFydCBvZiBmaWxlIChhbHNvIGJyZWFrcyBSTEUgbGlicmFyeSkuCi0gKiAjMSBpcyBhdHRyYWN0aXZlIGZvciBNUy1ET1MgYnV0IGlzIHVudGVuYWJsZSBvbiBVbml4LgotICoKLSAqIFRoZSBtb3N0IHBvcnRhYmxlIHNvbHV0aW9uIGZvciBmaWxlIHR5cGVzIHRoYXQgY2FuJ3QgYmUgaWRlbnRpZmllZCBieSB0aGVpcgotICogZmlyc3QgYnl0ZSBpcyB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgd2hhdCB0aGV5IGFyZS4gIFRoaXMgaXMgYWxzbyB0aGUKLSAqIG9ubHkgYXBwcm9hY2ggZm9yICJyYXciIGZpbGUgdHlwZXMgdGhhdCBjb250YWluIG9ubHkgYXJiaXRyYXJ5IHZhbHVlcy4KLSAqIFdlIHByZXNlbnRseSBhcHBseSB0aGlzIG1ldGhvZCBmb3IgVGFyZ2EgZmlsZXMuICBNb3N0IG9mIHRoZSB0aW1lIFRhcmdhCi0gKiBmaWxlcyBzdGFydCB3aXRoIDB4MDAsIHNvIHdlIHJlY29nbml6ZSB0aGF0IGNhc2UuICBQb3RlbnRpYWxseSwgaG93ZXZlciwKLSAqIGEgVGFyZ2EgZmlsZSBjb3VsZCBzdGFydCB3aXRoIGFueSBieXRlIHZhbHVlIChieXRlIDAgaXMgdGhlIGxlbmd0aCBvZiB0aGUKLSAqIHNlbGRvbS11c2VkIElEIGZpZWxkKSwgc28gd2UgcHJvdmlkZSBhIHN3aXRjaCB0byBmb3JjZSBUYXJnYSBpbnB1dCBtb2RlLgotICovCi0KLXN0YXRpYyBib29sZWFuIGlzX3RhcmdhOwkvKiByZWNvcmRzIHVzZXIgLXRhcmdhIHN3aXRjaCAqLwotCi0KLUxPQ0FMKGNqcGVnX3NvdXJjZV9wdHIpCi1zZWxlY3RfZmlsZV90eXBlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKLXsKLSAgaW50IGM7Ci0KLSAgaWYgKGlzX3RhcmdhKSB7Ci0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0gICAgcmV0dXJuIGppbml0X3JlYWRfdGFyZ2EoY2luZm8pOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9OT1RDT01QKTsKLSNlbmRpZgotICB9Ci0KLSAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FTVBUWSk7Ci0gIGlmICh1bmdldGMoYywgaW5maWxlKSA9PSBFT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9VTkdFVENfRkFJTEVEKTsKLQotICBzd2l0Y2ggKGMpIHsKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGNhc2UgJ0InOgotICAgIHJldHVybiBqaW5pdF9yZWFkX2JtcChjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0gIGNhc2UgJ0cnOgotICAgIHJldHVybiBqaW5pdF9yZWFkX2dpZihjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0gIGNhc2UgJ1AnOgotICAgIHJldHVybiBqaW5pdF9yZWFkX3BwbShjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBSTEVfU1VQUE9SVEVECi0gIGNhc2UgJ1InOgotICAgIHJldHVybiBqaW5pdF9yZWFkX3JsZShjaW5mbyk7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgY2FzZSAweDAwOgotICAgIHJldHVybiBqaW5pdF9yZWFkX3RhcmdhKGNpbmZvKTsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVU5LTk9XTl9GT1JNQVQpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7CQkJLyogc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MgKi8KLX0KLQotCi0vKgotICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgotICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQotICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKLSAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KLSAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgotICovCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLwotCi0KLUxPQ0FMKHZvaWQpCi11c2FnZSAodm9pZCkKLS8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KLXsKLSAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7Ci0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7Ci0jZWxzZQotICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKLSNlbmRpZgotCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xdWFsaXR5IE4gICAgIENvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMDsgNS05NSBpcyB1c2VmdWwgcmFuZ2UpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIENyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZVxuIik7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb3B0aW1pemUgICAgICBPcHRpbWl6ZSBIdWZmbWFuIHRhYmxlIChzbWFsbGVyIGZpbGUsIGJ1dCBzbG93IGNvbXByZXNzaW9uKVxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXByb2dyZXNzaXZlICAgQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZVxuIik7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC10YXJnYSAgICAgICAgIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0ICh1c3VhbGx5IG5vdCBuZWVkZWQpXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOwotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgaW50ICAgICAgIFVzZSBpbnRlZ2VyIERDVCBtZXRob2Qlc1xuIiwKLQkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JU0xPVyA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZhc3QgICAgICBVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSklc1xuIiwKLQkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JRkFTVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZsb2F0ICAgICBVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZCVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0ZMT0FUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7Ci0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNtb290aCBOICAgICAgU21vb3RoIGRpdGhlcmVkIGlucHV0IChOPTEuLjEwMCBpcyBzdHJlbmd0aClcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOwotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJhc2VsaW5lICAgICAgRm9yY2UgYmFzZWxpbmUgcXVhbnRpemF0aW9uIHRhYmxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcXRhYmxlcyBmaWxlICBVc2UgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xc2xvdHMgTlssLi4uXSAgICBTZXQgY29tcG9uZW50IHF1YW50aXphdGlvbiB0YWJsZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9yc1xuIik7Ci0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbnMgZmlsZSAgICBDcmVhdGUgbXVsdGktc2NhbiBKUEVHIHBlciBzY3JpcHQgZmlsZVxuIik7Ci0jZW5kaWYKLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLUxPQ0FMKGludCkKLXBhcnNlX3N3aXRjaGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAotCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQotLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCi0gKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCi0gKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOwotICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCi0gKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKLSAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKLSAqIHByb2Nlc3NpbmcuCi0gKi8KLXsKLSAgaW50IGFyZ247Ci0gIGNoYXIgKiBhcmc7Ci0gIGludCBxdWFsaXR5OwkJCS8qIC1xdWFsaXR5IHBhcmFtZXRlciAqLwotICBpbnQgcV9zY2FsZV9mYWN0b3I7CQkvKiBzY2FsaW5nIHBlcmNlbnRhZ2UgZm9yIC1xdGFibGVzICovCi0gIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmU7Ci0gIGJvb2xlYW4gc2ltcGxlX3Byb2dyZXNzaXZlOwotICBjaGFyICogcXRhYmxlZmlsZSA9IE5VTEw7CS8qIHNhdmVzIC1xdGFibGVzIGZpbGVuYW1lIGlmIGFueSAqLwotICBjaGFyICogcXNsb3RzYXJnID0gTlVMTDsJLyogc2F2ZXMgLXFzbG90cyBwYXJtIGlmIGFueSAqLwotICBjaGFyICogc2FtcGxlYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNhbXBsZSBwYXJtIGlmIGFueSAqLwotICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KLQotICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCi0gIC8qIE5vdGUgdGhhdCBkZWZhdWx0IC1xdWFsaXR5IGxldmVsIG5lZWQgbm90LCBhbmQgZG9lcyBub3QsCi0gICAqIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxpbmcgZm9yIGFuIGV4cGxpY2l0IC1xdGFibGVzIGFyZ3VtZW50LgotICAgKi8KLSAgcXVhbGl0eSA9IDc1OwkJCS8qIGRlZmF1bHQgLXF1YWxpdHkgdmFsdWUgKi8KLSAgcV9zY2FsZV9mYWN0b3IgPSAxMDA7CQkvKiBkZWZhdWx0IHRvIG5vIHNjYWxpbmcgZm9yIC1xdGFibGVzICovCi0gIGZvcmNlX2Jhc2VsaW5lID0gRkFMU0U7CS8qIGJ5IGRlZmF1bHQsIGFsbG93IDE2LWJpdCBxdWFudGl6ZXJzICovCi0gIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IEZBTFNFOwotICBpc190YXJnYSA9IEZBTFNFOwotICBvdXRmaWxlbmFtZSA9IE5VTEw7Ci0gIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmICgqYXJnICE9ICctJykgewotICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCi0gICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKLQlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLwotCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLwotICAgICAgfQotICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KLSAgICB9Ci0gICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCi0KLSAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYXJpdGhtZXRpYyIsIDEpKSB7Ci0gICAgICAvKiBVc2UgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0jaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECi0gICAgICBjaW5mby0+YXJpdGhfY29kZSA9IFRSVUU7Ci0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGFyaXRobWV0aWMgY29kaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImJhc2VsaW5lIiwgMSkpIHsKLSAgICAgIC8qIEZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgb3V0cHV0ICg4LWJpdCBxdWFudGl6ZXIgdmFsdWVzKS4gKi8KLSAgICAgIGZvcmNlX2Jhc2VsaW5lID0gVFJVRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKLSAgICAgIC8qIFNlbGVjdCBEQ1QgYWxnb3JpdGhtLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgewotCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7Ci0gICAgICB9IGVsc2UKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewotICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KLSAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCi0gICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKLQotICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgQ0pQRUcsIHZlcnNpb24gJXNcbiVzXG4iLAotCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7Ci0JcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDIpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMikpIHsKLSAgICAgIC8qIEZvcmNlIGEgbW9ub2Nocm9tZSBKUEVHIGZpbGUgdG8gYmUgZ2VuZXJhdGVkLiAqLwotICAgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX0dSQVlTQ0FMRSk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7Ci0gICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQotCWx2YWwgKj0gMTAwMEw7Ci0gICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3B0aW1pemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJvcHRpbWlzZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZW50cm9weSBwYXJtIG9wdGltaXphdGlvbi4gKi8KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBlbnRyb3B5IG9wdGltaXphdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvdXRmaWxlIiwgNCkpIHsKLSAgICAgIC8qIFNldCBvdXRwdXQgZmlsZSBuYW1lLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2FyZ25dOwkvKiBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZSAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJwcm9ncmVzc2l2ZSIsIDEpKSB7Ci0gICAgICAvKiBTZWxlY3Qgc2ltcGxlIHByb2dyZXNzaXZlIG1vZGUuICovCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IFRSVUU7Ci0gICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCBudW1fY29tcG9uZW50cyBpcyBrbm93bi4gKi8KLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgcHJvZ3Jlc3NpdmUgb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInF1YWxpdHkiLCAxKSkgewotICAgICAgLyogUXVhbGl0eSBmYWN0b3IgKHF1YW50aXphdGlvbiB0YWJsZSBzY2FsaW5nIGZhY3RvcikuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZxdWFsaXR5KSAhPSAxKQotCXVzYWdlKCk7Ci0gICAgICAvKiBDaGFuZ2Ugc2NhbGUgZmFjdG9yIGluIGNhc2UgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KLSAgICAgIHFfc2NhbGVfZmFjdG9yID0ganBlZ19xdWFsaXR5X3NjYWxpbmcocXVhbGl0eSk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInFzbG90cyIsIDIpKSB7Ci0gICAgICAvKiBRdWFudGl6YXRpb24gdGFibGUgc2xvdCBudW1iZXJzLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgcXNsb3RzYXJnID0gYXJndlthcmduXTsKLSAgICAgIC8qIE11c3QgZGVsYXkgc2V0dGluZyBxc2xvdHMgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBwcm9jZXNzZWQgYW55Ci0gICAgICAgKiBjb2xvcnNwYWNlLWRldGVybWluaW5nIHN3aXRjaGVzLCBzaW5jZSBqcGVnX3NldF9jb2xvcnNwYWNlIHNldHMKLSAgICAgICAqIGRlZmF1bHQgcXVhbnQgdGFibGUgbnVtYmVycy4KLSAgICAgICAqLwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxdGFibGVzIiwgMikpIHsKLSAgICAgIC8qIFF1YW50aXphdGlvbiB0YWJsZXMgZmV0Y2hlZCBmcm9tIGZpbGUuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBxdGFibGVmaWxlID0gYXJndlthcmduXTsKLSAgICAgIC8qIFdlIHBvc3Rwb25lIGFjdHVhbGx5IHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcXVhbGl0eSBjb21lcyBsYXRlci4gKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmVzdGFydCIsIDEpKSB7Ci0gICAgICAvKiBSZXN0YXJ0IGludGVydmFsIGluIE1DVSByb3dzIChvciBpbiBNQ1VzIHdpdGggJ2InKS4gKi8KLSAgICAgIGxvbmcgbHZhbDsKLSAgICAgIGNoYXIgY2ggPSAneCc7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQotCXVzYWdlKCk7Ci0gICAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDY1NTM1TCkKLQl1c2FnZSgpOwotICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKLQljaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIGx2YWw7Ci0JY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7IC8qIGVsc2UgcHJpb3IgJy1yZXN0YXJ0IG4nIG92ZXJyaWRlcyBtZSAqLwotICAgICAgfSBlbHNlIHsKLQljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gKGludCkgbHZhbDsKLQkvKiByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KLSAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2FtcGxlIiwgMikpIHsKLSAgICAgIC8qIFNldCBzYW1wbGluZyBmYWN0b3JzLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgc2FtcGxlYXJnID0gYXJndlthcmduXTsKLSAgICAgIC8qIE11c3QgZGVsYXkgc2V0dGluZyBzYW1wbGUgZmFjdG9ycyB1bnRpbCBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCBhbnkKLSAgICAgICAqIGNvbG9yc3BhY2UtZGV0ZXJtaW5pbmcgc3dpdGNoZXMsIHNpbmNlIGpwZWdfc2V0X2NvbG9yc3BhY2Ugc2V0cwotICAgICAgICogZGVmYXVsdCBzYW1wbGluZyBmYWN0b3JzLgotICAgICAgICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYW5zIiwgMikpIHsKLSAgICAgIC8qIFNldCBzY2FuIHNjcmlwdC4gKi8KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIHNjYW5zYXJnID0gYXJndlthcmduXTsKLSAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1wcm9ncmVzc2l2ZSBhcHBlYXJzLiAqLwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBtdWx0aS1zY2FuIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzbW9vdGgiLCAyKSkgewotICAgICAgLyogU2V0IGlucHV0IHNtb290aGluZyBmYWN0b3IuICovCi0gICAgICBpbnQgdmFsOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZ2YWwpICE9IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDEwMCkKLQl1c2FnZSgpOwotICAgICAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSB2YWw7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKLSAgICAgIC8qIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAqLwotICAgICAgaXNfdGFyZ2EgPSBUUlVFOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCi0gICAgfQotICB9Ci0KLSAgLyogUG9zdC1zd2l0Y2gtc2Nhbm5pbmcgY2xlYW51cCAqLwotCi0gIGlmIChmb3JfcmVhbCkgewotCi0gICAgLyogU2V0IHF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHNlbGVjdGVkIHF1YWxpdHkuICovCi0gICAgLyogU29tZSBvciBhbGwgbWF5IGJlIG92ZXJyaWRkZW4gaWYgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KLSAgICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCBxdWFsaXR5LCBmb3JjZV9iYXNlbGluZSk7Ci0KLSAgICBpZiAocXRhYmxlZmlsZSAhPSBOVUxMKQkvKiBwcm9jZXNzIC1xdGFibGVzIGlmIGl0IHdhcyBwcmVzZW50ICovCi0gICAgICBpZiAoISByZWFkX3F1YW50X3RhYmxlcyhjaW5mbywgcXRhYmxlZmlsZSwKLQkJCSAgICAgIHFfc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSkpCi0JdXNhZ2UoKTsKLQotICAgIGlmIChxc2xvdHNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtcXNsb3RzIGlmIGl0IHdhcyBwcmVzZW50ICovCi0gICAgICBpZiAoISBzZXRfcXVhbnRfc2xvdHMoY2luZm8sIHFzbG90c2FyZykpCi0JdXNhZ2UoKTsKLQotICAgIGlmIChzYW1wbGVhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtc2FtcGxlIGlmIGl0IHdhcyBwcmVzZW50ICovCi0gICAgICBpZiAoISBzZXRfc2FtcGxlX2ZhY3RvcnMoY2luZm8sIHNhbXBsZWFyZykpCi0JdXNhZ2UoKTsKLQotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgaWYgKHNpbXBsZV9wcm9ncmVzc2l2ZSkJLyogcHJvY2VzcyAtcHJvZ3Jlc3NpdmU7IC1zY2FucyBjYW4gb3ZlcnJpZGUgKi8KLSAgICAgIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKGNpbmZvKTsKLSNlbmRpZgotCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgaWYgKHNjYW5zYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNjYW5zIGlmIGl0IHdhcyBwcmVzZW50ICovCi0gICAgICBpZiAoISByZWFkX3NjYW5fc2NyaXB0KGNpbmZvLCBzY2Fuc2FyZykpCi0JdXNhZ2UoKTsKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCi19Ci0KLQotLyoKLSAqIFRoZSBtYWluIHByb2dyYW0uCi0gKi8KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOwotI2VuZGlmCi0gIGludCBmaWxlX2luZGV4OwotICBjanBlZ19zb3VyY2VfcHRyIHNyY19tZ3I7Ci0gIEZJTEUgKiBpbnB1dF9maWxlOwotICBGSUxFICogb3V0cHV0X2ZpbGU7Ci0gIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKLQotICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLwotI2lmZGVmIFVTRV9DQ09NTUFORAotICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOwotI2VuZGlmCi0KLSAgcHJvZ25hbWUgPSBhcmd2WzBdOwotICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQotICAgIHByb2duYW1lID0gImNqcGVnIjsJCS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLwotCi0gIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KLSAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOwotICAvKiBBZGQgc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBtZXNzYWdlcyAoZnJvbSBjZGVycm9yLmgpICovCi0gIGplcnIuYWRkb25fbWVzc2FnZV90YWJsZSA9IGNkanBlZ19tZXNzYWdlX3RhYmxlOwotICBqZXJyLmZpcnN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0ZJUlNUQURET05DT0RFOwotICBqZXJyLmxhc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfTEFTVEFERE9OQ09ERTsKLQotICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuICovCi0jaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgSlBFRyBwYXJhbWV0ZXJzLgotICAgKiBNdWNoIG9mIHRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIuCi0gICAqIEluIHBhcnRpY3VsYXIsIHdlIGRvbid0IHlldCBrbm93IHRoZSBpbnB1dCBmaWxlJ3MgY29sb3Igc3BhY2UsCi0gICAqIGJ1dCB3ZSBuZWVkIHRvIHByb3ZpZGUgc29tZSB2YWx1ZSBmb3IganBlZ19zZXRfZGVmYXVsdHMoKSB0byB3b3JrLgotICAgKi8KLQotICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IC8qIGFyYml0cmFyeSBndWVzcyAqLwotICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOwotCi0gIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4KLSAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKLSAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKLSAgICogdGhlIGlucHV0IGZpbGUuCi0gICAqLwotCi0gIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKLQotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KLSAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKLSAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgfQotI2Vsc2UKLSAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLwotICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0jZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLwotICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKLSAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCi0gICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLwotICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgewotICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KLSAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7Ci0jZW5kaWYKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBpbnB1dCBmaWxlIGZvcm1hdCwgYW5kIHNldCB1cCB0byByZWFkIGl0LiAqLwotICBzcmNfbWdyID0gc2VsZWN0X2ZpbGVfdHlwZSgmY2luZm8sIGlucHV0X2ZpbGUpOwotICBzcmNfbWdyLT5pbnB1dF9maWxlID0gaW5wdXRfZmlsZTsKLQotICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlIGhlYWRlciB0byBvYnRhaW4gZmlsZSBzaXplICYgY29sb3JzcGFjZS4gKi8KLSAgKCpzcmNfbWdyLT5zdGFydF9pbnB1dCkgKCZjaW5mbywgc3JjX21ncik7Ci0KLSAgLyogTm93IHRoYXQgd2Uga25vdyBpbnB1dCBjb2xvcnNwYWNlLCBmaXggY29sb3JzcGFjZS1kZXBlbmRlbnQgZGVmYXVsdHMgKi8KLSAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKLQotICAvKiBBZGp1c3QgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7Ci0KLSAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLwotICBqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRwdXRfZmlsZSk7Ci0KLSAgLyogU3RhcnQgY29tcHJlc3NvciAqLwotICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7Ci0KLSAgLyogUHJvY2VzcyBkYXRhICovCi0gIHdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7Ci0gICAgbnVtX3NjYW5saW5lcyA9ICgqc3JjX21nci0+Z2V0X3BpeGVsX3Jvd3MpICgmY2luZm8sIHNyY19tZ3IpOwotICAgICh2b2lkKSBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHNyY19tZ3ItPmJ1ZmZlciwgbnVtX3NjYW5saW5lcyk7Ci0gIH0KLQotICAvKiBGaW5pc2ggY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5ICovCi0gICgqc3JjX21nci0+ZmluaXNoX2lucHV0KSAoJmNpbmZvLCBzcmNfbWdyKTsKLSAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKLSAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCi0gIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQotICAgIGZjbG9zZShpbnB1dF9maWxlKTsKLSAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKLSAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOwotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7Ci0jZW5kaWYKLQotICAvKiBBbGwgZG9uZS4gKi8KLSAgZXhpdChqZXJyLm51bV93YXJuaW5ncyA/IEVYSVRfV0FSTklORyA6IEVYSVRfU1VDQ0VTUyk7Ci0gIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY2tjb25maWcuYyBiL2xpYmpwZWd0d3JwL2NrY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YmFmNzkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY2tjb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICogY2tjb25maWcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCB0byBoZWxwIHlvdSBkZXRlcm1pbmUgaG93IHRvIGNvbmZpZ3VyZSB0aGUgSlBFRwotICogc29mdHdhcmUgZm9yIGluc3RhbGxhdGlvbiBvbiBhIHBhcnRpY3VsYXIgc3lzdGVtLiAgVGhlIGlkZWEgaXMgdG8gdHJ5IHRvCi0gKiBjb21waWxlIGFuZCBleGVjdXRlIHRoaXMgcHJvZ3JhbS4gIElmIHlvdXIgY29tcGlsZXIgZmFpbHMgdG8gY29tcGlsZSB0aGUKLSAqIHByb2dyYW0sIG1ha2UgY2hhbmdlcyBhcyBpbmRpY2F0ZWQgaW4gdGhlIGNvbW1lbnRzIGJlbG93LiAgT25jZSB5b3UgY2FuCi0gKiBjb21waWxlIHRoZSBwcm9ncmFtLCBydW4gaXQsIGFuZCBpdCB3aWxsIHByb2R1Y2UgYSAiamNvbmZpZy5oIiBmaWxlIGZvcgotICogeW91ciBzeXN0ZW0uCi0gKgotICogQXMgYSBnZW5lcmFsIHJ1bGUsIGVhY2ggdGltZSB5b3UgdHJ5IHRvIGNvbXBpbGUgdGhpcyBwcm9ncmFtLAotICogcGF5IGF0dGVudGlvbiBvbmx5IHRvIHRoZSAqZmlyc3QqIGVycm9yIG1lc3NhZ2UgeW91IGdldCBmcm9tIHRoZSBjb21waWxlci4KLSAqIE1hbnkgQyBjb21waWxlcnMgd2lsbCBpc3N1ZSBsb3RzIG9mIHNwdXJpb3VzIGVycm9yIG1lc3NhZ2VzIG9uY2UgdGhleQotICogaGF2ZSBnb3R0ZW4gY29uZnVzZWQuICBHbyB0byB0aGUgbGluZSBpbmRpY2F0ZWQgaW4gdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2UsCi0gKiBhbmQgcmVhZCB0aGUgY29tbWVudHMgcHJlY2VkaW5nIHRoYXQgbGluZSB0byBzZWUgd2hhdCB0byBjaGFuZ2UuCi0gKgotICogQWxtb3N0IGFsbCBvZiB0aGUgZWRpdHMgeW91IG1heSBuZWVkIHRvIG1ha2UgdG8gdGhpcyBwcm9ncmFtIGNvbnNpc3Qgb2YKLSAqIGNoYW5naW5nIGEgbGluZSB0aGF0IHJlYWRzICIjZGVmaW5lIFNPTUVfU1lNQk9MIiB0byAiI3VuZGVmIFNPTUVfU1lNQk9MIiwKLSAqIG9yIHZpY2UgdmVyc2EuICBUaGlzIGlzIGNhbGxlZCBkZWZpbmluZyBvciB1bmRlZmluaW5nIHRoYXQgc3ltYm9sLgotICovCi0KLQotLyogRmlyc3Qgd2UgbXVzdCBzZWUgaWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBpbmNsdWRlIGZpbGVzIHdlIG5lZWQuCi0gKiBXZSBzdGFydCBvdXQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHlvdXIgc3lzdGVtIGhhcyBhbGwgdGhlIEFOU0ktc3RhbmRhcmQKLSAqIGluY2x1ZGUgZmlsZXMuICBJZiB5b3UgZ2V0IGFueSBlcnJvciB0cnlpbmcgdG8gaW5jbHVkZSBvbmUgb2YgdGhlc2UgZmlsZXMsCi0gKiB1bmRlZmluZSB0aGUgY29ycmVzcG9uZGluZyBIQVZFX3h4eCBzeW1ib2wuCi0gKi8KLQotI2RlZmluZSBIQVZFX1NURERFRl9ICQkvKiByZXBsYWNlICdkZWZpbmUnIGJ5ICd1bmRlZicgaWYgZXJyb3IgaGVyZSAqLwotI2lmZGVmIEhBVkVfU1REREVGX0gJCS8qIG5leHQgbGluZSB3aWxsIGJlIHNraXBwZWQgaWYgeW91IHVuZGVmLi4uICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBIQVZFX1NURExJQl9ICQkvKiBzYW1lIHRoaW5nIGZvciBzdGRsaWIuaCAqLwotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4JCS8qIElmIHlvdSBhaW4ndCBnb3QgdGhpcywgeW91IGFpbid0IGdvdCBDLiAqLwotCi0vKiBXZSBoYXZlIHRvIHNlZSBpZiB5b3VyIHN0cmluZyBmdW5jdGlvbnMgYXJlIGRlZmluZWQgYnkKLSAqIHN0cmluZ3MuaCAob2xkIEJTRCBjb252ZW50aW9uKSBvciBzdHJpbmcuaCAoZXZlcnlib2R5IGVsc2UpLgotICogV2UgdHJ5IHRoZSBub24tQlNEIGNvbnZlbnRpb24gZmlyc3Q7IGRlZmluZSBORUVEX0JTRF9TVFJJTkdTCi0gKiBpZiB0aGUgY29tcGlsZXIgc2F5cyBpdCBjYW4ndCBmaW5kIHN0cmluZy5oLgotICovCi0KLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0KLSNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKiBPbiBzb21lIHN5c3RlbXMgKGVzcGVjaWFsbHkgb2xkZXIgVW5peCBtYWNoaW5lcyksIHR5cGUgc2l6ZV90IGlzCi0gKiBkZWZpbmVkIG9ubHkgaW4gdGhlIGluY2x1ZGUgZmlsZSA8c3lzL3R5cGVzLmg+LiAgSWYgeW91IGdldCBhIGZhaWx1cmUKLSAqIG9uIHRoZSBzaXplX3QgdGVzdCBiZWxvdywgdHJ5IGRlZmluaW5nIE5FRURfU1lTX1RZUEVTX0guCi0gKi8KLQotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gJCS8qIHN0YXJ0IGJ5IGFzc3VtaW5nIHdlIGRvbid0IG5lZWQgaXQgKi8KLSNpZmRlZiBORUVEX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotCi0vKiBVc3VhbGx5IHR5cGUgc2l6ZV90IGlzIGRlZmluZWQgaW4gb25lIG9mIHRoZSBpbmNsdWRlIGZpbGVzIHdlJ3ZlIGluY2x1ZGVkCi0gKiBhYm92ZS4gIElmIG5vdCwgeW91J2xsIGdldCBhbiBlcnJvciBvbiB0aGUgInR5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsiIGxpbmUuCi0gKiBJbiB0aGF0IGNhc2UsIGZpcnN0IHRyeSBkZWZpbmluZyBORUVEX1NZU19UWVBFU19IIGp1c3QgYWJvdmUuCi0gKiBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gc2VhcmNoIHRocm91Z2ggeW91ciBzeXN0ZW0gbGlicmFyeQotICogdG8gZmlndXJlIG91dCB3aGljaCBpbmNsdWRlIGZpbGUgZGVmaW5lcyAic2l6ZV90Ii4gIExvb2sgZm9yIGEgbGluZSB0aGF0Ci0gKiBzYXlzICJ0eXBlZGVmIHNvbWV0aGluZy1vci1vdGhlciBzaXplX3Q7Ii4gIFRoZW4sIGNoYW5nZSB0aGUgbGluZSBiZWxvdwotICogdGhhdCBzYXlzICIjaW5jbHVkZSA8c29tZWluY2x1ZGVmaWxlLmg+IiB0byBpbnN0ZWFkIGluY2x1ZGUgdGhlIGZpbGUKLSAqIHlvdSBmb3VuZCBzaXplX3QgaW4sIGFuZCBkZWZpbmUgTkVFRF9TUEVDSUFMX0lOQ0xVREUuICBJZiB5b3UgY2FuJ3QgZmluZAotICogdHlwZSBzaXplX3QgYW55d2hlcmUsIHRyeSByZXBsYWNpbmcgIiNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4iIHdpdGgKLSAqICJ0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ii4KLSAqLwotCi0jdW5kZWYgTkVFRF9TUEVDSUFMX0lOQ0xVREUJLyogYXNzdW1lIHdlIERPTidUIG5lZWQgaXQsIGZvciBzdGFydGVycyAqLwotCi0jaWZkZWYgTkVFRF9TUEVDSUFMX0lOQ0xVREUKLSNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4KLSNlbmRpZgotCi10eXBlZGVmIHNpemVfdCBteV9zaXplX3Q7CS8qIFRoZSBwYXlvZmY6IGRvIHdlIGhhdmUgc2l6ZV90IG5vdz8gKi8KLQotCi0vKiBUaGUgbmV4dCBxdWVzdGlvbiBpcyB3aGV0aGVyIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgQU5TSS1zdHlsZSBmdW5jdGlvbgotICogcHJvdG90eXBlcy4gIFlvdSBuZWVkIHRvIGtub3cgdGhpcyBpbiBvcmRlciB0byBjaG9vc2UgYmV0d2VlbiB1c2luZwotICogbWFrZWZpbGUuYW5zaSBhbmQgdXNpbmcgbWFrZWZpbGUudW5peC4KLSAqIFRoZSAjZGVmaW5lIGxpbmUgYmVsb3cgaXMgc2V0IHRvIGFzc3VtZSB5b3UgaGF2ZSBBTlNJIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGluIHRoaXMgZ3JvdXAgb2YgbGluZXMsIHVuZGVmaW5lIEhBVkVfUFJPVE9UWVBFUy4KLSAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMik7IC8qIGNoZWNrIHByb3RvdHlwZXMgKi8KLQotc3RydWN0IG1ldGhvZHNfc3RydWN0IHsJCS8qIGNoZWNrIG1ldGhvZC1wb2ludGVyIGRlY2xhcmF0aW9ucyAqLwotICBpbnQgKCplcnJvcl9leGl0KSAoY2hhciAqbXNndGV4dCk7Ci0gIGludCAoKnRyYWNlX21lc3NhZ2UpIChjaGFyICptc2d0ZXh0KTsKLSAgaW50ICgqYW5vdGhlcl9tZXRob2QpICh2b2lkKTsKLX07Ci0KLWludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKSAvKiBjaGVjayBkZWZpbml0aW9ucyAqLwotewotICByZXR1cm4gYXJnMlthcmcxXTsKLX0KLQotaW50IHRlc3QyZnVuY3Rpb24gKHZvaWQpCS8qIGNoZWNrIHZvaWQgYXJnIGxpc3QgKi8KLXsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotCi0vKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIGtub3dzIHdoYXQgInVuc2lnbmVkIGNoYXIiIG1lYW5zLgotICogSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgInVuc2lnbmVkIGNoYXIgdW5fY2hhcjsiIGxpbmUsCi0gKiB0aGVuIHVuZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUi4KLSAqLwotCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi11bnNpZ25lZCBjaGFyIHVuX2NoYXI7Ci0jZW5kaWYKLQotCi0vKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIGtub3dzIHdoYXQgInVuc2lnbmVkIHNob3J0IiBtZWFucy4KLSAqIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlICJ1bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsiIGxpbmUsCi0gKiB0aGVuIHVuZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQuCi0gKi8KLQotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCi11bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsKLSNlbmRpZgotCi0KLS8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIgdW5kZXJzdGFuZHMgdHlwZSAidm9pZCIuCi0gKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGFueXdoZXJlIGluIGhlcmUsIHVuZGVmaW5lIEhBVkVfVk9JRC4KLSAqLwotCi0jZGVmaW5lIEhBVkVfVk9JRAotCi0jaWZkZWYgSEFWRV9WT0lECi0vKiBDYXV0aW9uOiBhIEMrKyBjb21waWxlciB3aWxsIGluc2lzdCBvbiBjb21wbGV0ZSBwcm90b3R5cGVzICovCi10eXBlZGVmIHZvaWQgKiB2b2lkX3B0cjsJLyogY2hlY2sgdm9pZCAqICovCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayBwdHIgdG8gZnVuY3Rpb24gcmV0dXJuaW5nIHZvaWQgKi8KLXR5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKGludCBhLCBpbnQgYik7Ci0jZWxzZQotdHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayB2b2lkIGZ1bmN0aW9uIHJlc3VsdCAqLwotdm9pZCB0ZXN0M2Z1bmN0aW9uICh2b2lkX3B0ciBhcmcxLCB2b2lkX2Z1bmMgYXJnMikKLSNlbHNlCi12b2lkIHRlc3QzZnVuY3Rpb24gKGFyZzEsIGFyZzIpCi0gICAgIHZvaWRfcHRyIGFyZzE7Ci0gICAgIHZvaWRfZnVuYyBhcmcyOwotI2VuZGlmCi17Ci0gIGNoYXIgKiBsb2NwdHIgPSAoY2hhciAqKSBhcmcxOyAvKiBjaGVjayBjYXN0aW5nIHRvIGFuZCBmcm9tIHZvaWQgKiAqLwotICBhcmcxID0gKHZvaWQgKikgbG9jcHRyOwotICAoKmFyZzIpICgxLCAyKTsJCS8qIGNoZWNrIGNhbGwgb2YgZmNuIHJldHVybmluZyB2b2lkICovCi19Ci0jZW5kaWYKLQotCi0vKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIGtub3dzIHdoYXQgImNvbnN0IiBtZWFucy4KLSAqIElmIHlvdSBnZXQgYW4gZXJyb3IgaGVyZSwgdW5kZWZpbmUgSEFWRV9DT05TVC4KLSAqLwotCi0jZGVmaW5lIEhBVkVfQ09OU1QKLQotI2lmZGVmIEhBVkVfQ09OU1QKLXN0YXRpYyBjb25zdCBpbnQgY2FycmF5WzNdID0gezEsIDIsIDN9OwotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgdGVzdDRmdW5jdGlvbiAoY29uc3QgaW50IGFyZzEpCi0jZWxzZQotaW50IHRlc3Q0ZnVuY3Rpb24gKGFyZzEpCi0gICAgIGNvbnN0IGludCBhcmcxOwotI2VuZGlmCi17Ci0gIHJldHVybiBjYXJyYXlbYXJnMV07Ci19Ci0jZW5kaWYKLQotCi0vKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG9yIHdhcm5pbmcgYWJvdXQgdGhpcyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwKLSAqIGRlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTi4KLSAqLwotCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmbmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotdHlwZWRlZiBzdHJ1Y3QgdW5kZWZpbmVkX3N0cnVjdHVyZSAqIHVuZGVmX3N0cnVjdF9wdHI7Ci0jZW5kaWYKLQotCi0vKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGFib3V0IGR1cGxpY2F0ZSBuYW1lcywKLSAqIGRlZmluZSBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTLgotICovCi0KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0KLSNpZm5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotCi1pbnQgcG9zc2libHlfZHVwbGljYXRlX2Z1bmN0aW9uICgpCi17Ci0gIHJldHVybiAwOwotfQotCi1pbnQgcG9zc2libHlfZHVwbGlfZnVuY3Rpb24gKCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLSNlbmRpZgotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE9LLCB0aGF0J3MgaXQuICBZb3Ugc2hvdWxkIG5vdCBoYXZlIHRvIGNoYW5nZSBhbnl0aGluZyBiZXlvbmQgdGhpcwotICogIHBvaW50IGluIG9yZGVyIHRvIGNvbXBpbGUgYW5kIGV4ZWN1dGUgdGhpcyBwcm9ncmFtLiAgKFlvdSBtaWdodCBnZXQKLSAqICBzb21lIHdhcm5pbmdzLCBidXQgeW91IGNhbiBpZ25vcmUgdGhlbS4pCi0gKiAgV2hlbiB5b3UgcnVuIHRoZSBwcm9ncmFtLCBpdCB3aWxsIG1ha2UgYSBjb3VwbGUgbW9yZSB0ZXN0cyB0aGF0IGl0Ci0gKiAgY2FuIGRvIGF1dG9tYXRpY2FsbHksIGFuZCB0aGVuIGl0IHdpbGwgY3JlYXRlIGpjb25maWcuaCBhbmQgcHJpbnQgb3V0Ci0gKiAgYW55IGFkZGl0aW9uYWwgc3VnZ2VzdGlvbnMgaXQgaGFzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotaW50IGlzX2NoYXJfc2lnbmVkIChpbnQgYXJnKQotI2Vsc2UKLWludCBpc19jaGFyX3NpZ25lZCAoYXJnKQotICAgICBpbnQgYXJnOwotI2VuZGlmCi17Ci0gIGlmIChhcmcgPT0gMTg5KSB7CQkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHVuc2lnbmVkIGNoYXIgKi8KLSAgICByZXR1cm4gMDsJCQkvKiB0eXBlIGNoYXIgaXMgdW5zaWduZWQgKi8KLSAgfQotICBlbHNlIGlmIChhcmcgIT0gLTY3KSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIGNoYXIgKi8KLSAgICBwcmludGYoIkhtbSwgaXQgc2VlbXMgJ2NoYXInIGlzIG5vdCBlaWdodCBiaXRzIHdpZGUgb24geW91ciBtYWNoaW5lLlxuIik7Ci0gICAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOwotICB9Ci0gIHJldHVybiAxOwkJCS8qIGFzc3VtZSBjaGFyIGlzIHNpZ25lZCBvdGhlcndpc2UgKi8KLX0KLQotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykKLSNlbHNlCi1pbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChhcmcpCi0gICAgIGxvbmcgYXJnOwotI2VuZGlmCi0vKiBTZWUgd2hldGhlciByaWdodC1zaGlmdCBvbiBhIGxvbmcgaXMgc2lnbmVkIG9yIG5vdC4gKi8KLXsKLSAgbG9uZyByZXMgPSBhcmcgPj4gNDsKLQotICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIHNoaWZ0ICovCi0gICAgcmV0dXJuIDE7CQkJLyogcmlnaHQgc2hpZnQgaXMgc2lnbmVkICovCi0gIH0KLSAgLyogc2VlIGlmIHVuc2lnbmVkLXNoaWZ0IGhhY2sgd2lsbCBmaXggaXQuICovCi0gIC8qIHdlIGNhbid0IGp1c3QgdGVzdCBleGFjdCB2YWx1ZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHdpZHRoIG9mIGxvbmcuLi4gKi8KLSAgcmVzIHw9ICh+MEwpIDw8ICgzMi00KTsKLSAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgbm93PyAqLwotICAgIHJldHVybiAwOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkICovCi0gIH0KLSAgcHJpbnRmKCJSaWdodCBzaGlmdCBpc24ndCBhY3RpbmcgYXMgSSBleHBlY3QgaXQgdG8uXG4iKTsKLSAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOwotICByZXR1cm4gMDsJCQkvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KLX0KLQotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi1pbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKLSNlbHNlCi1pbnQgbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLSNlbmRpZgotewotICBjaGFyIHNpZ25lZF9jaGFyX2NoZWNrID0gKGNoYXIpICgtNjcpOwotICBGSUxFICpvdXRmaWxlOwotCi0gIC8qIEF0dGVtcHQgdG8gd3JpdGUgamNvbmZpZy5oICovCi0gIGlmICgob3V0ZmlsZSA9IGZvcGVuKCJqY29uZmlnLmgiLCAidyIpKSA9PSBOVUxMKSB7Ci0gICAgcHJpbnRmKCJGYWlsZWQgdG8gd3JpdGUgamNvbmZpZy5oXG4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8qIFdyaXRlIG91dCBhbGwgdGhlIGluZm8gKi8KLSAgZnByaW50ZihvdXRmaWxlLCAiLyogamNvbmZpZy5oIC0tLSBnZW5lcmF0ZWQgYnkgY2tjb25maWcuYyAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIi8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovXG5cbiIpOwotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfUFJPVE9UWVBFU1xuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9QUk9UT1RZUEVTXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUlxuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9VTlNJR05FRF9DSEFSXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfVk9JRAotICBmcHJpbnRmKG91dGZpbGUsICIvKiAjZGVmaW5lIHZvaWQgY2hhciAqL1xuIik7Ci0jZWxzZQotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIHZvaWQgY2hhclxuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0NPTlNUCi0gIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgY29uc3QgKi9cbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBjb25zdFxuIik7Ci0jZW5kaWYKLSAgaWYgKGlzX2NoYXJfc2lnbmVkKChpbnQpIHNpZ25lZF9jaGFyX2NoZWNrKSkKLSAgICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgQ0hBUl9JU19VTlNJR05FRFxuIik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIENIQVJfSVNfVU5TSUdORURcbiIpOwotI2lmZGVmIEhBVkVfU1REREVGX0gKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1NURERFRl9IXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1NURERFRl9IXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1NURExJQl9IXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1NURExJQl9IXG4iKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBORUVEX0JTRF9TVFJJTkdTXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX0JTRF9TVFJJTkdTXG4iKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBORUVEX1NZU19UWVBFU19IXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX1NZU19UWVBFU19IXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlNcbiIpOwotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTXG4iKTsKLSNlbHNlCi0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTXG4iKTsKLSNlbmRpZgotI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU5cbiIpOwotI2Vsc2UKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOXG4iKTsKLSNlbmRpZgotICBmcHJpbnRmKG91dGZpbGUsICJcbiNpZmRlZiBKUEVHX0lOVEVSTkFMU1xuXG4iKTsKLSAgaWYgKGlzX3NoaWZ0aW5nX3NpZ25lZCgtMHg3RjdFODBCMUwpKQotICAgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRFxuIik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiXG4jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICJcbiNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHXG5cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOwotICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cblxuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBZb3UgbWF5IG5lZWQgdGhpcyBvbiBub24tVW5peCBzeXN0ZW1zICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIERPTlRfVVNFX0JfTU9ERVxuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgUFJPR1JFU1NfUkVQT1JUICovCS8qIG9wdGlvbmFsICovXG4iKTsKLSAgZnByaW50ZihvdXRmaWxlLCAiXG4jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqL1xuIik7Ci0KLSAgLyogQ2xvc2UgdGhlIGpjb25maWcuaCBmaWxlICovCi0gIGZjbG9zZShvdXRmaWxlKTsKLQotICAvKiBVc2VyIHJlcG9ydCAqLwotICBwcmludGYoIkNvbmZpZ3VyYXRpb24gY2hlY2sgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZSBkb25lLlxuIik7Ci0gIHByaW50ZigiXG5JIGhhdmUgd3JpdHRlbiB0aGUgamNvbmZpZy5oIGZpbGUgZm9yIHlvdS5cblxuIik7Ci0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0gIHByaW50ZigiWW91IHNob3VsZCB1c2UgbWFrZWZpbGUuYW5zaSBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgTWFrZWZpbGUuXG4iKTsKLSNlbHNlCi0gIHByaW50ZigiWW91IHNob3VsZCB1c2UgbWFrZWZpbGUudW5peCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgTWFrZWZpbGUuXG4iKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9TUEVDSUFMX0lOQ0xVREUKLSAgcHJpbnRmKCJcbllvdSdsbCBuZWVkIHRvIGNoYW5nZSBqY29uZmlnLmggdG8gaW5jbHVkZSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZVxuIik7Ci0gIHByaW50ZigidGhhdCB5b3UgZm91bmQgdHlwZSBzaXplX3QgaW4sIG9yIGFkZCBhIGRpcmVjdCBkZWZpbml0aW9uIG9mIHR5cGVcbiIpOwotICBwcmludGYoInNpemVfdCBpZiB0aGF0J3Mgd2hhdCB5b3UgdXNlZC4gIEp1c3QgYWRkIGl0IHRvIHRoZSBlbmQuXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY29kZXJ1bGVzLmRvYyBiL2xpYmpwZWd0d3JwL2NvZGVydWxlcy5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYjVkOWIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY29kZXJ1bGVzLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi1JSkcgSlBFRyBMSUJSQVJZOiAgQ09ESU5HIFJVTEVTCi0KLUNvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0KLQotU2luY2UgbnVtZXJvdXMgcGVvcGxlIHdpbGwgYmUgY29udHJpYnV0aW5nIGNvZGUgYW5kIGJ1ZyBmaXhlcywgaXQncyBpbXBvcnRhbnQKLXRvIGVzdGFibGlzaCBhIGNvbW1vbiBjb2Rpbmcgc3R5bGUuICBUaGUgZ29hbCBvZiB1c2luZyBzaW1pbGFyIGNvZGluZyBzdHlsZXMKLWlzIG11Y2ggbW9yZSBpbXBvcnRhbnQgdGhhbiB0aGUgZGV0YWlscyBvZiBqdXN0IHdoYXQgdGhhdCBzdHlsZSBpcy4KLQotSW4gZ2VuZXJhbCB3ZSBmb2xsb3cgdGhlIHJlY29tbWVuZGF0aW9ucyBvZiAiUmVjb21tZW5kZWQgQyBTdHlsZSBhbmQgQ29kaW5nCi1TdGFuZGFyZHMiIHJldmlzaW9uIDYuMSAoQ2Fubm9uIGV0IGFsLiBhcyBtb2RpZmllZCBieSBTcGVuY2VyLCBLZXBwZWwgYW5kCi1CcmFkZXIpLiAgVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgaW4gdGhlIElKRyBGVFAgYXJjaGl2ZSAoc2VlCi1qcGVnL2RvYy9jc3R5bGUubXMudGJsLlosIG9yIGNzdHlsZS50eHQuWiBmb3IgdGhvc2Ugd2l0aG91dCBucm9mZi90YmwpLgotCi1CbG9jayBjb21tZW50cyBzaG91bGQgYmUgbGFpZCBvdXQgdGh1c2x5OgotCi0vKgotICogIEJsb2NrIGNvbW1lbnRzIGluIHRoaXMgc3R5bGUuCi0gKi8KLQotV2UgaW5kZW50IHN0YXRlbWVudHMgaW4gSyZSIHN0eWxlLCBlLmcuLAotCWlmICh0ZXN0KSB7Ci0JICB0aGVuLXBhcnQ7Ci0JfSBlbHNlIHsKLQkgIGVsc2UtcGFydDsKLQl9Ci13aXRoIHR3byBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsLiAgKFRoaXMgaW5kZW50YXRpb24gY29udmVudGlvbiBpcwotaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IEdOVSBFbWFjcyBhbmQgbWFueSBvdGhlciB0ZXh0IGVkaXRvcnMuKQotCi1NdWx0aS13b3JkIG5hbWVzIHNob3VsZCBiZSB3cml0dGVuIGluIGxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcywgZS5nLiwKLW11bHRpX3dvcmRfbmFtZSAobm90IG11bHRpV29yZE5hbWUpLiAgUHJlcHJvY2Vzc29yIHN5bWJvbHMgYW5kIGVudW0gY29uc3RhbnRzCi1hcmUgc2ltaWxhciBidXQgdXBwZXIgY2FzZSAoTVVMVElfV09SRF9OQU1FKS4gIE5hbWVzIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluCi10aGUgZmlyc3QgZmlmdGVlbiBjaGFyYWN0ZXJzLiAgKE9uIHNvbWUgb2xkZXIgc3lzdGVtcywgZ2xvYmFsIG5hbWVzIG11c3QgYmUKLXVuaXF1ZSB3aXRoaW4gc2l4IGNoYXJhY3RlcnMuICBXZSBhY2NvbW1vZGF0ZSB0aGlzIHdpdGhvdXQgY2x1dHRlcmluZyB0aGUKLXNvdXJjZSBjb2RlIGJ5IHVzaW5nIG1hY3JvcyB0byBzdWJzdGl0dXRlIHNob3J0ZXIgbmFtZXMuKQotCi1XZSB1c2UgZnVuY3Rpb24gcHJvdG90eXBlcyBldmVyeXdoZXJlOyB3ZSByZWx5IG9uIGF1dG9tYXRpYyBzb3VyY2UgY29kZQotdHJhbnNmb3JtYXRpb24gdG8gZmVlZCBwcm90b3R5cGUtbGVzcyBDIGNvbXBpbGVycy4gIFRyYW5zZm9ybWF0aW9uIGlzIGRvbmUKLWJ5IHRoZSBzaW1wbGUgYW5kIHBvcnRhYmxlIHRvb2wgJ2Fuc2kya25yLmMnIChjb3VydGVzeSBvZiBHaG9zdHNjcmlwdCkuCi1hbnNpMmtuciBpcyBub3QgdmVyeSBicmlnaHQsIHNvIGl0IGltcG9zZXMgYSBmb3JtYXQgcmVxdWlyZW1lbnQgb24gZnVuY3Rpb24KLWRlY2xhcmF0aW9uczogdGhlIGZ1bmN0aW9uIG5hbWUgTVVTVCBCRUdJTiBJTiBDT0xVTU4gMS4gIFRodXMgYWxsIGZ1bmN0aW9ucwotc2hvdWxkIGJlIHdyaXR0ZW4gaW4gdGhlIGZvbGxvd2luZyBzdHlsZToKLQotTE9DQUwoaW50ICopCi1mdW5jdGlvbl9uYW1lIChpbnQgYSwgY2hhciAqYikKLXsKLSAgICBjb2RlLi4uCi19Ci0KLU5vdGUgdGhhdCBlYWNoIGZ1bmN0aW9uIGRlZmluaXRpb24gbXVzdCBiZWdpbiB3aXRoIEdMT0JBTCh0eXBlKSwgTE9DQUwodHlwZSksCi1vciBNRVRIT0RERUYodHlwZSkuICBUaGVzZSBtYWNyb3MgZXhwYW5kIHRvICJzdGF0aWMgdHlwZSIgb3IganVzdCAidHlwZSIgYXMKLWFwcHJvcHJpYXRlLiAgVGhleSBwcm92aWRlIGEgcmVhZGFibGUgaW5kaWNhdGlvbiBvZiB0aGUgcm91dGluZSdzIHVzYWdlIGFuZAotY2FuIHJlYWRpbHkgYmUgY2hhbmdlZCBmb3Igc3BlY2lhbCBuZWVkcy4gIChGb3IgaW5zdGFuY2UsIHNwZWNpYWwgbGlua2FnZQota2V5d29yZHMgY2FuIGJlIGluc2VydGVkIGZvciB1c2UgaW4gV2luZG93cyBETExzLikKLQotYW5zaTJrbnIgZG9lcyBub3QgdHJhbnNmb3JtIG1ldGhvZCBkZWNsYXJhdGlvbnMgKGZ1bmN0aW9uIHBvaW50ZXJzIGluCi1zdHJ1Y3RzKS4gIFdlIGhhbmRsZSB0aGVzZSB3aXRoIGEgbWFjcm8gSk1FVEhPRCwgZGVmaW5lZCBhcwotCSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLQkjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgYXJnbGlzdAotCSNlbHNlCi0JI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpICgpCi0JI2VuZGlmCi13aGljaCBpcyB1c2VkIGxpa2UgdGhpczoKLQlzdHJ1Y3QgZnVuY3Rpb25fcG9pbnRlcnMgewotCSAgSk1FVEhPRCh2b2lkLCBpbml0X2VudHJvcHlfZW5jb2RlciwgKGludCBzb21lYXJnLCBqcGFybXMgKmpwKSk7Ci0JICBKTUVUSE9EKHZvaWQsIHRlcm1fZW50cm9weV9lbmNvZGVyLCAodm9pZCkpOwotCX07Ci1Ob3RlIHRoZSBzZXQgb2YgcGFyZW50aGVzZXMgc3Vycm91bmRpbmcgdGhlIHBhcmFtZXRlciBsaXN0LgotCi1BIHNpbWlsYXIgc29sdXRpb24gaXMgdXNlZCBmb3IgZm9yd2FyZCBhbmQgZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0oc2VlIHRoZSBFWFRFUk4gYW5kIEpQUCBtYWNyb3MpLgotCi1JZiB0aGUgY29kZSBpcyB0byB3b3JrIG9uIG5vbi1BTlNJIGNvbXBpbGVycywgd2UgY2Fubm90IHJlbHkgb24gYSBwcm90b3R5cGUKLWRlY2xhcmF0aW9uIHRvIGNvZXJjZSBhY3R1YWwgcGFyYW1ldGVycyBpbnRvIHRoZSByaWdodCB0eXBlcy4gIFRoZXJlZm9yZSwgdXNlCi1leHBsaWNpdCBjYXN0cyBvbiBhY3R1YWwgcGFyYW1ldGVycyB3aGVuZXZlciB0aGUgYWN0dWFsIHBhcmFtZXRlciB0eXBlIGlzIG5vdAotaWRlbnRpY2FsIHRvIHRoZSBmb3JtYWwgcGFyYW1ldGVyLiAgQmV3YXJlIG9mIGltcGxpY2l0IGNvbnZlcnNpb25zIHRvICJpbnQiLgotCi1JdCBzZWVtcyB0aGVyZSBhcmUgc29tZSBub24tQU5TSSBjb21waWxlcnMgaW4gd2hpY2ggdGhlIHNpemVvZigpIG9wZXJhdG9yCi1pcyBkZWZpbmVkIHRvIHJldHVybiBpbnQsIHlldCBzaXplX3QgaXMgZGVmaW5lZCBhcyBsb25nLiAgTmVlZGxlc3MgdG8gc2F5LAotdGhpcyBpcyBicmFpbi1kYW1hZ2VkLiAgQWx3YXlzIHVzZSB0aGUgU0laRU9GKCkgbWFjcm8gaW4gcGxhY2Ugb2Ygc2l6ZW9mKCksCi1zbyB0aGF0IHRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBvZiB0eXBlIHNpemVfdC4KLQotCi1UaGUgSlBFRyBsaWJyYXJ5IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aGluIGxhcmdlciBwcm9ncmFtcy4gIEZ1cnRoZXJtb3JlLAotd2Ugd2FudCBpdCB0byBiZSByZWVudHJhbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgdGhhdCBwcm9jZXNzCi1tdWx0aXBsZSBpbWFnZXMgY29uY3VycmVudGx5LiAgVGhlIGZvbGxvd2luZyBydWxlcyBzdXBwb3J0IHRoZXNlIHJlcXVpcmVtZW50czoKLQotMS4gQXZvaWQgZGlyZWN0IHVzZSBvZiBmaWxlIEkvTywgIm1hbGxvYyIsIGVycm9yIHJlcG9ydCBwcmludG91dHMsIGV0YzsKLXBhc3MgdGhlc2UgdGhyb3VnaCB0aGUgY29tbW9uIHJvdXRpbmVzIHByb3ZpZGVkLgotCi0yLiBNaW5pbWl6ZSBnbG9iYWwgbmFtZXNwYWNlIHBvbGx1dGlvbi4gIEZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgc3RhdGljCi13aGVyZXZlciBwb3NzaWJsZS4gIChOb3RlIHRoYXQgb3VyIG1ldGhvZC1iYXNlZCBjYWxsaW5nIGNvbnZlbnRpb25zIGhlbHAgdGhpcwotYSBsb3Q6IGluIG1hbnkgbW9kdWxlcyBvbmx5IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aWxsIGV2ZXIgbmVlZCB0byBiZQotY2FsbGVkIGRpcmVjdGx5LCBzbyBvbmx5IHRoYXQgZnVuY3Rpb24gbmVlZCBiZSBleHRlcm5hbGx5IHZpc2libGUuKSAgQWxsCi1nbG9iYWwgZnVuY3Rpb24gbmFtZXMgc2hvdWxkIGJlZ2luIHdpdGggImpwZWdfIiwgYW5kIHNob3VsZCBoYXZlIGFuCi1hYmJyZXZpYXRlZCBuYW1lICh1bmlxdWUgaW4gdGhlIGZpcnN0IHNpeCBjaGFyYWN0ZXJzKSBzdWJzdGl0dXRlZCBieSBtYWNybwotd2hlbiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTIGlzIHNldC4KLQotMy4gRG9uJ3QgdXNlIGdsb2JhbCB2YXJpYWJsZXM7IGFueXRoaW5nIHRoYXQgbXVzdCBiZSB1c2VkIGluIGFub3RoZXIgbW9kdWxlCi1zaG91bGQgYmUgaW4gdGhlIGNvbW1vbiBkYXRhIHN0cnVjdHVyZXMuCi0KLTQuIERvbid0IHVzZSBzdGF0aWMgdmFyaWFibGVzIGV4Y2VwdCBmb3IgcmVhZC1vbmx5IGNvbnN0YW50IHRhYmxlcy4gIFZhcmlhYmxlcwotdGhhdCBzaG91bGQgYmUgcHJpdmF0ZSB0byBhIG1vZHVsZSBjYW4gYmUgcGxhY2VkIGludG8gcHJpdmF0ZSBzdHJ1Y3R1cmVzIChzZWUKLXRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIGRvY3VtZW50LCBzdHJ1Y3R1cmUuZG9jKS4KLQotNS4gU291cmNlIGZpbGUgbmFtZXMgc2hvdWxkIGJlZ2luIHdpdGggImoiIGZvciBmaWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZQotbGlicmFyeSBwcm9wZXI7IHNvdXJjZSBmaWxlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbGlicmFyeSwgc3VjaCBhcyBjanBlZy5jCi1hbmQgZGpwZWcuYywgZG8gbm90IGJlZ2luIHdpdGggImoiLiAgS2VlcCBzb3VyY2UgZmlsZSBuYW1lcyB0byBlaWdodAotY2hhcmFjdGVycyAocGx1cyAiLmMiIG9yICIuaCIsIGV0YykgdG8gbWFrZSBsaWZlIGVhc3kgZm9yIE1TLURPU2Vycy4gIEtlZXAKLWNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGNvZGUgaW4gc2VwYXJhdGUgc291cmNlIGZpbGVzIC0tLSBzb21lCi1hcHBsaWNhdGlvbnMgbWF5IHdhbnQgb25seSBvbmUgaGFsZiBvZiB0aGUgbGlicmFyeS4KLQotTm90ZTogdGhlc2UgcnVsZXMgKHBhcnRpY3VsYXJseSAjNCkgYXJlIG5vdCBmb2xsb3dlZCByZWxpZ2lvdXNseSBpbiB0aGUKLW1vZHVsZXMgdGhhdCBhcmUgdXNlZCBpbiBjanBlZy9kanBlZyBidXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBKUEVHIGxpYnJhcnkKLXByb3Blci4gIFRob3NlIG1vZHVsZXMgYXJlIG5vdCByZWFsbHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBvdGhlcgotYXBwbGljYXRpb25zLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvY29uZmlnLmd1ZXNzIGIvbGlianBlZ3R3cnAvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTNlZDQxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi0jISAvYmluL3NoCi0jIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCi0jIFRoZSBtYXN0ZXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgYXQgdGhlIEZTRiBpbiAvaG9tZS9nZC9nbnUvbGliLgotIwotIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCi0jIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAotIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KLSMKLSMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91Ci0jIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgotIwotIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKLSMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KLSMKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSA4LzI0Lzk0LikKLWlmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICi1maQotCi1VTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KLVVOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgotVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLXRyYXAgJ3JtIC1mIGR1bW15LmMgZHVtbXkubyBkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgYWxwaGE6T1NGMToqOiopCi0JaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgotCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAotCWZpCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQljYXQgPDxFT0YgPmR1bW15LnMKLQkuZ2xvYmwgbWFpbgotCS5lbnQgbWFpbgotbWFpbjoKLQkuZnJhbWUgXCQzMCwwLFwkMjYsMAotCS5wcm9sb2d1ZSAwCi0JLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQlsZGEgXCQyLDI1OQotCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQotCXNybCBcJDEsOCxcJDIKLQlzbGwgXCQyLDIsXCQyCi0Jc2xsIFwkMCwzLFwkMAotCWFkZGwgXCQxLFwkMCxcJDAKLQlhZGRsIFwkMixcJDAsXCQwCi0JcmV0IFwkMzEsKFwkMjYpLDEKLQkuZW5kIG1haW4KLUVPRgotCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkuL2R1bW15Ci0JCWNhc2UgIiQ/IiBpbgotCQkJNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMTUpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTE0KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMTYpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgZHVtbXkucyBkdW1teQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciBbW0EtWl1dIFtbYS16XV1gCi0JZXhpdCAwIDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCAwIDs7Ci0gICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCi0JZWNobyBtNjhrLWNibS1zeXN2NAotCWV4aXQgMDs7Ci0gICAgYW1pZ2E6TmV0QlNEOio6KikKLSAgICAgIGVjaG8gbTY4ay1jYm0tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotICAgICAgZXhpdCAwIDs7Ci0gICAgYW1pZ2E6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcmM2NDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcmM6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhrbWlwczpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQotCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OwotICAgIGFybTMyOk5ldEJTRDoqOiopCi0JZWNobyBhcm0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KnxNSVMqOk9TeCo6KjoqKQotCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCi0JaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MwotCWVsc2UKLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBOSUxFOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIGk4NnBjOlN1bk9TOjUuKjoqKQotCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzoqOiopCi0JY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgotCSAgICBTZXJpZXMqfFM0KikKLQkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCi0JCTs7Ci0JZXNhYwotCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KLQllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjMqOlN1bk9TOio6KikKLQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoaGVhZCAtMSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLWF0YXJpLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zKjpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1zdW4tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTg4azpPcGVuQlNEOio6KikKLQllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgMCA7OwotICAgIFJJU0MqOlVMVFJJWDoqOiopCi0JZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVkFYKjpVTFRSSVgqOio6KikKLQllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIDIwMjA6Q0xJWDoqOiopCi0JZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgewotCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjZW5kaWYKLQkgIGV4aXQgKC0xKTsKLQl9Ci1FT0YKLQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IFwKLQkgICYmIC4vZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAotCSAgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0gICAgICAgIGlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgLW8gJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXSA7IHRoZW4KLQlpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBcCi0JICAgICAtbyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0gOyB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZWxzZSBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaT84NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+ZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCQlybSAtZiBkdW1teS5jIGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6Kjo0KQotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVIbCBwcm9jMCB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6KikKLQllY2hvIHJzNjAwMC1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCi0JZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCAwIDs7Ci0gICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKLQllY2hvIG02OGstYnVsbC1zeXN2MwotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKLQllY2hvIG02OGstaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzQ3OF0/PzpIUC1VWDoqOiopCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7Ci0JICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKLQkgICAgOTAwMC83Pz8gfCA5MDAwLzg/WzE2NzldICkgSFBfQVJDSD1ocHBhMS4xIDs7Ci0JICAgIDkwMDAvOD8/ICkgICAgICAgICAgICBIUF9BUkNIPWhwcGExLjAgOzsKLQllc2FjCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIDMwNTAqOkhJLVVYOio6KikKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCi0JZWNobyBocHBhMS4xLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBpPzg2Ok9TRjE6KjoqKQotCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCi0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYXJpc2MqOkxpdGVzKjoqOiopCi0JZWNobyBocHBhMS4xLWhwLWxpdGVzCi0JZXhpdCAwIDs7Ci0gICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKLQllY2hvIGMxLWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWC1NUDoqOio6KikKLQllY2hvIHhtcC1jcmF5LXVuaWNvcwotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpbQS1aXTkwOio6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAotCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAotCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZLTI6KjoqOiopCi0JZWNobyBjcmF5Mi1jcmF5LXVuaWNvcwotICAgICAgICBleGl0IDAgOzsKLSAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciBbQS1aXSBbYS16XSB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiZjMwMC1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEYzMDE6VU5JWF9TeXN0ZW1fVjoqOiopCi0gICAgICAgZWNobyBmMzAxLWZ1aml0c3UtdXhwdmBlY2hvICRVTkFNRV9SRUxFQVNFIHwgc2VkICdzLyAuKi8vJ2AKLSAgICAgICBleGl0IDAgOzsKLSAgICBocDNbMC05XVswNV06TmV0QlNEOio6KikKLQllY2hvIG02OGstaHAtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpCU0QvMzg2Oio6KiB8ICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpOZXRCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIGkqOkNZR1dJTio6KikKLQllY2hvIGkzODYtcGMtY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvIGkzODYtcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbjMyCi0JZXhpdCAwIDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgICo6R05VOio6KikKLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDAgOzsKLSAgICAqOkxpbnV4Oio6KikKLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4KLQlsZF9oZWxwX3N0cmluZz1gbGQgLS1oZWxwIDI+JjFgCi0JbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnM9YGVjaG8gJGxkX2hlbHBfc3RyaW5nIFwKLQkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgZW11bGF0aW9uczovIWQKLQkJCQkgICAgcy9bIAldWyAJXSovIC9nCi0JCQkJICAgIHMvLipzdXBwb3J0ZWQgZW11bGF0aW9uczogKi8vCi0JCQkJICAgIHMvIC4qLy8KLQkJCQkgICAgcCdgCi0gICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucyIgaW4KLQkgIGk/ODZsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIgICAgICA7IGV4aXQgMCA7OwotCSAgaT84NmNvZmYpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIiAgICAgIDsgZXhpdCAwIDs7Ci0JICBzcGFyY2xpbnV4KSBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIG02OGtsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgZWxmMzJwcGMpICAgZWNobyAicG93ZXJwYy11bmtub3duLWxpbnV4LWdudSIgICAgICAgICAgICAgIDsgZXhpdCAwIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgotCQlzZWQgJ3MvXgkvLycgIDw8RU9GID5kdW1teS5zCi0JCS5nbG9ibCBtYWluCi0JCS5lbnQgbWFpbgotCW1haW46Ci0JCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JCS5wcm9sb2d1ZSAwCi0JCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCi0JCWxkYSBcJDIsMjU5Ci0JCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQotCQlzcmwgXCQxLDgsXCQyCi0JCXNsbCBcJDIsMixcJDIKLQkJc2xsIFwkMCwzLFwkMAotCQlhZGRsIFwkMSxcJDAsXCQwCi0JCWFkZGwgXCQyLFwkMCxcJDAKLQkJcmV0IFwkMzEsKFwkMjYpLDEKLQkJLmVuZCBtYWluCi1FT0YKLQkJTElCQz0iIgotCQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCi0JCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkuL2R1bW15Ci0JCQljYXNlICIkPyIgaW4KLQkJCTcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCi0JCQkJOzsKLQkJCTE1KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgotCQkJCTs7Ci0JCQkxNCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEwKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTE2KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQllc2FjCQotCi0JCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAotCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKLQkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkJTElCQz0ibGliYzEiCi0JCQlmaQotCQlmaQkKLQkJcm0gLWYgZHVtbXkucyBkdW1teQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwCi0JZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJtaXBzIiA7IHRoZW4KLQkgIGNhdCA+ZHVtbXkuYyA8PEVPRgotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmZGVmIF9fTUlQU0VCX18KLSAgcHJpbnRmICgiJXMtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0jaWZkZWYgX19NSVBTRUxfXwotICBwcmludGYgKCIlc2VsLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWVsc2UKLQkgICMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKQotCSAgIyBvciBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCi0JICAjIEdDQyB3YW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbnV4LWdudW9sZGxkIGFuZCBsaW51eC1nbnVhb3V0LgotCSAgIyBJZiBsZCBkb2VzIG5vdCBwcm92aWRlICphbnkqICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCi0JICAjIHRoYXQgbWVhbnMgaXQgaXMgZ251b2xkbGQuCi0JICBlY2hvICIkbGRfaGVscF9zdHJpbmciIHwgZ3JlcCA+L2Rldi9udWxsIDI+JjEgInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgIHRlc3QgJD8gIT0gMCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIiAmJiBleGl0IDAKLQotCSAgY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgIGk/ODYpCi0JICAgIFZFTkRPUj1wYzsKLQkgICAgOzsKLQkgICopCi0JICAgIFZFTkRPUj11bmtub3duOwotCSAgICA7OwotCSAgZXNhYwotCSAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQkgIGNhdCA+ZHVtbXkuYyA8PEVPRgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19FTEZfXwotIyBpZmRlZiBfX0dMSUJDX18KLSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0gICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jICBlbHNlCi0gICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7Ci0jIGVuZGlmCi0jZWxzZQotICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251YW91dFxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkgIHJtIC1mIGR1bW15LmMgZHVtbXkKLQlmaSA7OwotIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4gIGVhcmxpZXIgdmVyc2lvbnMKLSMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoIHN5c25hbWUgYW5kIG5vZGVuYW1lLgotICAgIGk/ODY6RFlOSVgvcHR4OjQqOiopCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpPzg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpPzg2Oio6NC4qOiogfCBpPzg2OlNZU1RFTV9WOjQuKjoqKQotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgMCA7OwotICAgIGk/ODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKLSAgICBtNjgqOkx5bnhPUzoyLio6KikKLQllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6THlueE9TOjIuKjoqKQotCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6U0lOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6U0lOSVgtKjoqOiopCi0JaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAotCWVsc2UKLQkJZWNobyBuczMyay1zbmktc3lzdgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgUEVOVElVTTpDUHVuaXg6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgotICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQotCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KLQkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KLQllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6KjoqOkZUWCopCi0JIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCi0JZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBtYzY4KjpBL1VYOio6KikKLQllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG5ld3MqOk5FV1MtT1M6Kjo2KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3M2Ci0JZXhpdCAwIDs7Ci0gICAgUjMwMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1jYXQgPmR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jaWYgIWRlZmluZWQgKHVsdHJpeCkKLSAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSAgZXhpdCAoMSk7Ci19Ci1FT0YKLQotJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiBkdW1teS5jIGR1bW15Ci0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KLQotIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQotCi1pZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQotdGhlbgotICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCi0gICAgYzEqKQotCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMyKikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzM4KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzQqKQotCWVjaG8gYzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGVzYWMKLWZpCi0KLSNlY2hvICcoVW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlKScgMT4mMgotCi1leGl0IDEKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2NvbmZpZy5zdWIgYi9saWJqcGVndHdycC9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTNhNmQ0Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSw5NTQgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQsIHZlcnNpb24gMS4xLgotIyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCi0jIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcwotIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgotIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucwotIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKLSMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcwotIyBjb25maWd1cmF0aW9uLgotCi0jIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgotIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQotIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCi0KLWlmIFsgeCQxID0geCBdCi10aGVuCi0JZWNobyBDb25maWd1cmF0aW9uIG5hbWUgbWlzc2luZy4gMT4mMgotCWVjaG8gIlVzYWdlOiAkMCBDUFUtTUZSLU9QU1lTIiAxPiYyCi0JZWNobyAib3IgICAgICQwIEFMSUFTIiAxPiYyCi0JZWNobyB3aGVyZSBBTElBUyBpcyBhIHJlY29nbml6ZWQgY29uZmlndXJhdGlvbiB0eXBlLiAxPiYyCi0JZXhpdCAxCi1maQotCi0jIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLWNhc2UgJDEgaW4KLQkqbG9jYWwqKQotCQllY2hvICQxCi0JCWV4aXQgMAotCQk7OwotCSopCi0JOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbGludXgtZ251KikKLSAgICBvcz0tJG1heWJlX29zCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKLSAgICA7OwotICAqKQotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKLSAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KLSAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCi0gICAgZWxzZSBvcz07IGZpCi0gICAgOzsKLWVzYWMKLQotIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCi0jIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbwotIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQotIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCi1jYXNlICRvcyBpbgotCS1zdW4qb3MqKQotCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KLQkJOzsKLQktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAotCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAotCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCi0JLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKLQktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAotCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPXNjbzMuMnY1Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNCkKLQkJb3M9LXNjbzMuMnY0Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4yLls0LTldKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMnZbNC05XSopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQl0YWhvZSB8IGk4NjAgfCBtMzJyIHwgbTY4ayB8IG02ODAwMCB8IG04OGsgfCBuczMyayB8IGFyYyB8IGFybSBcCi0JCXwgYXJtZVtsYl0gfCBweXJhbWlkIHwgbW4xMDIwMCB8IG1uMTAzMDAgXAotCQl8IHRyb24gfCBhMjlrIHwgNTgwIHwgaTk2MCB8IGg4MzAwIHwgaHBwYSB8IGhwcGExLjAgfCBocHBhMS4xIFwKLQkJfCBhbHBoYSB8IGFscGhhZXY1IHwgYWxwaGFldjU2IHwgd2UzMmsgfCBuczE2ayB8IGNsaXBwZXIgXAotCQl8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgfCAxNzUwYSB8IGRzcDE2eHggfCBwZHAxMSBcCi0JCXwgbWlwczY0IHwgbWlwc2VsIHwgbWlwczY0ZWwgfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCQl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JCXwgc3BhcmMgfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjNjQgfCB2ODUwKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpWzM0NTZdODYpCi0JICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCi0JICA7OwotCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCi0JKi0qLSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgotCXZheC0qIHwgdGFob2UtKiB8IGlbMzQ1Nl04Ni0qIHwgaTg2MC0qIHwgbTMyci0qIHwgbTY4ay0qIHwgbTY4MDAwLSogXAotCSAgICAgIHwgbTg4ay0qIHwgc3BhcmMtKiB8IG5zMzJrLSogfCBmeDgwLSogfCBhcmMtKiB8IGFybS0qIHwgY1sxMjNdKiBcCi0JICAgICAgfCBtaXBzLSogfCBweXJhbWlkLSogfCB0cm9uLSogfCBhMjlrLSogfCByb21wLSogfCByczYwMDAtKiBcCi0JICAgICAgfCBwb3dlci0qIHwgbm9uZS0qIHwgNTgwLSogfCBjcmF5Mi0qIHwgaDgzMDAtKiB8IGk5NjAtKiBcCi0JICAgICAgfCB4bXAtKiB8IHltcC0qIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIFwKLQkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2NS0qIHwgYWxwaGFldjU2LSogfCB3ZTMyay0qIHwgY3lkcmEtKiBcCi0JICAgICAgfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIHwgeHBzMTAwLSogfCBjbGlwcGVyLSogfCBvcmlvbi0qIFwKLQkgICAgICB8IHNwYXJjbGl0ZS0qIHwgcGRwMTEtKiB8IHNoLSogfCBwb3dlcnBjLSogfCBwb3dlcnBjbGUtKiBcCi0JICAgICAgfCBzcGFyYzY0LSogfCBtaXBzNjQtKiB8IG1pcHNlbC0qIFwKLQkgICAgICB8IG1pcHM2NGVsLSogfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qICBcCi0JICAgICAgfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQkgICAgICB8IGYzMDEtKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWF1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCW9zPS1hdXgKLQkJOzsKLQliYWxhbmNlKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JY29udmV4LWMxKQotCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMyKQotCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzMikKLQkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM0KQotCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzgpCi0JCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY3JheSB8IHltcCkKLQkJYmFzaWNfbWFjaGluZT15bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JheTIpCi0JCWJhc2ljX21hY2hpbmU9Y3JheTItY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JW2N0al05MC1jcmF5KQotCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmRzIHwgdW5vcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrN1swLTldWzAtOV0gfCBocDdbMC05XVswLTldIHwgaHA5azhbMC05XTcgfCBocDhbMC05XTcpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJb3M9LW12cwotCQk7OwotIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/Ci0JaVszNDU2XTg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWlbMzQ1Nl04NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWlbMzQ1Nl04NnYpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdgotCQk7OwotCWlbMzQ1Nl04NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JbWlwc2VsKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW5jcjMwMDApCi0JCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotICAgICAgICBwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwZW50aXVtIHwgcDUpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1pbnRlbAotCQk7OwotCXBlbnRpdW1wcm8gfCBwNikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWludGVsCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JazUpCi0JCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBBTUQncyBLNSB5ZXQsIHNvIGp1c3QgY2FsbCBpdCBhIFBlbnRpdW0KLQkJYmFzaWNfbWFjaGluZT1pNTg2LWFtZAotCQk7OwotCW5leGVuKQotCQkjIFdlIGRvbid0IGhhdmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgTmV4Z2VuIHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQotCQliYXNpY19tYWNoaW5lPWk1ODYtbmV4Z2VuCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0Jc2VxdWVudCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJOzsKLQlzaCkKLQkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQlzcHM3KQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjIKLQkJOzsKLQlzcHVyKQotCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgotCQk7OwotCXN1bjIpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQk7OwotCXN1bjJvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuMm9zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW4zb3MzKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4zb3M0KQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40b3MzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuNG9zNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRzb2wyKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlzdW4zIHwgc3VuMy0qKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCTs7Ci0Jc3VuNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0eDM5KQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KLQkJOzsKLQl0eDM5ZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JeG1wKQotCQliYXNpY19tYWNoaW5lPXhtcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0JbWlwcykKLQkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgotCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJZWxzZQotCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJZmkKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNwYXJjKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotICAgICAgICBjeWRyYSkKLQkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCi0JCTs7Ci0Jb3Jpb24pCi0JCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCi0JCTs7Ci0Jb3Jpb24xMDUpCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWN5Z3dpbjMyKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAotCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtdXhwdiopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQktc3Vub3M1KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAotCQk7OwotCS1zdW5vczYqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1uczIgKQotCSAgICAgICAgb3M9LW5leHRzdGVwMgotCQk7OwotCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KLQktc2luaXg1LiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCi0JCTs7Ci0JLXNpbml4KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXRyaXRvbiopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1vc3MqKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXN2cjMpCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zeXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KLQktc3lzdiopCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgotCQlvcz0tc3lzdjMKLQkJOzsKLQlzcGFyYy0qIHwgKi1zdW4pCi0JCW9zPS1zdW5vczQuMS4xCi0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLSAgICAgICAgKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLSAgICAgICAgKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotICAgICAgICAqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLSAgICAgICAgKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwMS1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktcHR4KikKLQkJCQl2ZW5kb3I9c2VxdWVudAotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9jb25maWd1cmUgYi9saWJqcGVndHdycC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YzlkYjUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMjAxMSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcnkgdXNpbmcgR05VIGxpYnRvb2wiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWMgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyeSB1c2luZyBHTlUgbGlidG9vbCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1heG1lbVs9Tl0gICAgIGVuYWJsZSB1c2Ugb2YgdGVtcCBmaWxlcywgc2V0IG1heCBtZW0gdXNhZ2UgdG8gTiBNQiIKLWFjX2hlbHA9IiRhY19oZWxwCi0iCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqPSopCi0gICAgdmFybmFtZT1gZWNobyAiJGFjX29wdGlvbiJ8c2VkIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZW4ndCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkdmFybmFtZXwgc2VkICdzL1thLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkdmFybmFtZTogaW52YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIHZhbD0iYGVjaG8gIiRhY19vcHRpb24ifHNlZCAncy9bXj1dKj0vLydgIgotICAgIHRlc3QgLW4gIiR2ZXJib3NlIiAmJiBlY2hvICIJc2V0dGluZyBzaGVsbCB2YXJpYWJsZSAkdmFybmFtZSB0byAkdmFsIgotICAgIGV2YWwgIiR2YXJuYW1lPSckdmFsJyIKLSAgICBldmFsICJleHBvcnQgJHZhcm5hbWUiIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWpjbWFzdGVyLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTM4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Njc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjU0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItTzIiCi1lbHNlCi0gIEdDQz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItTyIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODE6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzEzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQyOiBjaGVja2luZyBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snaWpnX2N2X2hhdmVfcHJvdG90eXBlcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDc0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLwotc3RydWN0IG1ldGhvZHNfc3RydWN0IHsJCS8qIGNoZWNrIG1ldGhvZC1wb2ludGVyIGRlY2xhcmF0aW9ucyAqLwotICBpbnQgKCplcnJvcl9leGl0KSAoY2hhciAqbXNndGV4dCk7Ci0gIGludCAoKnRyYWNlX21lc3NhZ2UpIChjaGFyICptc2d0ZXh0KTsKLSAgaW50ICgqYW5vdGhlcl9tZXRob2QpICh2b2lkKTsKLX07Ci1pbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMikgLyogY2hlY2sgZGVmaW5pdGlvbnMgKi8KLXsgcmV0dXJuIGFyZzJbYXJnMV07IH0KLWludCB0ZXN0MmZ1bmN0aW9uICh2b2lkKQkvKiBjaGVjayB2b2lkIGFyZyBsaXN0ICovCi17IHJldHVybiAwOyB9Ci0KLWludCBtYWluKCkgewotIAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyIgMT4mNgotaWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTIAotRU9GCi0KLWVsc2UKLSAgZWNobyBZb3VyIGNvbXBpbGVyIGRvZXMgbm90IHNlZW0gdG8ga25vdyBhYm91dCBmdW5jdGlvbiBwcm90b3R5cGVzLgotICBlY2hvIFBlcmhhcHMgaXQgbmVlZHMgYSBzcGVjaWFsIHN3aXRjaCB0byBlbmFibGUgQU5TSSBDIG1vZGUuCi0gIGVjaG8gSWYgc28sIHdlIHJlY29tbWVuZCBydW5uaW5nIGNvbmZpZ3VyZSBsaWtlIHRoaXM6Ci0gIGVjaG8gIiAgIC4vY29uZmlndXJlICBDQz0nY2MgLXN3aXRjaCciCi0gIGVjaG8gd2hlcmUgLXN3aXRjaCBpcyB0aGUgcHJvcGVyIHN3aXRjaC4KLWZpCi1hY19zYWZlPWBlY2hvICJzdGRkZWYuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RkZGVmLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc5MjogY2hlY2tpbmcgZm9yIHN0ZGRlZi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3OTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NURERFRl9IIAotRU9GCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1hY19zYWZlPWBlY2hvICJzdGRsaWIuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RkbGliLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyODogY2hlY2tpbmcgZm9yIHN0ZGxpYi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Mzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NURExJQl9IIAotRU9GCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1hY19zYWZlPWBlY2hvICJzdHJpbmcuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RyaW5nLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2NDogY2hlY2tpbmcgZm9yIHN0cmluZy5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9CU0RfU1RSSU5HUyAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MDA6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTAyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIEhBVkVfU1REREVGX0gKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgTkVFRF9CU0RfU1RSSU5HUwotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLXR5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsKLQotaW50IG1haW4oKSB7Ci0gbXlfc2l6ZV90IGZvb3ZhcjsgCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTIzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX3NpemVfdF9vaz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX3NpemVfdF9vaz0ibm90IEFOU0ksIHBlcmhhcHMgaXQgaXMgaW4gc3lzL3R5cGVzLmgiCi1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIiJGlqZ19zaXplX3Rfb2siIDE+JjYKLWlmIHRlc3QgIiRpamdfc2l6ZV90X29rIiAhPSB5ZXM7IHRoZW4KLWFjX3NhZmU9YGVjaG8gInN5cy90eXBlcy5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTM3OiBjaGVja2luZyBmb3Igc3lzL3R5cGVzLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjk0NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfU1lTX1RZUEVTX0ggCi1FT0YKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAic2l6ZV90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfc2l6ZV90X29rPSJzaXplX3QgaXMgaW4gc3lzL3R5cGVzLmgiCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgaWpnX3NpemVfdF9vaz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotaWpnX3NpemVfdF9vaz1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRpamdfc2l6ZV90X29rIiAxPiY2Ci1pZiB0ZXN0ICIkaWpnX3NpemVfdF9vayIgPSBubzsgdGhlbgotICBlY2hvIFR5cGUgc2l6ZV90IGlzIG5vdCBkZWZpbmVkIGluIGFueSBvZiB0aGUgdXN1YWwgcGxhY2VzLgotICBlY2hvIFRyeSBwdXR0aW5nICcidHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OyInIGluIGpjb25maWcuaC4KLWZpCi1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgY2hhciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTk0OiBjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBjaGFyIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotIHVuc2lnbmVkIGNoYXIgdW5fY2hhcjsgCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIgCi1FT0YKLQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIHNob3J0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDE4OiBjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBzaG9ydCIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDIwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0gdW5zaWduZWQgc2hvcnQgdW5fc2hvcnQ7IAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMjc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVCAKLUVPRgotCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHR5cGUgdm9pZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA0MjogY2hlY2tpbmcgZm9yIHR5cGUgdm9pZCIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogQ2F1dGlvbjogYSBDKysgY29tcGlsZXIgd2lsbCBpbnNpc3Qgb24gdmFsaWQgcHJvdG90eXBlcyAqLwotdHlwZWRlZiB2b2lkICogdm9pZF9wdHI7CS8qIGNoZWNrIHZvaWQgKiAqLwotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyB2b2lkICovCi10eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpIChpbnQgYSwgaW50IGIpOwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgdm9pZCBmdW5jdGlvbiByZXN1bHQgKi8KLXZvaWQgdGVzdDNmdW5jdGlvbiAodm9pZF9wdHIgYXJnMSwgdm9pZF9mdW5jIGFyZzIpCi0jZWxzZQotdm9pZCB0ZXN0M2Z1bmN0aW9uIChhcmcxLCBhcmcyKQotICAgICB2b2lkX3B0ciBhcmcxOwotICAgICB2b2lkX2Z1bmMgYXJnMjsKLSNlbmRpZgotewotICBjaGFyICogbG9jcHRyID0gKGNoYXIgKikgYXJnMTsgLyogY2hlY2sgY2FzdGluZyB0byBhbmQgZnJvbSB2b2lkICogKi8KLSAgYXJnMSA9ICh2b2lkICopIGxvY3B0cjsKLSAgKCphcmcyKSAoMSwgMik7CQkvKiBjaGVjayBjYWxsIG9mIGZjbiByZXR1cm5pbmcgdm9pZCAqLwotfQotCi1pbnQgbWFpbigpIHsKLSAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDcyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSB2b2lkIGNoYXIKLUVPRgotCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwOTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE0MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTYzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlqZ19jdl9pbmxpbmU9IiIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gX19pbmxpbmVfXyBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQotaW50IGJhcigpIHsgcmV0dXJuIGZvbygpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfY3ZfaW5saW5lPSJfX2lubGluZV9fIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19IF9faW5saW5lIGludCBmb28oKSB7IHJldHVybiAwOyB9Ci1pbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE5MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGlqZ19jdl9pbmxpbmU9Il9faW5saW5lIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19IGlubGluZSBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQotaW50IGJhcigpIHsgcmV0dXJuIGZvbygpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBpamdfY3ZfaW5saW5lPSJpbmxpbmUiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiIiRpamdfY3ZfaW5saW5lIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBJTkxJTkUgJGlqZ19jdl9pbmxpbmUKLUVPRgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYnJva2VuIGluY29tcGxldGUgdHlwZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMjQ6IGNoZWNraW5nIGZvciBicm9rZW4gaW5jb21wbGV0ZSB0eXBlcyIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSB0eXBlZGVmIHN0cnVjdCB1bmRlZmluZWRfc3RydWN0dXJlICogdW5kZWZfc3RydWN0X3B0cjsgCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMzM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIib2siIDE+JjYKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiImJyb2tlbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOIAotRU9GCi0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaG9ydCBleHRlcm5hbCBuYW1lcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0ODogY2hlY2tpbmcgZm9yIHNob3J0IGV4dGVybmFsIG5hbWVzIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgcG9zc2libHlfZHVwbGljYXRlX2Z1bmN0aW9uICgpIHsgcmV0dXJuIDA7IH0KLWludCBwb3NzaWJseV9kdXBsaV9mdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9Ci0KLWludCBtYWluKCkgewotIAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJvayIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIic2hvcnQiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTIAotRU9GCi0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiBjaGFyIGlzIHNpZ25lZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI3NTogY2hlY2tpbmcgdG8gc2VlIGlmIGNoYXIgaXMgc2lnbmVkIiA+JjUKLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gQXNzdW1pbmcgdGhhdCBjaGFyIGlzIHNpZ25lZCBvbiB0YXJnZXQgbWFjaGluZS4KLWVjaG8gSWYgaXQgaXMgdW5zaWduZWQsIHRoaXMgd2lsbCBiZSBhIGxpdHRsZSBiaXQgaW5lZmZpY2llbnQuCi0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCBpc19jaGFyX3NpZ25lZCAoaW50IGFyZykKLSNlbHNlCi1pbnQgaXNfY2hhcl9zaWduZWQgKGFyZykKLSAgICAgaW50IGFyZzsKLSNlbmRpZgotewotICBpZiAoYXJnID09IDE4OSkgewkJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciB1bnNpZ25lZCBjaGFyICovCi0gICAgcmV0dXJuIDA7CQkJLyogdHlwZSBjaGFyIGlzIHVuc2lnbmVkICovCi0gIH0KLSAgZWxzZSBpZiAoYXJnICE9IC02NykgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBjaGFyICovCi0gICAgcHJpbnRmKCJIbW0sIGl0IHNlZW1zICdjaGFyJyBpcyBub3QgZWlnaHQgYml0cyB3aWRlIG9uIHlvdXIgbWFjaGluZS5cbiIpOwotICAgIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKLSAgfQotICByZXR1cm4gMTsJCQkvKiBhc3N1bWUgY2hhciBpcyBzaWduZWQgb3RoZXJ3aXNlICovCi19Ci1jaGFyIHNpZ25lZF9jaGFyX2NoZWNrID0gKGNoYXIpICgtNjcpOwotbWFpbigpIHsKLSAgZXhpdChpc19jaGFyX3NpZ25lZCgoaW50KSBzaWduZWRfY2hhcl9jaGVjaykpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRCAKLUVPRgotCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzIzOiBjaGVja2luZyB0byBzZWUgaWYgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIiA+JjUKLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gIiRhY190IiJBc3N1bWluZyB0aGF0IHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCBvbiB0YXJnZXQgbWFjaGluZS4iIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLWludCBpc19zaGlmdGluZ19zaWduZWQgKGxvbmcgYXJnKQotI2Vsc2UKLWludCBpc19zaGlmdGluZ19zaWduZWQgKGFyZykKLSAgICAgbG9uZyBhcmc7Ci0jZW5kaWYKLS8qIFNlZSB3aGV0aGVyIHJpZ2h0LXNoaWZ0IG9uIGEgbG9uZyBpcyBzaWduZWQgb3Igbm90LiAqLwotewotICBsb25nIHJlcyA9IGFyZyA+PiA0OwotCi0gIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgc2hpZnQgKi8KLSAgICByZXR1cm4gMTsJCQkvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KLSAgfQotICAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KLSAgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLwotICByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOwotICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBub3c/ICovCi0gICAgcmV0dXJuIDA7CQkJLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KLSAgfQotICBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOwotICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7Ci0gIHJldHVybiAwOwkJCS8qIHRyeSBpdCB3aXRoIHVuc2lnbmVkIGFueXdheSAqLwotfQotbWFpbigpIHsKLSAgZXhpdChpc19zaGlmdGluZ19zaWduZWQoLTB4N0Y3RTgwQjFMKSk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRCAKLUVPRgotCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgZm9wZW4gYWNjZXB0cyBiIHNwZWMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNzU6IGNoZWNraW5nIHRvIHNlZSBpZiBmb3BlbiBhY2NlcHRzIGIgc3BlYyIgPiY1Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBlY2hvICIkYWNfdCIiQXNzdW1pbmcgdGhhdCBpdCBkb2VzLiIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1tYWluKCkgewotICBpZiAoZm9wZW4oImNvbmZ0ZXN0ZGF0YSIsICJ3YiIpICE9IE5VTEwpCi0gICAgZXhpdCgwKTsKLSAgZXhpdCgxKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRE9OVF9VU0VfQl9NT0RFIAotRU9GCi0KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzNjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBpbnN0YWxsYnNkIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICAjIE9TRi8xIGluc3RhbGxic2QgYWxzbyB1c2VzIGRzcG1zZywgYnV0IGlzIHVzYWJsZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLSMgRGVjaWRlIHdoZXRoZXIgdG8gdXNlIGxpYnRvb2wsCi0jIGFuZCBpZiBzbyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCwgc3RhdGljLCBvciBib3RoIGZsYXZvcnMgb2YgbGlicmFyeS4KLUxUU0hBUkVEPSJubyIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgTFRTSEFSRUQ9IiRlbmFibGV2YWwiCi1maQotCi1MVFNUQVRJQz0ibm8iCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIExUU1RBVElDPSIkZW5hYmxldmFsIgotZmkKLQotaWYgdGVzdCAieCRMVFNIQVJFRCIgIT0geG5vICAtbyAgIngkTFRTVEFUSUMiICE9IHhubzsgdGhlbgotICBVU0VMSUJUT09MPSJ5ZXMiCi0gIExJQlRPT0w9Ii4vbGlidG9vbCIKLSAgTz0ibG8iCi0gIEE9ImxhIgotICBMTj0nJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKScKLSAgSU5TVEFMTF9MSUI9JyQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJHtJTlNUQUxMfScKLSAgSU5TVEFMTF9QUk9HUkFNPSJcJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkSU5TVEFMTF9QUk9HUkFNIgotZWxzZQotICBVU0VMSUJUT09MPSJubyIKLSAgTElCVE9PTD0iIgotICBPPSJvIgotICBBPSJhIgotICBMTj0nJChDQyknCi0gIElOU1RBTExfTElCPSIkSU5TVEFMTF9EQVRBIgotZmkKLQotCi0KLQotCi0KLSMgQ29uZmlndXJlIGxpYnRvb2wgaWYgbmVlZGVkLgotaWYgdGVzdCAkVVNFTElCVE9PTCA9IHllczsgdGhlbgotICBkaXNhYmxlX3NoYXJlZD0KLSAgZGlzYWJsZV9zdGF0aWM9Ci0gIGlmIHRlc3QgIngkTFRTSEFSRUQiID0geG5vOyB0aGVuCi0gICAgZGlzYWJsZV9zaGFyZWQ9Ii0tZGlzYWJsZS1zaGFyZWQiCi0gIGZpCi0gIGlmIHRlc3QgIngkTFRTVEFUSUMiID0geG5vOyB0aGVuCi0gICAgZGlzYWJsZV9zdGF0aWM9Ii0tZGlzYWJsZS1zdGF0aWMiCi0gIGZpCi0gICRzcmNkaXIvbHRjb25maWcgJGRpc2FibGVfc2hhcmVkICRkaXNhYmxlX3N0YXRpYyAkc3JjZGlyL2x0bWFpbi5zaAotZmkKLQotIyBTZWxlY3QgbWVtb3J5IG1hbmFnZXIgZGVwZW5kaW5nIG9uIHVzZXIgaW5wdXQuCi0jIElmIG5vICItZW5hYmxlLW1heG1lbSIsIHVzZSBqbWVtbm9icwotTUVNT1JZTUdSPSdqbWVtbm9icy4kKE8pJwotTUFYTUVNPSJubyIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXhtZW0gb3IgLS1kaXNhYmxlLW1heG1lbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYXhtZW0rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21heG1lbSIKLSAgTUFYTUVNPSIkZW5hYmxldmFsIgotZmkKLQotIyBzdXBwb3J0IC0td2l0aC1tYXhtZW0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggSUpHIFY1LgotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tYXhtZW0gb3IgLS13aXRob3V0LW1heG1lbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbWF4bWVtK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX21heG1lbSIKLSAgTUFYTUVNPSIkd2l0aHZhbCIKLWZpCi0KLWlmIHRlc3QgIngkTUFYTUVNIiA9IHh5ZXM7IHRoZW4KLSAgTUFYTUVNPTEKLWZpCi1pZiB0ZXN0ICJ4JE1BWE1FTSIgIT0geG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gImBlY2hvICRNQVhNRU0gfCBzZWQgJ3MvWzAtOV0vL2cnYCI7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIC0tZW5hYmxlLW1heG1lbSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIERFRkFVTFRNQVhNRU09YGV4cHIgJE1BWE1FTSBcKiAxMDQ4NTc2YAotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNICR7REVGQVVMVE1BWE1FTX0KLUVPRgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJ3RtcGZpbGUoKSciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1OTY6IGNoZWNraW5nIGZvciAndG1wZmlsZSgpJyIgPiY1Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotaW50IG1haW4oKSB7Ci0gRklMRSAqIHRmaWxlID0gdG1wZmlsZSgpOyAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1NRU1PUllNR1I9J2ptZW1hbnNpLiQoTyknCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotTUVNT1JZTUdSPSdqbWVtbmFtZS4kKE8pJwotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIgCi1FT0YKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICdta3RlbXAoKSciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MjA6IGNoZWNraW5nIGZvciAnbWt0ZW1wKCknIiA+JjUKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLSBjaGFyIGZuYW1lWzgwXTsgbWt0ZW1wKGZuYW1lKTsgCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBOT19NS1RFTVAgCi1FT0YKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGxpYnJhcnkgdmVyc2lvbiBJRCBmcm9tIGpwZWdsaWIuaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGxpYmpwZWcgdmVyc2lvbiBudW1iZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NTA6IGNoZWNraW5nIGxpYmpwZWcgdmVyc2lvbiBudW1iZXIiID4mNQotSlBFR19MSUJfVkVSU0lPTj1gc2VkIC1lICcvXiNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTi8hZCcgLWUgJ3MvXlteMC05XSpcKFswLTldWzAtOV0qXCkuKiQvXDEvJyAkc3JjZGlyL2pwZWdsaWIuaGAKLWVjaG8gIiRhY190IiIkSlBFR19MSUJfVkVSU0lPTiIgMT4mNgotCi0KLSMgUHJlcGFyZSB0byBtYXNzYWdlIG1ha2VmaWxlLmNmZyBjb3JyZWN0bHkuCi1pZiB0ZXN0ICRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzID0geWVzOyB0aGVuCi0gIEEyS19ERVBTPSIiCi0gIENPTV9BMks9IiMgIgotZWxzZQotICBBMktfREVQUz0iYW5zaTJrbnIiCi0gIENPTV9BMks9IiIKLWZpCi0KLQotIyBhbnNpMmtuciBuZWVkcyAtREJTRCBpZiBzdHJpbmcuaCBpcyBtaXNzaW5nCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RyaW5nX2ggPSBubzsgdGhlbgotICBBTlNJMktOUkZMQUdTPSItREJTRCIKLWVsc2UKLSAgQU5TSTJLTlJGTEFHUz0iIgotZmkKLQotIyBTdWJzdGl0dXRpb25zIHRvIGVuYWJsZSBvciBkaXNhYmxlIGxpYnRvb2wtcmVsYXRlZCBzdHVmZgotaWYgdGVzdCAkVVNFTElCVE9PTCA9IHllcyAtYSAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgotICBDT01fTFQ9IiIKLWVsc2UKLSAgQ09NX0xUPSIjICIKLWZpCi0KLWlmIHRlc3QgIngkTFRTSEFSRUQiICE9IHhubzsgdGhlbgotICBGT1JDRV9JTlNUQUxMX0xJQj0iaW5zdGFsbC1saWIiCi1lbHNlCi0gIEZPUkNFX0lOU1RBTExfTElCPSIiCi1maQotCi0jIFNldCB1cCAtSSBkaXJlY3RpdmVzCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBJTkNMVURFRkxBR1M9Jy1JJChzcmNkaXIpJwotZWxzZQotICBJTkNMVURFRkxBR1M9Jy1JLiAtSSQoc3JjZGlyKScKLWZpCi0KLXRyYXAgJycgMSAyIDE1Ci0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMiIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlOm1ha2VmaWxlLmNmZyBqY29uZmlnLmg6amNvbmZpZy5jZmciIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQENDQCUkQ0MlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE9AJSRPJWcKLXMlQEFAJSRBJWcKLXMlQExOQCUkTE4lZwotcyVASU5TVEFMTF9MSUJAJSRJTlNUQUxMX0xJQiVnCi1zJUBNRU1PUllNR1JAJSRNRU1PUllNR1IlZwotcyVASlBFR19MSUJfVkVSU0lPTkAlJEpQRUdfTElCX1ZFUlNJT04lZwotcyVAQTJLX0RFUFNAJSRBMktfREVQUyVnCi1zJUBDT01fQTJLQCUkQ09NX0EySyVnCi1zJUBBTlNJMktOUkZMQUdTQCUkQU5TSTJLTlJGTEFHUyVnCi1zJUBDT01fTFRAJSRDT01fTFQlZwotcyVARk9SQ0VfSU5TVEFMTF9MSUJAJSRGT1JDRV9JTlNUQUxMX0xJQiVnCi1zJUBJTkNMVURFRkxBR1NAJSRJTkNMVURFRkxBR1MlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGU6bWFrZWZpbGUuY2ZnIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJqY29uZmlnLmg6amNvbmZpZy5jZmciCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvZGpwZWcuMSBiL2xpYmpwZWd0d3JwL2RqcGVnLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmViNmEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvZGpwZWcuMQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0uVEggREpQRUcgMSAiMjIgQXVndXN0IDE5OTciCi0uU0ggTkFNRQotZGpwZWcgXC0gZGVjb21wcmVzcyBhIEpQRUcgZmlsZSB0byBhbiBpbWFnZSBmaWxlCi0uU0ggU1lOT1BTSVMKLS5CIGRqcGVnCi1bCi0uSSBvcHRpb25zCi1dCi1bCi0uSSBmaWxlbmFtZQotXQotLkxQCi0uU0ggREVTQ1JJUFRJT04KLS5MUAotLkIgZGpwZWcKLWRlY29tcHJlc3NlcyB0aGUgbmFtZWQgSlBFRyBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKLWFuZCBwcm9kdWNlcyBhbiBpbWFnZSBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBQQk1QTFVTIChQUE0vUEdNKSwgQk1QLAotR0lGLCBUYXJnYSwgb3IgUkxFIChVdGFoIFJhc3RlciBUb29sa2l0KSBvdXRwdXQgZm9ybWF0IGNhbiBiZSBzZWxlY3RlZC4KLShSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCi0uU0ggT1BUSU9OUwotQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAotLkIgXC1ncmF5c2NhbGUKLW1heSBiZSB3cml0dGVuCi0uQiBcLWdyYXkKLW9yCi0uQlIgXC1nciAuCi1Nb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMgb25lIGxldHRlci4KLVVwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICh0aHVzCi0uQiBcLUJNUAotaXMgdGhlIHNhbWUgYXMKLS5CUiBcLWJtcCApLgotQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCi0uQlIgXC1ncmV5c2NhbGUgKSwKLXRob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KLS5QUAotVGhlIGJhc2ljIHN3aXRjaGVzIGFyZToKLS5UUAotLkJJIFwtY29sb3JzICIgTiIKLVJlZHVjZSBpbWFnZSB0byBhdCBtb3N0IE4gY29sb3JzLiAgVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29sb3JzIHVzZWQgaW4KLXRoZSBvdXRwdXQgaW1hZ2UsIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBvbiBhIGNvbG9ybWFwcGVkIGRpc3BsYXkgb3IKLXN0b3JlZCBpbiBhIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGFuIDgtYml0Ci1kaXNwbGF5LCB5b3UnZCBuZWVkIHRvIHJlZHVjZSB0byAyNTYgb3IgZmV3ZXIgY29sb3JzLgotLlRQCi0uQkkgXC1xdWFudGl6ZSAiIE4iCi1TYW1lIGFzCi0uQlIgXC1jb2xvcnMgLgotLkIgXC1jb2xvcnMKLWlzIHRoZSByZWNvbW1lbmRlZCBuYW1lLAotLkIgXC1xdWFudGl6ZQotaXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0uVFAKLS5CIFwtZmFzdAotU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgZmFzdCwgbG93IHF1YWxpdHkgb3V0cHV0LiAgKFRoZQotZGVmYXVsdCBvcHRpb25zIGFyZSBjaG9zZW4gZm9yIGhpZ2hlc3QgcXVhbGl0eSBvdXRwdXQuKSAgQ3VycmVudGx5LCB0aGlzIGlzCi1lcXVpdmFsZW50IHRvIFxmQlwtZGN0IGZhc3QgXC1ub3Ntb290aCBcLW9uZXBhc3MgXC1kaXRoZXIgb3JkZXJlZFxmUi4KLS5UUAotLkIgXC1ncmF5c2NhbGUKLUZvcmNlIGdyYXktc2NhbGUgb3V0cHV0IGV2ZW4gaWYgSlBFRyBmaWxlIGlzIGNvbG9yLiAgVXNlZnVsIGZvciB2aWV3aW5nIG9uCi1tb25vY2hyb21lIGRpc3BsYXlzOyBhbHNvLAotLkIgZGpwZWcKLXJ1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgotLlRQCi0uQkkgXC1zY2FsZSAiIE0vTiIKLVNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5IHRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZQotMS8xLCAxLzIsIDEvNCwgb3IgMS84LiAgU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgotc2NyZWVuOyBhbHNvLAotLkIgZGpwZWcKLXJ1bnMgbXVjaCBmYXN0ZXIgd2hlbiBzY2FsaW5nIGRvd24gdGhlIG91dHB1dC4KLS5UUAotLkIgXC1ibXAKLVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoV2luZG93cyBmbGF2b3IpLiAgOC1iaXQgY29sb3JtYXBwZWQgZm9ybWF0IGlzCi1lbWl0dGVkIGlmCi0uQiBcLWNvbG9ycwotb3IKLS5CIFwtZ3JheXNjYWxlCi1pcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsgb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvcgotZm9ybWF0IGlzIGVtaXR0ZWQuCi0uVFAKLS5CIFwtZ2lmCi1TZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQuICBTaW5jZSBHSUYgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMjU2IGNvbG9ycywKLS5CIFwtY29sb3JzIDI1NgotaXMgYXNzdW1lZCAodW5sZXNzIHlvdSBzcGVjaWZ5IGEgc21hbGxlciBudW1iZXIgb2YgY29sb3JzKS4KLS5UUAotLkIgXC1vczIKLVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiAxLnggZmxhdm9yKS4gIDgtYml0IGNvbG9ybWFwcGVkIGZvcm1hdCBpcwotZW1pdHRlZCBpZgotLkIgXC1jb2xvcnMKLW9yCi0uQiBcLWdyYXlzY2FsZQotaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IKLWZvcm1hdCBpcyBlbWl0dGVkLgotLlRQCi0uQiBcLXBubQotU2VsZWN0IFBCTVBMVVMgKFBQTS9QR00pIG91dHB1dCBmb3JtYXQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0KS4KLVBHTSBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZSBvciBpZgotLkIgXC1ncmF5c2NhbGUKLWlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIFBQTSBpcyBlbWl0dGVkLgotLlRQCi0uQiBcLXJsZQotU2VsZWN0IFJMRSBvdXRwdXQgZm9ybWF0LiAgKFJlcXVpcmVzIFVSVCBsaWJyYXJ5LikKLS5UUAotLkIgXC10YXJnYQotU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQuICBHcmF5LXNjYWxlIGZvcm1hdCBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMKLWdyYXktc2NhbGUgb3IgaWYKLS5CIFwtZ3JheXNjYWxlCi1pcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYKLS5CIFwtY29sb3JzCi1pcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCi0uUFAKLVN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKLS5UUAotLkIgXC1kY3QgaW50Ci1Vc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KLS5UUAotLkIgXC1kY3QgZmFzdAotVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgotLlRQCi0uQiBcLWRjdCBmbG9hdAotVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCi1UaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBpbnQgbWV0aG9kLCBidXQgaXMKLW11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUgaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28KLW5vdGUgdGhhdCByZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzCi1tYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuCi1UaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZCBpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgotLlRQCi0uQiBcLWRpdGhlciBmcwotVXNlIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotLlRQCi0uQiBcLWRpdGhlciBvcmRlcmVkCi1Vc2Ugb3JkZXJlZCBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgotLlRQCi0uQiBcLWRpdGhlciBub25lCi1EbyBub3QgdXNlIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi1CeSBkZWZhdWx0LCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGlzIGFwcGxpZWQgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsgdGhpcwotaXMgc2xvdyBidXQgdXN1YWxseSBwcm9kdWNlcyB0aGUgYmVzdCByZXN1bHRzLiAgT3JkZXJlZCBkaXRoZXIgaXMgYSBjb21wcm9taXNlCi1iZXR3ZWVuIHNwZWVkIGFuZCBxdWFsaXR5OyBubyBkaXRoZXJpbmcgaXMgZmFzdCBidXQgdXN1YWxseSBsb29rcyBhd2Z1bC4gIE5vdGUKLXRoYXQgdGhlc2Ugc3dpdGNoZXMgaGF2ZSBubyBlZmZlY3QgdW5sZXNzIGNvbG9yIHF1YW50aXphdGlvbiBpcyBiZWluZyBkb25lLgotT3JkZXJlZCBkaXRoZXIgaXMgb25seSBhdmFpbGFibGUgaW4KLS5CIFwtb25lcGFzcwotbW9kZS4KLS5UUAotLkJJIFwtbWFwICIgZmlsZSIKLVF1YW50aXplIHRvIHRoZSBjb2xvcnMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlIGZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IKLXByb2R1Y2luZyBtdWx0aXBsZSBmaWxlcyB3aXRoIGlkZW50aWNhbCBjb2xvciBtYXBzLCBvciBmb3IgZm9yY2luZyBhCi1wcmVkZWZpbmVkIHNldCBvZiBjb2xvcnMgdG8gYmUgdXNlZC4gIFRoZQotLkkgZmlsZQotbXVzdCBiZSBhIEdJRiBvciBQUE0gZmlsZS4gVGhpcyBvcHRpb24gb3ZlcnJpZGVzCi0uQiBcLWNvbG9ycwotYW5kCi0uQlIgXC1vbmVwYXNzIC4KLS5UUAotLkIgXC1ub3Ntb290aAotVXNlIGEgZmFzdGVyLCBsb3dlci1xdWFsaXR5IHVwc2FtcGxpbmcgcm91dGluZS4KLS5UUAotLkIgXC1vbmVwYXNzCi1Vc2Ugb25lLXBhc3MgaW5zdGVhZCBvZiB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24uICBUaGUgb25lLXBhc3MgbWV0aG9kIGlzCi1mYXN0ZXIgYW5kIG5lZWRzIGxlc3MgbWVtb3J5LCBidXQgaXQgcHJvZHVjZXMgYSBsb3dlci1xdWFsaXR5IGltYWdlLgotLkIgXC1vbmVwYXNzCi1pcyBpZ25vcmVkIHVubGVzcyB5b3UgYWxzbyBzYXkKLS5CIFwtY29sb3JzCi0uSVIgTiAuCi1BbHNvLCB0aGUgb25lLXBhc3MgbWV0aG9kIGlzIGFsd2F5cyB1c2VkIGZvciBncmF5LXNjYWxlIG91dHB1dCAodGhlIHR3by1wYXNzCi1tZXRob2QgaXMgbm8gaW1wcm92ZW1lbnQgdGhlbikuCi0uVFAKLS5CSSBcLW1heG1lbW9yeSAiIE4iCi1TZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKLWluIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQotbnVtYmVyLiAgRm9yIGV4YW1wbGUsCi0uQiBcLW1heCA0bQotc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0uVFAKLS5CSSBcLW91dGZpbGUgIiBuYW1lIgotU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCi0uVFAKLS5CIFwtdmVyYm9zZQotRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQotLkJSIFwtdiAncwotZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotLlRQCi0uQiBcLWRlYnVnCi1TYW1lIGFzCi0uQlIgXC12ZXJib3NlIC4KLS5TSCBFWEFNUExFUwotLkxQCi1UaGlzIGV4YW1wbGUgZGVjb21wcmVzc2VzIHRoZSBKUEVHIGZpbGUgZm9vLmpwZywgcXVhbnRpemVzIGl0IHRvCi0yNTYgY29sb3JzLCBhbmQgc2F2ZXMgdGhlIG91dHB1dCBpbiA4LWJpdCBCTVAgZm9ybWF0IGluIGZvby5ibXA6Ci0uSVAKLS5CIGRqcGVnIFwtY29sb3JzIDI1NiBcLWJtcAotLkkgZm9vLmpwZwotLkIgPgotLkkgZm9vLmJtcAotLlNIIEhJTlRTCi1UbyBnZXQgYSBxdWljayBwcmV2aWV3IG9mIGFuIGltYWdlLCB1c2UgdGhlCi0uQiBcLWdyYXlzY2FsZQotYW5kL29yCi0uQiBcLXNjYWxlCi1zd2l0Y2hlcy4KLS5CIFwtZ3JheXNjYWxlIFwtc2NhbGUgMS84Ci1pcyB0aGUgZmFzdGVzdCBjYXNlLgotLlBQCi1TZXZlcmFsIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGF0IHRyYWRlIG9mZiBpbWFnZSBxdWFsaXR5IHRvIGdhaW4gc3BlZWQuCi0uQiBcLWZhc3QKLXR1cm5zIG9uIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5ncy4KLS5QUAotLkIgXC1kY3QgZmFzdAotYW5kL29yCi0uQiBcLW5vc21vb3RoCi1nYWluIHNwZWVkIGF0IGEgc21hbGwgc2FjcmlmaWNlIGluIHF1YWxpdHkuCi1XaGVuIHByb2R1Y2luZyBhIGNvbG9yLXF1YW50aXplZCBpbWFnZSwKLS5CIFwtb25lcGFzcyBcLWRpdGhlciBvcmRlcmVkCi1pcyBmYXN0IGJ1dCBtdWNoIGxvd2VyIHF1YWxpdHkgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvci4KLS5CIFwtZGl0aGVyIG5vbmUKLW1heSBnaXZlIGFjY2VwdGFibGUgcmVzdWx0cyBpbiB0d28tcGFzcyBtb2RlLCBidXQgaXMgc2VsZG9tIHRvbGVyYWJsZSBpbgotb25lLXBhc3MgbW9kZS4KLS5QUAotSWYgeW91IGFyZSBmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgdmVyeSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLAotXGZCXC1kY3QgZmxvYXRcZlIgbWF5IGJlIGV2ZW4gZmFzdGVyIHRoYW4gXGZCXC1kY3QgZmFzdFxmUi4gIEJ1dCBvbiBtb3N0Ci1tYWNoaW5lcyBcZkJcLWRjdCBmbG9hdFxmUiBpcyBzbG93ZXIgdGhhbiBcZkJcLWRjdCBpbnRcZlI7IGluIHRoaXMgY2FzZSBpdCBpcwotbm90IHdvcnRoIHVzaW5nLCBiZWNhdXNlIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBhZHZhbnRhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlCi1zaWduaWZpY2FudCBpbiBwcmFjdGljZS4KLS5TSCBFTlZJUk9OTUVOVAotLlRQCi0uQiBKUEVHTUVNCi1JZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KLVRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKLS5CIFwtbWF4bWVtb3J5Ci1zd2l0Y2guCi0uQiBKUEVHTUVNCi1vdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKLWl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0Ci0uQlIgXC1tYXhtZW1vcnkgLgotLlNIIFNFRSBBTFNPCi0uQlIgY2pwZWcgKDEpLAotLkJSIGpwZWd0cmFuICgxKSwKLS5CUiByZGpwZ2NvbSAoMSksCi0uQlIgd3JqcGdjb20gKDEpCi0uYnIKLS5CUiBwcG0gKDUpLAotLkJSIHBnbSAoNSkKLS5icgotV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAotQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCi0uU0ggQlVHUwotQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KLS5QUAotVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LAotLkIgZGpwZWcKLXByb2R1Y2VzIHVuY29tcHJlc3NlZCBHSUYgZmlsZXMuICBUaGVzZSBhcmUgbGFyZ2VyIHRoYW4gdGhleSBzaG91bGQgYmUsIGJ1dAotYXJlIHJlYWRhYmxlIGJ5IHN0YW5kYXJkIEdJRiBkZWNvZGVycy4KLS5QUAotU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvZGpwZWcuYyBiL2xpYmpwZWd0d3JwL2RqcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOTllOTAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvZGpwZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKgotICogZGpwZWcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKiBJdCBzaG91bGQgd29yayBvbiBhbnkgc3lzdGVtIHdpdGggVW5peC0gb3IgTVMtRE9TLXN0eWxlIGNvbW1hbmQgbGluZXMuCi0gKgotICogVHdvIGRpZmZlcmVudCBjb21tYW5kIGxpbmUgc3R5bGVzIGFyZSBwZXJtaXR0ZWQsIGRlcGVuZGluZyBvbiB0aGUKLSAqIGNvbXBpbGUtdGltZSBzd2l0Y2ggVFdPX0ZJTEVfQ09NTUFORExJTkU6Ci0gKglkanBlZyBbb3B0aW9uc10gIGlucHV0ZmlsZSBvdXRwdXRmaWxlCi0gKglkanBlZyBbb3B0aW9uc10gIFtpbnB1dGZpbGVdCi0gKiBJbiB0aGUgc2Vjb25kIHN0eWxlLCBvdXRwdXQgaXMgYWx3YXlzIHRvIHN0YW5kYXJkIG91dHB1dCwgd2hpY2ggeW91J2QKLSAqIG5vcm1hbGx5IHJlZGlyZWN0IHRvIGEgZmlsZSBvciBwaXBlIHRvIHNvbWUgb3RoZXIgcHJvZ3JhbS4gIElucHV0IGlzCi0gKiBlaXRoZXIgZnJvbSBhIG5hbWVkIGZpbGUgb3IgZnJvbSBzdGFuZGFyZCBpbnB1dCAodHlwaWNhbGx5IHJlZGlyZWN0ZWQpLgotICogVGhlIHNlY29uZCBzdHlsZSBpcyBjb252ZW5pZW50IG9uIFVuaXggYnV0IGlzIHVuaGVscGZ1bCBvbiBzeXN0ZW1zIHRoYXQKLSAqIGRvbid0IHN1cHBvcnQgcGlwZXMuICBBbHNvLCB5b3UgTVVTVCB1c2UgdGhlIGZpcnN0IHN0eWxlIGlmIHlvdXIgc3lzdGVtCi0gKiBkb2Vzbid0IGRvIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LgotICogVG8gc2ltcGxpZnkgc2NyaXB0IHdyaXRpbmcsIHRoZSAiLW91dGZpbGUiIHN3aXRjaCBpcyBwcm92aWRlZC4gIFRoZSBzeW50YXgKLSAqCWRqcGVnIFtvcHRpb25zXSAgLW91dGZpbGUgb3V0cHV0ZmlsZSAgaW5wdXRmaWxlCi0gKiB3b3JrcyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbW1hbmQgbGluZSBzdHlsZSBpcyB1c2VkLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0jaW5jbHVkZSAianZlcnNpb24uaCIJCS8qIGZvciB2ZXJzaW9uIG1lc3NhZ2UgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzcHJpbnQoKSAqLwotCi0jaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNpZmRlZiBfX01XRVJLU19fCi0jaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLwotI2VuZGlmCi0jaWZkZWYgVEhJTktfQwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0KLQotLyogQ3JlYXRlIHRoZSBhZGQtb24gbWVzc2FnZSBzdHJpbmcgdGFibGUuICovCi0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RqcGVnX21lc3NhZ2VfdGFibGVbXSA9IHsKLSNpbmNsdWRlICJjZGVycm9yLmgiCi0gIE5VTEwKLX07Ci0KLQotLyoKLSAqIFRoaXMgbGlzdCBkZWZpbmVzIHRoZSBrbm93biBvdXRwdXQgaW1hZ2UgZm9ybWF0cwotICogKG5vdCBhbGwgb2Ygd2hpY2ggbmVlZCBiZSBzdXBwb3J0ZWQgYnkgYSBnaXZlbiB2ZXJzaW9uKS4KLSAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgYnkgZGVmaW5pbmcgREVGQVVMVF9GTVQ7Ci0gKiBpbmRlZWQsIHlvdSBoYWQgYmV0dGVyIGRvIHNvIGlmIHlvdSB1bmRlZmluZSBQUE1fU1VQUE9SVEVELgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JRk1UX0JNUCwJCS8qIEJNUCBmb3JtYXQgKFdpbmRvd3MgZmxhdm9yKSAqLwotCUZNVF9HSUYsCQkvKiBHSUYgZm9ybWF0ICovCi0JRk1UX09TMiwJCS8qIEJNUCBmb3JtYXQgKE9TLzIgZmxhdm9yKSAqLwotCUZNVF9QUE0sCQkvKiBQUE0vUEdNIChQQk1QTFVTIGZvcm1hdHMpICovCi0JRk1UX1JMRSwJCS8qIFJMRSBmb3JtYXQgKi8KLQlGTVRfVEFSR0EsCQkvKiBUYXJnYSBmb3JtYXQgKi8KLQlGTVRfVElGRgkJLyogVElGRiBmb3JtYXQgKi8KLX0gSU1BR0VfRk9STUFUUzsKLQotI2lmbmRlZiBERUZBVUxUX0ZNVAkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gQ0ZMQUdTIGluIE1ha2VmaWxlICovCi0jZGVmaW5lIERFRkFVTFRfRk1UCUZNVF9QUE0KLSNlbmRpZgotCi1zdGF0aWMgSU1BR0VfRk9STUFUUyByZXF1ZXN0ZWRfZm10OwotCi0KLS8qCi0gKiBBcmd1bWVudC1wYXJzaW5nIGNvZGUuCi0gKiBUaGUgc3dpdGNoIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSB1c2VmdWwgd2l0aCBET1Mtc3R5bGUgY29tbWFuZCBsaW5lCi0gKiBzeW50YXgsIGllLCBpbnRlcm1peGVkIHN3aXRjaGVzIGFuZCBmaWxlIG5hbWVzLCB3aGVyZSBvbmx5IHRoZSBzd2l0Y2hlcwotICogdG8gdGhlIGxlZnQgb2YgYSBnaXZlbiBmaWxlIG5hbWUgYWZmZWN0IHByb2Nlc3Npbmcgb2YgdGhhdCBmaWxlLgotICogVGhlIG1haW4gcHJvZ3JhbSBpbiB0aGlzIGZpbGUgZG9lc24ndCBhY3R1YWxseSB1c2UgdGhpcyBjYXBhYmlsaXR5Li4uCi0gKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCi0KLQotTE9DQUwodm9pZCkKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKLSNlbHNlCi0gIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOwotI2VuZGlmCi0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbG9ycyBOICAgICAgUmVkdWNlIGltYWdlIHRvIG5vIG1vcmUgdGhhbiBOIGNvbG9yc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZmFzdCAgICAgICAgICBGYXN0LCBsb3ctcXVhbGl0eSBwcm9jZXNzaW5nXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIEZvcmNlIGdyYXlzY2FsZSBvdXRwdXRcbiIpOwotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FsZSBNL04gICAgIFNjYWxlIG91dHB1dCBpbWFnZSBieSBmcmFjdGlvbiBNL04sIGVnLCAxLzhcbiIpOwotI2VuZGlmCi0jaWZkZWYgQk1QX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJtcCAgICAgICAgICAgU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIHN0eWxlKSVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9CTVAgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdpZiAgICAgICAgICAgU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0JXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX0dJRiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb3MyICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgc3R5bGUpJXNcbiIsCi0JICAoREVGQVVMVF9GTVQgPT0gRk1UX09TMiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7Ci0jZW5kaWYKLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtcG5tICAgICAgICAgICBTZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCVzXG4iLAotCSAgKERFRkFVTFRfRk1UID09IEZNVF9QUE0gPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJsZSAgICAgICAgICAgU2VsZWN0IFV0YWggUkxFIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfUkxFID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRhcmdhICAgICAgICAgU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQlc1xuIiwKLQkgIChERUZBVUxUX0ZNVCA9PSBGTVRfVEFSR0EgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOlxuIik7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBpbnQgICAgICAgVXNlIGludGVnZXIgRENUIG1ldGhvZCVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lTTE9XID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmFzdCAgICAgIFVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKSVzXG4iLAotCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lGQVNUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmxvYXQgICAgIFVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kJXNcbiIsCi0JICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfRkxPQVQgPyAiIChkZWZhdWx0KSIgOiAiIikpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIGZzICAgICBVc2UgRi1TIGRpdGhlcmluZyAoZGVmYXVsdClcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBub25lICAgRG9uJ3QgdXNlIGRpdGhlcmluZyBpbiBxdWFudGl6YXRpb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBvcmRlcmVkICBVc2Ugb3JkZXJlZCBkaXRoZXIgKG1lZGl1bSBzcGVlZCwgcXVhbGl0eSlcbiIpOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1hcCBGSUxFICAgICAgTWFwIHRvIGNvbG9ycyB1c2VkIGluIG5hbWVkIGltYWdlIGZpbGVcbiIpOwotI2VuZGlmCi0gIGZwcmludGYoc3RkZXJyLCAiICAtbm9zbW9vdGggICAgICBEb24ndCB1c2UgaGlnaC1xdWFsaXR5IHVwc2FtcGxpbmdcbiIpOwotI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9uZXBhc3MgICAgICAgVXNlIDEtcGFzcyBxdWFudGl6YXRpb24gKGZhc3QsIGxvdyBxdWFsaXR5KVxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZihzdGRlcnIsICIgIC1tYXhtZW1vcnkgTiAgIE1heGltdW0gbWVtb3J5IHRvIHVzZSAoaW4ga2J5dGVzKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtb3V0ZmlsZSBuYW1lICBTcGVjaWZ5IG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICBvciAgLWRlYnVnICAgRW1pdCBkZWJ1ZyBvdXRwdXRcbiIpOwotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLQotTE9DQUwoaW50KQotcGFyc2Vfc3dpdGNoZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKLQkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKLS8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgotICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgotICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKLSAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgotICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCi0gKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCi0gKiBwcm9jZXNzaW5nLgotICovCi17Ci0gIGludCBhcmduOwotICBjaGFyICogYXJnOwotCi0gIC8qIFNldCB1cCBkZWZhdWx0IEpQRUcgcGFyYW1ldGVycy4gKi8KLSAgcmVxdWVzdGVkX2ZtdCA9IERFRkFVTFRfRk1UOwkvKiBzZXQgZGVmYXVsdCBvdXRwdXQgZmlsZSBmb3JtYXQgKi8KLSAgb3V0ZmlsZW5hbWUgPSBOVUxMOwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYWRqdXN0IHBhcmFtZXRlcnMgKi8KLQotICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7Ci0gICAgYXJnID0gYXJndlthcmduXTsKLSAgICBpZiAoKmFyZyAhPSAnLScpIHsKLSAgICAgIC8qIE5vdCBhIHN3aXRjaCwgbXVzdCBiZSBhIGZpbGUgbmFtZSBhcmd1bWVudCAqLwotICAgICAgaWYgKGFyZ24gPD0gbGFzdF9maWxlX2FyZ19zZWVuKSB7Ci0Jb3V0ZmlsZW5hbWUgPSBOVUxMOwkvKiAtb3V0ZmlsZSBhcHBsaWVzIHRvIGp1c3Qgb25lIGlucHV0IGZpbGUgKi8KLQljb250aW51ZTsJCS8qIGlnbm9yZSB0aGlzIG5hbWUgaWYgcHJldmlvdXNseSBwcm9jZXNzZWQgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwkJCS8qIGVsc2UgZG9uZSBwYXJzaW5nIHN3aXRjaGVzICovCi0gICAgfQotICAgIGFyZysrOwkJCS8qIGFkdmFuY2UgcGFzdCBzd2l0Y2ggbWFya2VyIGNoYXJhY3RlciAqLwotCi0gICAgaWYgKGtleW1hdGNoKGFyZywgImJtcCIsIDEpKSB7Ci0gICAgICAvKiBCTVAgb3V0cHV0IGZvcm1hdC4gKi8KLSAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfQk1QOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjb2xvcnMiLCAxKSB8fCBrZXltYXRjaChhcmcsICJjb2xvdXJzIiwgMSkgfHwKLQkgICAgICAga2V5bWF0Y2goYXJnLCAicXVhbnRpemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJxdWFudGlzZSIsIDEpKSB7Ci0gICAgICAvKiBEbyBjb2xvciBxdWFudGl6YXRpb24uICovCi0gICAgICBpbnQgdmFsOwotCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZ2YWwpICE9IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSB2YWw7Ci0gICAgICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKLSAgICAgIC8qIFNlbGVjdCBJRENUIGFsZ29yaXRobS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaW50IiwgMSkpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSVNMT1c7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmYXN0IiwgMikpIHsKLQljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7Ci0gICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmbG9hdCIsIDIpKSB7Ci0JY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0ZMT0FUOwotICAgICAgfSBlbHNlCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGl0aGVyIiwgMikpIHsKLSAgICAgIC8qIFNlbGVjdCBkaXRoZXJpbmcgYWxnb3JpdGhtLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmcyIsIDIpKSB7Ci0JY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm5vbmUiLCAyKSkgewotCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfTk9ORTsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm9yZGVyZWQiLCAyKSkgewotCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKLSAgICAgIH0gZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRlYnVnIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZGVidWcgcHJpbnRvdXRzLiAqLwotICAgICAgLyogT24gZmlyc3QgLWQsIHByaW50IHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KLSAgICAgIHN0YXRpYyBib29sZWFuIHByaW50ZWRfdmVyc2lvbiA9IEZBTFNFOwotCi0gICAgICBpZiAoISBwcmludGVkX3ZlcnNpb24pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBESlBFRywgdmVyc2lvbiAlc1xuJXNcbiIsCi0JCUpWRVJTSU9OLCBKQ09QWVJJR0hUKTsKLQlwcmludGVkX3ZlcnNpb24gPSBUUlVFOwotICAgICAgfQotICAgICAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwrKzsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZmFzdCIsIDEpKSB7Ci0gICAgICAvKiBTZWxlY3QgcmVjb21tZW5kZWQgcHJvY2Vzc2luZyBvcHRpb25zIGZvciBxdWljay1hbmQtZGlydHkgb3V0cHV0LiAqLwotICAgICAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7Ci0gICAgICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX09SREVSRUQ7Ci0gICAgICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzKSAvKiBkb24ndCBvdmVycmlkZSBhbiBlYXJsaWVyIC1jb2xvcnMgKi8KLQljaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjE2OwotICAgICAgY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0ZBU1RFU1Q7Ci0gICAgICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IEZBTFNFOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJnaWYiLCAxKSkgewotICAgICAgLyogR0lGIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX0dJRjsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZ3JheXNjYWxlIiwgMikgfHwga2V5bWF0Y2goYXJnLCAiZ3JleXNjYWxlIiwyKSkgewotICAgICAgLyogRm9yY2UgbW9ub2Nocm9tZSBvdXRwdXQuICovCi0gICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWFwIiwgMykpIHsKLSAgICAgIC8qIFF1YW50aXplIHRvIGEgY29sb3IgbWFwIHRha2VuIGZyb20gYW4gaW5wdXQgZmlsZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChmb3JfcmVhbCkgewkJLyogdG9vIGV4cGVuc2l2ZSB0byBkbyB0d2ljZSEgKi8KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQJLyogb3RoZXJ3aXNlIGNhbid0IHF1YW50aXplIHRvIHN1cHBsaWVkIG1hcCAqLwotCUZJTEUgKiBtYXBmaWxlOwotCi0JaWYgKChtYXBmaWxlID0gZm9wZW4oYXJndlthcmduXSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0JICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7Ci0JICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0JfQotCXJlYWRfY29sb3JfbWFwKGNpbmZvLCBtYXBmaWxlKTsKLQlmY2xvc2UobWFwZmlsZSk7Ci0JY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IFRSVUU7Ci0jZWxzZQotCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXhtZW1vcnkiLCAzKSkgewotICAgICAgLyogTWF4aW11bSBtZW1vcnkgaW4gS2IgKG9yIE1iIHdpdGggJ20nKS4gKi8KLSAgICAgIGxvbmcgbHZhbDsKLSAgICAgIGNoYXIgY2ggPSAneCc7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQotCXVzYWdlKCk7Ci0gICAgICBpZiAoY2ggPT0gJ20nIHx8IGNoID09ICdNJykKLQlsdmFsICo9IDEwMDBMOwotICAgICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBsdmFsICogMTAwMEw7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vc21vb3RoIiwgMykpIHsKLSAgICAgIC8qIFN1cHByZXNzIGZhbmN5IHVwc2FtcGxpbmcgKi8KLSAgICAgIGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9uZXBhc3MiLCAzKSkgewotICAgICAgLyogVXNlIGZhc3Qgb25lLXBhc3MgcXVhbnRpemF0aW9uLiAqLwotICAgICAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9zMiIsIDMpKSB7Ci0gICAgICAvKiBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiBmbGF2b3IpLiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9PUzI7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgewotICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInBubSIsIDEpIHx8IGtleW1hdGNoKGFyZywgInBwbSIsIDEpKSB7Ci0gICAgICAvKiBQUE0vUEdNIG91dHB1dCBmb3JtYXQuICovCi0gICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1BQTTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmxlIiwgMSkpIHsKLSAgICAgIC8qIFJMRSBvdXRwdXQgZm9ybWF0LiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9STEU7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYWxlIiwgMSkpIHsKLSAgICAgIC8qIFNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmcmFjdGlvbiBNL04uICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZC8lZCIsCi0JCSAmY2luZm8tPnNjYWxlX251bSwgJmNpbmZvLT5zY2FsZV9kZW5vbSkgIT0gMikKLQl1c2FnZSgpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0YXJnYSIsIDEpKSB7Ci0gICAgICAvKiBUYXJnYSBvdXRwdXQgZm9ybWF0LiAqLwotICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9UQVJHQTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLwotICAgIH0KLSAgfQotCi0gIHJldHVybiBhcmduOwkJCS8qIHJldHVybiBpbmRleCBvZiBuZXh0IGFyZyAoZmlsZSBuYW1lKSAqLwotfQotCi0KLS8qCi0gKiBNYXJrZXIgcHJvY2Vzc29yIGZvciBDT00gYW5kIGludGVyZXN0aW5nIEFQUG4gbWFya2Vycy4KLSAqIFRoaXMgcmVwbGFjZXMgdGhlIGxpYnJhcnkncyBidWlsdC1pbiBwcm9jZXNzb3IsIHdoaWNoIGp1c3Qgc2tpcHMgdGhlIG1hcmtlci4KLSAqIFdlIHdhbnQgdG8gcHJpbnQgb3V0IHRoZSBtYXJrZXIgYXMgdGV4dCwgdG8gdGhlIGV4dGVudCBwb3NzaWJsZS4KLSAqIE5vdGUgdGhpcyBjb2RlIHJlbGllcyBvbiBhIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlLgotICovCi0KLUxPQ0FMKHVuc2lnbmVkIGludCkKLWpwZWdfZ2V0YyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFJlYWQgbmV4dCBieXRlICovCi17Ci0gIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBkYXRhc3JjID0gY2luZm8tPnNyYzsKLQotICBpZiAoZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyID09IDApIHsKLSAgICBpZiAoISAoKmRhdGFzcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOwotICB9Ci0gIGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlci0tOwotICByZXR1cm4gR0VUSk9DVEVUKCpkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUrKyk7Ci19Ci0KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1wcmludF90ZXh0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgYm9vbGVhbiB0cmFjZWl0ID0gKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID49IDEpOwotICBJTlQzMiBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCBjaDsKLSAgdW5zaWduZWQgaW50IGxhc3RjaCA9IDA7Ci0KLSAgbGVuZ3RoID0ganBlZ19nZXRjKGNpbmZvKSA8PCA4OwotICBsZW5ndGggKz0ganBlZ19nZXRjKGNpbmZvKTsKLSAgbGVuZ3RoIC09IDI7CQkJLyogZGlzY291bnQgdGhlIGxlbmd0aCB3b3JkIGl0c2VsZiAqLwotCi0gIGlmICh0cmFjZWl0KSB7Ci0gICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IEpQRUdfQ09NKQotICAgICAgZnByaW50ZihzdGRlcnIsICJDb21tZW50LCBsZW5ndGggJWxkOlxuIiwgKGxvbmcpIGxlbmd0aCk7Ci0gICAgZWxzZQkJCS8qIGFzc3VtZSBpdCBpcyBhbiBBUFBuIG90aGVyd2lzZSAqLwotICAgICAgZnByaW50ZihzdGRlcnIsICJBUFAlZCwgbGVuZ3RoICVsZDpcbiIsCi0JICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgLSBKUEVHX0FQUDAsIChsb25nKSBsZW5ndGgpOwotICB9Ci0KLSAgd2hpbGUgKC0tbGVuZ3RoID49IDApIHsKLSAgICBjaCA9IGpwZWdfZ2V0YyhjaW5mbyk7Ci0gICAgaWYgKHRyYWNlaXQpIHsKLSAgICAgIC8qIEVtaXQgdGhlIGNoYXJhY3RlciBpbiBhIHJlYWRhYmxlIGZvcm0uCi0gICAgICAgKiBOb25wcmludGFibGVzIGFyZSBjb252ZXJ0ZWQgdG8gXG5ubiBmb3JtLAotICAgICAgICogd2hpbGUgXCBpcyBjb252ZXJ0ZWQgdG8gXFwuCi0gICAgICAgKiBOZXdsaW5lcyBpbiBDUiwgQ1IvTEYsIG9yIExGIGZvcm0gd2lsbCBiZSBwcmludGVkIGFzIG9uZSBuZXdsaW5lLgotICAgICAgICovCi0gICAgICBpZiAoY2ggPT0gJ1xyJykgewotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgewotCWlmIChsYXN0Y2ggIT0gJ1xyJykKLQkgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgewotCWZwcmludGYoc3RkZXJyLCAiXFxcXCIpOwotICAgICAgfSBlbHNlIGlmIChpc3ByaW50KGNoKSkgewotCXB1dGMoY2gsIHN0ZGVycik7Ci0gICAgICB9IGVsc2UgewotCWZwcmludGYoc3RkZXJyLCAiXFwlMDNvIiwgY2gpOwotICAgICAgfQotICAgICAgbGFzdGNoID0gY2g7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRyYWNlaXQpCi0gICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBUaGUgbWFpbiBwcm9ncmFtLgotICovCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOwotI2VuZGlmCi0gIGludCBmaWxlX2luZGV4OwotICBkanBlZ19kZXN0X3B0ciBkZXN0X21nciA9IE5VTEw7Ci0gIEZJTEUgKiBpbnB1dF9maWxlOwotICBGSUxFICogb3V0cHV0X2ZpbGU7Ci0gIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKLQotICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLwotI2lmZGVmIFVTRV9DQ09NTUFORAotICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOwotI2VuZGlmCi0KLSAgcHJvZ25hbWUgPSBhcmd2WzBdOwotICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQotICAgIHByb2duYW1lID0gImRqcGVnIjsJCS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLwotCi0gIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLwotICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7Ci0gIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgLyogQWRkIHNvbWUgYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgKGZyb20gY2RlcnJvci5oKSAqLwotICBqZXJyLmFkZG9uX21lc3NhZ2VfdGFibGUgPSBjZGpwZWdfbWVzc2FnZV90YWJsZTsKLSAgamVyci5maXJzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19GSVJTVEFERE9OQ09ERTsKLSAgamVyci5sYXN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0xBU1RBRERPTkNPREU7Ci0KLSAgLyogSW5zZXJ0IGN1c3RvbSBtYXJrZXIgcHJvY2Vzc29yIGZvciBDT00gYW5kIEFQUDEyLgotICAgKiBBUFAxMiBpcyB1c2VkIGJ5IHNvbWUgZGlnaXRhbCBjYW1lcmEgbWFrZXJzIGZvciB0ZXh0dWFsIGluZm8sCi0gICAqIHNvIHdlIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gZGlzcGxheSBpdCBhcyB0ZXh0LgotICAgKiBJZiB5b3UgbGlrZSwgYWRkaXRpb25hbCBBUFBuIG1hcmtlciB0eXBlcyBjYW4gYmUgc2VsZWN0ZWQgZm9yIGRpc3BsYXksCi0gICAqIGJ1dCBkb24ndCB0cnkgdG8gb3ZlcnJpZGUgQVBQMCBvciBBUFAxNCB0aGlzIHdheSAoc2VlIGxpYmpwZWcuZG9jKS4KLSAgICovCi0gIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoJmNpbmZvLCBKUEVHX0NPTSwgcHJpbnRfdGV4dF9tYXJrZXIpOwotICBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCZjaW5mbywgSlBFR19BUFAwKzEyLCBwcmludF90ZXh0X21hcmtlcik7Ci0KLSAgLyogTm93IHNhZmUgdG8gZW5hYmxlIHNpZ25hbCBjYXRjaGVyLiAqLwotI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7Ci0jZW5kaWYKLQotICAvKiBTY2FuIGNvbW1hbmQgbGluZSB0byBmaW5kIGZpbGUgbmFtZXMuICovCi0gIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gdXNlIGp1c3Qgb25lIHN3aXRjaC1wYXJzaW5nIHJvdXRpbmUsIGJ1dCB0aGUgc3dpdGNoCi0gICAqIHZhbHVlcyByZWFkIGhlcmUgYXJlIGlnbm9yZWQ7IHdlIHdpbGwgcmVzY2FuIHRoZSBzd2l0Y2hlcyBhZnRlciBvcGVuaW5nCi0gICAqIHRoZSBpbnB1dCBmaWxlLgotICAgKiAoRXhjZXB0aW9uOiB0cmFjaW5nIGxldmVsIHNldCBoZXJlIGNvbnRyb2xzIHZlcmJvc2l0eSBmb3IgQ09NIG1hcmtlcnMKLSAgICogZm91bmQgZHVyaW5nIGpwZWdfcmVhZF9oZWFkZXIuLi4pCi0gICAqLwotCi0gIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKLQotI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KLSAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKLSAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgfQotI2Vsc2UKLSAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLwotICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0jZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLwotICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKLSAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCi0gICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLwotICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgewotICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KLSAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOwotICB9Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7Ci0jZW5kaWYKLQotICAvKiBTcGVjaWZ5IGRhdGEgc291cmNlIGZvciBkZWNvbXByZXNzaW9uICovCi0gIGpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5wdXRfZmlsZSk7Ci0KLSAgLyogUmVhZCBmaWxlIGhlYWRlciwgc2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzICovCi0gICh2b2lkKSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0KLSAgLyogQWRqdXN0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgb3V0cHV0IG1vZHVsZSBub3cgdG8gbGV0IGl0IG92ZXJyaWRlIGFueSBjcnVjaWFsCi0gICAqIG9wdGlvbiBzZXR0aW5ncyAoZm9yIGluc3RhbmNlLCBHSUYgd2FudHMgdG8gZm9yY2UgY29sb3IgcXVhbnRpemF0aW9uKS4KLSAgICovCi0gIHN3aXRjaCAocmVxdWVzdGVkX2ZtdCkgewotI2lmZGVmIEJNUF9TVVBQT1JURUQKLSAgY2FzZSBGTVRfQk1QOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfYm1wKCZjaW5mbywgRkFMU0UpOwotICAgIGJyZWFrOwotICBjYXNlIEZNVF9PUzI6Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ibXAoJmNpbmZvLCBUUlVFKTsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEdJRl9TVVBQT1JURUQKLSAgY2FzZSBGTVRfR0lGOgotICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfZ2lmKCZjaW5mbyk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBQUE1fU1VQUE9SVEVECi0gIGNhc2UgRk1UX1BQTToKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3BwbSgmY2luZm8pOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgUkxFX1NVUFBPUlRFRAotICBjYXNlIEZNVF9STEU6Ci0gICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ybGUoJmNpbmZvKTsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAotICBjYXNlIEZNVF9UQVJHQToKLSAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3RhcmdhKCZjaW5mbyk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKCZjaW5mbywgSkVSUl9VTlNVUFBPUlRFRF9GT1JNQVQpOwotICAgIGJyZWFrOwotICB9Ci0gIGRlc3RfbWdyLT5vdXRwdXRfZmlsZSA9IG91dHB1dF9maWxlOwotCi0gIC8qIFN0YXJ0IGRlY29tcHJlc3NvciAqLwotICAodm9pZCkganBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogV3JpdGUgb3V0cHV0IGZpbGUgaGVhZGVyICovCi0gICgqZGVzdF9tZ3ItPnN0YXJ0X291dHB1dCkgKCZjaW5mbywgZGVzdF9tZ3IpOwotCi0gIC8qIFByb2Nlc3MgZGF0YSAqLwotICB3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkgewotICAgIG51bV9zY2FubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgZGVzdF9tZ3ItPmJ1ZmZlciwKLQkJCQkJZGVzdF9tZ3ItPmJ1ZmZlcl9oZWlnaHQpOwotICAgICgqZGVzdF9tZ3ItPnB1dF9waXhlbF9yb3dzKSAoJmNpbmZvLCBkZXN0X21nciwgbnVtX3NjYW5saW5lcyk7Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICAvKiBIYWNrOiBjb3VudCBmaW5hbCBwYXNzIGFzIGRvbmUgaW4gY2FzZSBmaW5pc2hfb3V0cHV0IGRvZXMgYW4gZXh0cmEgcGFzcy4KLSAgICogVGhlIGxpYnJhcnkgd29uJ3QgaGF2ZSB1cGRhdGVkIGNvbXBsZXRlZF9wYXNzZXMuCi0gICAqLwotICBwcm9ncmVzcy5wdWIuY29tcGxldGVkX3Bhc3NlcyA9IHByb2dyZXNzLnB1Yi50b3RhbF9wYXNzZXM7Ci0jZW5kaWYKLQotICAvKiBGaW5pc2ggZGVjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkuCi0gICAqIEkgbXVzdCBkbyBpdCBpbiB0aGlzIG9yZGVyIGJlY2F1c2Ugb3V0cHV0IG1vZHVsZSBoYXMgYWxsb2NhdGVkIG1lbW9yeQotICAgKiBvZiBsaWZlc3BhbiBKUE9PTF9JTUFHRTsgaXQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSByZWxlYXNpbmcgbWVtb3J5LgotICAgKi8KLSAgKCpkZXN0X21nci0+ZmluaXNoX291dHB1dCkgKCZjaW5mbywgZGVzdF9tZ3IpOwotICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOwotICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotCi0gIC8qIENsb3NlIGZpbGVzLCBpZiB3ZSBvcGVuZWQgdGhlbSAqLwotICBpZiAoaW5wdXRfZmlsZSAhPSBzdGRpbikKLSAgICBmY2xvc2UoaW5wdXRfZmlsZSk7Ci0gIGlmIChvdXRwdXRfZmlsZSAhPSBzdGRvdXQpCi0gICAgZmNsb3NlKG91dHB1dF9maWxlKTsKLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBlbmRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8pOwotI2VuZGlmCi0KLSAgLyogQWxsIGRvbmUuICovCi0gIGV4aXQoamVyci5udW1fd2FybmluZ3MgPyBFWElUX1dBUk5JTkcgOiBFWElUX1NVQ0NFU1MpOwotICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2V4YW1wbGUuYyBiL2xpYmpwZWd0d3JwL2V4YW1wbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjMzU0Zi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9leGFtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIGV4YW1wbGUuYwotICoKLSAqIFRoaXMgZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZSBJSkcgY29kZSBhcyBhIHN1YnJvdXRpbmUgbGlicmFyeQotICogdG8gcmVhZCBvciB3cml0ZSBKUEVHIGltYWdlIGZpbGVzLiAgWW91IHNob3VsZCBsb29rIGF0IHRoaXMgY29kZSBpbgotICogY29uanVuY3Rpb24gd2l0aCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlIGxpYmpwZWcuZG9jLgotICoKLSAqIFRoaXMgY29kZSB3aWxsIG5vdCBkbyBhbnl0aGluZyB1c2VmdWwgYXMtaXMsIGJ1dCBpdCBtYXkgYmUgaGVscGZ1bCBhcyBhCi0gKiBza2VsZXRvbiBmb3IgY29uc3RydWN0aW5nIHJvdXRpbmVzIHRoYXQgY2FsbCB0aGUgSlBFRyBsaWJyYXJ5LiAgCi0gKgotICogV2UgcHJlc2VudCB0aGVzZSByb3V0aW5lcyBpbiB0aGUgc2FtZSBjb2Rpbmcgc3R5bGUgdXNlZCBpbiB0aGUgSlBFRyBjb2RlCi0gKiAoQU5TSSBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXRjKTsgYnV0IHlvdSBhcmUgb2YgY291cnNlIGZyZWUgdG8gY29kZSB5b3VyCi0gKiByb3V0aW5lcyBpbiBhIGRpZmZlcmVudCBzdHlsZSBpZiB5b3UgcHJlZmVyLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKgotICogSW5jbHVkZSBmaWxlIGZvciB1c2VycyBvZiBKUEVHIGxpYnJhcnkuCi0gKiBZb3Ugd2lsbCBuZWVkIHRvIGhhdmUgaW5jbHVkZWQgc3lzdGVtIGhlYWRlcnMgdGhhdCBkZWZpbmUgYXQgbGVhc3QKLSAqIHRoZSB0eXBlZGVmcyBGSUxFIGFuZCBzaXplX3QgYmVmb3JlIHlvdSBjYW4gaW5jbHVkZSBqcGVnbGliLmguCi0gKiAoc3RkaW8uaCBpcyBzdWZmaWNpZW50IG9uIEFOU0ktY29uZm9ybWluZyBzeXN0ZW1zLikKLSAqIFlvdSBtYXkgYWxzbyB3aXNoIHRvIGluY2x1ZGUgImplcnJvci5oIi4KLSAqLwotCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0vKgotICogPHNldGptcC5oPiBpcyB1c2VkIGZvciB0aGUgb3B0aW9uYWwgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtIHNob3duIGluCi0gKiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGV4YW1wbGUuCi0gKi8KLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqIEpQRUcgQ09NUFJFU1NJT04gU0FNUExFIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGhhbGYgb2YgdGhlIGV4YW1wbGUgc2hvd3MgaG93IHRvIGZlZWQgZGF0YSBpbnRvIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKiBXZSBwcmVzZW50IGEgbWluaW1hbCB2ZXJzaW9uIHRoYXQgZG9lcyBub3Qgd29ycnkgYWJvdXQgcmVmaW5lbWVudHMgc3VjaAotICogYXMgZXJyb3IgcmVjb3ZlcnkgKHRoZSBKUEVHIGNvZGUgd2lsbCBqdXN0IGV4aXQoKSBpZiBpdCBnZXRzIGFuIGVycm9yKS4KLSAqLwotCi0KLS8qCi0gKiBJTUFHRSBEQVRBIEZPUk1BVFM6Ci0gKgotICogVGhlIHN0YW5kYXJkIGlucHV0IGltYWdlIGZvcm1hdCBpcyBhIHJlY3Rhbmd1bGFyIGFycmF5IG9mIHBpeGVscywgd2l0aAotICogZWFjaCBwaXhlbCBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mICJjb21wb25lbnQiIHZhbHVlcyAoY29sb3IgY2hhbm5lbHMpLgotICogRWFjaCBwaXhlbCByb3cgaXMgYW4gYXJyYXkgb2YgSlNBTVBMRXMgKHdoaWNoIHR5cGljYWxseSBhcmUgdW5zaWduZWQgY2hhcnMpLgotICogSWYgeW91IGFyZSB3b3JraW5nIHdpdGggY29sb3IgZGF0YSwgdGhlbiB0aGUgY29sb3IgdmFsdWVzIGZvciBlYWNoIHBpeGVsCi0gKiBtdXN0IGJlIGFkamFjZW50IGluIHRoZSByb3c7IGZvciBleGFtcGxlLCBSLEcsQixSLEcsQixSLEcsQiwuLi4gZm9yIDI0LWJpdAotICogUkdCIGNvbG9yLgotICoKLSAqIEZvciB0aGlzIGV4YW1wbGUsIHdlJ2xsIGFzc3VtZSB0aGF0IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgd2F5Ci0gKiBvdXIgYXBwbGljYXRpb24gaGFzIHN0b3JlZCB0aGUgaW1hZ2UgaW4gbWVtb3J5LCBzbyB3ZSBjYW4ganVzdCBwYXNzIGEKLSAqIHBvaW50ZXIgdG8gb3VyIGltYWdlIGJ1ZmZlci4gIEluIHBhcnRpY3VsYXIsIGxldCdzIHNheSB0aGF0IHRoZSBpbWFnZSBpcwotICogUkdCIGNvbG9yIGFuZCBpcyBkZXNjcmliZWQgYnk6Ci0gKi8KLQotZXh0ZXJuIEpTQU1QTEUgKiBpbWFnZV9idWZmZXI7CS8qIFBvaW50cyB0byBsYXJnZSBhcnJheSBvZiBSLEcsQi1vcmRlciBkYXRhICovCi1leHRlcm4gaW50IGltYWdlX2hlaWdodDsJLyogTnVtYmVyIG9mIHJvd3MgaW4gaW1hZ2UgKi8KLWV4dGVybiBpbnQgaW1hZ2Vfd2lkdGg7CQkvKiBOdW1iZXIgb2YgY29sdW1ucyBpbiBpbWFnZSAqLwotCi0KLS8qCi0gKiBTYW1wbGUgcm91dGluZSBmb3IgSlBFRyBjb21wcmVzc2lvbi4gIFdlIGFzc3VtZSB0aGF0IHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0gKiBhbmQgYSBjb21wcmVzc2lvbiBxdWFsaXR5IGZhY3RvciBhcmUgcGFzc2VkIGluLgotICovCi0KLUdMT0JBTCh2b2lkKQotd3JpdGVfSlBFR19maWxlIChjaGFyICogZmlsZW5hbWUsIGludCBxdWFsaXR5KQotewotICAvKiBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgSlBFRyBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCBwb2ludGVycyB0bwotICAgKiB3b3JraW5nIHNwYWNlICh3aGljaCBpcyBhbGxvY2F0ZWQgYXMgbmVlZGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkpLgotICAgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIHNldmVyYWwgc3VjaCBzdHJ1Y3R1cmVzLCByZXByZXNlbnRpbmcgbXVsdGlwbGUKLSAgICogY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBwcm9jZXNzZXMsIGluIGV4aXN0ZW5jZSBhdCBvbmNlLiAgV2UgcmVmZXIKLSAgICogdG8gYW55IG9uZSBzdHJ1Y3QgKGFuZCBpdHMgYXNzb2NpYXRlZCB3b3JraW5nIGRhdGEpIGFzIGEgIkpQRUcgb2JqZWN0Ii4KLSAgICovCi0gIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAgLyogVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBhIEpQRUcgZXJyb3IgaGFuZGxlci4gIEl0IGlzIGRlY2xhcmVkIHNlcGFyYXRlbHkKLSAgICogYmVjYXVzZSBhcHBsaWNhdGlvbnMgb2Z0ZW4gd2FudCB0byBzdXBwbHkgYSBzcGVjaWFsaXplZCBlcnJvciBoYW5kbGVyCi0gICAqIChzZWUgdGhlIHNlY29uZCBoYWxmIG9mIHRoaXMgZmlsZSBmb3IgYW4gZXhhbXBsZSkuICBCdXQgaGVyZSB3ZSBqdXN0Ci0gICAqIHRha2UgdGhlIGVhc3kgd2F5IG91dCBhbmQgdXNlIHRoZSBzdGFuZGFyZCBlcnJvciBoYW5kbGVyLCB3aGljaCB3aWxsCi0gICAqIHByaW50IGEgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGNhbGwgZXhpdCgpIGlmIGNvbXByZXNzaW9uIGZhaWxzLgotICAgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3QgbXVzdCBsaXZlIGFzIGxvbmcgYXMgdGhlIG1haW4gSlBFRyBwYXJhbWV0ZXIKLSAgICogc3RydWN0LCB0byBhdm9pZCBkYW5nbGluZy1wb2ludGVyIHByb2JsZW1zLgotICAgKi8KLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0gIC8qIE1vcmUgc3R1ZmYgKi8KLSAgRklMRSAqIG91dGZpbGU7CQkvKiB0YXJnZXQgZmlsZSAqLwotICBKU0FNUFJPVyByb3dfcG9pbnRlclsxXTsJLyogcG9pbnRlciB0byBKU0FNUExFIHJvd1tzXSAqLwotICBpbnQgcm93X3N0cmlkZTsJCS8qIHBoeXNpY2FsIHJvdyB3aWR0aCBpbiBpbWFnZSBidWZmZXIgKi8KLQotICAvKiBTdGVwIDE6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0ICovCi0KLSAgLyogV2UgaGF2ZSB0byBzZXQgdXAgdGhlIGVycm9yIGhhbmRsZXIgZmlyc3QsIGluIGNhc2UgdGhlIGluaXRpYWxpemF0aW9uCi0gICAqIHN0ZXAgZmFpbHMuICAoVW5saWtlbHksIGJ1dCBpdCBjb3VsZCBoYXBwZW4gaWYgeW91IGFyZSBvdXQgb2YgbWVtb3J5LikKLSAgICogVGhpcyByb3V0aW5lIGZpbGxzIGluIHRoZSBjb250ZW50cyBvZiBzdHJ1Y3QgamVyciwgYW5kIHJldHVybnMgamVycidzCi0gICAqIGFkZHJlc3Mgd2hpY2ggd2UgcGxhY2UgaW50byB0aGUgbGluayBmaWVsZCBpbiBjaW5mby4KLSAgICovCi0gIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLSAgLyogTm93IHdlIGNhbiBpbml0aWFsaXplIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4gKi8KLSAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBTdGVwIDI6IHNwZWNpZnkgZGF0YSBkZXN0aW5hdGlvbiAoZWcsIGEgZmlsZSkgKi8KLSAgLyogTm90ZTogc3RlcHMgMiBhbmQgMyBjYW4gYmUgZG9uZSBpbiBlaXRoZXIgb3JkZXIuICovCi0KLSAgLyogSGVyZSB3ZSB1c2UgdGhlIGxpYnJhcnktc3VwcGxpZWQgY29kZSB0byBzZW5kIGNvbXByZXNzZWQgZGF0YSB0byBhCi0gICAqIHN0ZGlvIHN0cmVhbS4gIFlvdSBjYW4gYWxzbyB3cml0ZSB5b3VyIG93biBjb2RlIHRvIGRvIHNvbWV0aGluZyBlbHNlLgotICAgKiBWRVJZIElNUE9SVEFOVDogdXNlICJiIiBvcHRpb24gdG8gZm9wZW4oKSBpZiB5b3UgYXJlIG9uIGEgbWFjaGluZSB0aGF0Ci0gICAqIHJlcXVpcmVzIGl0IGluIG9yZGVyIHRvIHdyaXRlIGJpbmFyeSBmaWxlcy4KLSAgICovCi0gIGlmICgob3V0ZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAganBlZ19zdGRpb19kZXN0KCZjaW5mbywgb3V0ZmlsZSk7Ci0KLSAgLyogU3RlcCAzOiBzZXQgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npb24gKi8KLQotICAvKiBGaXJzdCB3ZSBzdXBwbHkgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgaW1hZ2UuCi0gICAqIEZvdXIgZmllbGRzIG9mIHRoZSBjaW5mbyBzdHJ1Y3QgbXVzdCBiZSBmaWxsZWQgaW46Ci0gICAqLwotICBjaW5mby5pbWFnZV93aWR0aCA9IGltYWdlX3dpZHRoOyAJLyogaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCwgaW4gcGl4ZWxzICovCi0gIGNpbmZvLmltYWdlX2hlaWdodCA9IGltYWdlX2hlaWdodDsKLSAgY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgcGVyIHBpeGVsICovCi0gIGNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgCS8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KLSAgLyogTm93IHVzZSB0aGUgbGlicmFyeSdzIHJvdXRpbmUgdG8gc2V0IGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycy4KLSAgICogKFlvdSBtdXN0IHNldCBhdCBsZWFzdCBjaW5mby5pbl9jb2xvcl9zcGFjZSBiZWZvcmUgY2FsbGluZyB0aGlzLAotICAgKiBzaW5jZSB0aGUgZGVmYXVsdHMgZGVwZW5kIG9uIHRoZSBzb3VyY2UgY29sb3Igc3BhY2UuKQotICAgKi8KLSAganBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLSAgLyogTm93IHlvdSBjYW4gc2V0IGFueSBub24tZGVmYXVsdCBwYXJhbWV0ZXJzIHlvdSB3aXNoIHRvLgotICAgKiBIZXJlIHdlIGp1c3QgaWxsdXN0cmF0ZSB0aGUgdXNlIG9mIHF1YWxpdHkgKHF1YW50aXphdGlvbiB0YWJsZSkgc2NhbGluZzoKLSAgICovCi0gIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBxdWFsaXR5LCBUUlVFIC8qIGxpbWl0IHRvIGJhc2VsaW5lLUpQRUcgdmFsdWVzICovKTsKLQotICAvKiBTdGVwIDQ6IFN0YXJ0IGNvbXByZXNzb3IgKi8KLQotICAvKiBUUlVFIGVuc3VyZXMgdGhhdCB3ZSB3aWxsIHdyaXRlIGEgY29tcGxldGUgaW50ZXJjaGFuZ2UtSlBFRyBmaWxlLgotICAgKiBQYXNzIFRSVUUgdW5sZXNzIHlvdSBhcmUgdmVyeSBzdXJlIG9mIHdoYXQgeW91J3JlIGRvaW5nLgotICAgKi8KLSAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOwotCi0gIC8qIFN0ZXAgNTogd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pICovCi0gIC8qICAgICAgICAgICBqcGVnX3dyaXRlX3NjYW5saW5lcyguLi4pOyAqLwotCi0gIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5J3Mgc3RhdGUgdmFyaWFibGUgY2luZm8ubmV4dF9zY2FubGluZSBhcyB0aGUKLSAgICogbG9vcCBjb3VudGVyLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8ga2VlcCB0cmFjayBvdXJzZWx2ZXMuCi0gICAqIFRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgd2UgcGFzcyBvbmUgc2NhbmxpbmUgcGVyIGNhbGw7IHlvdSBjYW4gcGFzcwotICAgKiBtb3JlIGlmIHlvdSB3aXNoLCB0aG91Z2guCi0gICAqLwotICByb3dfc3RyaWRlID0gaW1hZ2Vfd2lkdGggKiAzOwkvKiBKU0FNUExFcyBwZXIgcm93IGluIGltYWdlX2J1ZmZlciAqLwotCi0gIHdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7Ci0gICAgLyoganBlZ193cml0ZV9zY2FubGluZXMgZXhwZWN0cyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMuCi0gICAgICogSGVyZSB0aGUgYXJyYXkgaXMgb25seSBvbmUgZWxlbWVudCBsb25nLCBidXQgeW91IGNvdWxkIHBhc3MKLSAgICAgKiBtb3JlIHRoYW4gb25lIHNjYW5saW5lIGF0IGEgdGltZSBpZiB0aGF0J3MgbW9yZSBjb252ZW5pZW50LgotICAgICAqLwotICAgIHJvd19wb2ludGVyWzBdID0gJiBpbWFnZV9idWZmZXJbY2luZm8ubmV4dF9zY2FubGluZSAqIHJvd19zdHJpZGVdOwotICAgICh2b2lkKSBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd19wb2ludGVyLCAxKTsKLSAgfQotCi0gIC8qIFN0ZXAgNjogRmluaXNoIGNvbXByZXNzaW9uICovCi0KLSAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKLSAgLyogQWZ0ZXIgZmluaXNoX2NvbXByZXNzLCB3ZSBjYW4gY2xvc2UgdGhlIG91dHB1dCBmaWxlLiAqLwotICBmY2xvc2Uob3V0ZmlsZSk7Ci0KLSAgLyogU3RlcCA3OiByZWxlYXNlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0ICovCi0KLSAgLyogVGhpcyBpcyBhbiBpbXBvcnRhbnQgc3RlcCBzaW5jZSBpdCB3aWxsIHJlbGVhc2UgYSBnb29kIGRlYWwgb2YgbWVtb3J5LiAqLwotICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKLQotICAvKiBBbmQgd2UncmUgZG9uZSEgKi8KLX0KLQotCi0vKgotICogU09NRSBGSU5FIFBPSU5UUzoKLSAqCi0gKiBJbiB0aGUgYWJvdmUgbG9vcCwgd2UgaWdub3JlZCB0aGUgcmV0dXJuIHZhbHVlIG9mIGpwZWdfd3JpdGVfc2NhbmxpbmVzLAotICogd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzY2FubGluZXMgYWN0dWFsbHkgd3JpdHRlbi4gIFdlIGNvdWxkIGdldCBhd2F5Ci0gKiB3aXRoIHRoaXMgYmVjYXVzZSB3ZSB3ZXJlIG9ubHkgcmVseWluZyBvbiB0aGUgdmFsdWUgb2YgY2luZm8ubmV4dF9zY2FubGluZSwKLSAqIHdoaWNoIHdpbGwgYmUgaW5jcmVtZW50ZWQgY29ycmVjdGx5LiAgSWYgeW91IG1haW50YWluIGFkZGl0aW9uYWwgbG9vcAotICogdmFyaWFibGVzIHRoZW4geW91IHNob3VsZCBiZSBjYXJlZnVsIHRvIGluY3JlbWVudCB0aGVtIHByb3Blcmx5LgotICogQWN0dWFsbHksIGZvciBvdXRwdXQgdG8gYSBzdGRpbyBzdHJlYW0geW91IG5lZWRuJ3Qgd29ycnksIGJlY2F1c2UKLSAqIHRoZW4ganBlZ193cml0ZV9zY2FubGluZXMgd2lsbCB3cml0ZSBhbGwgdGhlIGxpbmVzIHBhc3NlZCAob3IgZWxzZSBleGl0Ci0gKiB3aXRoIGEgZmF0YWwgZXJyb3IpLiAgUGFydGlhbCB3cml0ZXMgY2FuIG9ubHkgb2NjdXIgaWYgeW91IHVzZSBhIGRhdGEKLSAqIGRlc3RpbmF0aW9uIG1vZHVsZSB0aGF0IGNhbiBkZW1hbmQgc3VzcGVuc2lvbiBvZiB0aGUgY29tcHJlc3Nvci4KLSAqIChJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoYXQncyBmb3IsIHlvdSBkb24ndCBuZWVkIGl0LikKLSAqCi0gKiBJZiB0aGUgY29tcHJlc3NvciByZXF1aXJlcyBmdWxsLWltYWdlIGJ1ZmZlcnMgKGZvciBlbnRyb3B5LWNvZGluZwotICogb3B0aW1pemF0aW9uIG9yIGEgbXVsdGktc2NhbiBKUEVHIGZpbGUpLCBpdCB3aWxsIGNyZWF0ZSB0ZW1wb3JhcnkKLSAqIGZpbGVzIGZvciBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgZml0IHdpdGhpbiB0aGUgbWF4aW11bS1tZW1vcnkgc2V0dGluZy4KLSAqIChOb3RlIHRoYXQgdGVtcCBmaWxlcyBhcmUgTk9UIG5lZWRlZCBpZiB5b3UgdXNlIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuKQotICogT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byBzZXQgdXAgYSBzaWduYWwgaGFuZGxlciB0byBlbnN1cmUgdGhhdAotICogdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkIGlmIHRoZSBwcm9ncmFtIGlzIGludGVycnVwdGVkLiAgU2VlIGxpYmpwZWcuZG9jLgotICoKLSAqIFNjYW5saW5lcyBNVVNUIGJlIHN1cHBsaWVkIGluIHRvcC10by1ib3R0b20gb3JkZXIgaWYgeW91IHdhbnQgeW91ciBKUEVHCi0gKiBmaWxlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggZXZlcnlvbmUgZWxzZSdzLiAgSWYgeW91IGNhbm5vdCByZWFkaWx5IHJlYWQKLSAqIHlvdXIgZGF0YSBpbiB0aGF0IG9yZGVyLCB5b3UnbGwgbmVlZCBhbiBpbnRlcm1lZGlhdGUgYXJyYXkgdG8gaG9sZCB0aGUKLSAqIGltYWdlLiAgU2VlIHJkdGFyZ2EuYyBvciByZGJtcC5jIGZvciBleGFtcGxlcyBvZiBoYW5kbGluZyBib3R0b20tdG8tdG9wCi0gKiBzb3VyY2UgZGF0YSB1c2luZyB0aGUgSlBFRyBjb2RlJ3MgaW50ZXJuYWwgdmlydHVhbC1hcnJheSBtZWNoYW5pc21zLgotICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKiogSlBFRyBERUNPTVBSRVNTSU9OIFNBTVBMRSBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBoYWxmIG9mIHRoZSBleGFtcGxlIHNob3dzIGhvdyB0byByZWFkIGRhdGEgZnJvbSB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKiBJdCdzIGEgYml0IG1vcmUgcmVmaW5lZCB0aGFuIHRoZSBhYm92ZSwgaW4gdGhhdCB3ZSBzaG93OgotICogICAoYSkgaG93IHRvIG1vZGlmeSB0aGUgSlBFRyBsaWJyYXJ5J3Mgc3RhbmRhcmQgZXJyb3ItcmVwb3J0aW5nIGJlaGF2aW9yOwotICogICAoYikgaG93IHRvIGFsbG9jYXRlIHdvcmtzcGFjZSB1c2luZyB0aGUgbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyLgotICoKLSAqIEp1c3QgdG8gbWFrZSB0aGlzIGV4YW1wbGUgYSBsaXR0bGUgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgd2UnbGwKLSAqIGFzc3VtZSB0aGF0IHdlIGRvIG5vdCBpbnRlbmQgdG8gcHV0IHRoZSB3aG9sZSBpbWFnZSBpbnRvIGFuIGluLW1lbW9yeQotICogYnVmZmVyLCBidXQgdG8gc2VuZCBpdCBsaW5lLWJ5LWxpbmUgc29tZXBsYWNlIGVsc2UuICBXZSBuZWVkIGEgb25lLQotICogc2NhbmxpbmUtaGlnaCBKU0FNUExFIGFycmF5IGFzIGEgd29yayBidWZmZXIsIGFuZCB3ZSB3aWxsIGxldCB0aGUgSlBFRwotICogbWVtb3J5IG1hbmFnZXIgYWxsb2NhdGUgaXQgZm9yIHVzLiAgVGhpcyBhcHByb2FjaCBpcyBhY3R1YWxseSBxdWl0ZSB1c2VmdWwKLSAqIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byByZW1lbWJlciB0byBkZWFsbG9jYXRlIHRoZSBidWZmZXIgc2VwYXJhdGVseTogaXQKLSAqIHdpbGwgZ28gYXdheSBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIEpQRUcgb2JqZWN0IGlzIGNsZWFuZWQgdXAuCi0gKi8KLQotCi0vKgotICogRVJST1IgSEFORExJTkc6Ci0gKgotICogVGhlIEpQRUcgbGlicmFyeSdzIHN0YW5kYXJkIGVycm9yIGhhbmRsZXIgKGplcnJvci5jKSBpcyBkaXZpZGVkIGludG8KLSAqIHNldmVyYWwgIm1ldGhvZHMiIHdoaWNoIHlvdSBjYW4gb3ZlcnJpZGUgaW5kaXZpZHVhbGx5LiAgVGhpcyBsZXRzIHlvdQotICogYWRqdXN0IHRoZSBiZWhhdmlvciB3aXRob3V0IGR1cGxpY2F0aW5nIGEgbG90IG9mIGNvZGUsIHdoaWNoIHlvdSBtaWdodAotICogaGF2ZSB0byB1cGRhdGUgd2l0aCBlYWNoIGZ1dHVyZSByZWxlYXNlLgotICoKLSAqIE91ciBleGFtcGxlIGhlcmUgc2hvd3MgaG93IHRvIG92ZXJyaWRlIHRoZSAiZXJyb3JfZXhpdCIgbWV0aG9kIHNvIHRoYXQKLSAqIGNvbnRyb2wgaXMgcmV0dXJuZWQgdG8gdGhlIGxpYnJhcnkncyBjYWxsZXIgd2hlbiBhIGZhdGFsIGVycm9yIG9jY3VycywKLSAqIHJhdGhlciB0aGFuIGNhbGxpbmcgZXhpdCgpIGFzIHRoZSBzdGFuZGFyZCBlcnJvcl9leGl0IG1ldGhvZCBkb2VzLgotICoKLSAqIFdlIHVzZSBDJ3Mgc2V0am1wL2xvbmdqbXAgZmFjaWxpdHkgdG8gcmV0dXJuIGNvbnRyb2wuICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gKiByb3V0aW5lIHdoaWNoIGNhbGxzIHRoZSBKUEVHIGxpYnJhcnkgbXVzdCBmaXJzdCBleGVjdXRlIGEgc2V0am1wKCkgY2FsbCB0bwotICogZXN0YWJsaXNoIHRoZSByZXR1cm4gcG9pbnQuICBXZSB3YW50IHRoZSByZXBsYWNlbWVudCBlcnJvcl9leGl0IHRvIGRvIGEKLSAqIGxvbmdqbXAoKS4gIEJ1dCB3ZSBuZWVkIHRvIG1ha2UgdGhlIHNldGptcCBidWZmZXIgYWNjZXNzaWJsZSB0byB0aGUKLSAqIGVycm9yX2V4aXQgcm91dGluZS4gIFRvIGRvIHRoaXMsIHdlIG1ha2UgYSBwcml2YXRlIGV4dGVuc2lvbiBvZiB0aGUKLSAqIHN0YW5kYXJkIEpQRUcgZXJyb3IgaGFuZGxlciBvYmplY3QuICAoSWYgd2Ugd2VyZSB1c2luZyBDKyssIHdlJ2Qgc2F5IHdlCi0gKiB3ZXJlIG1ha2luZyBhIHN1YmNsYXNzIG9mIHRoZSByZWd1bGFyIGVycm9yIGhhbmRsZXIuKQotICoKLSAqIEhlcmUncyB0aGUgZXh0ZW5kZWQgZXJyb3IgaGFuZGxlciBzdHJ1Y3Q6Ci0gKi8KLQotc3RydWN0IG15X2Vycm9yX21nciB7Ci0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciBwdWI7CS8qICJwdWJsaWMiIGZpZWxkcyAqLwotCi0gIGptcF9idWYgc2V0am1wX2J1ZmZlcjsJLyogZm9yIHJldHVybiB0byBjYWxsZXIgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IG15X2Vycm9yX21nciAqIG15X2Vycm9yX3B0cjsKLQotLyoKLSAqIEhlcmUncyB0aGUgcm91dGluZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3RhbmRhcmQgZXJyb3JfZXhpdCBtZXRob2Q6Ci0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1teV9lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIGNpbmZvLT5lcnIgcmVhbGx5IHBvaW50cyB0byBhIG15X2Vycm9yX21nciBzdHJ1Y3QsIHNvIGNvZXJjZSBwb2ludGVyICovCi0gIG15X2Vycm9yX3B0ciBteWVyciA9IChteV9lcnJvcl9wdHIpIGNpbmZvLT5lcnI7Ci0KLSAgLyogQWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UuICovCi0gIC8qIFdlIGNvdWxkIHBvc3Rwb25lIHRoaXMgdW50aWwgYWZ0ZXIgcmV0dXJuaW5nLCBpZiB3ZSBjaG9zZS4gKi8KLSAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKLQotICAvKiBSZXR1cm4gY29udHJvbCB0byB0aGUgc2V0am1wIHBvaW50ICovCi0gIGxvbmdqbXAobXllcnItPnNldGptcF9idWZmZXIsIDEpOwotfQotCi0KLS8qCi0gKiBTYW1wbGUgcm91dGluZSBmb3IgSlBFRyBkZWNvbXByZXNzaW9uLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSBmaWxlIG5hbWUKLSAqIGlzIHBhc3NlZCBpbi4gIFdlIHdhbnQgdG8gcmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiBlcnJvci4KLSAqLwotCi0KLUdMT0JBTChpbnQpCi1yZWFkX0pQRUdfZmlsZSAoY2hhciAqIGZpbGVuYW1lKQotewotICAvKiBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHBvaW50ZXJzIHRvCi0gICAqIHdvcmtpbmcgc3BhY2UgKHdoaWNoIGlzIGFsbG9jYXRlZCBhcyBuZWVkZWQgYnkgdGhlIEpQRUcgbGlicmFyeSkuCi0gICAqLwotICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAgLyogV2UgdXNlIG91ciBwcml2YXRlIGV4dGVuc2lvbiBKUEVHIGVycm9yIGhhbmRsZXIuCi0gICAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdCBtdXN0IGxpdmUgYXMgbG9uZyBhcyB0aGUgbWFpbiBKUEVHIHBhcmFtZXRlcgotICAgKiBzdHJ1Y3QsIHRvIGF2b2lkIGRhbmdsaW5nLXBvaW50ZXIgcHJvYmxlbXMuCi0gICAqLwotICBzdHJ1Y3QgbXlfZXJyb3JfbWdyIGplcnI7Ci0gIC8qIE1vcmUgc3R1ZmYgKi8KLSAgRklMRSAqIGluZmlsZTsJCS8qIHNvdXJjZSBmaWxlICovCi0gIEpTQU1QQVJSQVkgYnVmZmVyOwkJLyogT3V0cHV0IHJvdyBidWZmZXIgKi8KLSAgaW50IHJvd19zdHJpZGU7CQkvKiBwaHlzaWNhbCByb3cgd2lkdGggaW4gb3V0cHV0IGJ1ZmZlciAqLwotCi0gIC8qIEluIHRoaXMgZXhhbXBsZSB3ZSB3YW50IHRvIG9wZW4gdGhlIGlucHV0IGZpbGUgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UsCi0gICAqIHNvIHRoYXQgdGhlIHNldGptcCgpIGVycm9yIHJlY292ZXJ5IGJlbG93IGNhbiBhc3N1bWUgdGhlIGZpbGUgaXMgb3Blbi4KLSAgICogVkVSWSBJTVBPUlRBTlQ6IHVzZSAiYiIgb3B0aW9uIHRvIGZvcGVuKCkgaWYgeW91IGFyZSBvbiBhIG1hY2hpbmUgdGhhdAotICAgKiByZXF1aXJlcyBpdCBpbiBvcmRlciB0byByZWFkIGJpbmFyeSBmaWxlcy4KLSAgICovCi0KLSAgaWYgKChpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIFN0ZXAgMTogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCAqLwotCi0gIC8qIFdlIHNldCB1cCB0aGUgbm9ybWFsIEpQRUcgZXJyb3Igcm91dGluZXMsIHRoZW4gb3ZlcnJpZGUgZXJyb3JfZXhpdC4gKi8KLSAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIucHViKTsKLSAgamVyci5wdWIuZXJyb3JfZXhpdCA9IG15X2Vycm9yX2V4aXQ7Ci0gIC8qIEVzdGFibGlzaCB0aGUgc2V0am1wIHJldHVybiBjb250ZXh0IGZvciBteV9lcnJvcl9leGl0IHRvIHVzZS4gKi8KLSAgaWYgKHNldGptcChqZXJyLnNldGptcF9idWZmZXIpKSB7Ci0gICAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZSBKUEVHIGNvZGUgaGFzIHNpZ25hbGVkIGFuIGVycm9yLgotICAgICAqIFdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIEpQRUcgb2JqZWN0LCBjbG9zZSB0aGUgaW5wdXQgZmlsZSwgYW5kIHJldHVybi4KLSAgICAgKi8KLSAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgIGZjbG9zZShpbmZpbGUpOwotICAgIHJldHVybiAwOwotICB9Ci0gIC8qIE5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdC4gKi8KLSAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOwotCi0gIC8qIFN0ZXAgMjogc3BlY2lmeSBkYXRhIHNvdXJjZSAoZWcsIGEgZmlsZSkgKi8KLQotICBqcGVnX3N0ZGlvX3NyYygmY2luZm8sIGluZmlsZSk7Ci0KLSAgLyogU3RlcCAzOiByZWFkIGZpbGUgcGFyYW1ldGVycyB3aXRoIGpwZWdfcmVhZF9oZWFkZXIoKSAqLwotCi0gICh2b2lkKSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0gIC8qIFdlIGNhbiBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGpwZWdfcmVhZF9oZWFkZXIgc2luY2UKLSAgICogICAoYSkgc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUgd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UsIGFuZAotICAgKiAgIChiKSB3ZSBwYXNzZWQgVFJVRSB0byByZWplY3QgYSB0YWJsZXMtb25seSBKUEVHIGZpbGUgYXMgYW4gZXJyb3IuCi0gICAqIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBpbmZvLgotICAgKi8KLQotICAvKiBTdGVwIDQ6IHNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uICovCi0KLSAgLyogSW4gdGhpcyBleGFtcGxlLCB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBhbnkgb2YgdGhlIGRlZmF1bHRzIHNldCBieQotICAgKiBqcGVnX3JlYWRfaGVhZGVyKCksIHNvIHdlIGRvIG5vdGhpbmcgaGVyZS4KLSAgICovCi0KLSAgLyogU3RlcCA1OiBTdGFydCBkZWNvbXByZXNzb3IgKi8KLQotICAodm9pZCkganBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIFdlIGNhbiBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBzaW5jZSBzdXNwZW5zaW9uIGlzIG5vdCBwb3NzaWJsZQotICAgKiB3aXRoIHRoZSBzdGRpbyBkYXRhIHNvdXJjZS4KLSAgICovCi0KLSAgLyogV2UgbWF5IG5lZWQgdG8gZG8gc29tZSBzZXR1cCBvZiBvdXIgb3duIGF0IHRoaXMgcG9pbnQgYmVmb3JlIHJlYWRpbmcKLSAgICogdGhlIGRhdGEuICBBZnRlciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB3ZSBoYXZlIHRoZSBjb3JyZWN0IHNjYWxlZAotICAgKiBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhdmFpbGFibGUsIGFzIHdlbGwgYXMgdGhlIG91dHB1dCBjb2xvcm1hcAotICAgKiBpZiB3ZSBhc2tlZCBmb3IgY29sb3IgcXVhbnRpemF0aW9uLgotICAgKiBJbiB0aGlzIGV4YW1wbGUsIHdlIG5lZWQgdG8gbWFrZSBhbiBvdXRwdXQgd29yayBidWZmZXIgb2YgdGhlIHJpZ2h0IHNpemUuCi0gICAqLyAKLSAgLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBvdXRwdXQgYnVmZmVyICovCi0gIHJvd19zdHJpZGUgPSBjaW5mby5vdXRwdXRfd2lkdGggKiBjaW5mby5vdXRwdXRfY29tcG9uZW50czsKLSAgLyogTWFrZSBhIG9uZS1yb3ctaGlnaCBzYW1wbGUgYXJyYXkgdGhhdCB3aWxsIGdvIGF3YXkgd2hlbiBkb25lIHdpdGggaW1hZ2UgKi8KLSAgYnVmZmVyID0gKCpjaW5mby5tZW0tPmFsbG9jX3NhcnJheSkKLQkJKChqX2NvbW1vbl9wdHIpICZjaW5mbywgSlBPT0xfSU1BR0UsIHJvd19zdHJpZGUsIDEpOwotCi0gIC8qIFN0ZXAgNjogd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHJlYWQpICovCi0gIC8qICAgICAgICAgICBqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7ICovCi0KLSAgLyogSGVyZSB3ZSB1c2UgdGhlIGxpYnJhcnkncyBzdGF0ZSB2YXJpYWJsZSBjaW5mby5vdXRwdXRfc2NhbmxpbmUgYXMgdGhlCi0gICAqIGxvb3AgY291bnRlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgdHJhY2sgb3Vyc2VsdmVzLgotICAgKi8KLSAgd2hpbGUgKGNpbmZvLm91dHB1dF9zY2FubGluZSA8IGNpbmZvLm91dHB1dF9oZWlnaHQpIHsKLSAgICAvKiBqcGVnX3JlYWRfc2NhbmxpbmVzIGV4cGVjdHMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2NhbmxpbmVzLgotICAgICAqIEhlcmUgdGhlIGFycmF5IGlzIG9ubHkgb25lIGVsZW1lbnQgbG9uZywgYnV0IHlvdSBjb3VsZCBhc2sgZm9yCi0gICAgICogbW9yZSB0aGFuIG9uZSBzY2FubGluZSBhdCBhIHRpbWUgaWYgdGhhdCdzIG1vcmUgY29udmVuaWVudC4KLSAgICAgKi8KLSAgICAodm9pZCkganBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sIGJ1ZmZlciwgMSk7Ci0gICAgLyogQXNzdW1lIHB1dF9zY2FubGluZV9zb21lcGxhY2Ugd2FudHMgYSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnQuICovCi0gICAgcHV0X3NjYW5saW5lX3NvbWVwbGFjZShidWZmZXJbMF0sIHJvd19zdHJpZGUpOwotICB9Ci0KLSAgLyogU3RlcCA3OiBGaW5pc2ggZGVjb21wcmVzc2lvbiAqLwotCi0gICh2b2lkKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gIC8qIFdlIGNhbiBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBzaW5jZSBzdXNwZW5zaW9uIGlzIG5vdCBwb3NzaWJsZQotICAgKiB3aXRoIHRoZSBzdGRpbyBkYXRhIHNvdXJjZS4KLSAgICovCi0KLSAgLyogU3RlcCA4OiBSZWxlYXNlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KLQotICAvKiBUaGlzIGlzIGFuIGltcG9ydGFudCBzdGVwIHNpbmNlIGl0IHdpbGwgcmVsZWFzZSBhIGdvb2QgZGVhbCBvZiBtZW1vcnkuICovCi0gIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0KLSAgLyogQWZ0ZXIgZmluaXNoX2RlY29tcHJlc3MsIHdlIGNhbiBjbG9zZSB0aGUgaW5wdXQgZmlsZS4KLSAgICogSGVyZSB3ZSBwb3N0cG9uZSBpdCB1bnRpbCBhZnRlciBubyBtb3JlIEpQRUcgZXJyb3JzIGFyZSBwb3NzaWJsZSwKLSAgICogc28gYXMgdG8gc2ltcGxpZnkgdGhlIHNldGptcCBlcnJvciBsb2dpYyBhYm92ZS4gIChBY3R1YWxseSwgSSBkb24ndAotICAgKiB0aGluayB0aGF0IGpwZWdfZGVzdHJveSBjYW4gZG8gYW4gZXJyb3IgZXhpdCwgYnV0IHdoeSBhc3N1bWUgYW55dGhpbmcuLi4pCi0gICAqLwotICBmY2xvc2UoaW5maWxlKTsKLQotICAvKiBBdCB0aGlzIHBvaW50IHlvdSBtYXkgd2FudCB0byBjaGVjayB0byBzZWUgd2hldGhlciBhbnkgY29ycnVwdC1kYXRhCi0gICAqIHdhcm5pbmdzIG9jY3VycmVkICh0ZXN0IHdoZXRoZXIgamVyci5wdWIubnVtX3dhcm5pbmdzIGlzIG5vbnplcm8pLgotICAgKi8KLQotICAvKiBBbmQgd2UncmUgZG9uZSEgKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIFNPTUUgRklORSBQT0lOVFM6Ci0gKgotICogSW4gdGhlIGFib3ZlIGNvZGUsIHdlIGlnbm9yZWQgdGhlIHJldHVybiB2YWx1ZSBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzLAotICogd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzY2FubGluZXMgYWN0dWFsbHkgcmVhZC4gIFdlIGNvdWxkIGdldCBhd2F5IHdpdGgKLSAqIHRoaXMgYmVjYXVzZSB3ZSBhc2tlZCBmb3Igb25seSBvbmUgbGluZSBhdCBhIHRpbWUgYW5kIHdlIHdlcmVuJ3QgdXNpbmcKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBpbmZvLgotICoKLSAqIFdlIGNoZWF0ZWQgYSBiaXQgYnkgY2FsbGluZyBhbGxvY19zYXJyYXkoKSBhZnRlciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKTsKLSAqIHdlIHNob3VsZCBoYXZlIGRvbmUgaXQgYmVmb3JlaGFuZCB0byBlbnN1cmUgdGhhdCB0aGUgc3BhY2Ugd291bGQgYmUKLSAqIGNvdW50ZWQgYWdhaW5zdCB0aGUgSlBFRyBtYXhfbWVtb3J5IHNldHRpbmcuICBJbiBzb21lIHN5c3RlbXMgdGhlIGFib3ZlCi0gKiBjb2RlIHdvdWxkIHJpc2sgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci4gIEhvd2V2ZXIsIGluIGdlbmVyYWwgd2UgZG9uJ3QKLSAqIGtub3cgdGhlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGJlZm9yZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSwgdW5sZXNzIHdlCi0gKiBjYWxsIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpLiAgU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGFib3V0IHRoaXMuCi0gKgotICogU2NhbmxpbmVzIGFyZSByZXR1cm5lZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhciBpbiB0aGUgSlBFRyBmaWxlLAotICogd2hpY2ggaXMgc3RhbmRhcmRseSB0b3AtdG8tYm90dG9tLiAgSWYgeW91IG11c3QgZW1pdCBkYXRhIGJvdHRvbS10by10b3AsCi0gKiB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIHZpcnR1YWwgYXJyYXlzIHByb3ZpZGVkIGJ5IHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyCi0gKiB0byBpbnZlcnQgdGhlIGRhdGEuICBTZWUgd3JibXAuYyBmb3IgYW4gZXhhbXBsZS4KLSAqCi0gKiBBcyB3aXRoIGNvbXByZXNzaW9uLCBzb21lIG9wZXJhdGluZyBtb2RlcyBtYXkgcmVxdWlyZSB0ZW1wb3JhcnkgZmlsZXMuCi0gKiBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHNldCB1cCBhIHNpZ25hbCBoYW5kbGVyIHRvIGVuc3VyZSB0aGF0Ci0gKiB0ZW1wb3JhcnkgZmlsZXMgYXJlIGRlbGV0ZWQgaWYgdGhlIHByb2dyYW0gaXMgaW50ZXJydXB0ZWQuICBTZWUgbGlianBlZy5kb2MuCi0gKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ZpbGVsaXN0LmRvYyBiL2xpYmpwZWd0d3JwL2ZpbGVsaXN0LmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0OTgyYy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9maWxlbGlzdC5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotSUpHIEpQRUcgTElCUkFSWTogIEZJTEUgTElTVAotCi1Db3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotCi0KLUhlcmUgaXMgYSByb2FkIG1hcCB0byB0aGUgZmlsZXMgaW4gdGhlIElKRyBKUEVHIGRpc3RyaWJ1dGlvbi4gIFRoZQotZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHRoZSBKUEVHIGxpYnJhcnkgcHJvcGVyLCBwbHVzIHR3byBhcHBsaWNhdGlvbgotcHJvZ3JhbXMgKCJjanBlZyIgYW5kICJkanBlZyIpIHdoaWNoIHVzZSB0aGUgbGlicmFyeSB0byBjb252ZXJ0IEpQRUcKLWZpbGVzIHRvIGFuZCBmcm9tIHNvbWUgb3RoZXIgcG9wdWxhciBpbWFnZSBmb3JtYXRzLiAgQSB0aGlyZCBhcHBsaWNhdGlvbgotImpwZWd0cmFuIiB1c2VzIHRoZSBsaWJyYXJ5IHRvIGRvIGxvc3NsZXNzIGNvbnZlcnNpb24gYmV0d2VlbiBkaWZmZXJlbnQKLXZhcmlhbnRzIG9mIEpQRUcuICBUaGVyZSBhcmUgYWxzbyB0d28gc3RhbmQtYWxvbmUgYXBwbGljYXRpb25zLAotInJkanBnY29tIiBhbmQgIndyanBnY29tIi4KLQotCi1USEUgSlBFRyBMSUJSQVJZCi09PT09PT09PT09PT09PT09Ci0KLUluY2x1ZGUgZmlsZXM6Ci0KLWpwZWdsaWIuaAlKUEVHIGxpYnJhcnkncyBleHBvcnRlZCBkYXRhIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi1qY29uZmlnLmgJQ29uZmlndXJhdGlvbiBkZWNsYXJhdGlvbnMuICBOb3RlOiB0aGlzIGZpbGUgaXMgbm90IHByZXNlbnQKLQkJaW4gdGhlIGRpc3RyaWJ1dGlvbjsgaXQgaXMgZ2VuZXJhdGVkIGR1cmluZyBpbnN0YWxsYXRpb24uCi1qbW9yZWNmZy5oCUFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBkZWNsYXJhdGlvbnM7IG5lZWQgbm90IGJlIGNoYW5nZWQKLQkJZm9yIGEgc3RhbmRhcmQgaW5zdGFsbGF0aW9uLgotamVycm9yLmgJRGVjbGFyZXMgSlBFRyBsaWJyYXJ5J3MgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2UgY29kZXMuCi1qaW5jbHVkZS5oCUNlbnRyYWwgaW5jbHVkZSBmaWxlIHVzZWQgYnkgYWxsIElKRyAuYyBmaWxlcyB0byByZWZlcmVuY2UKLQkJc3lzdGVtIGluY2x1ZGUgZmlsZXMuCi1qcGVnaW50LmgJSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotamNodWZmLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW5jb2RlciBtb2R1bGVzLgotamRodWZmLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZGVjb2RlciBtb2R1bGVzLgotamRjdC5oCQlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgZm9yd2FyZCAmIHJldmVyc2UgRENUIHN1YnN5c3RlbXMuCi1qbWVtc3lzLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4KLWp2ZXJzaW9uLmgJVmVyc2lvbiBpbmZvcm1hdGlvbi4KLQotQXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZCBpbmNsdWRlIGpwZWdsaWIuaCAod2hpY2ggaW4gdHVybgotaW5jbHVkZXMgamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oKS4gIE9wdGlvbmFsbHksIGplcnJvci5oIG1heSBiZSBpbmNsdWRlZAotaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZmVyZW5jZSBpbmRpdmlkdWFsIEpQRUcgZXJyb3IgY29kZXMuICBUaGUKLW90aGVyIGluY2x1ZGUgZmlsZXMgYXJlIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2UgYW5kIHdvdWxkIG5vdCBub3JtYWxseQotYmUgaW5jbHVkZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbS4gIChjanBlZy9kanBlZy9ldGMgZG8gdXNlIGppbmNsdWRlLmgsCi1zaW5jZSBpdHMgZnVuY3Rpb24gaXMgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eSBvZiB0aGUgd2hvbGUgSUpHIGRpc3RyaWJ1dGlvbi4KLU1vc3Qgb3RoZXIgYXBwbGljYXRpb25zIHdpbGwgZGlyZWN0bHkgaW5jbHVkZSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMgdGhleQotd2FudCwgYW5kIGhlbmNlIHdvbid0IG5lZWQgamluY2x1ZGUuaC4pCi0KLQotQyBzb3VyY2UgY29kZSBmaWxlczoKLQotVGhlc2UgZmlsZXMgY29udGFpbiBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5Ci1hbiBhcHBsaWNhdGlvbiBwcm9ncmFtOgotCi1qY2FwaW1pbi5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBjb3JlIHJvdXRpbmVzIGZvciBjb21wcmVzc2lvbi4KLWpjYXBpc3RkLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IHN0YW5kYXJkIGNvbXByZXNzaW9uLgotamRhcGltaW4uYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogY29yZSByb3V0aW5lcyBmb3IgZGVjb21wcmVzc2lvbi4KLWpkYXBpc3RkLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IHN0YW5kYXJkIGRlY29tcHJlc3Npb24uCi1qY29tYXBpLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2Ugcm91dGluZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uCi0JCWFuZCBkZWNvbXByZXNzaW9uLgotamNwYXJhbS5jCUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR0aW5nIGhlbHBlciByb3V0aW5lcy4KLWpjdHJhbnMuYwlBUEkgYW5kIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLgotamR0cmFucy5jCUFQSSBhbmQgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgZGVjb21wcmVzc2lvbi4KLQotQ29tcHJlc3Npb24gc2lkZSBvZiB0aGUgbGlicmFyeToKLQotamNpbml0LmMJSW5pdGlhbGl6YXRpb246IGRldGVybWluZXMgd2hpY2ggb3RoZXIgbW9kdWxlcyB0byB1c2UuCi1qY21hc3Rlci5jCU1hc3RlciBjb250cm9sOiBzZXR1cCBhbmQgaW50ZXItcGFzcyBzZXF1ZW5jaW5nIGxvZ2ljLgotamNtYWluY3QuYwlNYWluIGJ1ZmZlciBjb250cm9sbGVyIChwcmVwcm9jZXNzb3IgPT4gSlBFRyBjb21wcmVzc29yKS4KLWpjcHJlcGN0LmMJUHJlcHJvY2Vzc29yIGJ1ZmZlciBjb250cm9sbGVyLgotamNjb2VmY3QuYwlCdWZmZXIgY29udHJvbGxlciBmb3IgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4KLWpjY29sb3IuYwlDb2xvciBzcGFjZSBjb252ZXJzaW9uLgotamNzYW1wbGUuYwlEb3duc2FtcGxpbmcuCi1qY2RjdG1nci5jCURDVCBtYW5hZ2VyIChEQ1QgaW1wbGVtZW50YXRpb24gc2VsZWN0aW9uICYgY29udHJvbCkuCi1qZmRjdGludC5jCUZvcndhcmQgRENUIHVzaW5nIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgotamZkY3Rmc3QuYwlGb3J3YXJkIERDVCB1c2luZyBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCi1qZmRjdGZsdC5jCUZvcndhcmQgRENUIHVzaW5nIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCi1qY2h1ZmYuYwlIdWZmbWFuIGVudHJvcHkgY29kaW5nIGZvciBzZXF1ZW50aWFsIEpQRUcuCi1qY3BodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KLWpjbWFya2VyLmMJSlBFRyBtYXJrZXIgd3JpdGluZy4KLWpkYXRhZHN0LmMJRGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGZvciBzdGRpbyBvdXRwdXQuCi0KLURlY29tcHJlc3Npb24gc2lkZSBvZiB0aGUgbGlicmFyeToKLQotamRtYXN0ZXIuYwlNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB3aGljaCBvdGhlciBtb2R1bGVzIHRvIHVzZS4KLWpkaW5wdXQuYwlJbnB1dCBjb250cm9sbGVyOiBjb250cm9scyBpbnB1dCBwcm9jZXNzaW5nIG1vZHVsZXMuCi1qZG1haW5jdC5jCU1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKEpQRUcgZGVjb21wcmVzc29yID0+IHBvc3Rwcm9jZXNzb3IpLgotamRjb2VmY3QuYwlCdWZmZXIgY29udHJvbGxlciBmb3IgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4KLWpkcG9zdGN0LmMJUG9zdHByb2Nlc3NvciBidWZmZXIgY29udHJvbGxlci4KLWpkbWFya2VyLmMJSlBFRyBtYXJrZXIgcmVhZGluZy4KLWpkaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyBmb3Igc2VxdWVudGlhbCBKUEVHLgotamRwaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KLWpkZGN0bWdyLmMJSURDVCBtYW5hZ2VyIChJRENUIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiAmIGNvbnRyb2wpLgotamlkY3RpbnQuYwlJbnZlcnNlIERDVCB1c2luZyBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KLWppZGN0ZnN0LmMJSW52ZXJzZSBEQ1QgdXNpbmcgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgotamlkY3RmbHQuYwlJbnZlcnNlIERDVCB1c2luZyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgotamlkY3RyZWQuYwlJbnZlcnNlIERDVHMgd2l0aCByZWR1Y2VkLXNpemUgb3V0cHV0cy4KLWpkc2FtcGxlLmMJVXBzYW1wbGluZy4KLWpkY29sb3IuYwlDb2xvciBzcGFjZSBjb252ZXJzaW9uLgotamRtZXJnZS5jCU1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24gKGZhc3RlciwgbG93ZXIgcXVhbGl0eSkuCi1qcXVhbnQxLmMJT25lLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHVzaW5nIGEgZml4ZWQtc3BhY2luZyBjb2xvcm1hcC4KLWpxdWFudDIuYwlUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgYSBjdXN0b20tZ2VuZXJhdGVkIGNvbG9ybWFwLgotCQlBbHNvIGhhbmRsZXMgb25lLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsbHkgZ2l2ZW4gbWFwLgotamRhdGFzcmMuYwlEYXRhIHNvdXJjZSBtYW5hZ2VyIGZvciBzdGRpbyBpbnB1dC4KLQotU3VwcG9ydCBmaWxlcyBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbjoKLQotamVycm9yLmMJU3RhbmRhcmQgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgKGFwcGxpY2F0aW9uIHJlcGxhY2VhYmxlKS4KLWptZW1tZ3IuYwlTeXN0ZW0taW5kZXBlbmRlbnQgKG1vcmUgb3IgbGVzcykgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4KLWp1dGlscy5jCU1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcy4KLQotam1lbW1nci5jIHJlbGllcyBvbiBhIHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZW1lbnQgbW9kdWxlLiAgVGhlIElKRwotZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzeXN0ZW0tZGVwZW5kZW50Ci1tb2R1bGU6Ci0KLWptZW1ub2JzLmMJIk5vIGJhY2tpbmcgc3RvcmUiOiBhc3N1bWVzIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5IGV4aXN0cy4KLWptZW1hbnNpLmMJTWFrZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggQU5TSS1zdGFuZGFyZCByb3V0aW5lIHRtcGZpbGUoKS4KLWptZW1uYW1lLmMJTWFrZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggcHJvZ3JhbS1nZW5lcmF0ZWQgZmlsZSBuYW1lcy4KLWptZW1kb3MuYwlDdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIE1TLURPUyAoMTYtYml0IGVudmlyb25tZW50IG9ubHkpOgotCQljYW4gdXNlIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnkgYXMgd2VsbCBhcyB0ZW1wIGZpbGVzLgotam1lbW1hYy5jCUN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgQXBwbGUgTWFjaW50b3NoLgotCi1FeGFjdGx5IG9uZSBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBtb2R1bGVzIHNob3VsZCBiZSBjb25maWd1cmVkIGludG8gYW4KLWluc3RhbGxlZCBKUEVHIGxpYnJhcnkgKHNlZSBpbnN0YWxsLmRvYyBmb3IgaGludHMgYWJvdXQgd2hpY2ggb25lIHRvIHVzZSkuCi1PbiB1bnVzdWFsIHN5c3RlbXMgeW91IG1heSBmaW5kIGl0IHdvcnRod2hpbGUgdG8gbWFrZSBhIHNwZWNpYWwKLXN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZXIuCi0KLQotTm9uLUMgc291cmNlIGNvZGUgZmlsZXM6Ci0KLWptZW1kb3NhLmFzbQk4MHg4NiBhc3NlbWJseSBjb2RlIHN1cHBvcnQgZm9yIGptZW1kb3MuYzsgdXNlZCBvbmx5IGluCi0JCU1TLURPUy1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBvZiB0aGUgSlBFRyBsaWJyYXJ5LgotCi0KLUNKUEVHL0RKUEVHL0pQRUdUUkFOCi09PT09PT09PT09PT09PT09PT09PQotCi1JbmNsdWRlIGZpbGVzOgotCi1jZGpwZWcuaAlEZWNsYXJhdGlvbnMgc2hhcmVkIGJ5IGNqcGVnL2RqcGVnL2pwZWd0cmFuIG1vZHVsZXMuCi1jZGVycm9yLmgJQWRkaXRpb25hbCBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZSBjb2RlcyBmb3IgY2pwZWcgZXQgYWwuCi10cmFuc3VwcC5oCURlY2xhcmF0aW9ucyBmb3IganBlZ3RyYW4gc3VwcG9ydCByb3V0aW5lcyBpbiB0cmFuc3VwcC5jLgotCi1DIHNvdXJjZSBjb2RlIGZpbGVzOgotCi1janBlZy5jCQlNYWluIHByb2dyYW0gZm9yIGNqcGVnLgotZGpwZWcuYwkJTWFpbiBwcm9ncmFtIGZvciBkanBlZy4KLWpwZWd0cmFuLmMJTWFpbiBwcm9ncmFtIGZvciBqcGVndHJhbi4KLWNkanBlZy5jCVV0aWxpdHkgcm91dGluZXMgdXNlZCBieSBhbGwgdGhyZWUgcHJvZ3JhbXMuCi1yZGNvbG1hcC5jCUNvZGUgdG8gcmVhZCBhIGNvbG9ybWFwIGZpbGUgZm9yIGRqcGVnJ3MgIi1tYXAiIHN3aXRjaC4KLXJkc3dpdGNoLmMJQ29kZSB0byBwcm9jZXNzIHNvbWUgb2YgY2pwZWcncyBtb3JlIGNvbXBsZXggc3dpdGNoZXMuCi0JCUFsc28gdXNlZCBieSBqcGVndHJhbi4KLXRyYW5zdXBwLmMJU3VwcG9ydCBjb2RlIGZvciBqcGVndHJhbjogbG9zc2xlc3MgaW1hZ2UgbWFuaXB1bGF0aW9ucy4KLQotSW1hZ2UgZmlsZSByZWFkZXIgbW9kdWxlcyBmb3IgY2pwZWc6Ci0KLXJkYm1wLmMJCUJNUCBmaWxlIGlucHV0LgotcmRnaWYuYwkJR0lGIGZpbGUgaW5wdXQgKG5vdyBqdXN0IGEgc3R1YikuCi1yZHBwbS5jCQlQUE0vUEdNIGZpbGUgaW5wdXQuCi1yZHJsZS5jCQlVdGFoIFJMRSBmaWxlIGlucHV0LgotcmR0YXJnYS5jCVRhcmdhIGZpbGUgaW5wdXQuCi0KLUltYWdlIGZpbGUgd3JpdGVyIG1vZHVsZXMgZm9yIGRqcGVnOgotCi13cmJtcC5jCQlCTVAgZmlsZSBvdXRwdXQuCi13cmdpZi5jCQlHSUYgZmlsZSBvdXRwdXQgKGEgbWVyZSBzaGFkb3cgb2YgaXRzIGZvcm1lciBzZWxmKS4KLXdycHBtLmMJCVBQTS9QR00gZmlsZSBvdXRwdXQuCi13cnJsZS5jCQlVdGFoIFJMRSBmaWxlIG91dHB1dC4KLXdydGFyZ2EuYwlUYXJnYSBmaWxlIG91dHB1dC4KLQotCi1SREpQR0NPTS9XUkpQR0NPTQotPT09PT09PT09PT09PT09PT0KLQotQyBzb3VyY2UgY29kZSBmaWxlczoKLQotcmRqcGdjb20uYwlTdGFuZC1hbG9uZSByZGpwZ2NvbSBhcHBsaWNhdGlvbi4KLXdyanBnY29tLmMJU3RhbmQtYWxvbmUgd3JqcGdjb20gYXBwbGljYXRpb24uCi0KLVRoZXNlIHByb2dyYW1zIGRvIG5vdCBkZXBlbmQgb24gdGhlIElKRyBsaWJyYXJ5LiAgVGhleSBkbyB1c2UKLWpjb25maWcuaCBhbmQgamluY2x1ZGUuaCwgb25seSB0byBpbXByb3ZlIHBvcnRhYmlsaXR5LgotCi0KLUFERElUSU9OQUwgRklMRVMKLT09PT09PT09PT09PT09PT0KLQotRG9jdW1lbnRhdGlvbiAoc2VlIFJFQURNRSBmb3IgYSBndWlkZSB0byB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyk6Ci0KLVJFQURNRQkJTWFzdGVyIGRvY3VtZW50YXRpb24gZmlsZS4KLSouZG9jCQlPdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzLgotKi4xCQlEb2N1bWVudGF0aW9uIGluIFVuaXggbWFuIHBhZ2UgZm9ybWF0LgotY2hhbmdlLmxvZwlWZXJzaW9uLXRvLXZlcnNpb24gY2hhbmdlIGhpZ2hsaWdodHMuCi1leGFtcGxlLmMJU2FtcGxlIGNvZGUgZm9yIGNhbGxpbmcgSlBFRyBsaWJyYXJ5LgotCi1Db25maWd1cmF0aW9uL2luc3RhbGxhdGlvbiBmaWxlcyBhbmQgcHJvZ3JhbXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgbW9yZSBpbmZvKToKLQotY29uZmlndXJlCVVuaXggc2hlbGwgc2NyaXB0IHRvIHBlcmZvcm0gYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uCi1sdGNvbmZpZwlTdXBwb3J0IHNjcmlwdHMgZm9yIGNvbmZpZ3VyZSAoZnJvbSBHTlUgbGlidG9vbCkuCi1sdG1haW4uc2gKLWNvbmZpZy5ndWVzcwotY29uZmlnLnN1YgotaW5zdGFsbC1zaAlJbnN0YWxsIHNoZWxsIHNjcmlwdCBmb3IgdGhvc2UgVW5peCBzeXN0ZW1zIGxhY2tpbmcgb25lLgotY2tjb25maWcuYwlQcm9ncmFtIHRvIGdlbmVyYXRlIGpjb25maWcuaCBvbiBub24tVW5peCBzeXN0ZW1zLgotamNvbmZpZy5kb2MJVGVtcGxhdGUgZm9yIG1ha2luZyBqY29uZmlnLmggYnkgaGFuZC4KLW1ha2VmaWxlLioJU2FtcGxlIG1ha2VmaWxlcyBmb3IgcGFydGljdWxhciBzeXN0ZW1zLgotamNvbmZpZy4qCVNhbXBsZSBqY29uZmlnLmggZm9yIHBhcnRpY3VsYXIgc3lzdGVtcy4KLWFuc2kya25yLmMJRGUtQU5TSWZpZXIgZm9yIHByZS1BTlNJIEMgY29tcGlsZXJzIChjb3VydGVzeSBvZgotCQlMLiBQZXRlciBEZXV0c2NoIGFuZCBBbGFkZGluIEVudGVycHJpc2VzKS4KLQotVGVzdCBmaWxlcyAoc2VlIGluc3RhbGwuZG9jIGZvciB0ZXN0IHByb2NlZHVyZSk6Ci0KLXRlc3QqLioJCVNvdXJjZSBhbmQgY29tcGFyaXNvbiBmaWxlcyBmb3IgY29uZmlkZW5jZSB0ZXN0LgotCQlUaGVzZSBhcmUgYmluYXJ5IGltYWdlIGZpbGVzLCBOT1QgdGV4dCBmaWxlcy4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2luc3RhbGwtc2ggYi9saWJqcGVndHdycC9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODQzNjY5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9pbnN0YWxsLmRvYyBiL2xpYmpwZWd0d3JwL2luc3RhbGwuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzAyYjk4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2luc3RhbGwuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi1JTlNUQUxMQVRJT04gSU5TVFJVQ1RJT05TIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKLQotQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1UaGlzIGZpbGUgZXhwbGFpbnMgaG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCB0aGUgSUpHIHNvZnR3YXJlLiAgV2UgaGF2ZQotdHJpZWQgdG8gbWFrZSB0aGlzIHNvZnR3YXJlIGV4dHJlbWVseSBwb3J0YWJsZSBhbmQgZmxleGlibGUsIHNvIHRoYXQgaXQgY2FuIGJlCi1hZGFwdGVkIHRvIGFsbW9zdCBhbnkgZW52aXJvbm1lbnQuICBUaGUgZG93bnNpZGUgb2YgdGhpcyBkZWNpc2lvbiBpcyB0aGF0IHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MgaXMgY29tcGxpY2F0ZWQuICBXZSBoYXZlIHByb3ZpZGVkIHNob3J0Y3V0cyB0byBzaW1wbGlmeQotdGhlIHRhc2sgb24gY29tbW9uIHN5c3RlbXMuICBCdXQgaW4gYW55IGNhc2UsIHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QgYSBsaXR0bGUKLWZhbWlsaWFyaXR5IHdpdGggQyBwcm9ncmFtbWluZyBhbmQgcHJvZ3JhbSBidWlsZCBwcm9jZWR1cmVzIGZvciB5b3VyIHN5c3RlbS4KLQotSWYgeW91IGFyZSBvbmx5IHVzaW5nIHRoaXMgc29mdHdhcmUgYXMgcGFydCBvZiBhIGxhcmdlciBwcm9ncmFtLCB0aGUgbGFyZ2VyCi1wcm9ncmFtJ3MgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBtYXkgdGFrZSBjYXJlIG9mIGNvbmZpZ3VyaW5nIHRoZSBJSkcgY29kZS4KLUZvciBleGFtcGxlLCBHaG9zdHNjcmlwdCdzIGluc3RhbGxhdGlvbiBzY3JpcHQgd2lsbCBjb25maWd1cmUgdGhlIElKRyBjb2RlLgotWW91IGRvbid0IG5lZWQgdG8gcmVhZCB0aGlzIGZpbGUgaWYgeW91IGp1c3Qgd2FudCB0byBjb21waWxlIEdob3N0c2NyaXB0LgotCi1JZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lLCB5b3UgbWF5IG5vdCBuZWVkIHRvIHJlYWQgdGhpcyBmaWxlIGF0IGFsbC4KLVRyeSBkb2luZwotCS4vY29uZmlndXJlCi0JbWFrZQotCW1ha2UgdGVzdAotSWYgdGhhdCBkb2Vzbid0IGNvbXBsYWluLCBkbwotCW1ha2UgaW5zdGFsbAotKGJldHRlciBkbyAibWFrZSAtbiBpbnN0YWxsIiBmaXJzdCB0byBzZWUgaWYgdGhlIG1ha2VmaWxlIHdpbGwgcHV0IHRoZSBmaWxlcwotd2hlcmUgeW91IHdhbnQgdGhlbSkuICBSZWFkIGZ1cnRoZXIgaWYgeW91IHJ1biBpbnRvIHNuYWdzIG9yIHdhbnQgdG8gY3VzdG9taXplCi10aGUgY29kZSBmb3IgeW91ciBzeXN0ZW0uCi0KLQotVEFCTEUgT0YgQ09OVEVOVFMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJlZm9yZSB5b3Ugc3RhcnQKLUNvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZToKLQl1c2luZyB0aGUgYXV0b21hdGljICJjb25maWd1cmUiIHNjcmlwdAotCXVzaW5nIG9uZSBvZiB0aGUgc3VwcGxpZWQgamNvbmZpZyBhbmQgbWFrZWZpbGUgZmlsZXMKLQlieSBoYW5kCi1CdWlsZGluZyB0aGUgc29mdHdhcmUKLVRlc3RpbmcgdGhlIHNvZnR3YXJlCi1JbnN0YWxsaW5nIHRoZSBzb2Z0d2FyZQotT3B0aW9uYWwgc3R1ZmYKLU9wdGltaXphdGlvbgotSGludHMgZm9yIHNwZWNpZmljIHN5c3RlbXMKLQotCi1CRUZPUkUgWU9VIFNUQVJUCi09PT09PT09PT09PT09PT09Ci0KLUJlZm9yZSBpbnN0YWxsaW5nIHRoZSBzb2Z0d2FyZSB5b3UgbXVzdCB1bnBhY2sgdGhlIGRpc3RyaWJ1dGVkIHNvdXJjZSBjb2RlLgotU2luY2UgeW91IGFyZSByZWFkaW5nIHRoaXMgZmlsZSwgeW91IGhhdmUgcHJvYmFibHkgYWxyZWFkeSBzdWNjZWVkZWQgaW4gdGhpcwotdGFzay4gIEhvd2V2ZXIsIHRoZXJlIGlzIGEgcG90ZW50aWFsIGZvciBlcnJvciBpZiB5b3UgbmVlZGVkIHRvIGNvbnZlcnQgdGhlCi1maWxlcyB0byB0aGUgbG9jYWwgc3RhbmRhcmQgdGV4dCBmaWxlIGZvcm1hdCAoZm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgb24KLU1TLURPUyB5b3UgbWF5IGhhdmUgY29udmVydGVkIExGIGVuZC1vZi1saW5lIHRvIENSL0xGKS4gIFlvdSBtdXN0IGFwcGx5Ci1zdWNoIGNvbnZlcnNpb24gdG8gYWxsIHRoZSBmaWxlcyBFWENFUFQgdGhvc2Ugd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAidGVzdCIuCi1UaGUgdGVzdCBmaWxlcyBjb250YWluIGJpbmFyeSBkYXRhOyBpZiB5b3UgY2hhbmdlIHRoZW0gaW4gYW55IHdheSB0aGVuIHRoZQotc2VsZi10ZXN0IHdpbGwgZ2l2ZSBiYWQgcmVzdWx0cy4KLQotUGxlYXNlIGNoZWNrIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhpcyBmaWxlIHRvIHNlZSBpZiB0aGVyZSBhcmUgaGludHMgZm9yIHRoZQotc3BlY2lmaWMgbWFjaGluZSBvciBjb21waWxlciB5b3UgYXJlIHVzaW5nLgotCi0KLUNPTkZJR1VSSU5HIFRIRSBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRvIGNvbmZpZ3VyZSB0aGUgSUpHIGNvZGUgZm9yIHlvdXIgc3lzdGVtLCB5b3UgbmVlZCB0byBjcmVhdGUgdHdvIGZpbGVzOgotICAqIGpjb25maWcuaDogY29udGFpbnMgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50ICNkZWZpbmUgc3ltYm9scy4KLSAgKiBNYWtlZmlsZTogY29udHJvbHMgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuCi0oT24gYSBub24tVW5peCBtYWNoaW5lLCB5b3UgbWF5IGNyZWF0ZSAicHJvamVjdCBmaWxlcyIgb3Igc29tZSBvdGhlcgotc3Vic3RpdHV0ZSBmb3IgYSBNYWtlZmlsZS4gIGpjb25maWcuaCBpcyBuZWVkZWQgaW4gYW55IGVudmlyb25tZW50LikKLQotV2UgcHJvdmlkZSB0aHJlZSBkaWZmZXJlbnQgd2F5cyB0byBnZW5lcmF0ZSB0aGVzZSBmaWxlczoKLSAgKiBPbiBhIFVuaXggc3lzdGVtLCB5b3UgY2FuIGp1c3QgcnVuIHRoZSAiY29uZmlndXJlIiBzY3JpcHQuCi0gICogV2UgcHJvdmlkZSBzYW1wbGUgamNvbmZpZyBmaWxlcyBhbmQgbWFrZWZpbGVzIGZvciBwb3B1bGFyIG1hY2hpbmVzOwotICAgIGlmIHlvdXIgbWFjaGluZSBtYXRjaGVzIG9uZSBvZiB0aGUgc2FtcGxlcywganVzdCBjb3B5IHRoZSByaWdodCBzYW1wbGUKLSAgICBmaWxlcyB0byBqY29uZmlnLmggYW5kIE1ha2VmaWxlLgotICAqIElmIGFsbCBlbHNlIGZhaWxzLCByZWFkIHRoZSBpbnN0cnVjdGlvbnMgYmVsb3cgYW5kIG1ha2UgeW91ciBvd24gZmlsZXMuCi0KLQotQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlIHVzaW5nIHRoZSBhdXRvbWF0aWMgImNvbmZpZ3VyZSIgc2NyaXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgeW91IGNhbiBqdXN0IHR5cGUKLQkuL2NvbmZpZ3VyZQotYW5kIGxldCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb25zdHJ1Y3QgYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBmaWxlcy4KLUlmIHlvdSdyZSB1c2luZyAiY3NoIiBvbiBhbiBvbGQgdmVyc2lvbiBvZiBTeXN0ZW0gViwgeW91IG1pZ2h0IG5lZWQgdG8gdHlwZQotCXNoIGNvbmZpZ3VyZQotaW5zdGVhZCB0byBwcmV2ZW50IGNzaCBmcm9tIHRyeWluZyB0byBleGVjdXRlIGNvbmZpZ3VyZSBpdHNlbGYuCi1FeHBlY3QgY29uZmlndXJlIHRvIHJ1biBmb3IgYSBmZXcgbWludXRlcywgcGFydGljdWxhcmx5IG9uIHNsb3dlciBtYWNoaW5lczsKLWl0IHdvcmtzIGJ5IGNvbXBpbGluZyBhIHNlcmllcyBvZiB0ZXN0IHByb2dyYW1zLgotCi1Db25maWd1cmUgd2FzIGNyZWF0ZWQgd2l0aCBHTlUgQXV0b2NvbmYgYW5kIGl0IGZvbGxvd3MgdGhlIHVzdWFsIGNvbnZlbnRpb25zCi1mb3IgR05VIGNvbmZpZ3VyZSBzY3JpcHRzLiAgSXQgbWFrZXMgYSBmZXcgYXNzdW1wdGlvbnMgdGhhdCB5b3UgbWF5IHdhbnQgdG8KLW92ZXJyaWRlLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHByb3ZpZGluZyBvcHRpb25hbCBzd2l0Y2hlcyB0byBjb25maWd1cmU6Ci0KLSogSWYgeW91IHdhbnQgdG8gYnVpbGQgbGlianBlZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBzYXkKLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQKLVRvIGdldCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcywgc2F5Ci0JLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYwotTm90ZSB0aGF0IHRoZXNlIHN3aXRjaGVzIGludm9rZSBHTlUgbGlidG9vbCB0byB0YWtlIGNhcmUgb2Ygc3lzdGVtLWRlcGVuZGVudAotc2hhcmVkIGxpYnJhcnkgYnVpbGRpbmcgbWV0aG9kcy4gIElmIHRoaW5ncyBkb24ndCB3b3JrIHRoaXMgd2F5LCBwbGVhc2UgdHJ5Ci1ydW5uaW5nIGNvbmZpZ3VyZSB3aXRob3V0IGVpdGhlciBzd2l0Y2g7IHRoYXQgc2hvdWxkIGJ1aWxkIGEgc3RhdGljIGxpYnJhcnkKLXdpdGhvdXQgdXNpbmcgbGlidG9vbC4gIElmIHRoYXQgd29ya3MsIHlvdXIgcHJvYmxlbSBpcyBwcm9iYWJseSB3aXRoIGxpYnRvb2wKLW5vdCB3aXRoIHRoZSBJSkcgY29kZS4gIGxpYnRvb2wgaXMgZmFpcmx5IG5ldyBhbmQgZG9lc24ndCBzdXBwb3J0IGFsbCBmbGF2b3JzCi1vZiBVbml4IHlldC4gIChZb3UgbWlnaHQgYmUgYWJsZSB0byBmaW5kIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJ0b29sIHRoYW4gdGhlCi1vbmUgaW5jbHVkZWQgd2l0aCBsaWJqcGVnOyBzZWUgZnRwLmdudS5vcmcuICBSZXBvcnQgbGlidG9vbCBwcm9ibGVtcyB0bwotYnVnLWxpYnRvb2xAZ251Lm9yZy4pCi0KLSogQ29uZmlndXJlIHdpbGwgdXNlIGdjYyAoR05VIEMgY29tcGlsZXIpIGlmIGl0J3MgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2MuCi1UbyBmb3JjZSBhIHBhcnRpY3VsYXIgY29tcGlsZXIgdG8gYmUgc2VsZWN0ZWQsIHVzZSB0aGUgQ0Mgb3B0aW9uLCBmb3IgZXhhbXBsZQotCS4vY29uZmlndXJlIENDPSdjYycKLVRoZSBzYW1lIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbmNsdWRlIGFueSB1bnVzdWFsIGNvbXBpbGVyIHN3aXRjaGVzLgotRm9yIGV4YW1wbGUsIG9uIEhQLVVYIHlvdSBwcm9iYWJseSB3YW50IHRvIHNheQotCS4vY29uZmlndXJlIENDPSdjYyAtQWEnCi10byBnZXQgSFAncyBjb21waWxlciB0byBydW4gaW4gQU5TSSBtb2RlLgotCi0qIFRoZSBkZWZhdWx0IENGTEFHUyBzZXR0aW5nIGlzICItTyIgZm9yIG5vbi1nY2MgY29tcGlsZXJzLCAiLU8yIiBmb3IgZ2NjLgotWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IHNheWluZywgZm9yIGV4YW1wbGUsCi0JLi9jb25maWd1cmUgQ0ZMQUdTPSctZycKLWlmIHlvdSB3YW50IHRvIGNvbXBpbGUgd2l0aCBkZWJ1Z2dpbmcgc3VwcG9ydC4KLQotKiBDb25maWd1cmUgd2lsbCBzZXQgdXAgdGhlIG1ha2VmaWxlIHNvIHRoYXQgIm1ha2UgaW5zdGFsbCIgd2lsbCBpbnN0YWxsIGZpbGVzCi1pbnRvIC91c3IvbG9jYWwvYmluLCAvdXNyL2xvY2FsL21hbiwgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuIGluc3RhbGxhdGlvbgotcHJlZml4IG90aGVyIHRoYW4gIi91c3IvbG9jYWwiIGJ5IGdpdmluZyBjb25maWd1cmUgdGhlIG9wdGlvbiAiLS1wcmVmaXg9UEFUSCIuCi0KLSogSWYgeW91IGRvbid0IGhhdmUgYSBsb3Qgb2Ygc3dhcCBzcGFjZSwgeW91IG1heSBuZWVkIHRvIGVuYWJsZSB0aGUgSUpHCi1zb2Z0d2FyZSdzIGludGVybmFsIHZpcnR1YWwgbWVtb3J5IG1lY2hhbmlzbS4gIFRvIGRvIHRoaXMsIGdpdmUgdGhlIG9wdGlvbgotIi0tZW5hYmxlLW1heG1lbT1OIiB3aGVyZSBOIGlzIHRoZSBkZWZhdWx0IG1heG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMuCi1UaGlzIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbCB1bmRlciAiU2VsZWN0aW5nIGEgbWVtb3J5IG1hbmFnZXIiLCBiZWxvdy4KLVlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgb24gcmVhc29uYWJseS1zaXplZCBVbml4IG1hY2hpbmVzLAotdW5sZXNzIHlvdSBwbGFuIHRvIHByb2Nlc3MgdmVyeSBsYXJnZSBpbWFnZXMuCi0KLUNvbmZpZ3VyZSBoYXMgc29tZSBvdGhlciBmZWF0dXJlcyB0aGF0IGFyZSB1c2VmdWwgaWYgeW91IGFyZSBjcm9zcy1jb21waWxpbmcKLW9yIHdvcmtpbmcgaW4gYSBuZXR3b3JrIG9mIG11bHRpcGxlIG1hY2hpbmUgdHlwZXM7IGJ1dCBpZiB5b3UgbmVlZCB0aG9zZQotZmVhdHVyZXMsIHlvdSBwcm9iYWJseSBhbHJlYWR5IGtub3cgaG93IHRvIHVzZSB0aGVtLgotCi0KLUNvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZSB1c2luZyBvbmUgb2YgdGhlIHN1cHBsaWVkIGpjb25maWcgYW5kIG1ha2VmaWxlIGZpbGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2Ugc3lzdGVtcywgeW91IGNhbiBqdXN0IHVzZSB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbgotZmlsZXM6Ci0KLU1ha2VmaWxlCWpjb25maWcgZmlsZQlTeXN0ZW0gYW5kL29yIGNvbXBpbGVyCi0KLW1ha2VmaWxlLm1hbngJamNvbmZpZy5tYW54CUFtaWdhLCBNYW54IEF6dGVjIEMKLW1ha2VmaWxlLnNhcwlqY29uZmlnLnNhcwlBbWlnYSwgU0FTIEMKLW1ha2Vwcm9qLm1hYwlqY29uZmlnLm1hYwlBcHBsZSBNYWNpbnRvc2gsIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKLW1haypqcGVnLnN0CWpjb25maWcuc3QJQXRhcmkgU1QvU1RFL1RULCBQdXJlIEMgb3IgVHVyYm8gQwotbWFrZWZpbGUuYmNjCWpjb25maWcuYmNjCU1TLURPUyBvciBPUy8yLCBCb3JsYW5kIEMKLW1ha2VmaWxlLmRqCWpjb25maWcuZGoJTVMtRE9TLCBESkdQUCAoRGVsb3JpZSdzIHBvcnQgb2YgR05VIEMpCi1tYWtlZmlsZS5tYzYJamNvbmZpZy5tYzYJTVMtRE9TLCBNaWNyb3NvZnQgQyAoMTYtYml0IG9ubHkpCi1tYWtlZmlsZS53YXQJamNvbmZpZy53YXQJTVMtRE9TLCBPUy8yLCBvciBXaW5kb3dzIE5ULCBXYXRjb20gQwotbWFrZWZpbGUudmMJamNvbmZpZy52YwlXaW5kb3dzIE5ULzk1LCBNUyBWaXN1YWwgQysrCi1tYWtlKi5kcwlqY29uZmlnLnZjCVdpbmRvd3MgTlQvOTUsIE1TIERldmVsb3BlciBTdHVkaW8KLW1ha2VmaWxlLm1tcwlqY29uZmlnLnZtcwlEaWdpdGFsIFZNUywgd2l0aCBNTVMgc29mdHdhcmUKLW1ha2VmaWxlLnZtcwlqY29uZmlnLnZtcwlEaWdpdGFsIFZNUywgd2l0aG91dCBNTVMgc29mdHdhcmUKLQotQ29weSB0aGUgcHJvcGVyIGpjb25maWcgZmlsZSB0byBqY29uZmlnLmggYW5kIHRoZSBtYWtlZmlsZSB0byBNYWtlZmlsZSAob3IKLXdoYXRldmVyIHlvdXIgc3lzdGVtIHVzZXMgYXMgdGhlIHN0YW5kYXJkIG1ha2VmaWxlIG5hbWUpLiAgRm9yIG1vcmUgaW5mbyBzZWUKLXRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0tc3BlY2lmaWMgaGludHMgc2VjdGlvbiBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgotCi0KLUNvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZSBieSBoYW5kCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1GaXJzdCwgZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZS4gIElmIHlvdSBhcmUgbW9kZXJhdGVseSBmYW1pbGlhciB3aXRoIEMsCi10aGUgY29tbWVudHMgaW4gamNvbmZpZy5kb2Mgc2hvdWxkIGJlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkbyB0aGlzOyBqdXN0Ci1jb3B5IGpjb25maWcuZG9jIHRvIGpjb25maWcuaCBhbmQgZWRpdCBpdCBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCB5b3UgbWF5Ci1wcmVmZXIgdG8gdXNlIHRoZSBja2NvbmZpZy5jIHByb2dyYW0uICBZb3Ugd2lsbCBuZWVkIHRvIGNvbXBpbGUgYW5kIGV4ZWN1dGUKLWNrY29uZmlnLmMgYnkgaGFuZCAtLS0gd2UgaG9wZSB5b3Uga25vdyBhdCBsZWFzdCBlbm91Z2ggdG8gZG8gdGhhdC4KLWNrY29uZmlnLmMgbWF5IG5vdCBjb21waWxlIHRoZSBmaXJzdCB0cnkgKGluIGZhY3QsIHRoZSB3aG9sZSBpZGVhIGlzIGZvciBpdAotdG8gZmFpbCBpZiBhbnl0aGluZyBpcyBnb2luZyB0bykuICBJZiB5b3UgZ2V0IGNvbXBpbGUgZXJyb3JzLCBmaXggdGhlbSBieQotZWRpdGluZyBja2NvbmZpZy5jIGFjY29yZGluZyB0byB0aGUgZGlyZWN0aW9ucyBnaXZlbiBpbiBja2NvbmZpZy5jLiAgT25jZQoteW91IGdldCBpdCB0byBydW4sIGl0IHdpbGwgd3JpdGUgYSBzdWl0YWJsZSBqY29uZmlnLmggZmlsZSwgYW5kIHdpbGwgYWxzbwotcHJpbnQgb3V0IHNvbWUgYWR2aWNlIGFib3V0IHdoaWNoIG1ha2VmaWxlIHRvIHVzZS4KLQotWW91IG1heSBhbHNvIHdhbnQgdG8gbG9vayBhdCB0aGUgY2FubmVkIGpjb25maWcgZmlsZXMsIGlmIHRoZXJlIGlzIG9uZSBmb3IgYQotc3lzdGVtIHNpbWlsYXIgdG8geW91cnMuCi0KLVNlY29uZCwgc2VsZWN0IGEgbWFrZWZpbGUgYW5kIGNvcHkgaXQgdG8gTWFrZWZpbGUgKG9yIHdoYXRldmVyIHlvdXIgc3lzdGVtCi11c2VzIGFzIHRoZSBzdGFuZGFyZCBtYWtlZmlsZSBuYW1lKS4gIFRoZSBtb3N0IGdlbmVyaWMgbWFrZWZpbGVzIHdlIHByb3ZpZGUKLWFyZQotCW1ha2VmaWxlLmFuc2k6CWlmIHlvdXIgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzCi0JbWFrZWZpbGUudW5peDoJaWYgbm90LgotKFlvdSBoYXZlIGZ1bmN0aW9uIHByb3RvdHlwZXMgaWYgY2tjb25maWcuYyBwdXQgIiNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTIgotaW4gamNvbmZpZy5oLikgIFlvdSBtYXkgd2FudCB0byBzdGFydCBmcm9tIG9uZSBvZiB0aGUgb3RoZXIgbWFrZWZpbGVzIGlmCi10aGVyZSBpcyBvbmUgZm9yIGEgc3lzdGVtIHNpbWlsYXIgdG8geW91cnMuCi0KLUxvb2sgb3ZlciB0aGUgc2VsZWN0ZWQgTWFrZWZpbGUgYW5kIGFkanVzdCBvcHRpb25zIGFzIG5lZWRlZC4gIEluIHBhcnRpY3VsYXIKLXlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIENDIGFuZCBDRkxBR1MgZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsIGlmIHlvdQotYXJlIHVzaW5nIEdDQywgc2V0IENDPWdjYy4gIElmIHlvdSBoYWQgdG8gdXNlIGFueSBjb21waWxlciBzd2l0Y2hlcyB0byBnZXQKLWNrY29uZmlnLmMgdG8gd29yaywgbWFrZSBzdXJlIHRoZSBzYW1lIHN3aXRjaGVzIGFyZSBpbiBDRkxBR1MuCi0KLUlmIHlvdSBhcmUgb24gYSBzeXN0ZW0gdGhhdCBkb2Vzbid0IHVzZSBtYWtlZmlsZXMsIHlvdSdsbCBuZWVkIHRvIHNldCB1cAotcHJvamVjdCBmaWxlcyAob3Igd2hhdGV2ZXIgeW91IGRvIHVzZSkgdG8gY29tcGlsZSBhbGwgdGhlIHNvdXJjZSBmaWxlcyBhbmQKLWxpbmsgdGhlbSBpbnRvIGV4ZWN1dGFibGUgZmlsZXMgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KLVNlZSB0aGUgZmlsZSBsaXN0cyBpbiBhbnkgb2YgdGhlIG1ha2VmaWxlcyB0byBmaW5kIG91dCB3aGljaCBmaWxlcyBnbyBpbnRvCi1lYWNoIHByb2dyYW0uICBOb3RlIHRoYXQgdGhlIHByb3ZpZGVkIG1ha2VmaWxlcyBhbGwgbWFrZSBhICJsaWJyYXJ5IiBmaWxlCi1saWJqcGVnIGZpcnN0LCBidXQgeW91IGRvbid0IGhhdmUgdG8gZG8gdGhhdCBpZiB5b3UgZG9uJ3Qgd2FudCB0bzsgdGhlIGZpbGUKLWxpc3RzIGlkZW50aWZ5IHdoaWNoIHNvdXJjZSBmaWxlcyBhcmUgYWN0dWFsbHkgbmVlZGVkIGZvciBjb21wcmVzc2lvbiwKLWRlY29tcHJlc3Npb24sIG9yIGJvdGguICBBcyBhIGxhc3QgcmVzb3J0LCB5b3UgY2FuIG1ha2UgYSBiYXRjaCBzY3JpcHQgdGhhdAotanVzdCBjb21waWxlcyBldmVyeXRoaW5nIGFuZCBsaW5rcyBpdCBhbGwgdG9nZXRoZXI7IG1ha2VmaWxlLnZtcyBpcyBhbiBleGFtcGxlCi1vZiB0aGlzIChpdCdzIGZvciBWTVMgc3lzdGVtcyB0aGF0IGhhdmUgbm8gbWFrZS1saWtlIHV0aWxpdHkpLgotCi1IZXJlIGFyZSBjb21tZW50cyBhYm91dCBzb21lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGVjaXNpb25zIHlvdSdsbAotbmVlZCB0byBtYWtlOgotCi1Db21tYW5kIGxpbmUgc3R5bGUKLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVzZSBwcm9ncmFtcyBjYW4gdXNlIGEgVW5peC1saWtlIGNvbW1hbmQgbGluZSBzdHlsZSB3aGljaCBzdXBwb3J0cwotcmVkaXJlY3Rpb24gYW5kIHBpcGluZywgbGlrZSB0aGlzOgotCWNqcGVnIGlucHV0ZmlsZSA+b3V0cHV0ZmlsZQotCWNqcGVnIDxpbnB1dGZpbGUgPm91dHB1dGZpbGUKLQlzb3VyY2UgcHJvZ3JhbSB8IGNqcGVnID5vdXRwdXRmaWxlCi1UaGUgc2ltcGxlciAidHdvIGZpbGUiIGNvbW1hbmQgbGluZSBzdHlsZSBpcyBqdXN0Ci0JY2pwZWcgaW5wdXRmaWxlIG91dHB1dGZpbGUKLVlvdSBtYXkgcHJlZmVyIHRoZSB0d28tZmlsZSBzdHlsZSwgcGFydGljdWxhcmx5IGlmIHlvdSBkb24ndCBoYXZlIHBpcGVzLgotCi1Zb3UgTVVTVCB1c2UgdHdvLWZpbGUgc3R5bGUgb24gYW55IHN5c3RlbSB0aGF0IGRvZXNuJ3QgY29wZSB3ZWxsIHdpdGggYmluYXJ5Ci1kYXRhIGZlZCB0aHJvdWdoIHN0ZGluL3N0ZG91dDsgdGhpcyBpcyB0cnVlIGZvciBzb21lIE1TLURPUyBjb21waWxlcnMsIGZvcgotZXhhbXBsZS4gIElmIHlvdSdyZSBub3Qgb24gYSBVbml4IHN5c3RlbSwgaXQncyBzYWZlc3QgdG8gYXNzdW1lIHlvdSBuZWVkCi10d28tZmlsZSBzdHlsZS4gIChCdXQgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBlaXRoZXIgdGhlIFBvc2l4LXN0YW5kYXJkCi1mZG9wZW4oKSBsaWJyYXJ5IHJvdXRpbmUgb3IgYSBNaWNyb3NvZnQtY29tcGF0aWJsZSBzZXRtb2RlKCkgcm91dGluZSwgeW91Ci1jYW4gc2FmZWx5IHVzZSB0aGUgVW5peCBjb21tYW5kIGxpbmUgc3R5bGUsIGJ5IGRlZmluaW5nIFVTRV9GRE9QRU4gb3IKLVVTRV9TRVRNT0RFIHJlc3BlY3RpdmVseS4pCi0KLVRvIHVzZSB0aGUgdHdvLWZpbGUgc3R5bGUsIG1ha2UgamNvbmZpZy5oIHNheSAiI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORSIuCi0KLVNlbGVjdGluZyBhIG1lbW9yeSBtYW5hZ2VyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSUpHIGNvZGUgaXMgY2FwYWJsZSBvZiB3b3JraW5nIG9uIGltYWdlcyB0aGF0IGFyZSB0b28gYmlnIHRvIGZpdCBpbiBtYWluCi1tZW1vcnk7IGRhdGEgaXMgc3dhcHBlZCBvdXQgdG8gdGVtcG9yYXJ5IGZpbGVzIGFzIG5lY2Vzc2FyeS4gIEhvd2V2ZXIsIHRoZQotY29kZSB0byBkbyB0aGlzIGlzIHJhdGhlciBzeXN0ZW0tZGVwZW5kZW50LiAgV2UgcHJvdmlkZSBmaXZlIGRpZmZlcmVudAotbWVtb3J5IG1hbmFnZXJzOgotCi0qIGptZW1hbnNpLmMJVGhpcyB2ZXJzaW9uIHVzZXMgdGhlIEFOU0ktc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lIHRtcGZpbGUoKSwKLQkJd2hpY2ggbm90IGFsbCBub24tQU5TSSBzeXN0ZW1zIGhhdmUuICBPbiBzb21lIHN5c3RlbXMKLQkJdG1wZmlsZSgpIG1heSBwdXQgdGhlIHRlbXBvcmFyeSBmaWxlIGluIGEgbm9uLW9wdGltYWwKLQkJbG9jYXRpb247IGlmIHlvdSBkb24ndCBsaWtlIHdoYXQgaXQgZG9lcywgdXNlIGptZW1uYW1lLmMuCi0KLSogam1lbW5hbWUuYwlUaGlzIHZlcnNpb24gY3JlYXRlcyBuYW1lZCB0ZW1wb3JhcnkgZmlsZXMuICBGb3IgYW55dGhpbmcKLQkJZXhjZXB0IGEgVW5peCBtYWNoaW5lLCB5b3UnbGwgbmVlZCB0byBjb25maWd1cmUgdGhlCi0JCXNlbGVjdF9maWxlX25hbWUoKSByb3V0aW5lIGFwcHJvcHJpYXRlbHk7IHNlZSB0aGUgY29tbWVudHMKLQkJbmVhciB0aGUgaGVhZCBvZiBqbWVtbmFtZS5jLiAgSWYgeW91IHVzZSB0aGlzIHZlcnNpb24sIGRlZmluZQotCQlORUVEX1NJR05BTF9DQVRDSEVSIGluIGpjb25maWcuaCB0byBtYWtlIHN1cmUgdGhlIHRlbXAgZmlsZXMKLQkJYXJlIHJlbW92ZWQgaWYgdGhlIHByb2dyYW0gaXMgYWJvcnRlZC4KLQotKiBqbWVtbm9icy5jCShUaGF0IHN0YW5kcyBmb3IgTm8gQmFja2luZyBTdG9yZSA6LSkuKSAgVGhpcyB3aWxsIGNvbXBpbGUgb24KLQkJYWxtb3N0IGFueSBzeXN0ZW0sIGJ1dCBpdCBhc3N1bWVzIHlvdSBoYXZlIGVub3VnaCBtYWluIG1lbW9yeQotCQlvciB2aXJ0dWFsIG1lbW9yeSB0byBob2xkIHRoZSBiaWdnZXN0IGltYWdlcyB5b3Ugd29yayB3aXRoLgotCi0qIGptZW1kb3MuYwlUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggbW9zdCAxNi1iaXQgTVMtRE9TIGNvbXBpbGVycy4KLQkJU2VlIHRoZSBzeXN0ZW0tc3BlY2lmaWMgbm90ZXMgYWJvdXQgTVMtRE9TIGZvciBtb3JlIGluZm8uCi0JCUlNUE9SVEFOVDogaWYgeW91IHVzZSB0aGlzLCBkZWZpbmUgVVNFX01TRE9TX01FTU1HUiBpbgotCQlqY29uZmlnLmgsIGFuZCBpbmNsdWRlIHRoZSBhc3NlbWJseSBmaWxlIGptZW1kb3NhLmFzbSBpbiB0aGUKLQkJcHJvZ3JhbXMuICBUaGUgc3VwcGxpZWQgbWFrZWZpbGVzIGFuZCBqY29uZmlnIGZpbGVzIGZvcgotCQkxNi1iaXQgTVMtRE9TIGNvbXBpbGVycyBhbHJlYWR5IGRvIGJvdGguCi0KLSogam1lbW1hYy5jCUN1c3RvbSB2ZXJzaW9uIGZvciBBcHBsZSBNYWNpbnRvc2g7IHNlZSB0aGUgc3lzdGVtLXNwZWNpZmljCi0JCW5vdGVzIGZvciBNYWNpbnRvc2ggZm9yIG1vcmUgaW5mby4KLQotVG8gdXNlIGEgcGFydGljdWxhciBtZW1vcnkgbWFuYWdlciwgY2hhbmdlIHRoZSBTWVNERVBNRU0gdmFyaWFibGUgaW4geW91cgotbWFrZWZpbGUgdG8gZXF1YWwgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGUgbmFtZSAoZm9yIGV4YW1wbGUsIGptZW1hbnNpLm8KLW9yIGptZW1hbnNpLm9iaiBmb3Igam1lbWFuc2kuYykuCi0KLUlmIHlvdSBoYXZlIHBsZW50eSBvZiAocmVhbCBvciB2aXJ0dWFsKSBtYWluIG1lbW9yeSwganVzdCB1c2Ugam1lbW5vYnMuYy4KLSJQbGVudHkiIG1lYW5zIGFib3V0IHRlbiBieXRlcyBmb3IgZXZlcnkgcGl4ZWwgaW4gdGhlIGxhcmdlc3QgaW1hZ2VzCi15b3UgcGxhbiB0byBwcm9jZXNzLCBzbyBhIGxvdCBvZiBzeXN0ZW1zIGRvbid0IG1lZXQgdGhpcyBjcml0ZXJpb24uCi1JZiB5b3VycyBkb2Vzbid0LCB0cnkgam1lbWFuc2kuYyBmaXJzdC4gIElmIHRoYXQgZG9lc24ndCBjb21waWxlLCB5b3UnbGwgaGF2ZQotdG8gdXNlIGptZW1uYW1lLmM7IGJlIHN1cmUgdG8gYWRqdXN0IHNlbGVjdF9maWxlX25hbWUoKSBmb3IgbG9jYWwgY29uZGl0aW9ucy4KLVlvdSBtYXkgYWxzbyBuZWVkIHRvIGNoYW5nZSB1bmxpbmsoKSB0byByZW1vdmUoKSBpbiBjbG9zZV9iYWNraW5nX3N0b3JlKCkuCi0KLUV4Y2VwdCB3aXRoIGptZW1ub2JzLmMgb3Igam1lbW1hYy5jLCB5b3UgbmVlZCB0byBhZGp1c3QgdGhlIERFRkFVTFRfTUFYX01FTQotc2V0dGluZyB0byBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIHlvdXIgc3lzdGVtIChlaXRoZXIgYnkgYWRkaW5nIGEgI2RlZmluZSBmb3IKLURFRkFVTFRfTUFYX01FTSB0byBqY29uZmlnLmgsIG9yIGJ5IGFkZGluZyBhIC1EIHN3aXRjaCB0byB0aGUgTWFrZWZpbGUpLgotVGhpcyB2YWx1ZSBsaW1pdHMgdGhlIGFtb3VudCBvZiBkYXRhIHNwYWNlIHRoZSBwcm9ncmFtIHdpbGwgYXR0ZW1wdCB0bwotYWxsb2NhdGUuICBDb2RlIGFuZCBzdGF0aWMgZGF0YSBzcGFjZSBpc24ndCBjb3VudGVkLCBzbyB0aGUgYWN0dWFsIG1lbW9yeQotbmVlZHMgZm9yIGNqcGVnIG9yIGRqcGVnIGFyZSB0eXBpY2FsbHkgMTAwIHRvIDE1MEtiIG1vcmUgdGhhbiB0aGUgbWF4LW1lbW9yeQotc2V0dGluZy4gIExhcmdlciBtYXgtbWVtb3J5IHNldHRpbmdzIHJlZHVjZSB0aGUgYW1vdW50IG9mIEkvTyBuZWVkZWQgdG8KLXByb2Nlc3MgYSBsYXJnZSBpbWFnZSwgYnV0IHRvbyBsYXJnZSBhIHZhbHVlIGNhbiByZXN1bHQgaW4gImluc3VmZmljaWVudAotbWVtb3J5IiBmYWlsdXJlcy4gIE9uIG1vc3QgVW5peCBtYWNoaW5lcyAoYW5kIG90aGVyIHN5c3RlbXMgd2l0aCB2aXJ0dWFsCi1tZW1vcnkpLCBqdXN0IHNldCBERUZBVUxUX01BWF9NRU0gdG8gc2V2ZXJhbCBtaWxsaW9uIGFuZCBmb3JnZXQgaXQuICBBdCB0aGUKLW90aGVyIGVuZCBvZiB0aGUgc3BlY3RydW0sIGZvciBNUy1ET1MgbWFjaGluZXMgeW91IHByb2JhYmx5IGNhbid0IGdvIG11Y2gKLWFib3ZlIDMwMEsgdG8gNDAwSy4gIChPbiBNUy1ET1MgdGhlIHZhbHVlIHJlZmVycyB0byBjb252ZW50aW9uYWwgbWVtb3J5IG9ubHkuCi1FeHRlbmRlZC9leHBhbmRlZCBtZW1vcnkgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGJ5IGptZW1kb3MuYy4pCi0KLQotQlVJTERJTkcgVEhFIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09PT09PT0KLQotTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBjb21waWxlIHRoZSBzb2Z0d2FyZS4gIEp1c3Qgc2F5ICJtYWtlIiAob3IKLXdoYXRldmVyJ3MgbmVjZXNzYXJ5IHRvIHN0YXJ0IHRoZSBjb21waWxhdGlvbikuICBIYXZlIGEgY3VwIG9mIGNvZmZlZS4KLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBjb3VsZCBnbyB3cm9uZzoKLQotSWYgeW91ciBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgdW5kZWZpbmVkIHN0cnVjdHVyZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0bwotc2h1dCBpdCB1cCBieSBwdXR0aW5nICIjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOIiBpbiBqY29uZmlnLmguCi0KLUlmIHlvdSBoYXZlIHRyb3VibGUgd2l0aCBtaXNzaW5nIHN5c3RlbSBpbmNsdWRlIGZpbGVzIG9yIGluY2x1c2lvbiBvZiB0aGUKLXdyb25nIG9uZXMsIHJlYWQgamluY2x1ZGUuaC4gIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBpZiB5b3UgdXNlZCBjb25maWd1cmUKLW9yIGNrY29uZmlnLmMgdG8gc2V0IHVwIGpjb25maWcuaC4KLQotVGhlcmUgYXJlIGEgZmFpciBudW1iZXIgb2Ygcm91dGluZXMgdGhhdCBkbyBub3QgdXNlIGFsbCBvZiB0aGVpciBwYXJhbWV0ZXJzOwotc29tZSBjb21waWxlcnMgd2lsbCBpc3N1ZSB3YXJuaW5ncyBhYm91dCB0aGlzLCB3aGljaCB5b3UgY2FuIGlnbm9yZS4gIFRoZXJlCi1hcmUgYWxzbyBhIGZldyBjb25maWd1cmF0aW9uIGNoZWNrcyB0aGF0IG1heSBnaXZlICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5ncy4KLUFueSBvdGhlciB3YXJuaW5nIGRlc2VydmVzIGludmVzdGlnYXRpb24uCi0KLUlmIHlvdSBkb24ndCBoYXZlIGEgZ2V0ZW52KCkgbGlicmFyeSByb3V0aW5lLCBkZWZpbmUgTk9fR0VURU5WLgotCi1BbHNvIHNlZSB0aGUgc3lzdGVtLXNwZWNpZmljIGhpbnRzLCBiZWxvdy4KLQotCi1URVNUSU5HIFRIRSBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PT09PT0KLQotQXMgYSBxdWljayB0ZXN0IG9mIGZ1bmN0aW9uYWxpdHkgd2UndmUgaW5jbHVkZWQgYSBzbWFsbCBzYW1wbGUgaW1hZ2UgaW4KLXNldmVyYWwgZm9ybXM6Ci0JdGVzdG9yaWcuanBnCVN0YXJ0aW5nIHBvaW50IGZvciB0aGUgZGpwZWcgdGVzdHMuCi0JdGVzdGltZy5wcG0JVGhlIG91dHB1dCBvZiBkanBlZyB0ZXN0b3JpZy5qcGcKLQl0ZXN0aW1nLmJtcAlUaGUgb3V0cHV0IG9mIGRqcGVnIC1ibXAgLWNvbG9ycyAyNTYgdGVzdG9yaWcuanBnCi0JdGVzdGltZy5qcGcJVGhlIG91dHB1dCBvZiBjanBlZyB0ZXN0aW1nLnBwbQotCXRlc3Rwcm9nLmpwZwlQcm9ncmVzc2l2ZS1tb2RlIGVxdWl2YWxlbnQgb2YgdGVzdG9yaWcuanBnLgotCXRlc3RpbWdwLmpwZwlUaGUgb3V0cHV0IG9mIGNqcGVnIC1wcm9ncmVzc2l2ZSAtb3B0aW1pemUgdGVzdGltZy5wcG0KLShUaGUgZmlyc3QtIGFuZCBzZWNvbmQtZ2VuZXJhdGlvbiAuanBnIGZpbGVzIGFyZW4ndCBpZGVudGljYWwgc2luY2UgSlBFRyBpcwotbG9zc3kuKSAgSWYgeW91IGNhbiBnZW5lcmF0ZSBkdXBsaWNhdGVzIG9mIHRoZSB0ZXN0aW1nKiBmaWxlcyB0aGVuIHlvdQotcHJvYmFibHkgaGF2ZSB3b3JraW5nIHByb2dyYW1zLgotCi1XaXRoIG1vc3Qgb2YgdGhlIG1ha2VmaWxlcywgIm1ha2UgdGVzdCIgd2lsbCBwZXJmb3JtIHRoZSBuZWNlc3NhcnkKLWNvbXBhcmlzb25zLgotCi1JZiB5b3UncmUgdXNpbmcgYSBtYWtlZmlsZSB0aGF0IGRvZXNuJ3QgcHJvdmlkZSB0aGUgdGVzdCBvcHRpb24sIHJ1biBkanBlZwotYW5kIGNqcGVnIGJ5IGhhbmQgYW5kIGNvbXBhcmUgdGhlIG91dHB1dCBmaWxlcyB0byB0ZXN0aW1nKiB3aXRoIHdoYXRldmVyCi1iaW5hcnkgZmlsZSBjb21wYXJpc29uIHRvb2wgeW91IGhhdmUuICBUaGUgZmlsZXMgc2hvdWxkIGJlIGJpdC1mb3ItYml0Ci1pZGVudGljYWwuCi0KLUlmIHRoZSBwcm9ncmFtcyBjb21wbGFpbiAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IiwgdGhlbiB5b3UKLW5lZWQgdG8gcmVkdWNlIE1BWF9BTExPQ19DSFVOSyB0byBhIHZhbHVlIHRoYXQgZml0cyBpbiB0eXBlIHNpemVfdC4KLVRyeSBhZGRpbmcgIiNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LIDY1NTIwTCIgdG8gamNvbmZpZy5oLiAgQSBsZXNzIGxpa2VseQotY29uZmlndXJhdGlvbiBlcnJvciBpcyAiQUxJR05fVFlQRSBpcyB3cm9uZywgcGxlYXNlIGZpeCI6IGRlZmluaW5nIEFMSUdOX1RZUEUKLWFzIGxvbmcgc2hvdWxkIHRha2UgY2FyZSBvZiB0aGF0IG9uZS4KLQotSWYgdGhlIGNqcGVnIHRlc3QgcnVuIGZhaWxzIHdpdGggIk1pc3NpbmcgSHVmZm1hbiBjb2RlIHRhYmxlIGVudHJ5IiwgaXQncyBhCi1nb29kIGJldCB0aGF0IHlvdSBuZWVkZWQgdG8gZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVELiAgR28gYmFjayB0byB0aGUKLWNvbmZpZ3VyYXRpb24gc3RlcCBhbmQgcnVuIGNrY29uZmlnLmMuICAoVGhpcyBpcyBhIGdvb2QgcGxhbiBmb3IgYW55IG90aGVyCi10ZXN0IGZhaWx1cmUsIHRvby4pCi0KLUlmIHlvdSBhcmUgdXNpbmcgVW5peCAob25lLWZpbGUpIGNvbW1hbmQgbGluZSBzdHlsZSBvbiBhIG5vbi1Vbml4IHN5c3RlbSwKLWl0J3MgYSBnb29kIGlkZWEgdG8gY2hlY2sgdGhhdCBiaW5hcnkgSS9PIHRocm91Z2ggc3RkaW4vc3Rkb3V0IGFjdHVhbGx5Ci13b3Jrcy4gIFlvdSBzaG91bGQgZ2V0IHRoZSBzYW1lIHJlc3VsdHMgZnJvbSAiZGpwZWcgPHRlc3RvcmlnLmpwZyA+b3V0LnBwbSIKLWFzIGZyb20gImRqcGVnIC1vdXRmaWxlIG91dC5wcG0gdGVzdG9yaWcuanBnIi4gIE5vdGUgdGhhdCB0aGUgbWFrZWZpbGVzIGFsbAotdXNlIHRoZSBsYXR0ZXIgc3R5bGUgYW5kIHRoZXJlZm9yZSBkbyBub3QgZXhlcmNpc2Ugc3RkaW4vc3Rkb3V0ISAgSWYgdGhpcwotY2hlY2sgZmFpbHMsIHRyeSByZWNvbXBpbGluZyB3aXRoIFVTRV9TRVRNT0RFIG9yIFVTRV9GRE9QRU4gZGVmaW5lZC4KLUlmIGl0IHN0aWxsIGRvZXNuJ3Qgd29yaywgYmV0dGVyIHVzZSB0d28tZmlsZSBzdHlsZS4KLQotSWYgeW91IGNob3NlIGEgbWVtb3J5IG1hbmFnZXIgb3RoZXIgdGhhbiBqbWVtbm9icy5jLCB5b3Ugc2hvdWxkIHRlc3QgdGhhdAotdGVtcG9yYXJ5LWZpbGUgdXNhZ2Ugd29ya3MuICBUcnkgImRqcGVnIC1ibXAgLWNvbG9ycyAyNTYgLW1heCAwIHRlc3RvcmlnLmpwZyIKLWFuZCBtYWtlIHN1cmUgaXRzIG91dHB1dCBtYXRjaGVzIHRlc3RpbWcuYm1wLiAgSWYgeW91IGhhdmUgYW55IHJlYWxseSBsYXJnZQotaW1hZ2VzIGhhbmR5LCB0cnkgY29tcHJlc3NpbmcgdGhlbSB3aXRoIC1vcHRpbWl6ZSBhbmQvb3IgZGVjb21wcmVzc2luZyB3aXRoCi0tY29sb3JzIDI1NiB0byBtYWtlIHN1cmUgeW91ciBERUZBVUxUX01BWF9NRU0gc2V0dGluZyBpcyBub3QgdG9vIGxhcmdlLgotCi1OT1RFOiB0aGlzIGlzIGZhciBmcm9tIGFuIGV4aGF1c3RpdmUgdGVzdCBvZiB0aGUgSlBFRyBzb2Z0d2FyZTsgc29tZSBtb2R1bGVzLAotc3VjaCBhcyAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCBhcmUgbm90IGV4ZXJjaXNlZCBhdCBhbGwuICBJdCdzIGp1c3QgYQotcXVpY2sgdGVzdCB0byBnaXZlIHlvdSBzb21lIGNvbmZpZGVuY2UgdGhhdCB5b3UgaGF2ZW4ndCBtaXNzZWQgc29tZXRoaW5nCi1tYWpvci4KLQotCi1JTlNUQUxMSU5HIFRIRSBTT0ZUV0FSRQotPT09PT09PT09PT09PT09PT09PT09PT0KLQotT25jZSB5b3UncmUgZG9uZSB3aXRoIHRoZSBhYm92ZSBzdGVwcywgeW91IGNhbiBpbnN0YWxsIHRoZSBzb2Z0d2FyZSBieQotY29weWluZyB0aGUgZXhlY3V0YWJsZSBmaWxlcyAoY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbSkKLXRvIHdoZXJldmVyIHlvdSBub3JtYWxseSBpbnN0YWxsIHByb2dyYW1zLiAgT24gVW5peCBzeXN0ZW1zLCB5b3UnbGwgYWxzbyB3YW50Ci10byBwdXQgdGhlIG1hbiBwYWdlcyAoY2pwZWcuMSwgZGpwZWcuMSwganBlZ3RyYW4uMSwgcmRqcGdjb20uMSwgd3JqcGdjb20uMSkKLWluIHRoZSBtYW4tcGFnZSBkaXJlY3RvcnkuICBUaGUgcHJlLWZhYiBtYWtlZmlsZXMgZG9uJ3Qgc3VwcG9ydCB0aGlzIHN0ZXAKLXNpbmNlIHRoZXJlJ3Mgc3VjaCBhIHdpZGUgdmFyaWV0eSBvZiBpbnN0YWxsYXRpb24gcHJvY2VkdXJlcyBvbiBkaWZmZXJlbnQKLXN5c3RlbXMuCi0KLUlmIHlvdSBnZW5lcmF0ZWQgYSBNYWtlZmlsZSB3aXRoIHRoZSAiY29uZmlndXJlIiBzY3JpcHQsIHlvdSBjYW4ganVzdCBzYXkKLQltYWtlIGluc3RhbGwKLXRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCB0aGVpciBtYW4gcGFnZXMgaW50byB0aGUgc3RhbmRhcmQgcGxhY2VzLgotKFlvdSdsbCBwcm9iYWJseSBuZWVkIHRvIGJlIHJvb3QgdG8gZG8gdGhpcy4pICBXZSByZWNvbW1lbmQgZmlyc3Qgc2F5aW5nCi0JbWFrZSAtbiBpbnN0YWxsCi10byBzZWUgd2hlcmUgY29uZmlndXJlIHRob3VnaHQgdGhlIGZpbGVzIHNob3VsZCBnby4gIFlvdSBtYXkgbmVlZCB0byBlZGl0Ci10aGUgTWFrZWZpbGUsIHBhcnRpY3VsYXJseSBpZiB5b3VyIHN5c3RlbSdzIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZQotZmlsZW5hbWVzIGRvbid0IG1hdGNoIHdoYXQgY29uZmlndXJlIGV4cGVjdHMuCi0KLUlmIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIElKRyBsaWJyYXJ5IGl0c2VsZiwgZm9yIHVzZSBpbiBjb21waWxpbmcgb3RoZXIKLXByb2dyYW1zIGJlc2lkZXMgb3VycywgdGhlbiB5b3UgbmVlZCB0byBwdXQgdGhlIGZvdXIgaW5jbHVkZSBmaWxlcwotCWpwZWdsaWIuaCBqZXJyb3IuaCBqY29uZmlnLmggam1vcmVjZmcuaAotaW50byB5b3VyIGluY2x1ZGUtZmlsZSBkaXJlY3RvcnksIGFuZCBwdXQgdGhlIGxpYnJhcnkgZmlsZSBsaWJqcGVnLmEKLShleHRlbnNpb24gbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHN5c3RlbSkgd2hlcmV2ZXIgbGlicmFyeSBmaWxlcyBnby4KLUlmIHlvdSBnZW5lcmF0ZWQgYSBNYWtlZmlsZSB3aXRoICJjb25maWd1cmUiLCBpdCB3aWxsIGRvIHdoYXQgaXQgdGhpbmtzCi1pcyB0aGUgcmlnaHQgdGhpbmcgaWYgeW91IHNheQotCW1ha2UgaW5zdGFsbC1saWIKLQotCi1PUFRJT05BTCBTVFVGRgotPT09PT09PT09PT09PT0KLQotUHJvZ3Jlc3MgbW9uaXRvcjoKLQotSWYgeW91IGxpa2UsIHlvdSBjYW4gI2RlZmluZSBQUk9HUkVTU19SRVBPUlQgKGluIGpjb25maWcuaCkgdG8gZW5hYmxlIGRpc3BsYXkKLW9mIHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzLiAgVGhlIHJvdXRpbmUgcHJvdmlkZWQgaW4gY2RqcGVnLmMgbWVyZWx5Ci1wcmludHMgcGVyY2VudGFnZXMgdG8gc3RkZXJyLCBidXQgeW91IGNhbiBjdXN0b21pemUgaXQgdG8gZG8gc29tZXRoaW5nCi1mYW5jaWVyLgotCi1VdGFoIFJMRSBmaWxlIGZvcm1hdCBzdXBwb3J0OgotCi1XZSBkaXN0cmlidXRlIHRoZSBzb2Z0d2FyZSB3aXRoIHN1cHBvcnQgZm9yIFJMRSBpbWFnZSBmaWxlcyAoVXRhaCBSYXN0ZXIKLVRvb2xraXQgZm9ybWF0KSBkaXNhYmxlZCwgYmVjYXVzZSB0aGUgUkxFIHN1cHBvcnQgd29uJ3QgY29tcGlsZSB3aXRob3V0IHRoZQotVXRhaCBsaWJyYXJ5LiAgSWYgeW91IGhhdmUgVVJUIHZlcnNpb24gMy4xIG9yIGxhdGVyLCB5b3UgY2FuIGVuYWJsZSBSTEUKLXN1cHBvcnQgYXMgZm9sbG93czoKLQkxLiAgI2RlZmluZSBSTEVfU1VQUE9SVEVEIGluIGpjb25maWcuaC4KLQkyLiAgQWRkIGEgLUkgb3B0aW9uIHRvIENGTEFHUyBpbiB0aGUgTWFrZWZpbGUgZm9yIHRoZSBkaXJlY3RvcnkKLQkgICAgY29udGFpbmluZyB0aGUgVVJUIC5oIGZpbGVzICh0eXBpY2FsbHkgdGhlICJpbmNsdWRlIgotCSAgICBzdWJkaXJlY3Rvcnkgb2YgdGhlIFVSVCBkaXN0cmlidXRpb24pLgotCTMuICBBZGQgLUwuLi4gLWxybGUgdG8gTERMSUJTIGluIHRoZSBNYWtlZmlsZSwgd2hlcmUgLi4uIHNwZWNpZmllcwotCSAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFVSVCAibGlicmxlLmEiIGZpbGUgKHR5cGljYWxseSB0aGUKLQkgICAgImxpYiIgc3ViZGlyZWN0b3J5IG9mIHRoZSBVUlQgZGlzdHJpYnV0aW9uKS4KLQotU3VwcG9ydCBmb3IgMTItYml0LWRlZXAgcGl4ZWwgZGF0YToKLQotVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzIGVpdGhlciA4LWJpdCBvciAxMi1iaXQgZGF0YSBwcmVjaXNpb24uICAoRm9yIGNvbG9yLAotdGhpcyBtZWFucyA4IG9yIDEyIGJpdHMgcGVyIGNoYW5uZWwsIG9mIGNvdXJzZS4pICBJZiB5b3UgbmVlZCB0byB3b3JrIHdpdGgKLWRlZXBlciB0aGFuIDgtYml0IGRhdGEsIHlvdSBjYW4gY29tcGlsZSB0aGUgSUpHIGNvZGUgZm9yIDEyLWJpdCBvcGVyYXRpb24uCi1UbyBkbyBzbzoKLSAgMS4gSW4gam1vcmVjZmcuaCwgZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSBhcyAxMiByYXRoZXIgdGhhbiA4LgotICAyLiBJbiBqY29uZmlnLmgsIHVuZGVmaW5lIEJNUF9TVVBQT1JURUQsIFJMRV9TVVBQT1JURUQsIGFuZCBUQVJHQV9TVVBQT1JURUQsCi0gICAgIGJlY2F1c2UgdGhlIGNvZGUgZm9yIHRob3NlIGZvcm1hdHMgZG9lc24ndCBoYW5kbGUgMTItYml0IGRhdGEgYW5kIHdvbid0Ci0gICAgIGV2ZW4gY29tcGlsZS4gIChUaGUgUFBNIGNvZGUgZG9lcyB3b3JrLCBhcyBleHBsYWluZWQgYmVsb3cuICBUaGUgR0lGCi0gICAgIGNvZGUgd29ya3MgdG9vOyBpdCBzY2FsZXMgOC1iaXQgR0lGIGRhdGEgdG8gYW5kIGZyb20gMTItYml0IGRlcHRoCi0gICAgIGF1dG9tYXRpY2FsbHkuKQotICAzLiBDb21waWxlLiAgRG9uJ3QgZXhwZWN0ICJtYWtlIHRlc3QiIHRvIHBhc3MsIHNpbmNlIHRoZSBzdXBwbGllZCB0ZXN0Ci0gICAgIGZpbGVzIGFyZSBmb3IgOC1iaXQgZGF0YS4KLQotQ3VycmVudGx5LCAxMi1iaXQgc3VwcG9ydCBkb2VzIG5vdCB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCi0KLU5vdGUgdGhhdCBhIDEyLWJpdCB2ZXJzaW9uIHdpbGwgbm90IHJlYWQgOC1iaXQgSlBFRyBmaWxlcywgbm9yIHZpY2UgdmVyc2E7Ci1zbyB5b3UnbGwgd2FudCB0byBrZWVwIGFyb3VuZCBhIHJlZ3VsYXIgOC1iaXQgY29tcGlsYXRpb24gYXMgd2VsbC4KLShSdW4tdGltZSBzZWxlY3Rpb24gb2YgZGF0YSBkZXB0aCwgdG8gYWxsb3cgYSBzaW5nbGUgY29weSB0aGF0IGRvZXMgYm90aCwKLWlzIHBvc3NpYmxlIGJ1dCB3b3VsZCBwcm9iYWJseSBzbG93IHRoaW5ncyBkb3duIGNvbnNpZGVyYWJseTsgaXQncyB2ZXJ5IGxvdwotb24gb3VyIHRvLWRvIGxpc3QuKQotCi1UaGUgUFBNIHJlYWRlciAocmRwcG0uYykgY2FuIHJlYWQgMTItYml0IGRhdGEgZnJvbSBlaXRoZXIgdGV4dC1mb3JtYXQgb3IKLWJpbmFyeS1mb3JtYXQgUFBNIGFuZCBQR00gZmlsZXMuICBCaW5hcnktZm9ybWF0IFBQTS9QR00gZmlsZXMgd2hpY2ggaGF2ZSBhCi1tYXh2YWwgZ3JlYXRlciB0aGFuIDI1NSBhcmUgYXNzdW1lZCB0byB1c2UgMiBieXRlcyBwZXIgc2FtcGxlLCBMU0IgZmlyc3QKLShsaXR0bGUtZW5kaWFuIG9yZGVyKS4gIEFzIG9mIGVhcmx5IDE5OTUsIDItYnl0ZSBiaW5hcnkgZm9ybWF0IGlzIG5vdAotb2ZmaWNpYWxseSBzdXBwb3J0ZWQgYnkgdGhlIFBCTVBMVVMgbGlicmFyeSwgYnV0IGl0IGlzIGV4cGVjdGVkIHRoYXQgYQotZnV0dXJlIHJlbGVhc2Ugb2YgUEJNUExVUyB3aWxsIHN1cHBvcnQgaXQuICBOb3RlIHRoYXQgdGhlIFBQTSByZWFkZXIgd2lsbAotcmVhZCBmaWxlcyBvZiBhbnkgbWF4dmFsIHJlZ2FyZGxlc3Mgb2YgdGhlIEJJVFNfSU5fSlNBTVBMRSBzZXR0aW5nOyBpbmNvbWluZwotZGF0YSBpcyBhdXRvbWF0aWNhbGx5IHJlc2NhbGVkIHRvIGVpdGhlciBtYXh2YWw9MjU1IG9yIG1heHZhbD00MDk1IGFzCi1hcHByb3ByaWF0ZSBmb3IgdGhlIGNqcGVnIGJpdCBkZXB0aC4KLQotVGhlIFBQTSB3cml0ZXIgKHdycHBtLmMpIHdpbGwgbm9ybWFsbHkgd3JpdGUgMi1ieXRlIGJpbmFyeSBQUE0gb3IgUEdNCi1mb3JtYXQsIG1heHZhbCA0MDk1LCB3aGVuIGNvbXBpbGVkIHdpdGggQklUU19JTl9KU0FNUExFPTEyLiAgU2luY2UgdGhpcwotZm9ybWF0IGlzIG5vdCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCwgeW91IGNhbiBkaXNhYmxlIGl0IGJ5IGNvbXBpbGluZyB3cnBwbS5jCi13aXRoIFBQTV9OT1JBV1dPUkQgZGVmaW5lZDsgdGhlbiB0aGUgZGF0YSBpcyBzY2FsZWQgZG93biB0byA4IGJpdHMgdG8gbWFrZSBhCi1zdGFuZGFyZCAxLWJ5dGUvc2FtcGxlIFBQTSBvciBQR00gZmlsZS4gIChZZXMsIHRoaXMgbWVhbnMgc3RpbGwgYW5vdGhlciBjb3B5Ci1vZiBkanBlZyB0byBrZWVwIGFyb3VuZC4gIEJ1dCBob3BlZnVsbHkgeW91IHdvbid0IG5lZWQgaXQgZm9yIHZlcnkgbG9uZy4KLVBvc2thbnplcidzIHN1cHBvc2VkIHRvIGdldCB0aGF0IG5ldyBQQk1QTFVTIHJlbGVhc2Ugb3V0IFJlYWwgU29vbiBOb3cuKQotCi1PZiBjb3Vyc2UsIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIDEyLWJpdCBkYXRhLCB5b3UgcHJvYmFibHkgaGF2ZSBpdCBzdG9yZWQKLWluIHNvbWUgb3RoZXIsIG5vbnN0YW5kYXJkIGZvcm1hdC4gIEluIHRoYXQgY2FzZSB5b3UnbGwgcHJvYmFibHkgd2FudCB0bwotd3JpdGUgeW91ciBvd24gSS9PIG1vZHVsZXMgdG8gcmVhZCBhbmQgd3JpdGUgeW91ciBmb3JtYXQuCi0KLU5vdGUgdGhhdCBhIDEyLWJpdCB2ZXJzaW9uIG9mIGNqcGVnIGFsd2F5cyBydW5zIGluICItb3B0aW1pemUiIG1vZGUsIGluCi1vcmRlciB0byBnZW5lcmF0ZSB2YWxpZCBIdWZmbWFuIHRhYmxlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3VyCi1kZWZhdWx0IEh1ZmZtYW4gdGFibGVzIG9ubHkgY292ZXIgOC1iaXQgZGF0YS4KLQotUmVtb3ZpbmcgY29kZToKLQotSWYgeW91IG5lZWQgdG8gbWFrZSBhIHNtYWxsZXIgdmVyc2lvbiBvZiB0aGUgSlBFRyBzb2Z0d2FyZSwgc29tZSBvcHRpb25hbAotZnVuY3Rpb25zIGNhbiBiZSByZW1vdmVkIGF0IGNvbXBpbGUgdGltZS4gIFNlZSB0aGUgeHh4X1NVUFBPUlRFRCAjZGVmaW5lcyBpbgotamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oLiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgbGVhdmUgaW4KLWRlY29kZXIgc3VwcG9ydCBmb3IgYWxsIHZhbGlkIEpQRUcgZmlsZXMsIHRvIGVuc3VyZSB0aGF0IHlvdSBjYW4gcmVhZCBhbnlvbmUncwotb3V0cHV0LiAgVGFraW5nIG91dCBzdXBwb3J0IGZvciBpbWFnZSBmaWxlIGZvcm1hdHMgdGhhdCB5b3UgZG9uJ3QgdXNlIGlzIHRoZQotbW9zdCBwYWlubGVzcyB3YXkgdG8gbWFrZSB0aGUgcHJvZ3JhbXMgc21hbGxlci4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8KLXJlbW92ZSBzb21lIG9mIHRoZSBEQ1QgbWV0aG9kczogaW4gcGFydGljdWxhciwgdGhlICJJRkFTVCIgbWV0aG9kIG1heSBub3QgYmUKLWVub3VnaCBmYXN0ZXIgdGhhbiB0aGUgb3RoZXJzIHRvIGJlIHdvcnRoIGtlZXBpbmcgb24geW91ciBtYWNoaW5lLiAgKElmIHlvdQotZG8gcmVtb3ZlIElTTE9XIG9yIElGQVNULCBiZSBzdXJlIHRvIHJlZGVmaW5lIEpEQ1RfREVGQVVMVCBvciBKRENUX0ZBU1RFU1QKLXRvIGEgc3VwcG9ydGVkIG1ldGhvZCwgYnkgYWRkaW5nIGEgI2RlZmluZSBpbiBqY29uZmlnLmguKQotCi0KLU9QVElNSVpBVElPTgotPT09PT09PT09PT09Ci0KLVVubGVzcyB5b3Ugb3duIGEgQ3JheSwgeW91J2xsIHByb2JhYmx5IGJlIGludGVyZXN0ZWQgaW4gbWFraW5nIHRoZSBKUEVHCi1zb2Z0d2FyZSBnbyBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgVGhpcyBzZWN0aW9uIGNvdmVycyBzb21lIG1hY2hpbmUtZGVwZW5kZW50Ci1vcHRpbWl6YXRpb25zIHlvdSBtYXkgd2FudCB0byB0cnkuICBXZSBzdWdnZXN0IHRoYXQgYmVmb3JlIHRyeWluZyBhbnkgb2YKLXRoaXMsIHlvdSBmaXJzdCBnZXQgdGhlIGJhc2ljIGluc3RhbGxhdGlvbiB0byBwYXNzIHRoZSBzZWxmLXRlc3Qgc3RlcC4KLVJlcGVhdCB0aGUgc2VsZi10ZXN0IGFmdGVyIGFueSBvcHRpbWl6YXRpb24gdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmVuJ3QKLWJyb2tlbiBhbnl0aGluZy4KLQotVGhlIGludGVnZXIgRENUIHJvdXRpbmVzIHBlcmZvcm0gYSBsb3Qgb2YgbXVsdGlwbGljYXRpb25zLiAgVGhlc2UKLW11bHRpcGxpY2F0aW9ucyBtdXN0IHlpZWxkIDMyLWJpdCByZXN1bHRzLCBidXQgbm9uZSBvZiB0aGVpciBpbnB1dCB2YWx1ZXMKLWFyZSBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLiAgT24gbWFueSBtYWNoaW5lcywgbm90YWJseSB0aGUgNjgweDAgYW5kIDgweDg2Ci1DUFVzLCBhIDE2eDE2PT4zMiBiaXQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24gaXMgZmFzdGVyIHRoYW4gYSBmdWxsIDMyeDMyPT4zMgotYml0IG11bHRpcGx5LiAgVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBwb3J0YWJsZSB3YXkgdG8gc3BlY2lmeSBzdWNoIGEKLW11bHRpcGxpY2F0aW9uIGluIEMsIGJ1dCBzb21lIGNvbXBpbGVycyBjYW4gZ2VuZXJhdGUgb25lIHdoZW4geW91IHVzZSB0aGUKLXJpZ2h0IGNvbWJpbmF0aW9uIG9mIGNhc3RzLiAgU2VlIHRoZSBNVUxUSVBMWXh4eCBtYWNybyBkZWZpbml0aW9ucyBpbgotamRjdC5oLiAgSWYgeW91ciBjb21waWxlciBtYWtlcyAiaW50IiBiZSAzMiBiaXRzIGFuZCAic2hvcnQiIGJlIDE2IGJpdHMsCi1kZWZpbmluZyBTSE9SVHhTSE9SVF8zMiBpcyBmYWlybHkgbGlrZWx5IHRvIHdvcmsuICBXaGVuIGV4cGVyaW1lbnRpbmcgd2l0aAotYWx0ZXJuYXRlIGRlZmluaXRpb25zLCBiZSBzdXJlIHRvIHRlc3Qgbm90IG9ubHkgd2hldGhlciB0aGUgY29kZSBzdGlsbCB3b3JrcwotKHVzZSB0aGUgc2VsZi10ZXN0KSwgYnV0IGFsc28gd2hldGhlciBpdCBpcyBhY3R1YWxseSBmYXN0ZXIgLS0tIG9uIHNvbWUKLWNvbXBpbGVycywgYWx0ZXJuYXRlIGRlZmluaXRpb25zIG1heSBjb21wdXRlIHRoZSByaWdodCBhbnN3ZXIsIHlldCBiZSBzbG93ZXIKLXRoYW4gdGhlIGRlZmF1bHQuICBUaW1pbmcgY2pwZWcgb24gYSBsYXJnZSBQR00gKGdyYXlzY2FsZSkgaW5wdXQgZmlsZSBpcyB0aGUKLWJlc3Qgd2F5IHRvIGNoZWNrIHRoaXMsIGFzIHRoZSBEQ1Qgd2lsbCBiZSB0aGUgbGFyZ2VzdCBmcmFjdGlvbiBvZiB0aGUgcnVudGltZQotaW4gdGhhdCBtb2RlLiAgKE5vdGU6IHNvbWUgb2YgdGhlIGRpc3RyaWJ1dGVkIGNvbXBpbGVyLXNwZWNpZmljIGpjb25maWcgZmlsZXMKLWFscmVhZHkgY29udGFpbiAjZGVmaW5lIHN3aXRjaGVzIHRvIHNlbGVjdCBhcHByb3ByaWF0ZSBNVUxUSVBMWXh4eAotZGVmaW5pdGlvbnMuKQotCi1JZiB5b3VyIG1hY2hpbmUgaGFzIHN1ZmZpY2llbnRseSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLCB5b3UgbWF5IGZpbmQKLXRoYXQgdGhlIGZsb2F0IERDVCBtZXRob2QgaXMgZmFzdGVyIHRoYW4gdGhlIGludGVnZXIgRENUIG1ldGhvZHMsIGV2ZW4KLWFmdGVyIHR3ZWFraW5nIHRoZSBpbnRlZ2VyIG11bHRpcGx5IG1hY3Jvcy4gIEluIHRoYXQgY2FzZSB5b3UgbWF5IHdhbnQgdG8KLW1ha2UgdGhlIGZsb2F0IERDVCBiZSB0aGUgZGVmYXVsdCBtZXRob2QuICAoVGhlIG9ubHkgb2JqZWN0aW9uIHRvIHRoaXMgaXMKLXRoYXQgZmxvYXQgRENUIHJlc3VsdHMgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzIG1hY2hpbmVzLikgIFRvIGRvIHRoYXQsIGFkZAotIiNkZWZpbmUgSkRDVF9ERUZBVUxUIEpEQ1RfRkxPQVQiIHRvIGpjb25maWcuaC4gIEV2ZW4gaWYgeW91IGRvbid0IGNoYW5nZQotdGhlIGRlZmF1bHQsIHlvdSBzaG91bGQgcmVkZWZpbmUgSkRDVF9GQVNURVNULCB3aGljaCBpcyB0aGUgbWV0aG9kIHNlbGVjdGVkCi1ieSBkanBlZydzIC1mYXN0IHN3aXRjaC4gIERvbid0IGZvcmdldCB0byB1cGRhdGUgdGhlIGRvY3VtZW50YXRpb24gZmlsZXMKLSh1c2FnZS5kb2MgYW5kL29yIGNqcGVnLjEsIGRqcGVnLjEpIHRvIGFncmVlIHdpdGggd2hhdCB5b3UndmUgZG9uZS4KLQotSWYgYWNjZXNzIHRvICJzaG9ydCIgYXJyYXlzIGlzIHNsb3cgb24geW91ciBtYWNoaW5lLCBpdCBtYXkgYmUgYSB3aW4gdG8KLWRlZmluZSB0eXBlIEpDT0VGIGFzIGludCByYXRoZXIgdGhhbiBzaG9ydC4gIFRoaXMgd2lsbCBjb3N0IGEgZ29vZCBkZWFsIG9mCi1tZW1vcnkgdGhvdWdoLCBwYXJ0aWN1bGFybHkgaW4gc29tZSBtdWx0aS1wYXNzIG1vZGVzLCBzbyBkb24ndCBkbyBpdCB1bmxlc3MKLXlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCBzaG9ydCBpcyBSRUFMTFkgc2xvdy4KLQotSWYgeW91ciBjb21waWxlciBjYW4gY29tcGlsZSBmdW5jdGlvbiBjYWxscyBpbi1saW5lLCBtYWtlIHN1cmUgdGhlIElOTElORQotbWFjcm8gaW4gam1vcmVjZmcuaCBpcyBkZWZpbmVkIGFzIHRoZSBrZXl3b3JkIHRoYXQgbWFya3MgYSBmdW5jdGlvbgotaW5saW5lLWFibGUuICBTb21lIGNvbXBpbGVycyBoYXZlIGEgc3dpdGNoIHRoYXQgdGVsbHMgdGhlIGNvbXBpbGVyIHRvIGlubGluZQotYW55IGZ1bmN0aW9uIGl0IHRoaW5rcyBpcyBwcm9maXRhYmxlIChlLmcuLCAtZmlubGluZS1mdW5jdGlvbnMgZm9yIGdjYykuCi1FbmFibGluZyBzdWNoIGEgc3dpdGNoIGlzIGxpa2VseSB0byBtYWtlIHRoZSBjb21waWxlZCBjb2RlIGJpZ2dlciBidXQgZmFzdGVyLgotCi1JbiBnZW5lcmFsLCBpdCdzIHdvcnRoIHRyeWluZyB0aGUgbWF4aW11bSBvcHRpbWl6YXRpb24gbGV2ZWwgb2YgeW91ciBjb21waWxlciwKLWFuZCBleHBlcmltZW50aW5nIHdpdGggYW55IG9wdGlvbmFsIG9wdGltaXphdGlvbnMgc3VjaCBhcyBsb29wIHVucm9sbGluZy4KLShVbmZvcnR1bmF0ZWx5LCBmYXIgdG9vIG1hbnkgY29tcGlsZXJzIGhhdmUgb3B0aW1pemVyIGJ1Z3MgLi4uIGJlIHByZXBhcmVkIHRvCi1iYWNrIG9mZiBpZiB0aGUgY29kZSBmYWlscyBzZWxmLXRlc3QuKSAgSWYgeW91IGRvIGFueSBleHBlcmltZW50YXRpb24gYWxvbmcKLXRoZXNlIGxpbmVzLCBwbGVhc2UgcmVwb3J0IHRoZSBvcHRpbWFsIHNldHRpbmdzIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQgc28KLXdlIGNhbiBtZW50aW9uIHRoZW0gaW4gZnV0dXJlIHJlbGVhc2VzLiAgQmUgc3VyZSB0byBzcGVjaWZ5IHlvdXIgbWFjaGluZSBhbmQKLWNvbXBpbGVyIHZlcnNpb24uCi0KLQotSElOVFMgRk9SIFNQRUNJRklDIFNZU1RFTVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdlIHdlbGNvbWUgcmVwb3J0cyBvbiBjaGFuZ2VzIG5lZWRlZCBmb3Igc3lzdGVtcyBub3QgbWVudGlvbmVkIGhlcmUuICBTdWJtaXQKLSdlbSB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0LiAgQWxzbywgaWYgY29uZmlndXJlIG9yIGNrY29uZmlnLmMgaXMgd3JvbmcKLWFib3V0IGhvdyB0byBjb25maWd1cmUgdGhlIEpQRUcgc29mdHdhcmUgZm9yIHlvdXIgc3lzdGVtLCBwbGVhc2UgbGV0IHVzIGtub3cuCi0KLQotQWNvcm4gUklTQyBPUzoKLQotKFRoYW5rcyB0byBTaW1vbiBNaWRkbGV0b24gZm9yIHRoZXNlIGhpbnRzIG9uIGNvbXBpbGluZyB3aXRoIERlc2t0b3AgQy4pCi1BZnRlciByZW5hbWluZyB0aGUgZmlsZXMgYWNjb3JkaW5nIHRvIEFjb3JuIGNvbnZlbnRpb25zLCB0YWtlIGEgY29weSBvZgotbWFrZWZpbGUuYW5zaSwgY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiAnbGlianBlZy5hJyB0byAnbGlianBlZy5vJyBhbmQKLWNoYW5nZSB0aGVzZSBkZWZpbml0aW9ucyBhcyBpbmRpY2F0ZWQ6Ci0KLUNGTEFHUz0gLXRocm93YmFjayAtSUM6IC1XbgotTERMSUJTPUM6by5TdHVicwotU1lTREVQTUVNPWptZW1hbnNpLm8KLUxOPUxpbmsKLUFSPUxpYkZpbGUgLWMgLW8KLQotQWxzbyBhZGQgYSBuZXcgbGluZSAnLmMubzo7ICQoY2MpICQ8ICQoY2ZsYWdzKSAtYyAtbyAkQCcuICBSZW1vdmUgdGhlCi1saW5lcyAnJChSTSkgbGlianBlZy5vJyBhbmQgJyQoQVIyKSBsaWJqcGVnLm8nIGFuZCB0aGUgJ2pjb25maWcuaCcKLWRlcGVuZGVuY3kgc2VjdGlvbi4KLQotQ29weSBqY29uZmlnLmRvYyB0byBqY29uZmlnLmguICBFZGl0IGpjb25maWcuaCB0byBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKLWFuZCBDSEFSX0lTX1VOU0lHTkVELgotCi1SdW4gdGhlIG1ha2VmaWxlIHVzaW5nICFBTVUgbm90ICFNYWtlLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAnY2xlYW4nIGFuZAotJ3Rlc3QnIG1ha2VmaWxlIGVudHJpZXMgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBzeW50YXggYSBiaXQKLWFuZCByZW5hbWUgdGhlIHRlc3QgZmlsZXMuCi0KLQotQW1pZ2E6Ci0KLVNBUyBDIDYuNTAgcmVwb3J0ZWRseSBpcyB0b28gYnVnZ3kgdG8gY29tcGlsZSB0aGUgSUpHIGNvZGUgcHJvcGVybHkuCi1BIHBhdGNoIHRvIHVwZGF0ZSB0byA2LjUxIGlzIGF2YWlsYWJsZSBmcm9tIFNBUyBvciBBbWlOZXQgRlRQIHNpdGVzLgotCi1UaGUgc3VwcGxpZWQgY29uZmlnIGZpbGVzIGFyZSBzZXQgdXAgdG8gdXNlIGptZW1uYW1lLmMgYXMgdGhlIG1lbW9yeQotbWFuYWdlciwgd2l0aCB0ZW1wb3JhcnkgZmlsZXMgYmVpbmcgY3JlYXRlZCBvbiB0aGUgZGV2aWNlIG5hbWVkIGJ5Ci0iSlBFR1RNUDoiLgotCi0KLUF0YXJpIFNUL1NURS9UVDoKLSAKLUNvcHkgdGhlIHByb2plY3QgZmlsZXMgbWFrY2pwZWcuc3QsIG1ha2RqcGVnLnN0LCBtYWt0anBlZy5zdCwgYW5kIG1ha2xqcGVnLnN0Ci10byBjanBlZy5wcmosIGRqcGVnLnByaiwganBlZ3RyYW4ucHJqLCBhbmQgbGlianBlZy5wcmogcmVzcGVjdGl2ZWx5LiAgVGhlCi1wcm9qZWN0IGZpbGVzIHNob3VsZCB3b3JrIGFzLWlzIHdpdGggUHVyZSBDLiAgRm9yIFR1cmJvIEMsIGNoYW5nZSBsaWJyYXJ5Ci1maWxlbmFtZXMgInBjLi4uIiB0byAidGMuLi4iIGluIGVhY2ggcHJvamVjdCBmaWxlLiAgTm90ZSB0aGF0IGxpYmpwZWcucHJqCi1zZWxlY3RzIGptZW1hbnNpLmMgYXMgdGhlIHJlY29tbWVuZGVkIG1lbW9yeSBtYW5hZ2VyLiAgWW91J2xsIHByb2JhYmx5IHdhbnQgdG8KLWFkanVzdCB0aGUgREVGQVVMVF9NQVhfTUVNIHNldHRpbmcgLS0tIHlvdSB3YW50IGl0IHRvIGJlIGEgY291cGxlIGh1bmRyZWQgSwotbGVzcyB0aGFuIHlvdXIgbm9ybWFsIGZyZWUgbWVtb3J5LiAgUHV0ICIjZGVmaW5lIERFRkFVTFRfTUFYX01FTSBubm5uIiBpbnRvCi1qY29uZmlnLmggdG8gZG8gdGhpcy4KLQotVG8gdXNlIHRoZSA2ODg4MS82ODg4MiBjb3Byb2Nlc3NvciBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IERDVCwgYWRkIHRoZQotY29tcGlsZXIgb3B0aW9uICItOCIgdG8gdGhlIHByb2plY3QgZmlsZXMgYW5kIHJlcGxhY2UgcGNmbHRsaWIubGliIHdpdGgKLXBjODgxbGliLmxpYiBpbiBjanBlZy5wcmogYW5kIGRqcGVnLnByai4gIE9yIGlmIHlvdSBkb24ndCBoYXZlIGEKLWNvcHJvY2Vzc29yLCB5b3UgbWF5IHByZWZlciB0byByZW1vdmUgdGhlIGZsb2F0IERDVCBjb2RlIGJ5IHVuZGVmaW5pbmcKLURDVF9GTE9BVF9TVVBQT1JURUQgaW4gam1vcmVjZmcuaCAoc2luY2Ugd2l0aG91dCBhIGNvcHJvY2Vzc29yLCB0aGUgZmxvYXQKLWNvZGUgd2lsbCBiZSB0b28gc2xvdyB0byBiZSB1c2VmdWwpLiAgSW4gdGhhdCBjYXNlLCB5b3UgY2FuIGRlbGV0ZQotcGNmbHRsaWIubGliIGZyb20gdGhlIHByb2plY3QgZmlsZXMuCi0KLU5vdGUgdGhhdCB5b3UgbXVzdCBtYWtlIGxpYmpwZWcubGliIGJlZm9yZSBtYWtpbmcgY2pwZWcudHRwLCBkanBlZy50dHAsCi1vciBqcGVndHJhbi50dHAuICBZb3UnbGwgaGF2ZSB0byBwZXJmb3JtIHRoZSBzZWxmLXRlc3QgYnkgaGFuZC4KLQotV2UgaGF2ZW4ndCBib3RoZXJlZCB0byBpbmNsdWRlIHByb2plY3QgZmlsZXMgZm9yIHJkanBnY29tIGFuZCB3cmpwZ2NvbS4KLVRob3NlIHNvdXJjZSBmaWxlcyBzaG91bGQganVzdCBiZSBjb21waWxlZCBieSB0aGVtc2VsdmVzOyB0aGV5IGRvbid0Ci1kZXBlbmQgb24gdGhlIEpQRUcgbGlicmFyeS4KLQotVGhlcmUgaXMgYSBidWcgaW4gc29tZSBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgVHVyYm8gQyBsaWJyYXJ5IHdoaWNoIGNhdXNlcyB0aGUKLXNwYWNlIHVzZWQgYnkgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgd2l0aCAidG1wZmlsZSgpIiBub3QgdG8gYmUgZnJlZWQgYWZ0ZXIKLWFuIGFibm9ybWFsIHByb2dyYW0gZXhpdC4gIElmIHlvdSBjaGVjayB5b3VyIGRpc2sgYWZ0ZXJ3YXJkcywgeW91IHdpbGwgZmluZAotY2x1c3RlciBjaGFpbnMgdGhhdCBhcmUgYWxsb2NhdGVkIGJ1dCBub3QgdXNlZCBieSBhIGZpbGUuICBUaGlzIHNob3VsZCBub3QKLWhhcHBlbiBpbiBjanBlZy9kanBlZy9qcGVndHJhbiwgc2luY2Ugd2UgZW5hYmxlIGEgc2lnbmFsIGNhdGNoZXIgdG8gZXhwbGljaXRseQotY2xvc2UgdGVtcCBmaWxlcyBiZWZvcmUgZXhpdGluZy4gIEJ1dCBpZiB5b3UgdXNlIHRoZSBKUEVHIGxpYnJhcnkgd2l0aCB5b3VyCi1vd24gY29kZSwgYmUgc3VyZSB0byBzdXBwbHkgYSBzaWduYWwgY2F0Y2hlciwgb3IgZWxzZSB1c2UgYSBkaWZmZXJlbnQKLXN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZXIuCi0KLQotQ3JheToKLQotU2hvdWxkIHlvdSBiZSBzbyBmb3J0dW5hdGUgYXMgdG8gYmUgcnVubmluZyBKUEVHIG9uIGEgQ3JheSBZTVAsIHRoZXJlIGlzIGEKLWNvbXBpbGVyIGJ1ZyBpbiBvbGQgdmVyc2lvbnMgb2YgQ3JheSdzIFN0YW5kYXJkIEMgKHByaW9yIHRvIDMuMSkuICBJZiB5b3UKLXN0aWxsIGhhdmUgYW4gb2xkIGNvbXBpbGVyLCB5b3UnbGwgbmVlZCB0byBpbnNlcnQgYSBsaW5lIHJlYWRpbmcKLSIjcHJhZ21hIG5vdmVjdG9yIiBqdXN0IGJlZm9yZSB0aGUgbG9vcAkKLSAgICBmb3IgKGkgPSAxOyBpIDw9IChpbnQpIGh0YmwtPmJpdHNbbF07IGkrKykKLSAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKLWluIGZpeF9odWZmX3RibCAoaW4gVjViZXRhMSwgbGluZSAyMDQgb2YgamNodWZmLmMgYW5kIGxpbmUgMTc2IG9mIGpkaHVmZi5jKS4KLVtUaGlzIGJ1ZyBtYXkgb3IgbWF5IG5vdCBzdGlsbCBvY2N1ciB3aXRoIHRoZSBjdXJyZW50IElKRyBjb2RlLCBidXQgaXQncwotcHJvYmFibHkgYSBkZWFkIGlzc3VlIGFueXdheS4uLl0KLQotCi1IUC1VWDoKLQotSWYgeW91IGhhdmUgSFAtVVggNy4wNSBvciBsYXRlciB3aXRoIHRoZSAic29mdHdhcmUgZGV2ZWxvcG1lbnQiIEMgY29tcGlsZXIsCi15b3Ugc2hvdWxkIHJ1biB0aGUgY29tcGlsZXIgaW4gQU5TSSBtb2RlLiAgSWYgdXNpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsCi1zYXkKLQkuL2NvbmZpZ3VyZSBDQz0nY2MgLUFhJwotKG9yIC1BZSBpZiB5b3UgcHJlZmVyKS4gIElmIGNvbmZpZ3VyaW5nIGJ5IGhhbmQsIHVzZSBtYWtlZmlsZS5hbnNpIGFuZCBhZGQKLSItQWEiIHRvIHRoZSBDRkxBR1MgbGluZSBpbiB0aGUgbWFrZWZpbGUuCi0KLUlmIHlvdSBoYXZlIGEgcHJlLTcuMDUgc3lzdGVtLCBvciBpZiB5b3UgYXJlIHVzaW5nIHRoZSBub24tQU5TSSBDIGNvbXBpbGVyCi1kZWxpdmVyZWQgd2l0aCBhIG1pbmltdW0gSFAtVVggc3lzdGVtLCB0aGVuIHlvdSBtdXN0IHVzZSBtYWtlZmlsZS51bml4Ci0oYW5kIGRvIE5PVCBhZGQgLUFhKTsgb3IganVzdCBydW4gY29uZmlndXJlIHdpdGhvdXQgdGhlIENDIG9wdGlvbi4KLQotT24gSFAgOTAwMCBzZXJpZXMgODAwIG1hY2hpbmVzLCB0aGUgSFAgQyBjb21waWxlciBpcyBidWdneSBpbiByZXZpc2lvbnMgcHJpb3IKLXRvIEEuMDguMDcuICBJZiB5b3UgZ2V0IGNvbXBsYWludHMgYWJvdXQgIm5vdCBhIHR5cGVkZWYgbmFtZSIsIHlvdSdsbCBoYXZlIHRvCi11c2UgbWFrZWZpbGUudW5peCwgb3IgcnVuIGNvbmZpZ3VyZSB3aXRob3V0IHRoZSBDQyBvcHRpb24uCi0KLQotTWFjaW50b3NoLCBnZW5lcmljIGNvbW1lbnRzOgotCi1UaGUgc3VwcGxpZWQgdXNlci1pbnRlcmZhY2UgZmlsZXMgKGNqcGVnLmMsIGRqcGVnLmMsIGV0YykgYXJlIHNldCB1cCB0bwotcHJvdmlkZSBhIFVuaXgtc3R5bGUgY29tbWFuZCBsaW5lIGludGVyZmFjZS4gIFlvdSBjYW4gdXNlIHRoaXMgaW50ZXJmYWNlIG9uCi10aGUgTWFjIGJ5IG1lYW5zIG9mIHRoZSBjY29tbWFuZCgpIGxpYnJhcnkgcm91dGluZSBwcm92aWRlZCBieSBNZXRyb3dlcmtzCi1Db2RlV2FycmlvciBvciBUaGluayBDLiAgVGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlIGZvciB0ZXN0aW5nIHRoZSBsaWJyYXJ5LAotaG93ZXZlcjsgdG8gbWFrZSBhIHVzZXItZnJpZW5kbHkgZXF1aXZhbGVudCBvZiBjanBlZy9kanBlZyB5b3UnZCByZWFsbHkgd2FudAotdG8gZGV2ZWxvcCBhIE1hYy1zdHlsZSB1c2VyIGludGVyZmFjZS4gIFRoZXJlIGlzbid0IGEgY29tcGxldGUgZXhhbXBsZQotYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQsIGJ1dCB0aGVyZSBhcmUgc29tZSBoZWxwZnVsIHN0YXJ0aW5nIHBvaW50czoKLTEuIFNhbSBCdXNoZWxsJ3MgZnJlZSAiVG8gSlBFRyIgYXBwbGV0IHByb3ZpZGVzIGRyYWctYW5kLWRyb3AgY29udmVyc2lvbiB0bwotSlBFRyB1bmRlciBTeXN0ZW0gNyBhbmQgbGF0ZXIuICBUaGlzIG9ubHkgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUKLWNvbXByZXNzaW9uIGhhbGYgb2YgdGhlIGxpYnJhcnksIGJ1dCBpdCBkb2VzIGEgdmVyeSBuaWNlIGpvYiBvZiB0aGF0IHBhcnQuCi1UaGUgQ29kZVdhcnJpb3Igc291cmNlIGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5wb2JveC5jb20vfmpzYW0uCi0yLiBKaW0gQnJ1bm5lciBwcmVwYXJlZCBhIE1hYy1zdHlsZSB1c2VyIGludGVyZmFjZSBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb24uICBVbmZvcnR1bmF0ZWx5LCBpdCBoYXNuJ3QgYmVlbiB1cGRhdGVkIHNpbmNlIElKRyB2NCwgYW5kCi10aGUgbGlicmFyeSdzIEFQSSBoYXMgY2hhbmdlZCBjb25zaWRlcmFibHkgc2luY2UgdGhlbi4gIFN0aWxsIGl0IG1heSBiZSBvZgotc29tZSBoZWxwLCBwYXJ0aWN1bGFybHkgYXMgYSBndWlkZSB0byBjb21waWxpbmcgdGhlIElKRyBjb2RlIHVuZGVyIFRoaW5rIEMuCi1KaW0ncyBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBJbmZvLU1hYyBhcmNoaXZlcywgYXQgc3VtZXgtYWltLnN0YW5mb3JkLmVkdQotb3IgbWlycm9ycyB0aGVyZW9mOyBzZWUgZmlsZSAvaW5mby1tYWMvZGV2L3NyYy9qcGVnLWNvbnZlcnQtYy5ocXguCi0KLWptZW1tYWMuYyBpcyB0aGUgcmVjb21tZW5kZWQgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgZm9yIE1hY2ludG9zaC4gIEl0IHVzZXMKLU5ld1B0ci9EaXNwb3NlUHRyIGluc3RlYWQgb2YgbWFsbG9jL2ZyZWUsIGFuZCBoYXMgYSBNYWMtc3BlY2lmaWMKLWltcGxlbWVudGF0aW9uIG9mIGpwZWdfbWVtX2F2YWlsYWJsZSgpLiAgSXQgYWxzbyBjcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0aGF0Ci1mb2xsb3cgTWFjIGNvbnZlbnRpb25zLiAgKFRoYXQgcGFydCBvZiB0aGUgY29kZSByZWxpZXMgb24gU3lzdGVtLTctb3ItbGF0ZXIgT1MKLWZ1bmN0aW9ucy4gIFNlZSB0aGUgY29tbWVudHMgaW4gam1lbW1hYy5jIGlmIHlvdSBuZWVkIHRvIHJ1biBpdCBvbiBTeXN0ZW0gNi4pCi1OT1RFIHRoYXQgVVNFX01BQ19NRU1NR1IgbXVzdCBiZSBkZWZpbmVkIGluIGpjb25maWcuaCB0byB1c2Ugam1lbW1hYy5jLgotCi1Zb3UgY2FuIGFsc28gdXNlIGptZW1ub2JzLmMsIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGhhbmRsaW5nIGltYWdlcyBsYXJnZXIKLXRoYW4gYXZhaWxhYmxlIG1lbW9yeS4gIElmIHlvdSB1c2UgYW55IG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIG90aGVyIHRoYW4KLWptZW1tYWMuYywgd2UgcmVjb21tZW5kIHJlcGxhY2luZyAibWFsbG9jIiBhbmQgImZyZWUiIGJ5ICJOZXdQdHIiIGFuZAotIkRpc3Bvc2VQdHIiLCBiZWNhdXNlIE1hYyBDIGxpYnJhcmllcyBvZnRlbiBoYXZlIHBlY3VsaWFyIGltcGxlbWVudGF0aW9ucyBvZgotbWFsbG9jL2ZyZWUuICAoRm9yIGluc3RhbmNlLCBmcmVlKCkgbWF5IG5vdCByZXR1cm4gdGhlIGZyZWVkIHNwYWNlIHRvIHRoZQotTWFjIE1lbW9yeSBNYW5hZ2VyLiAgVGhpcyBpcyB1bmRlc2lyYWJsZSBmb3IgdGhlIElKRyBjb2RlIGJlY2F1c2Ugam1lbW1nci5jCi1hbHJlYWR5IGNsdW1wcyBzcGFjZSByZXF1ZXN0cy4pCi0KLQotTWFjaW50b3NoLCBNZXRyb3dlcmtzIENvZGVXYXJyaW9yOgotCi1UaGUgVW5peC1jb21tYW5kLWxpbmUtc3R5bGUgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGJ5IGRlZmluaW5nIFVTRV9DQ09NTUFORC4KLVlvdSdsbCBhbHNvIG5lZWQgdG8gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FIHRvIGF2b2lkIHN0ZGluL3N0ZG91dC4KLVRoaXMgbWVhbnMgdGhhdCB3aGVuIHVzaW5nIHRoZSBjanBlZy9kanBlZyBwcm9ncmFtcywgeW91J2xsIGhhdmUgdG8gdHlwZSB0aGUKLWlucHV0IGFuZCBvdXRwdXQgZmlsZSBuYW1lcyBpbiB0aGUgIkFyZ3VtZW50cyIgdGV4dC1lZGl0IGJveCwgcmF0aGVyIHRoYW4KLXVzaW5nIHRoZSBmaWxlIHJhZGlvIGJ1dHRvbnMuICAoUGVyaGFwcyBVU0VfRkRPUEVOIG9yIFVTRV9TRVRNT0RFIHdvdWxkCi1lbGltaW5hdGUgdGhlIHByb2JsZW0sIGJ1dCBJIGhhdmVuJ3QgaGVhcmQgZnJvbSBhbnlvbmUgd2hvJ3MgdHJpZWQgaXQuKQotCi1PbiA2ODB4MCBNYWNzLCBNZXRyb3dlcmtzIGRlZmluZXMgdHlwZSAiZG91YmxlIiBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZAotZmxvYXQuICBqbWVtbWdyLmMgd29uJ3QgbGlrZSB0aGlzOiBpdCB3YW50cyBzaXplb2YoQUxJR05fVFlQRSkgdG8gYmUgYSBwb3dlcgotb2YgMi4gIEFkZCAiI2RlZmluZSBBTElHTl9UWVBFIGxvbmciIHRvIGpjb25maWcuaCB0byBlbGltaW5hdGUgdGhlIGNvbXBsYWludC4KLQotVGhlIHN1cHBsaWVkIGNvbmZpZ3VyYXRpb24gZmlsZSBqY29uZmlnLm1hYyBjYW4gYmUgdXNlZCBmb3IgeW91ciBqY29uZmlnLmg7Ci1pdCBpbmNsdWRlcyBhbGwgdGhlIHJlY29tbWVuZGVkIHN5bWJvbCBkZWZpbml0aW9ucy4gIElmIHlvdSBoYXZlIEFwcGxlU2NyaXB0Ci1pbnN0YWxsZWQsIHlvdSBjYW4gcnVuIHRoZSBzdXBwbGllZCBzY3JpcHQgbWFrZXByb2oubWFjIHRvIGNyZWF0ZSBDb2RlV2FycmlvcgotcHJvamVjdCBmaWxlcyBmb3IgdGhlIGxpYnJhcnkgYW5kIHRoZSB0ZXN0YmVkIGFwcGxpY2F0aW9ucywgdGhlbiBidWlsZCB0aGUKLWxpYnJhcnkgYW5kIGFwcGxpY2F0aW9ucy4gIChUaGFua3MgdG8gRGFuIFNlYXJzIGFuZCBEb24gQWdybyBmb3IgdGhpcyBuaWZ0eQotaGFjaywgd2hpY2ggc2F2ZXMgdXMgZnJvbSB0cnlpbmcgdG8gbWFpbnRhaW4gQ29kZVdhcnJpb3IgcHJvamVjdCBmaWxlcyBhcyBwYXJ0Ci1vZiB0aGUgSUpHIGRpc3RyaWJ1dGlvbi4uLikKLQotCi1NYWNpbnRvc2gsIFRoaW5rIEM6Ci0KLVRoZSBkb2N1bWVudGF0aW9uIGluIEppbSBCcnVubmVyJ3MgIkpQRUcgQ29udmVydCIgc291cmNlIGNvZGUgKHNlZSBhYm92ZSkKLWluY2x1ZGVzIGRldGFpbGVkIGJ1aWxkIGluc3RydWN0aW9ucyBmb3IgVGhpbmsgQzsgaXQncyBwcm9iYWJseSBzb21ld2hhdAotb3V0IG9mIGRhdGUgZm9yIHRoZSBjdXJyZW50IHJlbGVhc2UsIGJ1dCBtYXkgYmUgaGVscGZ1bC4KLQotSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIG1pbmltYWwgY29tbWFuZCBsaW5lIHZlcnNpb24sIHByb2NlZWQgYXMgZm9sbG93cy4KLVlvdSdsbCBoYXZlIHRvIHByZXBhcmUgcHJvamVjdCBmaWxlcyBmb3IgdGhlIHByb2dyYW1zOyB3ZSBkb24ndCBpbmNsdWRlIGFueQotaW4gdGhlIGRpc3RyaWJ1dGlvbiBzaW5jZSB0aGV5IGFyZSBub3QgdGV4dCBmaWxlcy4gIFVzZSB0aGUgZmlsZSBsaXN0cyBpbgotYW55IG9mIHRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYXMgYSBndWlkZS4gIEFsc28gYWRkIHRoZSBBTlNJIGFuZCBVbml4IEMKLWxpYnJhcmllcyBpbiBhIHNlcGFyYXRlIHNlZ21lbnQuICBZb3UgbWF5IG5lZWQgdG8gZGl2aWRlIHRoZSBKUEVHIGZpbGVzIGludG8KLW1vcmUgdGhhbiBvbmUgc2VnbWVudDsgd2UgcmVjb21tZW5kIGRpdmlkaW5nIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1tb2R1bGVzLiAgRGVmaW5lIFVTRV9DQ09NTUFORCBpbiBqY29uZmlnLmggc28gdGhhdCB0aGUgY2NvbW1hbmQoKSByb3V0aW5lIGlzCi1jYWxsZWQuICBZb3UgbXVzdCBhbHNvIGRlZmluZSBUV09fRklMRV9DT01NQU5ETElORSBiZWNhdXNlIHN0ZGluL3N0ZG91dAotZG9uJ3QgaGFuZGxlIGJpbmFyeSBkYXRhIGNvcnJlY3RseS4KLQotT24gNjgweDAgTWFjcywgVGhpbmsgQyBkZWZpbmVzIHR5cGUgImRvdWJsZSIgYXMgYSAxMi1ieXRlIElFRUUgZXh0ZW5kZWQgZmxvYXQuCi1qbWVtbWdyLmMgd29uJ3QgbGlrZSB0aGlzOiBpdCB3YW50cyBzaXplb2YoQUxJR05fVFlQRSkgdG8gYmUgYSBwb3dlciBvZiAyLgotQWRkICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgdG8gamNvbmZpZy5oIHRvIGVsaW1pbmF0ZSB0aGUgY29tcGxhaW50LgotCi1qY29uZmlnLm1hYyBzaG91bGQgd29yayBhcyBhIGpjb25maWcuaCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIFRoaW5rIEMsCi1idXQgdGhlIG1ha2Vwcm9qLm1hYyBBcHBsZVNjcmlwdCBzY3JpcHQgaXMgc3BlY2lmaWMgdG8gQ29kZVdhcnJpb3IuICBTb3JyeS4KLQotCi1NSVBTIFIzMDAwOgotCi1NSVBTJ3MgY2MgdmVyc2lvbiAxLjMxIGhhcyBhIHJhdGhlciBuYXN0eSBvcHRpbWl6YXRpb24gYnVnLiAgRG9uJ3QgdXNlIC1PCi1pZiB5b3UgaGF2ZSB0aGF0IGNvbXBpbGVyIHZlcnNpb24uICAoVXNlICJjYyAtViIgdG8gY2hlY2sgdGhlIHZlcnNpb24uKQotTm90ZSB0aGF0IHRoZSBSMzAwMCBjaGlwIGlzIGZvdW5kIGluIHdvcmtzdGF0aW9ucyBmcm9tIERFQyBhbmQgb3RoZXJzLgotCi0KLU1TLURPUywgZ2VuZXJpYyBjb21tZW50cyBmb3IgMTYtYml0IGNvbXBpbGVyczoKLQotVGhlIElKRyBjb2RlIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2VsbCBpbiA4MHg4NiAic21hbGwiIG9yICJtZWRpdW0iIG1lbW9yeQotbW9kZWxzIChpLmUuLCBkYXRhIHBvaW50ZXJzIGFyZSAxNiBiaXRzIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkICJmYXIiOwotY29kZSBwb2ludGVycyBjYW4gYmUgZWl0aGVyIHNpemUpLiAgWW91IG1heSBiZSBhYmxlIHRvIHVzZSBzbWFsbCBtb2RlbCB0bwotY29tcGlsZSBjanBlZyBvciBkanBlZyBieSBpdHNlbGYsIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZSBtZWRpdW0KLW1vZGVsIGZvciBhbnkgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3b24ndCBtYWtlIG11Y2ggZGlmZmVyZW5jZSBpbgotcGVyZm9ybWFuY2UuICBZb3UgKndpbGwqIHRha2UgYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGhpdCBpZiB5b3UgdXNlIGEKLWxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsLCBhbmQgeW91IHNob3VsZCBhdm9pZCAiaHVnZSIgbW9kZWwgaWYgYXQgYWxsCi1wb3NzaWJsZS4gIEJlIHN1cmUgdGhhdCBORUVEX0ZBUl9QT0lOVEVSUyBpcyBkZWZpbmVkIGluIGpjb25maWcuaCBpZiB5b3UgdXNlCi1hIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsOyBiZSBzdXJlIGl0IGlzIE5PVCBkZWZpbmVkIGlmIHlvdSB1c2UgYSBsYXJnZS1kYXRhCi1tb2RlbC4gIChUaGUgc3VwcGxpZWQgbWFrZWZpbGVzIGFuZCBqY29uZmlnIGZpbGVzIGZvciBCb3JsYW5kIGFuZCBNaWNyb3NvZnQgQwotY29tcGlsZSBpbiBtZWRpdW0gbW9kZWwgYW5kIGRlZmluZSBORUVEX0ZBUl9QT0lOVEVSUy4pCi0KLVRoZSBET1Mtc3BlY2lmaWMgbWVtb3J5IG1hbmFnZXIsIGptZW1kb3MuYywgc2hvdWxkIGJlIHVzZWQgaWYgcG9zc2libGUuCi1JdCBuZWVkcyBzb21lIGFzc2VtYmx5LWNvZGUgcm91dGluZXMgd2hpY2ggYXJlIGluIGptZW1kb3NhLmFzbTsgbWFrZSBzdXJlCi15b3VyIG1ha2VmaWxlIGFzc2VtYmxlcyB0aGF0IGZpbGUgYW5kIGluY2x1ZGVzIGl0IGluIHRoZSBsaWJyYXJ5LiAgSWYgeW91Ci1kb24ndCBoYXZlIGEgc3VpdGFibGUgYXNzZW1ibGVyLCB5b3UgY2FuIGdldCBwcmUtYXNzZW1ibGVkIG9iamVjdCBmaWxlcyBmb3IKLWptZW1kb3NhIGJ5IEZUUCBmcm9tIGZ0cC51dS5uZXQ6L2dyYXBoaWNzL2pwZWcvamRvc2FvYmouemlwLiAgKERPUy1vcmllbnRlZAotZGlzdHJpYnV0aW9ucyBvZiB0aGUgSUpHIHNvdXJjZSBjb2RlIG9mdGVuIGluY2x1ZGUgdGhlc2Ugb2JqZWN0IGZpbGVzLikKLQotV2hlbiB1c2luZyBqbWVtZG9zLmMsIGpjb25maWcuaCBtdXN0IGRlZmluZSBVU0VfTVNET1NfTUVNTUdSIGFuZCBtdXN0IHNldAotTUFYX0FMTE9DX0NIVU5LIHRvIGxlc3MgdGhhbiA2NEsgKDY1NTIwTCBpcyBhIHR5cGljYWwgdmFsdWUpLiAgSWYgeW91cgotQyBsaWJyYXJ5J3MgZmFyLWhlYXAgbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgYmxvY2tzIHRoYXQgbGFyZ2UsIHJlZHVjZQotTUFYX0FMTE9DX0NIVU5LIHRvIHdoYXRldmVyIGl0IGNhbiBoYW5kbGUuCi0KLUlmIHlvdSBjYW4ndCB1c2Ugam1lbWRvcy5jIGZvciBzb21lIHJlYXNvbiAtLS0gZm9yIGV4YW1wbGUsIGJlY2F1c2UgeW91Ci1kb24ndCBoYXZlIGFuIGFzc2VtYmxlciB0byBhc3NlbWJsZSBqbWVtZG9zYS5hc20gLS0tIHlvdSdsbCBoYXZlIHRvIGZhbGwKLWJhY2sgdG8gam1lbWFuc2kuYyBvciBqbWVtbmFtZS5jLiAgWW91J2xsIHByb2JhYmx5IHN0aWxsIG5lZWQgdG8gc2V0Ci1NQVhfQUxMT0NfQ0hVTksgaW4gamNvbmZpZy5oLCBiZWNhdXNlIG1vc3QgRE9TIEMgbGlicmFyaWVzIHdvbid0IG1hbGxvYygpCi1tb3JlIHRoYW4gNjRLIGF0IGEgdGltZS4gIElNUE9SVEFOVDogaWYgeW91IHVzZSBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMsCi15b3Ugd2lsbCBoYXZlIHRvIGNvbXBpbGUgaW4gYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBpbiBvcmRlciB0byBnZXQgdGhlCi1yaWdodCBzdGRpbyBsaWJyYXJ5LiAgVG9vIGJhZC4KLQotd3JqcGdjb20gbmVlZHMgdG8gYmUgY29tcGlsZWQgaW4gbGFyZ2UgbW9kZWwsIGJlY2F1c2UgaXQgbWFsbG9jKClzIGEgNjRLQgotd29yayBhcmVhIHRvIGhvbGQgdGhlIGNvbW1lbnQgdGV4dC4gIElmIHlvdXIgQyBsaWJyYXJ5J3MgbWFsbG9jIGNhbid0Ci1oYW5kbGUgdGhhdCwgcmVkdWNlIE1BWF9DT01fTEVOR1RIIGFzIG5lY2Vzc2FyeSBpbiB3cmpwZ2NvbS5jLgotCi1Nb3N0IE1TLURPUyBjb21waWxlcnMgdHJlYXQgc3RkaW4vc3Rkb3V0IGFzIHRleHQgZmlsZXMsIHNvIHlvdSBtdXN0IHVzZQotdHdvLWZpbGUgY29tbWFuZCBsaW5lIHN0eWxlLiAgQnV0IGlmIHlvdXIgY29tcGlsZXIgaGFzIGVpdGhlciBmZG9wZW4oKSBvcgotc2V0bW9kZSgpLCB5b3UgY2FuIHVzZSBvbmUtZmlsZSBzdHlsZSBpZiB5b3UgbGlrZS4gIFRvIGRvIHRoaXMsIGRlZmluZQotVVNFX1NFVE1PREUgb3IgVVNFX0ZET1BFTiBzbyB0aGF0IHN0ZGluL3N0ZG91dCB3aWxsIGJlIHNldCB0byBiaW5hcnkgbW9kZS4KLShVU0VfU0VUTU9ERSBzZWVtcyB0byB3b3JrIHdpdGggbW9yZSBET1MgY29tcGlsZXJzIHRoYW4gVVNFX0ZET1BFTi4pICBZb3UKLXNob3VsZCB0ZXN0IHRoYXQgSS9PIHRocm91Z2ggc3RkaW4vc3Rkb3V0IHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdHMgYXMgSS9PCi10byBleHBsaWNpdGx5IG5hbWVkIGZpbGVzLi4uIHRoZSAibWFrZSB0ZXN0IiBwcm9jZWR1cmVzIGluIHRoZSBzdXBwbGllZAotbWFrZWZpbGVzIGRvIE5PVCB1c2Ugc3RkaW4vc3Rkb3V0LgotCi0KLU1TLURPUywgZ2VuZXJpYyBjb21tZW50cyBmb3IgMzItYml0IGNvbXBpbGVyczoKLQotTm9uZSBvZiB0aGUgYWJvdmUgY29tbWVudHMgYWJvdXQgbWVtb3J5IG1vZGVscyBhcHBseSBpZiB5b3UgYXJlIHVzaW5nIGEKLTMyLWJpdCBmbGF0LW1lbW9yeS1zcGFjZSBlbnZpcm9ubWVudCwgc3VjaCBhcyBESkdQUCBvciBXYXRjb20gQy4gIChBbmQgeW91Ci1zaG91bGQgdXNlIG9uZSBpZiB5b3UgaGF2ZSBpdCwgYXMgcGVyZm9ybWFuY2Ugd2lsbCBiZSBtdWNoIGJldHRlciB0aGFuCi04MDg2LWNvbXBhdGlibGUgY29kZSEpICBGb3IgZmxhdC1tZW1vcnktc3BhY2UgY29tcGlsZXJzLCBkbyBOT1QgZGVmaW5lCi1ORUVEX0ZBUl9QT0lOVEVSUywgYW5kIGRvIE5PVCB1c2Ugam1lbWRvcy5jLiAgVXNlIGptZW1ub2JzLmMgaWYgdGhlCi1lbnZpcm9ubWVudCBzdXBwbGllcyBhZGVxdWF0ZSB2aXJ0dWFsIG1lbW9yeSwgb3RoZXJ3aXNlIHVzZSBqbWVtYW5zaS5jIG9yCi1qbWVtbmFtZS5jLgotCi1Zb3UnbGwgc3RpbGwgbmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IGJpbmFyeSBJL08gdGhyb3VnaCBzdGRpbi9zdGRvdXQuCi1TZWUgdGhlIGxhc3QgcGFyYWdyYXBoIG9mIHRoZSBwcmV2aW91cyBzZWN0aW9uLgotCi0KLU1TLURPUywgQm9ybGFuZCBDOgotCi1CZSBzdXJlIHRvIGNvbnZlcnQgYWxsIHRoZSBzb3VyY2UgZmlsZXMgdG8gRE9TIHRleHQgZm9ybWF0IChDUi9MRiBuZXdsaW5lcykuCi1BbHRob3VnaCBCb3JsYW5kIEMgd2lsbCBvZnRlbiB3b3JrIE9LIHdpdGggdW5tb2RpZmllZCBVbml4IChMRiBuZXdsaW5lcykKLXNvdXJjZSBmaWxlcywgc29tZXRpbWVzIGl0IHdpbGwgZ2l2ZSBib2d1cyBjb21waWxlIGVycm9ycy4KLSJJbGxlZ2FsIGNoYXJhY3RlciAnIyciIGlzIHRoZSBtb3N0IGNvbW1vbiBzdWNoIGVycm9yLiAgKFRoaXMgaXMgdHJ1ZSB3aXRoCi1Cb3JsYW5kIEMgMy4xLCBidXQgcGVyaGFwcyBpcyBmaXhlZCBpbiBuZXdlciByZWxlYXNlcy4pCi0KLUlmIHlvdSB3YW50IG9uZS1maWxlIGNvbW1hbmQgbGluZSBzdHlsZSwganVzdCB1bmRlZmluZSBUV09fRklMRV9DT01NQU5ETElORS4KLWpjb25maWcuYmNjIGFscmVhZHkgaW5jbHVkZXMgI2RlZmluZSBVU0VfU0VUTU9ERSB0byBtYWtlIHRoaXMgd29yay4KLShmZG9wZW4gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuKQotCi0KLU1TLURPUywgTWljcm9zb2Z0IEM6Ci0KLW1ha2VmaWxlLm1jNiB3b3JrcyB3aXRoIE1pY3Jvc29mdCBDLCBET1MgVmlzdWFsIEMrKywgZXRjLiAgSXQgc2hvdWxkIG9ubHkKLWJlIHVzZWQgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSAxNi1iaXQgKHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwpIHByb2dyYW0uCi0KLUlmIHlvdSB3YW50IG9uZS1maWxlIGNvbW1hbmQgbGluZSBzdHlsZSwganVzdCB1bmRlZmluZSBUV09fRklMRV9DT01NQU5ETElORS4KLWpjb25maWcubWM2IGFscmVhZHkgaW5jbHVkZXMgI2RlZmluZSBVU0VfU0VUTU9ERSB0byBtYWtlIHRoaXMgd29yay4KLShmZG9wZW4gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuKQotCi1Ob3RlIHRoYXQgdGhpcyBtYWtlZmlsZSBhc3N1bWVzIHRoYXQgdGhlIHdvcmtpbmcgY29weSBvZiBpdHNlbGYgaXMgY2FsbGVkCi0ibWFrZWZpbGUiLiAgSWYgeW91IHdhbnQgdG8gY2FsbCBpdCBzb21ldGhpbmcgZWxzZSwgc2F5ICJtYWtlZmlsZS5tYWsiLAotYmUgc3VyZSB0byBhZGp1c3QgdGhlIGRlcGVuZGVuY3kgbGluZSB0aGF0IHJlYWRzICIkKFJGSUxFKSA6IG1ha2VmaWxlIi4KLU90aGVyd2lzZSB0aGUgbWFrZSB3aWxsIGZhaWwgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGNyZWF0ZSAibWFrZWZpbGUiLgotV29yc2UsIHNvbWUgcmVsZWFzZXMgb2YgTWljcm9zb2Z0J3MgbWFrZSB1dGlsaXRpZXMgZ2l2ZSBhbiBpbmNvcnJlY3QgZXJyb3IKLW1lc3NhZ2UgaW4gdGhpcyBzaXR1YXRpb24uCi0KLU9sZCB2ZXJzaW9ucyBvZiBNUyBDIGZhaWwgd2l0aCBhbiAib3V0IG9mIG1hY3JvIGV4cGFuc2lvbiBzcGFjZSIgZXJyb3IKLWJlY2F1c2UgdGhleSBjYW4ndCBjb3BlIHdpdGggdGhlIG1hY3JvIFRSQUNFTVM4IChkZWZpbmVkIGluIGplcnJvci5oKS4KLUlmIHRoaXMgaGFwcGVucyB0byB5b3UsIHRoZSBlYXNpZXN0IHNvbHV0aW9uIGlzIHRvIGNoYW5nZSBUUkFDRU1TOCB0bwotZXhwYW5kIHRvIG5vdGhpbmcuICBZb3UnbGwgbG9zZSB0aGUgYWJpbGl0eSB0byBkdW1wIG91dCBKUEVHIGNvZWZmaWNpZW50Ci10YWJsZXMgd2l0aCBkanBlZyAtZGVidWcgLWRlYnVnLCBidXQgYXQgbGVhc3QgeW91IGNhbiBjb21waWxlLgotCi1PcmlnaW5hbCBNUyBDIDYuMCBpcyB2ZXJ5IGJ1Z2d5OyBpdCBjb21waWxlcyBpbmNvcnJlY3QgY29kZSB1bmxlc3MgeW91IHR1cm4KLW9mZiBvcHRpbWl6YXRpb24gZW50aXJlbHkgKHJlbW92ZSAtTyBmcm9tIENGTEFHUykuICA2LjAwQSBpcyBiZXR0ZXIsIGJ1dCBpdAotc3RpbGwgZ2VuZXJhdGVzIGJhZCBjb2RlIGlmIHlvdSBlbmFibGUgbG9vcCBvcHRpbWl6YXRpb25zICgtT2wgb3IgLU94KS4KLQotTVMgQyA4LjAgY3Jhc2hlcyB3aGVuIGNvbXBpbGluZyBqcXVhbnQxLmMgd2l0aCBvcHRpbWl6YXRpb24gc3dpdGNoIC9PbyAuLi4KLXdoaWNoIGlzIG9uIGJ5IGRlZmF1bHQuICBUbyB3b3JrIGFyb3VuZCB0aGlzIGJ1ZywgY29tcGlsZSB0aGF0IG9uZSBmaWxlCi13aXRoIC9Pby0uCi0KLQotTWljcm9zb2Z0IFdpbmRvd3MgKGFsbCB2ZXJzaW9ucyksIGdlbmVyaWMgY29tbWVudHM6Ci0KLVNvbWUgV2luZG93cyBzeXN0ZW0gaW5jbHVkZSBmaWxlcyBkZWZpbmUgdHlwZWRlZiBib29sZWFuIGFzICJ1bnNpZ25lZCBjaGFyIi4KLVRoZSBJSkcgY29kZSBhbHNvIGRlZmluZXMgdHlwZWRlZiBib29sZWFuLCBidXQgd2UgbWFrZSBpdCAiaW50IiBieSBkZWZhdWx0LgotVGhpcyBkb2Vzbid0IGFmZmVjdCB0aGUgSUpHIHByb2dyYW1zIGJlY2F1c2Ugd2UgZG9uJ3QgaW1wb3J0IHRob3NlIFdpbmRvd3MKLWluY2x1ZGUgZmlsZXMuICBCdXQgaWYgeW91IHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW0sIGFuZCBzb21lCi1vZiB5b3VyIHByb2dyYW0ncyBmaWxlcyBpbXBvcnQgb25lIGRlZmluaXRpb24gb2YgYm9vbGVhbiB3aGlsZSBzb21lIGltcG9ydCB0aGUKLW90aGVyLCB5b3UgY2FuIGdldCBhbGwgc29ydHMgb2YgbXlzdGVyaW91cyBwcm9ibGVtcy4gIEEgZ29vZCBwcmV2ZW50aXZlIHN0ZXAKLWlzIHRvIG1ha2UgdGhlIElKRyBsaWJyYXJ5IHVzZSAidW5zaWduZWQgY2hhciIgZm9yIGJvb2xlYW4uICBUbyBkbyB0aGF0LAotYWRkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8geW91ciBqY29uZmlnLmggZmlsZToKLQkvKiBEZWZpbmUgImJvb2xlYW4iIGFzIHVuc2lnbmVkIGNoYXIsIG5vdCBpbnQsIHBlciBXaW5kb3dzIGN1c3RvbSAqLwotCSNpZm5kZWYgX19SUENORFJfSF9fCS8qIGRvbid0IGNvbmZsaWN0IGlmIHJwY25kci5oIGFscmVhZHkgcmVhZCAqLwotCXR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOwotCSNlbmRpZgotCSNkZWZpbmUgSEFWRV9CT09MRUFOCS8qIHByZXZlbnQgam1vcmVjZmcuaCBmcm9tIHJlZGVmaW5pbmcgaXQgKi8KLShUaGlzIGlzIGFscmVhZHkgaW4gamNvbmZpZy52YywgYnkgdGhlIHdheS4pCi0KLXdpbmRlZi5oIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMKLQkjZGVmaW5lIGZhcgotCSNkZWZpbmUgRkFSIGZhcgotU2luY2Ugam1vcmVjZmcuaCB0cmllcyB0byBkZWZpbmUgRkFSIGFzIGVtcHR5LCB5b3UgbWF5IGdldCBhIGNvbXBpbGVyCi13YXJuaW5nIGlmIHlvdSBpbmNsdWRlIGJvdGgganBlZ2xpYi5oIGFuZCB3aW5kZWYuaCAod2hpY2ggd2luZG93cy5oCi1pbmNsdWRlcykuICBUbyBzdXBwcmVzcyB0aGUgd2FybmluZywgeW91IGNhbiBwdXQgIiNpZm5kZWYgRkFSIi8iI2VuZGlmIgotYXJvdW5kIHRoZSBsaW5lICIjZGVmaW5lIEZBUiIgaW4gam1vcmVjZmcuaC4KLQotV2hlbiB1c2luZyB0aGUgbGlicmFyeSBpbiBhIFdpbmRvd3MgYXBwbGljYXRpb24sIHlvdSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKLXdhbnQgdG8gbW9kaWZ5IG9yIHJlcGxhY2UgdGhlIGVycm9yIGhhbmRsZXIgbW9kdWxlIGplcnJvci5jLCBzaW5jZSBvdXIKLWRlZmF1bHQgZXJyb3IgaGFuZGxlciBkb2VzIGEgY291cGxlIG9mIGluYXBwcm9wcmlhdGUgdGhpbmdzOgotICAxLiBpdCB0cmllcyB0byB3cml0ZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBvbiBzdGRlcnI7Ci0gIDIuIGluIGV2ZW50IG9mIGEgZmF0YWwgZXJyb3IsIGl0IGV4aXRzIGJ5IGNhbGxpbmcgZXhpdCgpLgotCi1BIHNpbXBsZSBzdG9wZ2FwIHNvbHV0aW9uIGZvciBwcm9ibGVtIDEgaXMgdG8gcmVwbGFjZSB0aGUgbGluZQotCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1ZmZlcik7Ci0oaW4gb3V0cHV0X21lc3NhZ2UgaW4gamVycm9yLmMpIHdpdGgKLQlNZXNzYWdlQm94KEdldEFjdGl2ZVdpbmRvdygpLGJ1ZmZlciwiSlBFRyBFcnJvciIsTUJfT0t8TUJfSUNPTkVSUk9SKTsKLUl0J3MgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGF0IGxlYXN0IGRvIHRoYXQgbXVjaCwgc2luY2Ugb3RoZXJ3aXNlCi1lcnJvciBtZXNzYWdlcyB3aWxsIGRpc2FwcGVhciBpbnRvIG5vd2hlcmUuICAoQmVnaW5uaW5nIHdpdGggSUpHIHY2YiwgdGhpcwotY29kZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gamVycm9yLmM7IGp1c3QgZGVmaW5lIFVTRV9XSU5ET1dTX01FU1NBR0VCT1ggaW4KLWpjb25maWcuaCB0byBlbmFibGUgaXQuKQotCi1UaGUgcHJvcGVyIHNvbHV0aW9uIGZvciBwcm9ibGVtIDIgaXMgdG8gcmV0dXJuIGNvbnRyb2wgdG8geW91ciBjYWxsaW5nCi1hcHBsaWNhdGlvbiBhZnRlciBhIGxpYnJhcnkgZXJyb3IuICBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIHNldGptcC9sb25nam1wCi10ZWNobmlxdWUgZGlzY3Vzc2VkIGluIGxpYmpwZWcuZG9jIGFuZCBpbGx1c3RyYXRlZCBpbiBleGFtcGxlLmMuICAoTk9URToKLXNvbWUgb2xkZXIgV2luZG93cyBDIGNvbXBpbGVycyBwcm92aWRlIHZlcnNpb25zIG9mIHNldGptcC9sb25nam1wIHRoYXQKLWRvbid0IGFjdHVhbGx5IHdvcmsgdW5kZXIgV2luZG93cy4gIFlvdSBtYXkgbmVlZCB0byB1c2UgdGhlIFdpbmRvd3Mgc3lzdGVtCi1mdW5jdGlvbnMgQ2F0Y2ggYW5kIFRocm93IGluc3RlYWQuKQotCi1UaGUgcmVjb21tZW5kZWQgbWVtb3J5IG1hbmFnZXIgdW5kZXIgV2luZG93cyBpcyBqbWVtbm9icy5jOyBpbiBvdGhlciB3b3JkcywKLWxldCBXaW5kb3dzIGRvIGFueSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IG5lZWRlZC4gIFlvdSBzaG91bGQgTk9UIHVzZQotam1lbWRvcy5jIG5vciBqbWVtZG9zYS5hc20gdW5kZXIgV2luZG93cy4KLQotRm9yIFdpbmRvd3MgMy4xLCB3ZSByZWNvbW1lbmQgY29tcGlsaW5nIGluIG1lZGl1bSBvciBsYXJnZSBtZW1vcnkgbW9kZWw7Ci1mb3IgbmV3ZXIgV2luZG93cyB2ZXJzaW9ucywgdXNlIGEgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsLiAgKFNlZSB0aGUgTVMtRE9TCi1zZWN0aW9ucyBhYm92ZSBmb3IgbW9yZSBpbmZvIGFib3V0IG1lbW9yeSBtb2RlbHMuKSAgSW4gdGhlIDE2LWJpdCBtZW1vcnkKLW1vZGVscyBvbmx5LCB5b3UnbGwgbmVlZCB0byBwdXQKLQkjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCi1pbnRvIGpjb25maWcuaCB0byBsaW1pdCBhbGxvY2F0aW9uIGNodW5rcyB0byA2NEtiLiAgKFdpdGhvdXQgdGhhdCwgeW91J2QKLWhhdmUgdG8gdXNlIGh1Z2UgbWVtb3J5IG1vZGVsLCB3aGljaCBzbG93cyB0aGluZ3MgZG93biB1bm5lY2Vzc2FyaWx5LikKLWptZW1ub2JzLmMgd29ya3Mgd2l0aG91dCBtb2RpZmljYXRpb24gaW4gbGFyZ2Ugb3IgZmxhdCBtZW1vcnkgbW9kZWxzLCBidXQgdG8KLXVzZSBtZWRpdW0gbW9kZWwsIHlvdSBuZWVkIHRvIG1vZGlmeSBpdHMganBlZ19nZXRfbGFyZ2UgYW5kIGpwZWdfZnJlZV9sYXJnZQotcm91dGluZXMgdG8gYWxsb2NhdGUgZmFyIG1lbW9yeS4gIEluIGFueSBjYXNlLCB5b3UgbWlnaHQgbGlrZSB0byByZXBsYWNlCi1pdHMgY2FsbHMgdG8gbWFsbG9jIGFuZCBmcmVlIHdpdGggZGlyZWN0IGNhbGxzIG9uIFdpbmRvd3MgbWVtb3J5IGFsbG9jYXRpb24KLWZ1bmN0aW9ucy4KLQotWW91IG1heSBhbHNvIHdhbnQgdG8gbW9kaWZ5IGpkYXRhc3JjLmMgYW5kIGpkYXRhZHN0LmMgdG8gdXNlIFdpbmRvd3MgZmlsZQotb3BlcmF0aW9ucyByYXRoZXIgdGhhbiBmcmVhZC9md3JpdGUuICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdXIgQwotY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIGEgY29tcGV0ZW50IGltcGxlbWVudGF0aW9uIG9mIEMgc3RkaW8gZnVuY3Rpb25zLgotCi1Zb3UgbWlnaHQgd2FudCB0byB0d2VhayB0aGUgUkdCX3h4eCBtYWNyb3MgaW4gam1vcmVjZmcuaCBzbyB0aGF0IHRoZSBsaWJyYXJ5Ci13aWxsIGFjY2VwdCBvciBkZWxpdmVyIGNvbG9yIHBpeGVscyBpbiBCR1Igc2FtcGxlIG9yZGVyLCBub3QgUkdCOyBCR1Igb3JkZXIKLWlzIHVzdWFsbHkgbW9yZSBjb252ZW5pZW50IHVuZGVyIFdpbmRvd3MuICBOb3RlIHRoYXQgdGhpcyBjaGFuZ2Ugd2lsbCBicmVhawotdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcvZGpwZWcsIGJ1dCB0aGUgbGlicmFyeSBpdHNlbGYgd29ya3MgZmluZS4KLQotCi1NYW55IHBlb3BsZSB3YW50IHRvIGNvbnZlcnQgdGhlIElKRyBsaWJyYXJ5IGludG8gYSBETEwuICBUaGlzIGlzIHJlYXNvbmFibHkKLXN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHdhdGNoIG91dCBmb3IgdGhlIGZvbGxvd2luZzoKLQotICAxLiBEb24ndCB0cnkgdG8gY29tcGlsZSBhcyBhIERMTCBpbiBzbWFsbCBvciBtZWRpdW0gbWVtb3J5IG1vZGVsOyB1c2UKLWxhcmdlIG1vZGVsLCBvciBldmVuIGJldHRlciwgMzItYml0IGZsYXQgbW9kZWwuICBNYW55IHBsYWNlcyBpbiB0aGUgSUpHIGNvZGUKLWFzc3VtZSB0aGUgYWRkcmVzcyBvZiBhIGxvY2FsIHZhcmlhYmxlIGlzIGFuIG9yZGluYXJ5IChub3QgRkFSKSBwb2ludGVyOwotdGhhdCBpc24ndCB0cnVlIGluIGEgbWVkaXVtLW1vZGVsIERMTC4KLQotICAyLiBNaWNyb3NvZnQgQyBjYW5ub3QgcGFzcyBmaWxlIHBvaW50ZXJzIGJldHdlZW4gYXBwbGljYXRpb25zIGFuZCBETExzLgotKFNlZSBNaWNyb3NvZnQgS25vd2xlZGdlIEJhc2UsIFBTUyBJRCBOdW1iZXIgUTUwMzM2LikgIFNvIGpkYXRhc3JjLmMgYW5kCi1qZGF0YWRzdC5jIGRvbid0IHdvcmsgaWYgeW91IG9wZW4gYSBmaWxlIGluIHlvdXIgYXBwbGljYXRpb24gYW5kIHRoZW4gcGFzcwotdGhlIHBvaW50ZXIgdG8gdGhlIERMTC4gIE9uZSB3b3JrYXJvdW5kIGlzIHRvIG1ha2UgamRhdGFzcmMuYy9qZGF0YWRzdC5jCi1wYXJ0IG9mIHlvdXIgbWFpbiBhcHBsaWNhdGlvbiByYXRoZXIgdGhhbiBwYXJ0IG9mIHRoZSBETEwuCi0KLSAgMy4gWW91J2xsIHByb2JhYmx5IG5lZWQgdG8gbW9kaWZ5IHRoZSBtYWNyb3MgR0xPQkFMKCkgYW5kIEVYVEVSTigpIHRvCi1hdHRhY2ggc3VpdGFibGUgbGlua2FnZSBrZXl3b3JkcyB0byB0aGUgZXhwb3J0ZWQgcm91dGluZSBuYW1lcy4gIFNpbWlsYXJseSwKLXlvdSdsbCB3YW50IHRvIG1vZGlmeSBNRVRIT0RERUYoKSBhbmQgSk1FVEhPRCgpIHRvIGVuc3VyZSBmdW5jdGlvbiBwb2ludGVycwotYXJlIGRlY2xhcmVkIGluIGEgd2F5IHRoYXQgbGV0cyBhcHBsaWNhdGlvbiByb3V0aW5lcyBiZSBjYWxsZWQgYmFjayB0aHJvdWdoCi10aGUgZnVuY3Rpb24gcG9pbnRlcnMuICBUaGVzZSBtYWNyb3MgYXJlIGluIGptb3JlY2ZnLmguICBUeXBpY2FsIGRlZmluaXRpb25zCi1mb3IgYSAxNi1iaXQgRExMIGFyZToKLQkjZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZSBfZmFyIF9wYXNjYWwgX2xvYWRkcyBfZXhwb3J0Ci0JI2RlZmluZSBFWFRFUk4odHlwZSkJCWV4dGVybiB0eXBlIF9mYXIgX3Bhc2NhbCBfbG9hZGRzCi0JI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlIF9mYXIgX3Bhc2NhbAotCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIFwKLQkJdHlwZSAoX2ZhciBfcGFzY2FsICptZXRob2RuYW1lKSBhcmdsaXN0Ci1Gb3IgYSAzMi1iaXQgRExMIHlvdSBtYXkgd2FudCBzb21ldGhpbmcgbGlrZQotCSNkZWZpbmUgR0xPQkFMKHR5cGUpCQlfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZQotCSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHR5cGUKLUFsdGhvdWdoIG5vdCBhbGwgdGhlIEdMT0JBTCByb3V0aW5lcyBhcmUgYWN0dWFsbHkgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGJ5Ci10aGUgYXBwbGljYXRpb24sIHRoZSBwZXJmb3JtYW5jZSBjb3N0IG9mIG1ha2luZyB0aGVtIGFsbCBETEwgZW50cnkgcG9pbnRzIGlzCi1uZWdsaWdpYmxlLgotCi1UaGUgdW5tb2RpZmllZCBJSkcgbGlicmFyeSBwcmVzZW50cyBhIHZlcnkgQy1zcGVjaWZpYyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UsCi1zbyB0aGUgcmVzdWx0aW5nIERMTCBpcyBvbmx5IHVzYWJsZSBmcm9tIEMgb3IgQysrIGFwcGxpY2F0aW9ucy4gIFRoZXJlIGhhcwotYmVlbiBzb21lIHRhbGsgb2Ygd3JpdGluZyB3cmFwcGVyIGNvZGUgdGhhdCB3b3VsZCBwcmVzZW50IGEgc2ltcGxlciBpbnRlcmZhY2UKLXVzYWJsZSBmcm9tIG90aGVyIGxhbmd1YWdlcywgc3VjaCBhcyBWaXN1YWwgQmFzaWMuICBUaGlzIGlzIG9uIG91ciB0by1kbyBsaXN0Ci1idXQgaGFzbid0IGJlZW4gdmVyeSBoaWdoIHByaW9yaXR5IC0tLSBhbnkgdm9sdW50ZWVycyBvdXQgdGhlcmU/Ci0KLQotTWljcm9zb2Z0IFdpbmRvd3MsIEJvcmxhbmQgQzoKLQotVGhlIHByb3ZpZGVkIGpjb25maWcuYmNjIHNob3VsZCB3b3JrIE9LIGluIGEgMzItYml0IFdpbmRvd3MgZW52aXJvbm1lbnQsCi1idXQgeW91J2xsIG5lZWQgdG8gdHdlYWsgaXQgaW4gYSAxNi1iaXQgZW52aXJvbm1lbnQgKHlvdSdkIG5lZWQgdG8gZGVmaW5lCi1ORUVEX0ZBUl9QT0lOVEVSUyBhbmQgTUFYX0FMTE9DX0NIVU5LKS4gIEJld2FyZSB0aGF0IG1ha2VmaWxlLmJjYyB3aWxsIG5lZWQKLWFsdGVyYXRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGl0IGZvciBXaW5kb3dzIC0tLSBpbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkCi11c2Ugam1lbW5vYnMuYyBub3Qgam1lbWRvcy5jIHVuZGVyIFdpbmRvd3MuCi0KLUJvcmxhbmQgQysrIDQuNSBmYWlscyB3aXRoIGFuIGludGVybmFsIGNvbXBpbGVyIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUKLWpkbWVyZ2UuYyBpbiAzMi1iaXQgbW9kZS4gIElmIGVub3VnaCBwZW9wbGUgY29tcGxhaW4sIHBlcmhhcHMgQm9ybGFuZCB3aWxsIGZpeAotaXQuICBJbiB0aGUgbWVhbnRpbWUsIHRoZSBzaW1wbGVzdCBrbm93biB3b3JrYXJvdW5kIGlzIHRvIGFkZCBhIHJlZHVuZGFudAotZGVmaW5pdGlvbiBvZiB0aGUgdmFyaWFibGUgcmFuZ2VfbGltaXQgaW4gaDJ2MV9tZXJnZWRfdXBzYW1wbGUoKSwgYXQgdGhlIGhlYWQKLW9mIHRoZSBibG9jayB0aGF0IGhhbmRsZXMgb2RkIGltYWdlIHdpZHRoIChhYm91dCBsaW5lIDI2OCBpbiB2NiBqZG1lcmdlLmMpOgotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OyAvKiBBREQgVEhJUyAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLVByZXR0eSBiaXphcnJlLCBlc3BlY2lhbGx5IHNpbmNlIHRoZSB2ZXJ5IHNpbWlsYXIgcm91dGluZSBoMnYyX21lcmdlZF91cHNhbXBsZQotZG9lc24ndCB0cmlnZ2VyIHRoZSBidWcuCi1SZWNlbnQgcmVwb3J0cyBzdWdnZXN0IHRoYXQgdGhpcyBidWcgZG9lcyBub3Qgb2NjdXIgd2l0aCAiYmNjMzJhIiAodGhlCi1QZW50aXVtLW9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlcikuCi0KLUFub3RoZXIgcmVwb3J0IGZyb20gYSB1c2VyIG9mIEJvcmxhbmQgQyA0LjUgd2FzIHRoYXQgaW5jb3JyZWN0IGNvZGUgKGxlYWRpbmcKLXRvIGEgY29sb3Igc2hpZnQgaW4gcHJvY2Vzc2VkIGltYWdlcykgd2FzIHByb2R1Y2VkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nCi1vcHRpbWl6YXRpb24gc3dpdGNoIGNvbWJpbmF0aW9ucyB3ZXJlIHVzZWQ6IAotCS1PdCAtT2cKLQktT3QgLU9wCi0JLU90IC1PbQotU28gdHJ5IGJhY2tpbmcgb2ZmIG9uIG9wdGltaXphdGlvbiBpZiB5b3Ugc2VlIHN1Y2ggYSBwcm9ibGVtLiAgKEFyZSB0aGVyZQotc2V2ZXJhbCBkaWZmZXJlbnQgcmVsZWFzZXMgYWxsIG51bWJlcmVkICI0LjUiPz8pCi0KLQotTWljcm9zb2Z0IFdpbmRvd3MsIE1pY3Jvc29mdCBWaXN1YWwgQysrOgotCi1qY29uZmlnLnZjIHNob3VsZCB3b3JrIE9LIHdpdGggYW55IE1pY3Jvc29mdCBjb21waWxlciBmb3IgYSAzMi1iaXQgbWVtb3J5Ci1tb2RlbC4gIG1ha2VmaWxlLnZjIGlzIGludGVuZGVkIGZvciBjb21tYW5kLWxpbmUgdXNlLiAgKElmIHlvdSBhcmUgdXNpbmcKLXRoZSBEZXZlbG9wZXIgU3R1ZGlvIGVudmlyb25tZW50LCB5b3UgbWF5IHByZWZlciB0aGUgRGV2U3R1ZGlvIHByb2plY3QKLWZpbGVzOyBzZWUgYmVsb3cuKQotCi1Tb21lIHVzZXJzIGZlZWwgdGhhdCBpdCdzIGVhc2llciB0byBjYWxsIHRoZSBsaWJyYXJ5IGZyb20gQysrIGNvZGUgaWYgeW91Ci1mb3JjZSBWQysrIHRvIHRyZWF0IHRoZSBsaWJyYXJ5IGFzIEMrKyBjb2RlLCB3aGljaCB5b3UgY2FuIGRvIGJ5IHJlbmFtaW5nCi1hbGwgdGhlICouYyBmaWxlcyB0byAqLmNwcCAoYW5kIGFkanVzdGluZyB0aGUgbWFrZWZpbGUgdG8gbWF0Y2gpLiAgVGhpcwotYXZvaWRzIHRoZSBuZWVkIHRvIHB1dCBleHRlcm4gIkMiIHsgLi4uIH0gYXJvdW5kICNpbmNsdWRlICJqcGVnbGliLmgiIGluCi15b3VyIEMrKyBhcHBsaWNhdGlvbi4KLQotCi1NaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW86Ci0KLVdlIGluY2x1ZGUgbWFrZWZpbGVzIHRoYXQgc2hvdWxkIHdvcmsgYXMgcHJvamVjdCBmaWxlcyBpbiBEZXZTdHVkaW8gNC4yIG9yCi1sYXRlci4gIFRoZXJlIGlzIGEgbGlicmFyeSBtYWtlZmlsZSB0aGF0IGJ1aWxkcyB0aGUgSUpHIGxpYnJhcnkgYXMgYSBzdGF0aWMKLVdpbjMyIGxpYnJhcnksIGFuZCBhbiBhcHBsaWNhdGlvbiBtYWtlZmlsZSB0aGF0IGJ1aWxkcyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucwotYXMgV2luMzIgY29uc29sZSBhcHBsaWNhdGlvbnMuICAoRXZlbiBpZiB5b3Ugb25seSB3YW50IHRoZSBsaWJyYXJ5LCB3ZQotcmVjb21tZW5kIGJ1aWxkaW5nIHRoZSBhcHBsaWNhdGlvbnMgc28gdGhhdCB5b3UgY2FuIHJ1biB0aGUgc2VsZi10ZXN0LikKLQotVG8gdXNlOgotMS4gQ29weSBqY29uZmlnLnZjIHRvIGpjb25maWcuaCwgbWFrZWxpYi5kcyB0byBqcGVnLm1haywgYW5kCi0gICBtYWtlYXBwcy5kcyB0byBhcHBzLm1hay4gIChOb3RlIHRoYXQgdGhlIHJlbmFtaW5nIGlzIGNyaXRpY2FsISkKLTIuIENsaWNrIG9uIHRoZSAubWFrIGZpbGVzIHRvIGNvbnN0cnVjdCBwcm9qZWN0IHdvcmtzcGFjZXMuCi0gICAoSWYgeW91IGFyZSB1c2luZyBEZXZTdHVkaW8gbW9yZSByZWNlbnQgdGhhbiA0LjIsIHlvdSdsbCBwcm9iYWJseQotICAgZ2V0IGEgbWVzc2FnZSBzYXlpbmcgdGhhdCB0aGUgbWFrZWZpbGVzIGFyZSBiZWluZyB1cGRhdGVkLikKLTMuIEJ1aWxkIHRoZSBsaWJyYXJ5IHByb2plY3QsIHRoZW4gdGhlIGFwcGxpY2F0aW9ucyBwcm9qZWN0LgotNC4gTW92ZSB0aGUgYXBwbGljYXRpb24gLmV4ZSBmaWxlcyBmcm9tIGBhcHBgXFJlbGVhc2UgdG8gYW4KLSAgIGFwcHJvcHJpYXRlIGxvY2F0aW9uIG9uIHlvdXIgcGF0aC4KLTUuIFRvIHBlcmZvcm0gdGhlIHNlbGYtdGVzdCwgZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lCi0JTk1BS0UgL2YgbWFrZWZpbGUudmMgIHRlc3QKLQotCi1PUy8yLCBCb3JsYW5kIEMrKzoKLQotV2F0Y2ggb3V0IGZvciBvcHRpbWl6YXRpb24gYnVncyBpbiBvbGRlciBCb3JsYW5kIGNvbXBpbGVyczsgeW91IG1heSBuZWVkCi10byBiYWNrIG9mZiB0aGUgb3B0aW1pemF0aW9uIHN3aXRjaCBzZXR0aW5ncy4gIFNlZSB0aGUgY29tbWVudHMgaW4KLW1ha2VmaWxlLmJjYy4KLQotCi1TR0k6Ci0KLU9uIHNvbWUgU0dJIHN5c3RlbXMsIHlvdSBtYXkgbmVlZCB0byBzZXQgIkFSMj0gYXIgLXRzIiBpbiB0aGUgTWFrZWZpbGUuCi1JZiB5b3UgYXJlIHVzaW5nIGNvbmZpZ3VyZSwgeW91IGNhbiBkbyB0aGlzIGJ5IHNheWluZwotCS4vY29uZmlndXJlIFJBTkxJQj0nYXIgLXRzJwotVGhpcyBjaGFuZ2UgaXMgbm90IG5lZWRlZCBvbiBhbGwgU0dJcy4gIFVzZSBpdCBvbmx5IGlmIHRoZSBtYWtlIGZhaWxzIGF0IHRoZQotc3RhZ2Ugb2YgbGlua2luZyB0aGUgY29tcGxldGVkIHByb2dyYW1zLgotCi1PbiB0aGUgTUlQUyBSNDAwMCBhcmNoaXRlY3R1cmUgKEluZHksIGV0Yy4pLCB0aGUgY29tcGlsZXIgb3B0aW9uICItbWlwczIiCi1yZXBvcnRlZGx5IHNwZWVkcyB1cCB0aGUgZmxvYXQgRENUIG1ldGhvZCBzdWJzdGFudGlhbGx5LCBlbm91Z2ggdG8gbWFrZSBpdAotZmFzdGVyIHRoYW4gdGhlIGRlZmF1bHQgaW50IG1ldGhvZCAoYnV0IHN0aWxsIHNsb3dlciB0aGFuIHRoZSBmYXN0IGludAotbWV0aG9kKS4gIElmIHlvdSB1c2UgLW1pcHMyLCB5b3UgbWF5IHdhbnQgdG8gYWx0ZXIgdGhlIGRlZmF1bHQgRENUIG1ldGhvZCB0bwotYmUgZmxvYXQuICBUbyBkbyB0aGlzLCBwdXQgIiNkZWZpbmUgSkRDVF9ERUZBVUxUIEpEQ1RfRkxPQVQiIGluIGpjb25maWcuaC4KLQotCi1WTVM6Ci0KLU9uIGFuIEFscGhhL1ZNUyBzeXN0ZW0gd2l0aCBNTVMsIGJlIHN1cmUgdG8gdXNlIHRoZSAiL01hcmNvPUFscGhhPTEiCi1xdWFsaWZpZXIgd2l0aCBNTVMgd2hlbiBidWlsZGluZyB0aGUgSlBFRyBwYWNrYWdlLgotCi1WQVgvVk1TIHY1LjUtMSBtYXkgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0IHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2NlZHVyZQotcmVwb3J0aW5nIGRpZmZlcmVuY2VzIHdoZW4gaXQgY29tcGFyZXMgdGhlIG9yaWdpbmFsIGFuZCB0ZXN0IGltYWdlcy4gIElmIHRoZQotZXJyb3IgcG9pbnRzIHRvIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBmaWxlcywgaXQgaXMgbW9zdCBsaWtlbHkgYm9ndXMgYW5kIG1heQotYmUgc2FmZWx5IGlnbm9yZWQuICBJdCBzZWVtcyB0byBiZSBiZWNhdXNlIHRoZSBmaWxlcyBhcmUgU3RyZWFtX0xGIGFuZAotQmFja3VwL0NvbXBhcmUgaGFzIGRpZmZpY3VsdHkgd2l0aCB0aGUgKHByZXN1bWFibHkpIG51bGwgcGFkZGVkIGZpbGVzLgotVGhpcyBwcm9ibGVtIHdhcyBub3Qgb2JzZXJ2ZWQgb24gVkFYL1ZNUyB2Ni4xIG9yIEFYUC9WTVMgdjYuMS4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjYXBpbWluLmMgYi9saWJqcGVndHdycC9qY2FwaW1pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZiOGM1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjYXBpbWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIGpjYXBpbWluLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJtaW5pbXVtIiBBUEkgcm91dGluZXMgdGhhdCBtYXkgYmUKLSAqIG5lZWRlZCBpbiBlaXRoZXIgdGhlIG5vcm1hbCBmdWxsLWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlIHRyYW5zY29kaW5nLW9ubHkKLSAqIGNhc2UuCi0gKgotICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCi0gKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpjYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNwYXJhbS5jIGZvcgotICogcGFyYW1ldGVyLXNldHVwIGhlbHBlciByb3V0aW5lcywgamNvbWFwaS5jIGZvciByb3V0aW5lcyBzaGFyZWQgYnkKLSAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamN0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcgY2FzZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCi0gKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfQ3JlYXRlQ29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpCi17Ci0gIGludCBpOwotCi0gIC8qIEd1YXJkIGFnYWluc3QgdmVyc2lvbiBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGVyLiAqLwotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIHNvIGpwZWdfZGVzdHJveSBrbm93cyBtZW0gbWdyIG5vdCBjYWxsZWQgKi8KLSAgaWYgKHZlcnNpb24gIT0gSlBFR19MSUJfVkVSU0lPTikKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfTElCX1ZFUlNJT04sIEpQRUdfTElCX1ZFUlNJT04sIHZlcnNpb24pOwotICBpZiAoc3RydWN0c2l6ZSAhPSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAotCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCksIChpbnQpIHN0cnVjdHNpemUpOwotCi0gIC8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlIHplcm8gdGhlIHdob2xlIG1hc3RlciBzdHJ1Y3R1cmUuCi0gICAqIEJ1dCB0aGUgYXBwbGljYXRpb24gaGFzIGFscmVhZHkgc2V0IHRoZSBlcnIgcG9pbnRlciwgYW5kIG1heSBoYXZlIHNldAotICAgKiBjbGllbnRfZGF0YSwgc28gd2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRob3NlIGZpZWxkcy4KLSAgICogTm90ZTogaWYgYXBwbGljYXRpb24gaGFzbid0IHNldCBjbGllbnRfZGF0YSwgdG9vbHMgbGlrZSBQdXJpZnkgbWF5Ci0gICAqIGNvbXBsYWluIGhlcmUuCi0gICAqLwotICB7Ci0gICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLSAgICB2b2lkICogY2xpZW50X2RhdGEgPSBjaW5mby0+Y2xpZW50X2RhdGE7IC8qIGlnbm9yZSBQdXJpZnkgY29tcGxhaW50IGhlcmUgKi8KLSAgICBNRU1aRVJPKGNpbmZvLCBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSk7Ci0gICAgY2luZm8tPmVyciA9IGVycjsKLSAgICBjaW5mby0+Y2xpZW50X2RhdGEgPSBjbGllbnRfZGF0YTsKLSAgfQotICBjaW5mby0+aXNfZGVjb21wcmVzc29yID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLwotICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KLSAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKLSAgY2luZm8tPmRlc3QgPSBOVUxMOwotCi0gIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQotICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLQotICBjaW5mby0+c2NyaXB0X3NwYWNlID0gTlVMTDsKLQotICBjaW5mby0+aW5wdXRfZ2FtbWEgPSAxLjA7CS8qIGluIGNhc2UgYXBwbGljYXRpb24gZm9yZ2V0cyAqLwotCi0gIC8qIE9LLCBJJ20gcmVhZHkgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9TVEFSVDsKLX0KLQotCi0vKgotICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZXN0cm95X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCi19Ci0KLQotLyoKLSAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9wZXJhdGlvbiwKLSAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hYm9ydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KLX0KLQotCi0vKgotICogRm9yY2libHkgc3VwcHJlc3Mgb3IgdW4tc3VwcHJlc3MgYWxsIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCi0gKiBNYXJrcyBhbGwgY3VycmVudGx5IGRlZmluZWQgdGFibGVzIGFzIGFscmVhZHkgd3JpdHRlbiAoaWYgc3VwcHJlc3MpCi0gKiBvciBub3Qgd3JpdHRlbiAoaWYgIXN1cHByZXNzKS4gIFRoaXMgd2lsbCBjb250cm9sIHdoZXRoZXIgdGhleSBnZXQgZW1pdHRlZAotICogYnkgYSBzdWJzZXF1ZW50IGpwZWdfc3RhcnRfY29tcHJlc3MgY2FsbC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgZXhwb3J0ZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHByb2R1Y2UKLSAqIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuICBJdCBsb2dpY2FsbHkgYmVsb25ncyBpbiBqY3BhcmFtLmMsIGJ1dAotICogc2luY2UgaXQgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MsIHdlIHB1dCBpdCBoZXJlIC0tLSBvdGhlcndpc2UKLSAqIGpjcGFyYW0ubyB3b3VsZCBiZSBsaW5rZWQgd2hldGhlciB0aGUgYXBwbGljYXRpb24gdXNlZCBpdCBvciBub3QuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3N1cHByZXNzX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gc3VwcHJlc3MpCi17Ci0gIGludCBpOwotICBKUVVBTlRfVEJMICogcXRibDsKLSAgSkhVRkZfVEJMICogaHRibDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgewotICAgIGlmICgocXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSkgIT0gTlVMTCkKLSAgICAgIHF0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBpZiAoKGh0YmwgPSBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKLSAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKLSAgICBpZiAoKGh0YmwgPSBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKLSAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggSlBFRyBjb21wcmVzc2lvbi4KLSAqCi0gKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgbWF5IGRvIGEgZ3JlYXQgZGVhbCBvZgotICogd29yayBpbmNsdWRpbmcgbW9zdCBvZiB0aGUgYWN0dWFsIG91dHB1dC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZmluaXNoX2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgSkRJTUVOU0lPTiBpTUNVX3JvdzsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfU0NBTk5JTkcgfHwKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gQ1NUQVRFX1JBV19PSykgewotICAgIC8qIFRlcm1pbmF0ZSBmaXJzdCBwYXNzICovCi0gICAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lIDwgY2luZm8tPmltYWdlX2hlaWdodCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKLSAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9wYXNzKSAoY2luZm8pOwotICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogUGVyZm9ybSBhbnkgcmVtYWluaW5nIHBhc3NlcyAqLwotICB3aGlsZSAoISBjaW5mby0+bWFzdGVyLT5pc19sYXN0X3Bhc3MpIHsKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX3Bhc3MpIChjaW5mbyk7Ci0gICAgZm9yIChpTUNVX3JvdyA9IDA7IGlNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsgaU1DVV9yb3crKykgewotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgaU1DVV9yb3c7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7Ci0JKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0gICAgICAvKiBXZSBieXBhc3MgdGhlIG1haW4gY29udHJvbGxlciBhbmQgaW52b2tlIGNvZWYgY29udHJvbGxlciBkaXJlY3RseTsKLSAgICAgICAqIGFsbCB3b3JrIGlzIGJlaW5nIGRvbmUgZnJvbSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLgotICAgICAgICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMKSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0gICAgfQotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIH0KLSAgLyogV3JpdGUgRU9JLCBkbyBmaW5hbCBjbGVhbnVwICovCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV90cmFpbGVyKSAoY2luZm8pOwotICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOwotICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLwotICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLX0KLQotCi0vKgotICogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4KLSAqIFRoaXMgaXMgb25seSByZWNvbW1lbmRlZCBmb3Igd3JpdGluZyBDT00gb3IgQVBQbiBtYXJrZXJzLgotICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBiZWZvcmUKLSAqIGZpcnN0IGNhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBvciBqcGVnX3dyaXRlX3Jhd19kYXRhKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCi0JCSAgIGNvbnN0IEpPQ1RFVCAqZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCi17Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBpbmZvLCBpbnQgdmFsKSk7Ci0KLSAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKLSAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7Ci0gIHdyaXRlX21hcmtlcl9ieXRlID0gY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2J5dGU7CS8qIGNvcHkgZm9yIHNwZWVkICovCi0gIHdoaWxlIChkYXRhbGVuLS0pIHsKLSAgICAoKndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sICpkYXRhcHRyKTsKLSAgICBkYXRhcHRyKys7Ci0gIH0KLX0KLQotLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX21faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCi17Ci0gIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSAhPSAwIHx8Ci0gICAgICAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcgJiYKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0sgJiYKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2hlYWRlcikgKGNpbmZvLCBtYXJrZXIsIGRhdGFsZW4pOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfbV9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKLXsKLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZSkgKGNpbmZvLCB2YWwpOwotfQotCi0KLS8qCi0gKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZS4KLSAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCi0gKgotICogVG8gcHJvZHVjZSBhIHBhaXIgb2YgZmlsZXMgY29udGFpbmluZyBhYmJyZXZpYXRlZCB0YWJsZXMgYW5kIGFiYnJldmlhdGVkCi0gKiBpbWFnZSBkYXRhLCBvbmUgd291bGQgcHJvY2VlZCBhcyBmb2xsb3dzOgotICoKLSAqCQlpbml0aWFsaXplIEpQRUcgb2JqZWN0Ci0gKgkJc2V0IEpQRUcgcGFyYW1ldGVycwotICoJCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZSBmaWxlCi0gKgkJanBlZ193cml0ZV90YWJsZXMoY2luZm8pOwotICoJCXNldCBkZXN0aW5hdGlvbiB0byBpbWFnZSBmaWxlCi0gKgkJanBlZ19zdGFydF9jb21wcmVzcyhjaW5mbywgRkFMU0UpOwotICoJCXdyaXRlIGRhdGEuLi4KLSAqCQlqcGVnX2ZpbmlzaF9jb21wcmVzcyhjaW5mbyk7Ci0gKgotICoganBlZ193cml0ZV90YWJsZXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBtYXJraW5nIGFsbCB0YWJsZXMgd3JpdHRlbgotICogKHNhbWUgYXMganBlZ19zdXBwcmVzc190YWJsZXMoLi4uLCBUUlVFKSkuICBUaHVzIGEgc3Vic2VxdWVudCBzdGFydF9jb21wcmVzcwotICogd2lsbCBub3QgcmUtZW1pdCB0aGUgdGFibGVzIHVubGVzcyBpdCBpcyBwYXNzZWQgd3JpdGVfYWxsX3RhYmxlcz1UUlVFLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ193cml0ZV90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KLSAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgLi4uIGJpdCBvZiBhIGNyb2NrIHRvIGRvIGl0IGhlcmUuICovCi0gIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOwotICAvKiBXcml0ZSB0aGVtIHRhYmxlcyEgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV90YWJsZXNfb25seSkgKGNpbmZvKTsKLSAgLyogQW5kIGNsZWFuIHVwLiAqLwotICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOwotICAvKgotICAgKiBJbiBsaWJyYXJ5IHJlbGVhc2VzIHVwIHRocm91Z2ggdjZhLCB3ZSBjYWxsZWQganBlZ19hYm9ydCgpIGhlcmUgdG8gZnJlZQotICAgKiBhbnkgd29ya2luZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGFuZCBtYXJrZXIKLSAgICogd3JpdGVyLiAgU29tZSBhcHBsaWNhdGlvbnMgaGFkIGEgcHJvYmxlbSB3aXRoIHRoYXQ6IHRoZXkgYWxsb2NhdGVkIHNwYWNlCi0gICAqIG9mIHRoZWlyIG93biBmcm9tIHRoZSBsaWJyYXJ5IG1lbW9yeSBtYW5hZ2VyLCBhbmQgZGlkbid0IHdhbnQgaXQgdG8gZ28KLSAgICogYXdheSBkdXJpbmcgd3JpdGVfdGFibGVzLiAgU28gbm93IHdlIGRvIG5vdGhpbmcuICBUaGlzIHdpbGwgY2F1c2UgYQotICAgKiBtZW1vcnkgbGVhayBpZiBhbiBhcHAgY2FsbHMgd3JpdGVfdGFibGVzIHJlcGVhdGVkbHkgd2l0aG91dCBkb2luZyBhIGZ1bGwKLSAgICogY29tcHJlc3Npb24gY3ljbGUgb3Igb3RoZXJ3aXNlIHJlc2V0dGluZyB0aGUgSlBFRyBvYmplY3QuICBIb3dldmVyLCB0aGF0Ci0gICAqIHNlZW1zIGxlc3MgYmFkIHRoYW4gdW5leHBlY3RlZGx5IGZyZWVpbmcgbWVtb3J5IGluIHRoZSBub3JtYWwgY2FzZS4KLSAgICogQW4gYXBwIHRoYXQgcHJlZmVycyB0aGUgb2xkIGJlaGF2aW9yIGNhbiBjYWxsIGpwZWdfYWJvcnQgZm9yIGl0c2VsZiBhZnRlcgotICAgKiBlYWNoIGNhbGwgdG8ganBlZ193cml0ZV90YWJsZXMoKS4KLSAgICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY2FwaXN0ZC5jIGIvbGlianBlZ3R3cnAvamNhcGlzdGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMjBiMS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY2FwaXN0ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBqY2FwaXN0ZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBjb21wcmVzc2lvbiBoYWxmCi0gKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAic3RhbmRhcmQiIEFQSSByb3V0aW5lcyB0aGF0IGFyZQotICogdXNlZCBpbiB0aGUgbm9ybWFsIGZ1bGwtY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKLSAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KLSAqIGpwZWdfc3RhcnRfY29tcHJlc3MsIGl0IHdpbGwgZW5kIHVwIGxpbmtpbmcgaW4gdGhlIGVudGlyZSBjb21wcmVzc29yLgotICogV2UgdGh1cyBtdXN0IHNlcGFyYXRlIHRoaXMgZmlsZSBmcm9tIGpjYXBpbWluLmMgdG8gYXZvaWQgbGlua2luZyB0aGUKLSAqIHdob2xlIGNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBDb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KLSAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCi0gKgotICogV2UgcmVxdWlyZSBhIHdyaXRlX2FsbF90YWJsZXMgcGFyYW1ldGVyIGFzIGEgZmFpbHNhZmUgY2hlY2sgd2hlbiB3cml0aW5nCi0gKiBtdWx0aXBsZSBkYXRhc3RyZWFtcyBmcm9tIHRoZSBzYW1lIGNvbXByZXNzaW9uIG9iamVjdC4gIFNpbmNlIHByaW9yIHJ1bnMKLSAqIHdpbGwgaGF2ZSBsZWZ0IGFsbCB0aGUgdGFibGVzIG1hcmtlZCBzZW50X3RhYmxlPVRSVUUsIGEgc3Vic2VxdWVudCBydW4KLSAqIHdvdWxkIGVtaXQgYW4gYWJicmV2aWF0ZWQgc3RyZWFtIChubyB0YWJsZXMpIGJ5IGRlZmF1bHQuICBUaGlzIG1heSBiZSB3aGF0Ci0gKiBpcyB3YW50ZWQsIGJ1dCBmb3Igc2FmZXR5J3Mgc2FrZSBpdCBzaG91bGQgbm90IGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yOgotICogcHJvZ3JhbW1lcnMgc2hvdWxkIGhhdmUgdG8gbWFrZSBhIGRlbGliZXJhdGUgY2hvaWNlIHRvIGVtaXQgYWJicmV2aWF0ZWQKLSAqIGltYWdlcy4gIFRoZXJlZm9yZSB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgc2hvdWxkIGVuY291cmFnZSBwZW9wbGUKLSAqIHRvIHBhc3Mgd3JpdGVfYWxsX3RhYmxlcz1UUlVFOyB0aGVuIGl0IHdpbGwgdGFrZSBhY3RpdmUgdGhvdWdodCB0byBkbyB0aGUKLSAqIHdyb25nIHRoaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zdGFydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgaWYgKHdyaXRlX2FsbF90YWJsZXMpCi0gICAganBlZ19zdXBwcmVzc190YWJsZXMoY2luZm8sIEZBTFNFKTsJLyogbWFyayBhbGwgdGFibGVzIHRvIGJlIHdyaXR0ZW4gKi8KLQotICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KLSAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qIFBlcmZvcm0gbWFzdGVyIHNlbGVjdGlvbiBvZiBhY3RpdmUgbW9kdWxlcyAqLwotICBqaW5pdF9jb21wcmVzc19tYXN0ZXIoY2luZm8pOwotICAvKiBTZXQgdXAgZm9yIHRoZSBmaXJzdCBwYXNzICovCi0gICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3JfcGFzcykgKGNpbmZvKTsKLSAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIGZpcnN0IHBhc3MgdGhyb3VnaCBqcGVnX3dyaXRlX3NjYW5saW5lcwotICAgKiBvciBqcGVnX3dyaXRlX3Jhd19kYXRhLgotICAgKi8KLSAgY2luZm8tPm5leHRfc2NhbmxpbmUgPSAwOwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gKGNpbmZvLT5yYXdfZGF0YV9pbiA/IENTVEFURV9SQVdfT0sgOiBDU1RBVEVfU0NBTk5JTkcpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHNjYW5saW5lcyBvZiBkYXRhIHRvIHRoZSBKUEVHIGNvbXByZXNzb3IuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgd3JpdHRlbi4KLSAqIFRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgc3VwcGxpZWQgbnVtX2xpbmVzIG9ubHkgaW4gY2FzZSB0aGF0Ci0gKiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgaGFzIHJlcXVlc3RlZCBzdXNwZW5zaW9uIG9mIHRoZSBjb21wcmVzc29yLAotICogb3IgaWYgbW9yZSB0aGFuIGltYWdlX2hlaWdodCBzY2FubGluZXMgYXJlIHBhc3NlZCBpbi4KLSAqCi0gKiBOb3RlOiB3ZSB3YXJuIGFib3V0IGV4Y2VzcyBjYWxscyB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIHNpbmNlCi0gKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAotICogZXhjZXNzIHNjYW5saW5lcyBwYXNzZWQgaW4gdGhlIGxhc3QgdmFsaWQgY2FsbCBhcmUgKnNpbGVudGx5KiBpZ25vcmVkLAotICogc28gdGhhdCB0aGUgYXBwbGljYXRpb24gbmVlZCBub3QgYWRqdXN0IG51bV9saW5lcyBmb3IgZW5kLW9mLWltYWdlCi0gKiB3aGVuIHVzaW5nIGEgbXVsdGlwbGUtc2NhbmxpbmUgYnVmZmVyLgotICovCi0KLUdMT0JBTChKRElNRU5TSU9OKQotanBlZ193cml0ZV9zY2FubGluZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJICAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpCi17Ci0gIEpESU1FTlNJT04gcm93X2N0ciwgcm93c19sZWZ0OwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7Ci0KLSAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+bmV4dF9zY2FubGluZTsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKLSAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgfQotCi0gIC8qIEdpdmUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlIGFub3RoZXIgY2hhbmNlIGlmIHRoaXMgaXMgZmlyc3QgY2FsbCB0bwotICAgKiBqcGVnX3dyaXRlX3NjYW5saW5lcy4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQotICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KLSAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9zY2FubGluZXMuCi0gICAqLwotICBpZiAoY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXApCi0gICAgKCpjaW5mby0+bWFzdGVyLT5wYXNzX3N0YXJ0dXApIChjaW5mbyk7Ci0KLSAgLyogSWdub3JlIGFueSBleHRyYSBzY2FubGluZXMgYXQgYm90dG9tIG9mIGltYWdlLiAqLwotICByb3dzX2xlZnQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0IC0gY2luZm8tPm5leHRfc2NhbmxpbmU7Ci0gIGlmIChudW1fbGluZXMgPiByb3dzX2xlZnQpCi0gICAgbnVtX2xpbmVzID0gcm93c19sZWZ0OwotCi0gIHJvd19jdHIgPSAwOwotICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgc2NhbmxpbmVzLCAmcm93X2N0ciwgbnVtX2xpbmVzKTsKLSAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gcm93X2N0cjsKLSAgcmV0dXJuIHJvd19jdHI7Ci19Ci0KLQotLyoKLSAqIEFsdGVybmF0ZSBlbnRyeSBwb2ludCB0byB3cml0ZSByYXcgZGF0YS4KLSAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KLSAqLwotCi1HTE9CQUwoSkRJTUVOU0lPTikKLWpwZWdfd3JpdGVfcmF3X2RhdGEgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGRhdGEsCi0JCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpCi17Ci0gIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0spCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lID49IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCi0gICAqIGpwZWdfd3JpdGVfcmF3X2RhdGEuICBUaGlzIGxldHMgb3V0cHV0IG9mIHRoZSBmcmFtZS9zY2FuIGhlYWRlcnMgYmUKLSAgICogZGVsYXllZCBzbyB0aGF0IGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBDT00sIGV0YywgbWFya2VycyBiZXR3ZWVuCi0gICAqIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIGpwZWdfd3JpdGVfcmF3X2RhdGEuCi0gICAqLwotICBpZiAoY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXApCi0gICAgKCpjaW5mby0+bWFzdGVyLT5wYXNzX3N0YXJ0dXApIChjaW5mbyk7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGhhcyBiZWVuIHBhc3NlZC4gKi8KLSAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKLSAgaWYgKG51bV9saW5lcyA8IGxpbmVzX3Blcl9pTUNVX3JvdykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JVRkZFUl9TSVpFKTsKLQotICAvKiBEaXJlY3RseSBjb21wcmVzcyB0aGUgcm93LiAqLwotICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIGRhdGEpKSB7Ci0gICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgc3VzcGVuZCBwcm9jZXNzaW5nLiAqLwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogT0ssIHdlIHByb2Nlc3NlZCBvbmUgaU1DVSByb3cuICovCi0gIGNpbmZvLT5uZXh0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKLSAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjY29lZmN0LmMgYi9saWJqcGVndHdycC9qY2NvZWZjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTYzZGRiLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjY29lZmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoKLSAqIGpjY29lZmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGNvbXByZXNzaW9uLgotICogVGhpcyBjb250cm9sbGVyIGlzIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpQRUcgY29tcHJlc3NvciBwcm9wZXIuCi0gKiBUaGUgY29lZmZpY2llbnQgYnVmZmVyIGxpZXMgYmV0d2VlbiBmb3J3YXJkLURDVCBhbmQgZW50cm9weSBlbmNvZGluZyBzdGVwcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogV2UgdXNlIGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIgd2hlbiBkb2luZyBIdWZmbWFuIG9wdGltaXphdGlvbiwKLSAqIGFuZCBhbHNvIGZvciB3cml0aW5nIG11bHRpcGxlLXNjYW4gSlBFRyBmaWxlcy4gIEluIGFsbCBjYXNlcywgdGhlIERDVAotICogc3RlcCBpcyBydW4gZHVyaW5nIHRoZSBmaXJzdCBwYXNzLCBhbmQgc3Vic2VxdWVudCBwYXNzZXMgbmVlZCBvbmx5IHJlYWQKLSAqIHRoZSBidWZmZXJlZCBjb2VmZmljaWVudHMuCi0gKi8KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSNkZWZpbmUgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLSNlbHNlCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0jZGVmaW5lIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgSkRJTUVOU0lPTiBpTUNVX3Jvd19udW07CS8qIGlNQ1Ugcm93ICMgd2l0aGluIGltYWdlICovCi0gIEpESU1FTlNJT04gbWN1X2N0cjsJCS8qIGNvdW50cyBNQ1VzIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdyAqLwotICBpbnQgTUNVX3ZlcnRfb2Zmc2V0OwkJLyogY291bnRzIE1DVSByb3dzIHdpdGhpbiBpTUNVIHJvdyAqLwotICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2Ygc3VjaCByb3dzIG5lZWRlZCAqLwotCi0gIC8qIEZvciBzaW5nbGUtcGFzcyBjb21wcmVzc2lvbiwgaXQncyBzdWZmaWNpZW50IHRvIGJ1ZmZlciBqdXN0IG9uZSBNQ1UKLSAgICogKGFsdGhvdWdoIHRoaXMgbWF5IHByb3ZlIGEgYml0IHNsb3cgaW4gcHJhY3RpY2UpLiAgV2UgYWxsb2NhdGUgYQotICAgKiB3b3Jrc3BhY2Ugb2YgQ19NQVhfQkxPQ0tTX0lOX01DVSBjb2VmZmljaWVudCBibG9ja3MsIGFuZCByZXVzZSBpdCBmb3IgZWFjaAotICAgKiBNQ1UgY29uc3RydWN0ZWQgYW5kIHNlbnQuICAoT24gODB4ODYsIHRoZSB3b3Jrc3BhY2UgaXMgRkFSIGV2ZW4gdGhvdWdoCi0gICAqIGl0J3Mgbm90IHJlYWxseSB2ZXJ5IGJpZzsgdGhpcyBpcyB0byBrZWVwIHRoZSBtb2R1bGUgaW50ZXJmYWNlcyB1bmNoYW5nZWQKLSAgICogd2hlbiBhIGxhcmdlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBuZWNlc3NhcnkuKQotICAgKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB0aGlzIGFycmF5IHBvaW50cyB0byB0aGUgY3VycmVudCBNQ1UncyBibG9ja3MKLSAgICogd2l0aGluIHRoZSB2aXJ0dWFsIGFycmF5cy4KLSAgICovCi0gIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOwotCi0gIC8qIEluIG11bHRpLXBhc3MgbW9kZXMsIHdlIG5lZWQgYSB2aXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KLSAganZpcnRfYmFycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107Ci19IG15X2NvZWZfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX2RhdGEKLSAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOwotI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi1NRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3NfZmlyc3RfcGFzcwotICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3Nfb3V0cHV0Ci0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKLSNlbmRpZgotCi0KLUxPQ0FMKHZvaWQpCi1zdGFydF9pTUNVX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBSZXNldCB3aXRoaW4taU1DVS1yb3cgY291bnRlcnMgZm9yIGEgbmV3IHJvdyAqLwotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICAvKiBJbiBhbiBpbnRlcmxlYXZlZCBzY2FuLCBhbiBNQ1Ugcm93IGlzIHRoZSBzYW1lIGFzIGFuIGlNQ1Ugcm93LgotICAgKiBJbiBhIG5vbmludGVybGVhdmVkIHNjYW4sIGFuIGlNQ1Ugcm93IGhhcyB2X3NhbXBfZmFjdG9yIE1DVSByb3dzLgotICAgKiBCdXQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHByb2Nlc3Mgb25seSB3aGF0J3MgbGVmdC4KLSAgICovCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA+IDEpIHsKLSAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSAxOwotICB9IGVsc2UgewotICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCAoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cy0xKSkKLSAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT52X3NhbXBfZmFjdG9yOwotICAgIGVsc2UKLSAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5sYXN0X3Jvd19oZWlnaHQ7Ci0gIH0KLQotICBjb2VmLT5tY3VfY3RyID0gMDsKLSAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0gMDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2NvZWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgY29lZi0+aU1DVV9yb3dfbnVtID0gMDsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotCi0gIHN3aXRjaCAocGFzc19tb2RlKSB7Ci0gIGNhc2UgSkJVRl9QQVNTX1RIUlU6Ci0gICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdICE9IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19kYXRhOwotICAgIGJyZWFrOwotI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi0gIGNhc2UgSkJVRl9TQVZFX0FORF9QQVNTOgotICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3NfZmlyc3RfcGFzczsKLSAgICBicmVhazsKLSAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6Ci0gICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19vdXRwdXQ7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNpbmdsZS1wYXNzIGNhc2UuCi0gKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQotICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBpbWFnZS4KLSAqIFJldHVybnMgVFJVRSBpZiB0aGUgaU1DVSByb3cgaXMgY29tcGxldGVkLCBGQUxTRSBpZiBzdXNwZW5kZWQuCi0gKgotICogTkI6IGlucHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZSwKLSAqIHdoaWNoIHdlIGluZGV4IGFjY29yZGluZyB0byB0aGUgY29tcG9uZW50J3MgU09GIHBvc2l0aW9uLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotY29tcHJlc3NfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBKRElNRU5TSU9OIGxhc3RfTUNVX2NvbCA9IGNpbmZvLT5NQ1VzX3Blcl9yb3cgLSAxOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgaW50IGJsa24sIGJpLCBjaSwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKLSAgSkRJTUVOU0lPTiB5cG9zLCB4cG9zOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIExvb3AgdG8gd3JpdGUgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5tY3VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIERldGVybWluZSB3aGVyZSBkYXRhIGNvbWVzIGZyb20gaW4gaW5wdXRfYnVmIGFuZCBkbyB0aGUgRENUIHRoaW5nLgotICAgICAgICogRWFjaCBjYWxsIG9uIGZvcndhcmRfRENUIHByb2Nlc3NlcyBhIGhvcml6b250YWwgcm93IG9mIERDVCBibG9ja3MKLSAgICAgICAqIGFzIHdpZGUgYXMgYW4gTUNVOyB3ZSByZWx5IG9uIGhhdmluZyBhbGxvY2F0ZWQgdGhlIE1DVV9idWZmZXJbXSBibG9ja3MKLSAgICAgICAqIHNlcXVlbnRpYWxseS4gIER1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2UgYXJlIGZpbGxlZCBpbgotICAgICAgICogc3BlY2lhbGx5LiAgVGhlIGRhdGEgaW4gdGhlbSBkb2VzIG5vdCBtYXR0ZXIgZm9yIGltYWdlIHJlY29uc3RydWN0aW9uLAotICAgICAgICogc28gd2UgZmlsbCB0aGVtIHdpdGggdmFsdWVzIHRoYXQgd2lsbCBlbmNvZGUgdG8gdGhlIHNtYWxsZXN0IGFtb3VudCBvZgotICAgICAgICogZGF0YSwgdml6OiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCi0gICAgICAgKiBibG9jaydzIERDIHZhbHVlLiAgKFRoYW5rcyB0byBUaG9tYXMgS2luc21hbiBmb3IgdGhpcyBpZGVhLikKLSAgICAgICAqLwotICAgICAgYmxrbiA9IDA7Ci0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0JYmxvY2tjbnQgPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCi0JCQkJCQk6IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoOwotCXhwb3MgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGg7Ci0JeXBvcyA9IHlvZmZzZXQgKiBEQ1RTSVpFOyAvKiB5cG9zID09ICh5b2Zmc2V0K3lpbmRleCkgKiBEQ1RTSVpFICovCi0JZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCSAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cgfHwKLQkgICAgICB5b2Zmc2V0K3lpbmRleCA8IGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCkgewotCSAgICAoKmNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVCkgKGNpbmZvLCBjb21wcHRyLAotCQkJCQkgaW5wdXRfYnVmW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCi0JCQkJCSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa25dLAotCQkJCQkgeXBvcywgeHBvcywgKEpESU1FTlNJT04pIGJsb2NrY250KTsKLQkgICAgaWYgKGJsb2NrY250IDwgY29tcHB0ci0+TUNVX3dpZHRoKSB7Ci0JICAgICAgLyogQ3JlYXRlIHNvbWUgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBpbWFnZS4gKi8KLQkgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbiArIGJsb2NrY250XSwKLQkJCShjb21wcHRyLT5NQ1Vfd2lkdGggLSBibG9ja2NudCkgKiBTSVpFT0YoSkJMT0NLKSk7Ci0JICAgICAgZm9yIChiaSA9IGJsb2NrY250OyBiaSA8IGNvbXBwdHItPk1DVV93aWR0aDsgYmkrKykgewotCQljb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmldWzBdWzBdID0gY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpLTFdWzBdWzBdOwotCSAgICAgIH0KLQkgICAgfQotCSAgfSBlbHNlIHsKLQkgICAgLyogQ3JlYXRlIGEgcm93IG9mIGR1bW15IGJsb2NrcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4gKi8KLQkgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa25dLAotCQkgICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggKiBTSVpFT0YoSkJMT0NLKSk7Ci0JICAgIGZvciAoYmkgPSAwOyBiaSA8IGNvbXBwdHItPk1DVV93aWR0aDsgYmkrKykgewotCSAgICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbitiaV1bMF1bMF0gPSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24tMV1bMF1bMF07Ci0JICAgIH0KLQkgIH0KLQkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOwotCSAgeXBvcyArPSBEQ1RTSVpFOwotCX0KLSAgICAgIH0KLSAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAgSW4gZXZlbnQgb2YgYSBzdXNwZW5zaW9uIGZhaWx1cmUsIHdlIHdpbGwKLSAgICAgICAqIHJlLURDVCB0aGUgTUNVIG9uIHJlc3RhcnQgKGEgYml0IGluZWZmaWNpZW50LCBjb3VsZCBiZSBmaXhlZC4uLikKLSAgICAgICAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgewotCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5tY3VfY3RyID0gMDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0jaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBmaXJzdCBwYXNzIG9mIGEgbXVsdGktcGFzcyBjYXNlLgotICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKLSAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgaW1hZ2UuCi0gKiBUaGlzIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciwgRENUJ2QgYW5kIHF1YW50aXplZCwKLSAqIGFuZCBzYXZlZCBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5cy4gIFdlIGFsc28gZ2VuZXJhdGUgc3VpdGFibGUgZHVtbXkgYmxvY2tzCi0gKiBhcyBuZWVkZWQgYXQgdGhlIHJpZ2h0IGFuZCBsb3dlciBlZGdlcy4gIChUaGUgZHVtbXkgYmxvY2tzIGFyZSBjb25zdHJ1Y3RlZAotICogaW4gdGhlIHZpcnR1YWwgYXJyYXlzLCB3aGljaCBoYXZlIGJlZW4gcGFkZGVkIGFwcHJvcHJpYXRlbHkuKSAgVGhpcyBtYWtlcwotICogaXQgcG9zc2libGUgZm9yIHN1YnNlcXVlbnQgcGFzc2VzIG5vdCB0byB3b3JyeSBhYm91dCByZWFsIHZzLiBkdW1teSBibG9ja3MuCi0gKgotICogV2UgbXVzdCBhbHNvIGVtaXQgdGhlIGRhdGEgdG8gdGhlIGVudHJvcHkgZW5jb2Rlci4gIFRoaXMgaXMgY29udmVuaWVudGx5Ci0gKiBkb25lIGJ5IGNhbGxpbmcgY29tcHJlc3Nfb3V0cHV0KCkgYWZ0ZXIgd2UndmUgbG9hZGVkIHRoZSBjdXJyZW50IHN0cmlwCi0gKiBvZiB0aGUgdmlydHVhbCBhcnJheXMuCi0gKgotICogTkI6IGlucHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4gIEFsbAotICogY29tcG9uZW50cyBhcmUgRENUJ2QgYW5kIGxvYWRlZCBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5cyBpbiB0aGlzIHBhc3MuCi0gKiBIb3dldmVyLCBpdCBtYXkgYmUgdGhhdCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBlbWl0dGVkIHRvCi0gKiB0aGUgZW50cm9weSBlbmNvZGVyIGR1cmluZyB0aGlzIGZpcnN0IHBhc3M7IGJlIGNhcmVmdWwgYWJvdXQgbG9va2luZwotICogYXQgdGhlIHNjYW4tZGVwZW5kZW50IHZhcmlhYmxlcyAoTUNVIGRpbWVuc2lvbnMsIGV0YykuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1jb21wcmVzc19maXJzdF9wYXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgSkRJTUVOU0lPTiBibG9ja3NfYWNyb3NzLCBNQ1VzX2Fjcm9zcywgTUNVaW5kZXg7Ci0gIGludCBiaSwgY2ksIGhfc2FtcF9mYWN0b3IsIGJsb2NrX3JvdywgYmxvY2tfcm93cywgbmR1bW15OwotICBKQ09FRiBsYXN0REM7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkJMT0NLUk9XIHRoaXNibG9ja3JvdywgbGFzdGJsb2Nrcm93OwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KLSAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotICAgICAgIGNvZWYtPmlNQ1Vfcm93X251bSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0gICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLwotICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93KQotICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlLCBzaW5jZSBtYXkgbm90IGJlIHNldCEgKi8KLSAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgfQotICAgIGJsb2Nrc19hY3Jvc3MgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0gICAgaF9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgLyogQ291bnQgbnVtYmVyIG9mIGR1bW15IGJsb2NrcyB0byBiZSBhZGRlZCBhdCB0aGUgcmlnaHQgbWFyZ2luLiAqLwotICAgIG5kdW1teSA9IChpbnQpIChibG9ja3NfYWNyb3NzICUgaF9zYW1wX2ZhY3Rvcik7Ci0gICAgaWYgKG5kdW1teSA+IDApCi0gICAgICBuZHVtbXkgPSBoX3NhbXBfZmFjdG9yIC0gbmR1bW15OwotICAgIC8qIFBlcmZvcm0gRENUIGZvciBhbGwgbm9uLWR1bW15IGJsb2NrcyBpbiB0aGlzIGlNQ1Ugcm93LiAgRWFjaCBjYWxsCi0gICAgICogb24gZm9yd2FyZF9EQ1QgcHJvY2Vzc2VzIGEgY29tcGxldGUgaG9yaXpvbnRhbCByb3cgb2YgRENUIGJsb2Nrcy4KLSAgICAgKi8KLSAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7Ci0gICAgICB0aGlzYmxvY2tyb3cgPSBidWZmZXJbYmxvY2tfcm93XTsKLSAgICAgICgqY2luZm8tPmZkY3QtPmZvcndhcmRfRENUKSAoY2luZm8sIGNvbXBwdHIsCi0JCQkJICAgaW5wdXRfYnVmW2NpXSwgdGhpc2Jsb2Nrcm93LAotCQkJCSAgIChKRElNRU5TSU9OKSAoYmxvY2tfcm93ICogRENUU0laRSksCi0JCQkJICAgKEpESU1FTlNJT04pIDAsIGJsb2Nrc19hY3Jvc3MpOwotICAgICAgaWYgKG5kdW1teSA+IDApIHsKLQkvKiBDcmVhdGUgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBpbWFnZS4gKi8KLQl0aGlzYmxvY2tyb3cgKz0gYmxvY2tzX2Fjcm9zczsgLyogPT4gZmlyc3QgZHVtbXkgYmxvY2sgKi8KLQlqemVyb19mYXIoKHZvaWQgRkFSICopIHRoaXNibG9ja3JvdywgbmR1bW15ICogU0laRU9GKEpCTE9DSykpOwotCWxhc3REQyA9IHRoaXNibG9ja3Jvd1stMV1bMF07Ci0JZm9yIChiaSA9IDA7IGJpIDwgbmR1bW15OyBiaSsrKSB7Ci0JICB0aGlzYmxvY2tyb3dbYmldWzBdID0gbGFzdERDOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgLyogSWYgYXQgZW5kIG9mIGltYWdlLCBjcmVhdGUgZHVtbXkgYmxvY2sgcm93cyBhcyBuZWVkZWQuCi0gICAgICogVGhlIHRyaWNreSBwYXJ0IGhlcmUgaXMgdGhhdCB3aXRoaW4gZWFjaCBNQ1UsIHdlIHdhbnQgdGhlIERDIHZhbHVlcwotICAgICAqIG9mIHRoZSBkdW1teSBibG9ja3MgdG8gbWF0Y2ggdGhlIGxhc3QgcmVhbCBibG9jaydzIERDIHZhbHVlLgotICAgICAqIFRoaXMgc3F1ZWV6ZXMgYSBmZXcgbW9yZSBieXRlcyBvdXQgb2YgdGhlIHJlc3VsdGluZyBmaWxlLi4uCi0gICAgICovCi0gICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA9PSBsYXN0X2lNQ1Vfcm93KSB7Ci0gICAgICBibG9ja3NfYWNyb3NzICs9IG5kdW1teTsJLyogaW5jbHVkZSBsb3dlciByaWdodCBjb3JuZXIgKi8KLSAgICAgIE1DVXNfYWNyb3NzID0gYmxvY2tzX2Fjcm9zcyAvIGhfc2FtcF9mYWN0b3I7Ci0gICAgICBmb3IgKGJsb2NrX3JvdyA9IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0JICAgYmxvY2tfcm93KyspIHsKLQl0aGlzYmxvY2tyb3cgPSBidWZmZXJbYmxvY2tfcm93XTsKLQlsYXN0YmxvY2tyb3cgPSBidWZmZXJbYmxvY2tfcm93LTFdOwotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgdGhpc2Jsb2Nrcm93LAotCQkgIChzaXplX3QpIChibG9ja3NfYWNyb3NzICogU0laRU9GKEpCTE9DSykpKTsKLQlmb3IgKE1DVWluZGV4ID0gMDsgTUNVaW5kZXggPCBNQ1VzX2Fjcm9zczsgTUNVaW5kZXgrKykgewotCSAgbGFzdERDID0gbGFzdGJsb2Nrcm93W2hfc2FtcF9mYWN0b3ItMV1bMF07Ci0JICBmb3IgKGJpID0gMDsgYmkgPCBoX3NhbXBfZmFjdG9yOyBiaSsrKSB7Ci0JICAgIHRoaXNibG9ja3Jvd1tiaV1bMF0gPSBsYXN0REM7Ci0JICB9Ci0JICB0aGlzYmxvY2tyb3cgKz0gaF9zYW1wX2ZhY3RvcjsgLyogYWR2YW5jZSB0byBuZXh0IE1DVSBpbiByb3cgKi8KLQkgIGxhc3RibG9ja3JvdyArPSBoX3NhbXBfZmFjdG9yOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyogTkI6IGNvbXByZXNzX291dHB1dCB3aWxsIGluY3JlbWVudCBpTUNVX3Jvd19udW0gaWYgc3VjY2Vzc2Z1bC4KLSAgICogQSBzdXNwZW5zaW9uIHJldHVybiB3aWxsIHJlc3VsdCBpbiByZWRvaW5nIGFsbCB0aGUgd29yayBhYm92ZSBuZXh0IHRpbWUuCi0gICAqLwotCi0gIC8qIEVtaXQgZGF0YSB0byB0aGUgZW50cm9weSBlbmNvZGVyLCBzaGFyaW5nIGNvZGUgd2l0aCBzdWJzZXF1ZW50IHBhc3NlcyAqLwotICByZXR1cm4gY29tcHJlc3Nfb3V0cHV0KGNpbmZvLCBpbnB1dF9idWYpOwotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiBzdWJzZXF1ZW50IHBhc3NlcyBvZiBhIG11bHRpLXBhc3MgY2FzZS4KLSAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCi0gKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjYW4uCi0gKiBUaGUgZGF0YSBpcyBvYnRhaW5lZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cyBhbmQgZmVkIHRvIHRoZSBlbnRyb3B5IGNvZGVyLgotICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KLSAqCi0gKiBOQjogaW5wdXRfYnVmIGlzIGlnbm9yZWQ7IGl0IGlzIGxpa2VseSB0byBiZSBhIE5VTEwgcG9pbnRlci4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWNvbXByZXNzX291dHB1dCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OwotICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBmb3IgdGhlIGNvbXBvbmVudHMgdXNlZCBpbiB0aGlzIHNjYW4uCi0gICAqIE5COiBkdXJpbmcgZmlyc3QgcGFzcywgdGhpcyBpcyBzYWZlIG9ubHkgYmVjYXVzZSB0aGUgYnVmZmVycyB3aWxsCi0gICAqIGFscmVhZHkgYmUgYWxpZ25lZCBwcm9wZXJseSwgc28gam1lbW1nci5jIHdvbid0IG5lZWQgdG8gZG8gYW55IEkvTy4KLSAgICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBidWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCi0gICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICB9Ci0KLSAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLyogQ29uc3RydWN0IGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUIGJsb2NrcyBiZWxvbmdpbmcgdG8gdGhpcyBNQ1UgKi8KLSAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0JY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQlzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV93aWR0aDsKLQlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7Ci0JICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7Ci0JICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKLQkgICAgY29lZi0+TUNVX2J1ZmZlcltibGtuKytdID0gYnVmZmVyX3B0cisrOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgewotCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5tY3VfY3RyID0gMDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotI2VuZGlmIC8qIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9jX2NvZWZfY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKLXsKLSAgbXlfY29lZl9wdHIgY29lZjsKLQotICBjb2VmID0gKG15X2NvZWZfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2NvZWZfY29udHJvbGxlcikpOwotICBjaW5mby0+Y29lZiA9IChzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqKSBjb2VmOwotICBjb2VmLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfY29lZjsKLQotICAvKiBDcmVhdGUgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KLSAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKLSNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotICAgIC8qIEFsbG9jYXRlIGEgZnVsbC1pbWFnZSB2aXJ0dWFsIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudCwgKi8KLSAgICAvKiBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBzYW1wX2ZhY3RvciBEQ1QgYmxvY2tzIGluIGVhY2ggZGlyZWN0aW9uLiAqLwotICAgIGludCBjaTsKLSAgICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgfQotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KLSAgICBKQkxPQ0tST1cgYnVmZmVyOwotICAgIGludCBpOwotCi0gICAgYnVmZmVyID0gKEpCTE9DS1JPVykKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOwotICAgIGZvciAoaSA9IDA7IGkgPCBDX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKLSAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOwotICAgIH0KLSAgICBjb2VmLT53aG9sZV9pbWFnZVswXSA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjY29sb3IuYyBiL2xpYmpwZWd0d3JwL2pjY29sb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhNzZjMy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY2NvbG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoKLSAqIGpjY29sb3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbiByb3V0aW5lcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLS8vIHRoaXMgZW5hYmxlcyB1bnJvbGxpbmcgbnVsbF9jb252ZXJ0J3MgbG9vcCwgYW5kIHJlYWRpbmcvd3JpdGUgaW50cyBmb3Igc3BlZWQKLSNkZWZpbmUgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCi0KLS8qIFByaXZhdGUgc3Vib2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFJHQi0+WUNDIGNvbnZlcnNpb24gKi8KLSAgSU5UMzIgKiByZ2JfeWNjX3RhYjsJCS8qID0+IHRhYmxlIGZvciBSR0IgdG8gWUNiQ3IgY29udmVyc2lvbiAqLwotfSBteV9jb2xvcl9jb252ZXJ0ZXI7Ci0KLXR5cGVkZWYgbXlfY29sb3JfY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOwotCi0KLS8qKioqKioqKioqKioqKioqIFJHQiAtPiBZQ2JDciBjb252ZXJzaW9uOiBtb3N0IGNvbW1vbiBjYXNlICoqKioqKioqKioqKioqLwotCi0vKgotICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQotICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KLSAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCi0gKglZICA9ICAwLjI5OTAwICogUiArIDAuNTg3MDAgKiBHICsgMC4xMTQwMCAqIEIKLSAqCUNiID0gLTAuMTY4NzQgKiBSIC0gMC4zMzEyNiAqIEcgKyAwLjUwMDAwICogQiAgKyBDRU5URVJKU0FNUExFCi0gKglDciA9ICAwLjUwMDAwICogUiAtIDAuNDE4NjkgKiBHIC0gMC4wODEzMSAqIEIgICsgQ0VOVEVSSlNBTVBMRQotICogKFRoZXNlIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSBUSUZGIDYuMCBzZWN0aW9uIDIxLCBkYXRlZCAzLUp1bmUtOTIuKQotICogTm90ZTogb2xkZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlIHVzZWQgYSB6ZXJvIG9mZnNldCBvZiBNQVhKU0FNUExFLzIsCi0gKiByYXRoZXIgdGhhbiBDRU5URVJKU0FNUExFLCBmb3IgQ2IgYW5kIENyLiAgVGhpcyBnYXZlIGVxdWFsIHBvc2l0aXZlIGFuZAotICogbmVnYXRpdmUgc3dpbmdzIGZvciBDYi9DciwgYnV0IG1lYW50IHRoYXQgZ3JheXNjYWxlIHZhbHVlcyAoQ2I9Q3I9MCkKLSAqIHdlcmUgbm90IHJlcHJlc2VudGVkIGV4YWN0bHkuICBOb3cgd2Ugc2FjcmlmaWNlIGV4YWN0IHJlcHJlc2VudGF0aW9uIG9mCi0gKiBtYXhpbXVtIHJlZCBhbmQgbWF4aW11bSBibHVlIGluIG9yZGVyIHRvIGdldCBleGFjdCBncmF5c2NhbGVzLgotICoKLSAqIFRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHdlIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMKLSAqIGFzIGludGVnZXJzIHNjYWxlZCB1cCBieSAyXjE2IChhYm91dCA0IGRpZ2l0cyBwcmVjaXNpb24pOyB3ZSBoYXZlIHRvIGRpdmlkZQotICogdGhlIHByb2R1Y3RzIGJ5IDJeMTYsIHdpdGggYXBwcm9wcmlhdGUgcm91bmRpbmcsIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIuCi0gKgotICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAotICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBSLEcsQiBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcy4KLSAqIEZvciA4LWJpdCBKU0FNUExFcyB0aGlzIGlzIHZlcnkgcmVhc29uYWJsZSAob25seSAyNTYgZW50cmllcyBwZXIgdGFibGUpOwotICogZm9yIDEyLWJpdCBzYW1wbGVzIGl0IGlzIHN0aWxsIGFjY2VwdGFibGUuICBJdCdzIG5vdCB2ZXJ5IHJlYXNvbmFibGUgZm9yCi0gKiAxNi1iaXQgc2FtcGxlcywgYnV0IGlmIHlvdSB3YW50IGxvc3NsZXNzIHN0b3JhZ2UgeW91IHNob3VsZG4ndCBiZSBjaGFuZ2luZwotICogY29sb3JzcGFjZSBhbnl3YXkuCi0gKiBUaGUgQ0VOVEVSSlNBTVBMRSBvZmZzZXRzIGFuZCB0aGUgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNSBhcmUgaW5jbHVkZWQKLSAqIGluIHRoZSB0YWJsZXMgdG8gc2F2ZSBhZGRpbmcgdGhlbSBzZXBhcmF0ZWx5IGluIHRoZSBpbm5lciBsb29wLgotICovCi0KLSNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCi0jZGVmaW5lIENCQ1JfT0ZGU0VUCSgoSU5UMzIpIENFTlRFUkpTQU1QTEUgPDwgU0NBTEVCSVRTKQotI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCi0jZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCi0KLS8qIFdlIGFsbG9jYXRlIG9uZSBiaWcgdGFibGUgYW5kIGRpdmlkZSBpdCB1cCBpbnRvIGVpZ2h0IHBhcnRzLCBpbnN0ZWFkIG9mCi0gKiBkb2luZyBlaWdodCBhbGxvY19zbWFsbCByZXF1ZXN0cy4gIFRoaXMgbGV0cyB1cyB1c2UgYSBzaW5nbGUgdGFibGUgYmFzZQotICogYWRkcmVzcywgd2hpY2ggY2FuIGJlIGhlbGQgaW4gYSByZWdpc3RlciBpbiB0aGUgaW5uZXIgbG9vcHMgb24gbWFueQotICogbWFjaGluZXMgKG1vcmUgdGhhbiBjYW4gaG9sZCBhbGwgZWlnaHQgYWRkcmVzc2VzLCBhbnl3YXkpLgotICovCi0KLSNkZWZpbmUgUl9ZX09GRgkJMAkJCS8qIG9mZnNldCB0byBSID0+IFkgc2VjdGlvbiAqLwotI2RlZmluZSBHX1lfT0ZGCQkoMSooTUFYSlNBTVBMRSsxKSkJLyogb2Zmc2V0IHRvIEcgPT4gWSBzZWN0aW9uICovCi0jZGVmaW5lIEJfWV9PRkYJCSgyKihNQVhKU0FNUExFKzEpKQkvKiBldGMuICovCi0jZGVmaW5lIFJfQ0JfT0ZGCSgzKihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBHX0NCX09GRgkoNCooTUFYSlNBTVBMRSsxKSkKLSNkZWZpbmUgQl9DQl9PRkYJKDUqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIFJfQ1JfT0ZGCUJfQ0JfT0ZGCQkvKiBCPT5DYiwgUj0+Q3IgYXJlIHRoZSBzYW1lICovCi0jZGVmaW5lIEdfQ1JfT0ZGCSg2KihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBCX0NSX09GRgkoNyooTUFYSlNBTVBMRSsxKSkKLSNkZWZpbmUgVEFCTEVfU0laRQkoOCooTUFYSlNBTVBMRSsxKSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgUkdCLT5ZQ0MgY29sb3JzcGFjZSBjb252ZXJzaW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmdiX3ljY19zdGFydCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgSU5UMzIgKiByZ2JfeWNjX3RhYjsKLSAgSU5UMzIgaTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgY29udmVyc2lvbiB0YWJsZXMuICovCi0gIGNjb252ZXJ0LT5yZ2JfeWNjX3RhYiA9IHJnYl95Y2NfdGFiID0gKElOVDMyICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoVEFCTEVfU0laRSAqIFNJWkVPRihJTlQzMikpKTsKLQotICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykgewotICAgIHJnYl95Y2NfdGFiW2krUl9ZX09GRl0gPSBGSVgoMC4yOTkwMCkgKiBpOwotICAgIHJnYl95Y2NfdGFiW2krR19ZX09GRl0gPSBGSVgoMC41ODcwMCkgKiBpOwotICAgIHJnYl95Y2NfdGFiW2krQl9ZX09GRl0gPSBGSVgoMC4xMTQwMCkgKiBpICAgICArIE9ORV9IQUxGOwotICAgIHJnYl95Y2NfdGFiW2krUl9DQl9PRkZdID0gKC1GSVgoMC4xNjg3NCkpICogaTsKLSAgICByZ2JfeWNjX3RhYltpK0dfQ0JfT0ZGXSA9ICgtRklYKDAuMzMxMjYpKSAqIGk7Ci0gICAgLyogV2UgdXNlIGEgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNS1lcHNpbG9uIGZvciBDYiBhbmQgQ3IuCi0gICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1heGltdW0gb3V0cHV0IHdpbGwgcm91bmQgdG8gTUFYSlNBTVBMRQotICAgICAqIG5vdCBNQVhKU0FNUExFKzEsIGFuZCB0aHVzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByYW5nZS1saW1pdC4KLSAgICAgKi8KLSAgICByZ2JfeWNjX3RhYltpK0JfQ0JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7Ci0vKiAgQj0+Q2IgYW5kIFI9PkNyIHRhYmxlcyBhcmUgdGhlIHNhbWUKLSAgICByZ2JfeWNjX3RhYltpK1JfQ1JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7Ci0qLwotICAgIHJnYl95Y2NfdGFiW2krR19DUl9PRkZdID0gKC1GSVgoMC40MTg2OSkpICogaTsKLSAgICByZ2JfeWNjX3RhYltpK0JfQ1JfT0ZGXSA9ICgtRklYKDAuMDgxMzEpKSAqIGk7Ci0gIH0KLX0KLQotCi0vKgotICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQKLSAqIHRvIG91ciBpbnRlcm5hbCBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0LgotICogVGhlIGlucHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMgYXMgd2lkZSBhcyB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAqCi0gKiBBIHN0YXJ0aW5nIHJvdyBvZmZzZXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICBUaGUgY2FsbGVyCi0gKiBjYW4gZWFzaWx5IGFkanVzdCB0aGUgcGFzc2VkIGlucHV0X2J1ZiB2YWx1ZSB0byBhY2NvbW1vZGF0ZSBhbnkgcm93Ci0gKiBvZmZzZXQgcmVxdWlyZWQgb24gdGhhdCBzaWRlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmdiX3ljY19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCSBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgciwgZywgYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gKmlucHV0X2J1ZisrOwotICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOwotICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOwotICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOwotICAgIG91dHB1dF9yb3crKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOwotICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7Ci0gICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOwotICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKLSAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucwotICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KLSAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKLSAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCi0gICAgICAgKi8KLSAgICAgIC8qIFkgKi8KLSAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgICAvKiBDYiAqLwotICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICAgIC8qIENyICovCi0gICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gUkdCIC0+IFlDYkNyICoqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBSR0ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCB3aGljaCBpcyB0aGUgc2FtZQotICogYXMgdGhlIFJHQi0+WSBwb3J0aW9uIG9mIFJHQi0+WUNiQ3IuCi0gKiBXZSBhc3N1bWUgcmdiX3ljY19zdGFydCBoYXMgYmVlbiBjYWxsZWQgKHdlIG9ubHkgdXNlIHRoZSBZIHRhYmxlcykuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfZ3JheV9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCByLCBnLCBiOwotICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOwotICAgIG91dHB1dF9yb3crKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOwotICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7Ci0gICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOwotICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKLSAgICAgIC8qIFkgKi8KLSAgICAgIG91dHB0cltjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgQWRvYmUtc3R5bGUgQ01ZSy0+WUNDSyBjb252ZXJzaW9uLAotICogd2hlcmUgd2UgY29udmVydCBSPTEtQywgRz0xLU0sIGFuZCBCPTEtWSB0byBZQ2JDciB1c2luZyB0aGUgc2FtZQotICogY29udmVyc2lvbiBhcyBhYm92ZSwgd2hpbGUgcGFzc2luZyBLIChibGFjaykgdW5jaGFuZ2VkLgotICogV2UgYXNzdW1lIHJnYl95Y2Nfc3RhcnQgaGFzIGJlZW4gY2FsbGVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotY215a195Y2NrX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgciwgZywgYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMiwgb3V0cHRyMzsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gKmlucHV0X2J1ZisrOwotICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOwotICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOwotICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOwotICAgIG91dHB0cjMgPSBvdXRwdXRfYnVmWzNdW291dHB1dF9yb3ddOwotICAgIG91dHB1dF9yb3crKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgciA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzBdKTsKLSAgICAgIGcgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clsxXSk7Ci0gICAgICBiID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMl0pOwotICAgICAgLyogSyBwYXNzZXMgdGhyb3VnaCBhcy1pcyAqLwotICAgICAgb3V0cHRyM1tjb2xdID0gaW5wdHJbM107CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCi0gICAgICBpbnB0ciArPSA0OwotICAgICAgLyogSWYgdGhlIGlucHV0cyBhcmUgMC4uTUFYSlNBTVBMRSwgdGhlIG91dHB1dHMgb2YgdGhlc2UgZXF1YXRpb25zCi0gICAgICAgKiBtdXN0IGJlIHRvbzsgd2UgZG8gbm90IG5lZWQgYW4gZXhwbGljaXQgcmFuZ2UtbGltaXRpbmcgb3BlcmF0aW9uLgotICAgICAgICogSGVuY2UgdGhlIHZhbHVlIGJlaW5nIHNoaWZ0ZWQgaXMgbmV2ZXIgbmVnYXRpdmUsIGFuZCB3ZSBkb24ndAotICAgICAgICogbmVlZCB0aGUgZ2VuZXJhbCBSSUdIVF9TSElGVCBtYWNyby4KLSAgICAgICAqLwotICAgICAgLyogWSAqLwotICAgICAgb3V0cHRyMFtjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICAgIC8qIENiICovCi0gICAgICBvdXRwdHIxW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9DQl9PRkZdICsgY3RhYltnK0dfQ0JfT0ZGXSArIGN0YWJbYitCX0NCX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgICAgLyogQ3IgKi8KLSAgICAgIG91dHB0cjJbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX0NSX09GRl0gKyBjdGFiW2crR19DUl9PRkZdICsgY3RhYltiK0JfQ1JfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGdyYXlzY2FsZSBvdXRwdXQgd2l0aCBubyBjb252ZXJzaW9uLgotICogVGhlIHNvdXJjZSBjYW4gYmUgZWl0aGVyIHBsYWluIGdyYXlzY2FsZSBvciBZQ2JDciAoc2luY2UgWSA9PSBncmF5KS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWdyYXlzY2FsZV9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOwotICBpbnQgaW5zdHJpZGUgPSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdXRfcm93Kys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIG91dHB0cltjb2xdID0gaW5wdHJbMF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSAgICAgIGlucHRyICs9IGluc3RyaWRlOwotICAgIH0KLSAgfQotfQotCi0jaWZkZWYgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVSU5UMzI7Ci0KLSNkZWZpbmUgQjAobikgICAoKG4pICYgMHhGRikKLSNkZWZpbmUgQjEobikgICAoKChuKSA+PiA4KSAmIDB4RkYpCi0jZGVmaW5lIEIyKG4pICAgKCgobikgPj4gMTYpICYgMHhGRikKLSNkZWZpbmUgQjMobikgICAoKG4pID4+IDI0KQotCi0jZGVmaW5lIFBBQ0soYSwgYiwgYywgZCkgICAgKChhKSB8ICgoYikgPDwgOCkgfCAoKGMpIDw8IDE2KSB8ICgoZCkgPDwgMjQpKQotCi1zdGF0aWMgaW50IHB0cl9pc19xdWFkKGNvbnN0IHZvaWQqIHApCi17Ci0gICAgcmV0dXJuICgoKGNvbnN0IGNoYXIqKXAgLSAoY29uc3QgY2hhciopMCkgJiAzKSA9PSAwOwotfQotCi1zdGF0aWMgdm9pZCBjb3B5cXVhZHMoY29uc3QgVUlOVDMyIGluW10sIFVJTlQzMiBvdXQwW10sIFVJTlQzMiBvdXQxW10sIFVJTlQzMiBvdXQyW10sIGludCBjb2w0KQotewotICAgIGRvIHsKLSAgICAgICAgVUlOVDMyIHNyYzAgPSAqaW4rKzsKLSAgICAgICAgVUlOVDMyIHNyYzEgPSAqaW4rKzsKLSAgICAgICAgVUlOVDMyIHNyYzIgPSAqaW4rKzsKLSAgICAgICAgLy8gTEVuZGlhbgotICAgICAgICAqb3V0MCsrID0gUEFDSyhCMChzcmMwKSwgQjMoc3JjMCksIEIyKHNyYzEpLCBCMShzcmMyKSk7Ci0gICAgICAgICpvdXQxKysgPSBQQUNLKEIxKHNyYzApLCBCMChzcmMxKSwgQjMoc3JjMSksIEIyKHNyYzIpKTsKLSAgICAgICAgKm91dDIrKyA9IFBBQ0soQjIoc3JjMCksIEIxKHNyYzEpLCBCMChzcmMyKSwgQjMoc3JjMikpOwotICAgIH0gd2hpbGUgKC0tY29sNCAhPSAwKTsKLX0KLQotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBtdWx0aS1jb21wb25lbnQgY29sb3JzcGFjZXMgd2l0aG91dCBjb252ZXJzaW9uLgotICogV2UgYXNzdW1lIGlucHV0X2NvbXBvbmVudHMgPT0gbnVtX2NvbXBvbmVudHMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1udWxsX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICByZWdpc3RlciBpbnQgY2k7Ci0gIGludCBuYyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLQotI2lmZGVmIEVOQUJMRV9BTkRST0lEX05VTExfQ09OVkVSVAotICAgIGlmICgxID09IG51bV9yb3dzICYmIDMgPT0gbmMgJiYgbnVtX2NvbHMgPiAwKSB7Ci0gICAgICAgIEpTQU1QUk9XIGlucHRyID0gKmlucHV0X2J1ZjsKLSAgICAgICAgSlNBTVBST1cgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgICAgIEpTQU1QUk9XIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOwotICAgICAgICBKU0FNUFJPVyBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKLSAgICAgICAgCi0gICAgICAgIGludCBjb2wgPSBudW1fY29sczsKLSAgICAgICAgaW50IGNvbDQgPSBjb2wgPj4gMjsKLSAgICAgICAgaWYgKGNvbDQgPiAwICYmIHB0cl9pc19xdWFkKGlucHRyKSAmJiBwdHJfaXNfcXVhZChvdXRwdHIwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2lzX3F1YWQob3V0cHRyMSkgJiYgcHRyX2lzX3F1YWQob3V0cHRyMikpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29uc3QgVUlOVDMyKiBpbiA9IChjb25zdCBVSU5UMzIqKWlucHRyOwotICAgICAgICAgICAgVUlOVDMyKiBvdXQwID0gKFVJTlQzMiopb3V0cHRyMDsKLSAgICAgICAgICAgIFVJTlQzMiogb3V0MSA9IChVSU5UMzIqKW91dHB0cjE7Ci0gICAgICAgICAgICBVSU5UMzIqIG91dDIgPSAoVUlOVDMyKilvdXRwdHIyOwotICAgICAgICAgICAgY29weXF1YWRzKGluLCBvdXQwLCBvdXQxLCBvdXQyLCBjb2w0KTsKLSAgICAgICAgICAgIGNvbCAmPSAzOwotICAgICAgICAgICAgaWYgKDAgPT0gY29sKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNvbDQgPDw9IDI7Ci0gICAgICAgICAgICBpbnB0ciArPSBjb2w0ICogMzsgIC8qIHdlIHJlYWQgdGhpcyAzIHRpbWVzIHBlciBpbiBjb3B5cXVhZHMgKi8KLSAgICAgICAgICAgIG91dHB0cjAgKz0gY29sNDsKLSAgICAgICAgICAgIG91dHB0cjEgKz0gY29sNDsKLSAgICAgICAgICAgIG91dHB0cjIgKz0gY29sNDsKLSAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byB3aGlsZS1sb29wICovCi0gICAgICAgIH0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgKm91dHB0cjArKyA9ICppbnB0cisrOwotICAgICAgICAgICAgKm91dHB0cjErKyA9ICppbnB0cisrOwotICAgICAgICAgICAgKm91dHB0cjIrKyA9ICppbnB0cisrOwotICAgICAgICB9IHdoaWxlICgtLWNvbCAhPSAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLVNMT1c6Ci0jZW5kaWYKLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIC8qIEl0IHNlZW1zIGZhc3Rlc3QgdG8gbWFrZSBhIHNlcGFyYXRlIHBhc3MgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7Ci0gICAgICBpbnB0ciA9ICppbnB1dF9idWY7Ci0gICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2NpXVtvdXRwdXRfcm93XTsKLSAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0Jb3V0cHRyW2NvbF0gPSBpbnB0cltjaV07IC8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLQlpbnB0ciArPSBuYzsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5wdXRfYnVmKys7Ci0gICAgb3V0cHV0X3JvdysrOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfbWV0aG9kIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayBuZWVkZWQgKi8KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NvbG9yX2NvbnZlcnRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKLQotICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29sb3JfY29udmVydGVyKSk7Ci0gIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKikgY2NvbnZlcnQ7Ci0gIC8qIHNldCBzdGFydF9wYXNzIHRvIG51bGwgbWV0aG9kIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCi0gIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IG51bGxfbWV0aG9kOwotCi0gIC8qIE1ha2Ugc3VyZSBpbnB1dF9jb21wb25lbnRzIGFncmVlcyB3aXRoIGluX2NvbG9yX3NwYWNlICovCi0gIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1JHQjoKLSNpZiBSR0JfUElYRUxTSVpFICE9IDMKLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCi0KLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19DTVlLOgotICBjYXNlIEpDU19ZQ0NLOgotICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSA0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPCAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBDaGVjayBudW1fY29tcG9uZW50cywgc2V0IGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZSAqLwotICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OwotICAgIGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OwotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX2dyYXlfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCICYmIFJHQl9QSVhFTFNJWkUgPT0gMykKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfeWNjX2NvbnZlcnQ7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19DTVlLOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBjbXlrX3ljY2tfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoJCQkvKiBhbGxvdyBudWxsIGNvbnZlcnNpb24gb2YgSkNTX1VOS05PV04gKi8KLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gY2luZm8tPmluX2NvbG9yX3NwYWNlIHx8Ci0JY2luZm8tPm51bV9jb21wb25lbnRzICE9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBicmVhazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNkY3RtZ3IuYyBiL2xpYmpwZWd0d3JwL2pjZGN0bWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmE3OWIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNkY3RtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKgotICogamNkY3RtZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb3J3YXJkLURDVCBtYW5hZ2VtZW50IGxvZ2ljLgotICogVGhpcyBjb2RlIHNlbGVjdHMgYSBwYXJ0aWN1bGFyIERDVCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLAotICogYW5kIGl0IHBlcmZvcm1zIHJlbGF0ZWQgaG91c2VrZWVwaW5nIGNob3JlcyBpbmNsdWRpbmcgY29lZmZpY2llbnQKLSAqIHF1YW50aXphdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCBmb3IgdGhpcyBtb2R1bGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBEQ1Qgcm91dGluZSBhY3R1YWxseSBpbiB1c2UgKi8KLSAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3Q7Ci0KLSAgLyogVGhlIGFjdHVhbCBwb3N0LURDVCBkaXZpc29ycyAtLS0gbm90IGlkZW50aWNhbCB0byB0aGUgcXVhbnQgdGFibGUKLSAgICogZW50cmllcywgYmVjYXVzZSBvZiBzY2FsaW5nIChlc3BlY2lhbGx5IGZvciBhbiB1bm5vcm1hbGl6ZWQgRENUKS4KLSAgICogRWFjaCB0YWJsZSBpcyBnaXZlbiBpbiBub3JtYWwgYXJyYXkgb3JkZXIuCi0gICAqLwotICBEQ1RFTEVNICogZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAvKiBTYW1lIGFzIGFib3ZlIGZvciB0aGUgZmxvYXRpbmctcG9pbnQgY2FzZS4gKi8KLSAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZmxvYXRfZGN0OwotICBGQVNUX0ZMT0FUICogZmxvYXRfZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwotI2VuZGlmCi19IG15X2ZkY3RfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9mZGN0X2NvbnRyb2xsZXIgKiBteV9mZGN0X3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKiBWZXJpZnkgdGhhdCBhbGwgcmVmZXJlbmNlZCBRLXRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIHNldCB1cAotICogdGhlIGRpdmlzb3IgdGFibGUgZm9yIGVhY2ggb25lLgotICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIERDVCBvZiBhbGwgY29tcG9uZW50cyBpcyBkb25lIGR1cmluZwotICogdGhlIGZpcnN0IHBhc3MsIGV2ZW4gaWYgb25seSBzb21lIGNvbXBvbmVudHMgd2lsbCBiZSBvdXRwdXQgaW4gdGhlCi0gKiBmaXJzdCBzY2FuLiAgSGVuY2UgYWxsIGNvbXBvbmVudHMgc2hvdWxkIGJlIGV4YW1pbmVkIGhlcmUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2ZkY3RtZ3IgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKLSAgaW50IGNpLCBxdGJsbm8sIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotICBEQ1RFTEVNICogZHRibDsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKLSAgICAvKiBNYWtlIHN1cmUgc3BlY2lmaWVkIHF1YW50aXphdGlvbiB0YWJsZSBpcyBwcmVzZW50ICovCi0gICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0JY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOwotICAgIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXTsKLSAgICAvKiBDb21wdXRlIGRpdmlzb3JzIGZvciB0aGlzIHF1YW50IHRhYmxlICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIHNhbWUgdGFibGUsIGJ1dCBpdCdzIG5vdCBhIGJpZyBkZWFsICovCi0gICAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgewotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICAvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KLSAgICAgICAqIGNvZWZmaWNpZW50cyBtdWx0aXBsaWVkIGJ5IDggKHRvIGNvdW50ZXJhY3Qgc2NhbGluZykuCi0gICAgICAgKi8KLSAgICAgIGlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQlmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOwotICAgICAgfQotICAgICAgZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCWR0YmxbaV0gPSAoKERDVEVMRU0pIHF0YmwtPnF1YW50dmFsW2ldKSA8PCAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0lGQVNUOgotICAgICAgewotCS8qIEZvciBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICogV2UgYXBwbHkgYSBmdXJ0aGVyIHNjYWxlIGZhY3RvciBvZiA4LgotCSAqLwotI2RlZmluZSBDT05TVF9CSVRTIDE0Ci0Jc3RhdGljIGNvbnN0IElOVDE2IGFhbnNjYWxlc1tEQ1RTSVpFMl0gPSB7Ci0JICAvKiBwcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE0IGJpdHMgKi8KLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKLQkgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKLQkgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgMTUxMzcsIDEwNDI2LCAgNTMxNSwKLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKLQkgICA4ODY3LCAxMjI5OSwgMTE1ODUsIDEwNDI2LCAgODg2NywgIDY5NjcsICA0Nzk5LCAgMjQ0NiwKLQkgICA0NTIwLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NwotCX07Ci0JU0hJRlRfVEVNUFMKLQotCWlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQkgIGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQotCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7Ci0JfQotCWR0YmwgPSBmZGN0LT5kaXZpc29yc1txdGJsbm9dOwotCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JICBkdGJsW2ldID0gKERDVEVMRU0pCi0JICAgIERFU0NBTEUoTVVMVElQTFkxNlYxNigoSU5UMzIpIHF0YmwtPnF1YW50dmFsW2ldLAotCQkJCSAgKElOVDMyKSBhYW5zY2FsZXNbaV0pLAotCQkgICAgQ09OU1RfQklUUy0zKTsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfRkxPQVQ6Ci0gICAgICB7Ci0JLyogRm9yIGZsb2F0IEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KLQkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKLQkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQotCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKLQkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCi0JICogV2hhdCdzIGFjdHVhbGx5IHN0b3JlZCBpcyAxL2Rpdmlzb3Igc28gdGhhdCB0aGUgaW5uZXIgbG9vcCBjYW4KLQkgKiB1c2UgYSBtdWx0aXBsaWNhdGlvbiByYXRoZXIgdGhhbiBhIGRpdmlzaW9uLgotCSAqLwotCUZBU1RfRkxPQVQgKiBmZHRibDsKLQlpbnQgcm93LCBjb2w7Ci0Jc3RhdGljIGNvbnN0IGRvdWJsZSBhYW5zY2FsZWZhY3RvcltEQ1RTSVpFXSA9IHsKLQkgIDEuMCwgMS4zODcwMzk4NDUsIDEuMzA2NTYyOTY1LCAxLjE3NTg3NTYwMiwKLQkgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQotCX07Ci0KLQlpZiAoZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7Ci0JICBmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID0gKEZBU1RfRkxPQVQgKikKLQkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkJRENUU0laRTIgKiBTSVpFT0YoRkFTVF9GTE9BVCkpOwotCX0KLQlmZHRibCA9IGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub107Ci0JaSA9IDA7Ci0JZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgewotCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgewotCSAgICBmZHRibFtpXSA9IChGQVNUX0ZMT0FUKQotCSAgICAgICgxLjAgLyAoKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKLQkJICAgICAgIGFhbnNjYWxlZmFjdG9yW3Jvd10gKiBhYW5zY2FsZWZhY3Rvcltjb2xdICogOC4wKSkpOwotCSAgICBpKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZm9yd2FyZCBEQ1Qgb24gb25lIG9yIG1vcmUgYmxvY2tzIG9mIGEgY29tcG9uZW50LgotICoKLSAqIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSB0YWtlbiBmcm9tIHRoZSBzYW1wbGVfZGF0YVtdIGFycmF5IHN0YXJ0aW5nIGF0Ci0gKiBwb3NpdGlvbiBzdGFydF9yb3cvc3RhcnRfY29sLCBhbmQgbW92aW5nIHRvIHRoZSByaWdodCBmb3IgYW55IGFkZGl0aW9uYWwKLSAqIGJsb2Nrcy4gVGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIGNvZWZfYmxvY2tzW10uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mb3J3YXJkX0RDVCAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAotCSAgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCSAgICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQotLyogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgZm9yIGludGVnZXIgRENUIGltcGxlbWVudGF0aW9ucy4gKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgaXQgdGlnaHRseS4gKi8KLSAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7Ci0gIGZvcndhcmRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZGN0OwotICBEQ1RFTEVNICogZGl2aXNvcnMgPSBmZGN0LT5kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOwotICBEQ1RFTEVNIHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCi0gIEpESU1FTlNJT04gYmk7Ci0KLSAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwotCi0gIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7Ci0gICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICB7IHJlZ2lzdGVyIERDVEVMRU0gKndvcmtzcGFjZXB0cjsKLSAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7Ci0gICAgICByZWdpc3RlciBpbnQgZWxlbXI7Ci0KLSAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKLSAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKLQllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOwotI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCi0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0jZWxzZQotCXsgcmVnaXN0ZXIgaW50IGVsZW1jOwotCSAgZm9yIChlbGVtYyA9IERDVFNJWkU7IGVsZW1jID4gMDsgZWxlbWMtLSkgewotCSAgICAqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkgIH0KLQl9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KLSAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7Ci0KLSAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KLSAgICB7IHJlZ2lzdGVyIERDVEVMRU0gdGVtcCwgcXZhbDsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQlxdmFsID0gZGl2aXNvcnNbaV07Ci0JdGVtcCA9IHdvcmtzcGFjZVtpXTsKLQkvKiBEaXZpZGUgdGhlIGNvZWZmaWNpZW50IHZhbHVlIGJ5IHF2YWwsIGVuc3VyaW5nIHByb3BlciByb3VuZGluZy4KLQkgKiBTaW5jZSBDIGRvZXMgbm90IHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiByb3VuZGluZyBmb3IgbmVnYXRpdmUKLQkgKiBxdW90aWVudHMsIHdlIGhhdmUgdG8gZm9yY2UgdGhlIGRpdmlkZW5kIHBvc2l0aXZlIGZvciBwb3J0YWJpbGl0eS4KLQkgKgotCSAqIEluIG1vc3QgZmlsZXMsIGF0IGxlYXN0IGhhbGYgb2YgdGhlIG91dHB1dCB2YWx1ZXMgd2lsbCBiZSB6ZXJvCi0JICogKGF0IGRlZmF1bHQgcXVhbnRpemF0aW9uIHNldHRpbmdzLCBtb3JlIGxpa2UgdGhyZWUtcXVhcnRlcnMuLi4pCi0JICogc28gd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoaXMgY2FzZSBpcyBmYXN0LiAgT24gbWFueSBtYWNoaW5lcywKLQkgKiBhIGNvbXBhcmlzb24gaXMgZW5vdWdoIGNoZWFwZXIgdGhhbiBhIGRpdmlkZSB0byBtYWtlIGEgc3BlY2lhbCB0ZXN0Ci0JICogYSB3aW4uICBTaW5jZSBib3RoIGlucHV0cyB3aWxsIGJlIG5vbm5lZ2F0aXZlLCB3ZSBuZWVkIG9ubHkgdGVzdAotCSAqIGZvciBhIDwgYiB0byBkaXNjb3ZlciB3aGV0aGVyIGEvYiBpcyAwLgotCSAqIElmIHlvdXIgbWFjaGluZSdzIGRpdmlzaW9uIGlzIGZhc3QgZW5vdWdoLCBkZWZpbmUgRkFTVF9ESVZJREUuCi0JICovCi0jaWZkZWYgRkFTVF9ESVZJREUKLSNkZWZpbmUgRElWSURFX0JZKGEsYikJYSAvPSBiCi0jZWxzZQotI2RlZmluZSBESVZJREVfQlkoYSxiKQlpZiAoYSA+PSBiKSBhIC89IGI7IGVsc2UgYSA9IDAKLSNlbmRpZgotCWlmICh0ZW1wIDwgMCkgewotCSAgdGVtcCA9IC10ZW1wOwotCSAgdGVtcCArPSBxdmFsPj4xOwkvKiBmb3Igcm91bmRpbmcgKi8KLQkgIERJVklERV9CWSh0ZW1wLCBxdmFsKTsKLQkgIHRlbXAgPSAtdGVtcDsKLQl9IGVsc2UgewotCSAgdGVtcCArPSBxdmFsPj4xOwkvKiBmb3Igcm91bmRpbmcgKi8KLQkgIERJVklERV9CWSh0ZW1wLCBxdmFsKTsKLQl9Ci0Jb3V0cHV0X3B0cltpXSA9IChKQ09FRikgdGVtcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi1NRVRIT0RERUYodm9pZCkKLWZvcndhcmRfRENUX2Zsb2F0IChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKLQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCQkgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCi0vKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgZmxvYXRpbmctcG9pbnQgRENUIGltcGxlbWVudGF0aW9ucy4gKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgaXQgdGlnaHRseS4gKi8KLSAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7Ci0gIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRvX2Zsb2F0X2RjdDsKLSAgRkFTVF9GTE9BVCAqIGRpdmlzb3JzID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbY29tcHB0ci0+cXVhbnRfdGJsX25vXTsKLSAgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdOyAvKiB3b3JrIGFyZWEgZm9yIEZEQ1Qgc3Vicm91dGluZSAqLwotICBKRElNRU5TSU9OIGJpOwotCi0gIHNhbXBsZV9kYXRhICs9IHN0YXJ0X3JvdzsJLyogZm9sZCBpbiB0aGUgdmVydGljYWwgb2Zmc2V0IG9uY2UgKi8KLQotICBmb3IgKGJpID0gMDsgYmkgPCBudW1fYmxvY2tzOyBiaSsrLCBzdGFydF9jb2wgKz0gRENUU0laRSkgewotICAgIC8qIExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCi0gICAgeyByZWdpc3RlciBGQVNUX0ZMT0FUICp3b3Jrc3BhY2VwdHI7Ci0gICAgICByZWdpc3RlciBKU0FNUFJPVyBlbGVtcHRyOwotICAgICAgcmVnaXN0ZXIgaW50IGVsZW1yOwotCi0gICAgICB3b3Jrc3BhY2VwdHIgPSB3b3Jrc3BhY2U7Ci0gICAgICBmb3IgKGVsZW1yID0gMDsgZWxlbXIgPCBEQ1RTSVpFOyBlbGVtcisrKSB7Ci0JZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2VsZW1yXSArIHN0YXJ0X2NvbDsKLSNpZiBEQ1RTSVpFID09IDgJCS8qIHVucm9sbCB0aGUgaW5uZXIgbG9vcCAqLwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLSNlbHNlCi0JeyByZWdpc3RlciBpbnQgZWxlbWM7Ci0JICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7Ci0JICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKQotCSAgICAgIChHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JICB9Ci0JfQotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUGVyZm9ybSB0aGUgRENUICovCi0gICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOwotCi0gICAgLyogUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2Nrc1tdICovCi0gICAgeyByZWdpc3RlciBGQVNUX0ZMT0FUIHRlbXA7Ci0gICAgICByZWdpc3RlciBpbnQgaTsKLSAgICAgIHJlZ2lzdGVyIEpDT0VGUFRSIG91dHB1dF9wdHIgPSBjb2VmX2Jsb2Nrc1tiaV07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JLyogQXBwbHkgdGhlIHF1YW50aXphdGlvbiBhbmQgc2NhbGluZyBmYWN0b3IgKi8KLQl0ZW1wID0gd29ya3NwYWNlW2ldICogZGl2aXNvcnNbaV07Ci0JLyogUm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyLgotCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQotCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgotCSAqIFRoZSBtYXhpbXVtIGNvZWZmaWNpZW50IHNpemUgaXMgKy0xNksgKGZvciAxMi1iaXQgZGF0YSksIHNvIHRoaXMKLQkgKiBjb2RlIHNob3VsZCB3b3JrIGZvciBlaXRoZXIgMTYtYml0IG9yIDMyLWJpdCBpbnRzLgotCSAqLwotCW91dHB1dF9wdHJbaV0gPSAoSkNPRUYpICgoaW50KSAodGVtcCArIChGQVNUX0ZMT0FUKSAxNjM4NC41KSAtIDE2Mzg0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBGRENUIG1hbmFnZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9mb3J3YXJkX2RjdCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2ZkY3RfcHRyIGZkY3Q7Ci0gIGludCBpOwotCi0gIGZkY3QgPSAobXlfZmRjdF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfZmRjdF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5mZGN0ID0gKHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICopIGZkY3Q7Ci0gIGZkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19mZGN0bWdyOwotCi0gIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JU0xPVzoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaXNsb3c7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JRkFTVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaWZhc3Q7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9GTE9BVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVF9mbG9hdDsKLSAgICBmZGN0LT5kb19mbG9hdF9kY3QgPSBqcGVnX2ZkY3RfZmxvYXQ7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBNYXJrIGRpdmlzb3IgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7Ci0gICAgZmRjdC0+ZGl2aXNvcnNbaV0gPSBOVUxMOwotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICBmZGN0LT5mbG9hdF9kaXZpc29yc1tpXSA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNodWZmLmMgYi9saWJqcGVndHdycC9qY2h1ZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNTI1MC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY2h1ZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDkwOSArMCwwIEBACi0vKgotICogamNodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMuCi0gKgotICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgb3V0cHV0IHN1c3BlbnNpb24uCi0gKiBJZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KLSAqIGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUKLSAqIHZhcmlhYmxlcyBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlCi0gKiBwZXJtYW5lbnQgSlBFRyBvYmplY3RzIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqY2h1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqY3BodWZmLmMgKi8KLQotCi0vKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGVuY29kaW5nLgotICoKLSAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKLSAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLwotICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLwotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi19IHNhdmFibGVfc3RhdGU7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KLSAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQotICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgotICovCi0KLSNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCi0jZWxzZQotI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAotCSgoZGVzdCkucHV0X2J1ZmZlciA9IChzcmMpLnB1dF9idWZmZXIsIFwKLQkgKGRlc3QpLnB1dF9iaXRzID0gKHNyYykucHV0X2JpdHMsIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCi0jZW5kaWYKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBCaXQgYnVmZmVyICYgREMgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCi0gIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciB0byB3cml0ZSAoMC03KSAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCi0gIGNfZGVyaXZlZF90YmwgKiBkY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0gIGNfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQJLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbiAqLwotICBsb25nICogZGNfY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgbG9uZyAqIGFjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107Ci0jZW5kaWYKLX0gaHVmZl9lbnRyb3B5X2VuY29kZXI7Ci0KLXR5cGVkZWYgaHVmZl9lbnRyb3B5X2VuY29kZXIgKiBodWZmX2VudHJvcHlfcHRyOwotCi0vKiBXb3JraW5nIHN0YXRlIHdoaWxlIHdyaXRpbmcgYW4gTUNVLgotICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgYWxsIHRoZSBmaWVsZHMgdGhhdCBhcmUgbmVlZGVkIGJ5IHN1YnJvdXRpbmVzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotICBzYXZhYmxlX3N0YXRlIGN1cjsJCS8qIEN1cnJlbnQgYml0IGJ1ZmZlciAmIERDIHN0YXRlICovCi0gIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogZHVtcF9idWZmZXIgbmVlZHMgYWNjZXNzIHRvIHRoaXMgKi8KLX0gd29ya2luZ19zdGF0ZTsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9nYXRoZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICogSWYgZ2F0aGVyX3N0YXRpc3RpY3MgaXMgVFJVRSwgd2UgZG8gbm90IG91dHB1dCBhbnl0aGluZyBkdXJpbmcgdGhlIHNjYW4sCi0gKiBqdXN0IGNvdW50IHRoZSBIdWZmbWFuIHN5bWJvbHMgdXNlZCBhbmQgZ2VuZXJhdGUgSHVmZm1hbiBjb2RlIHRhYmxlcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpLCBkY3RibCwgYWN0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlmIChnYXRoZXJfc3RhdGlzdGljcykgewotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9nYXRoZXI7Ci0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfZ2F0aGVyOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfaHVmZjsKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19odWZmOwotICB9Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgewotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXhlcyAqLwotICAgICAgLyogKG1ha2VfY19kZXJpdmVkX3RibCBkb2VzIHRoaXMgaW4gdGhlIG90aGVyIHBhdGgpICovCi0gICAgICBpZiAoZGN0YmwgPCAwIHx8IGRjdGJsID49IE5VTV9IVUZGX1RCTFMpCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgZGN0YmwpOwotICAgICAgaWYgKGFjdGJsIDwgMCB8fCBhY3RibCA+PSBOVU1fSFVGRl9UQkxTKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGFjdGJsKTsKLSAgICAgIC8qIEFsbG9jYXRlIGFuZCB6ZXJvIHRoZSBzdGF0aXN0aWNzIHRhYmxlcyAqLwotICAgICAgLyogTm90ZSB0aGF0IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgZXhwZWN0cyAyNTcgZW50cmllcyBpbiBlYWNoIHRhYmxlISAqLwotICAgICAgaWYgKGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID09IE5VTEwpCi0JZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0gPSAobG9uZyAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgICAgTUVNWkVSTyhlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIGlmIChlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9PSBOVUxMKQotCWVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdID0gKGxvbmcgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIE1FTVpFUk8oZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZXMgKi8KLSAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCi0gICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tkY3RibF0pOwotICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKLQkJCSAgICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7Ci0gICAgfQotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIGJpdCBidWZmZXIgdG8gZW1wdHkgKi8KLSAgZW50cm9weS0+c2F2ZWQucHV0X2J1ZmZlciA9IDA7Ci0gIGVudHJvcHktPnNhdmVkLnB1dF9iaXRzID0gMDsKLQotICAvKiBJbml0aWFsaXplIHJlc3RhcnQgc3R1ZmYgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSA9IDA7Ci19Ci0KLQotLyoKLSAqIENvbXB1dGUgdGhlIGRlcml2ZWQgdmFsdWVzIGZvciBhIEh1ZmZtYW4gdGFibGUuCi0gKiBUaGlzIHJvdXRpbmUgYWxzbyBwZXJmb3JtcyBzb21lIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB0YWJsZS4KLSAqCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpjcGh1ZmYuYy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCi0JCQkgY19kZXJpdmVkX3RibCAqKiBwZHRibCkKLXsKLSAgSkhVRkZfVEJMICpodGJsOwotICBjX2Rlcml2ZWRfdGJsICpkdGJsOwotICBpbnQgcCwgaSwgbCwgbGFzdHAsIHNpLCBtYXhzeW1ib2w7Ci0gIGNoYXIgaHVmZnNpemVbMjU3XTsKLSAgdW5zaWduZWQgaW50IGh1ZmZjb2RlWzI1N107Ci0gIHVuc2lnbmVkIGludCBjb2RlOwotCi0gIC8qIE5vdGUgdGhhdCBodWZmc2l6ZVtdIGFuZCBodWZmY29kZVtdIGFyZSBmaWxsZWQgaW4gY29kZS1sZW5ndGggb3JkZXIsCi0gICAqIHBhcmFsbGVsaW5nIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGluIGh0YmwtPmh1ZmZ2YWxbXS4KLSAgICovCi0KLSAgLyogRmluZCB0aGUgaW5wdXQgSHVmZm1hbiB0YWJsZSAqLwotICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9IVUZGX1RCTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOwotICBodGJsID0KLSAgICBpc0RDID8gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dIDogY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dOwotICBpZiAoaHRibCA9PSBOVUxMKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKLQotICAvKiBBbGxvY2F0ZSBhIHdvcmtzcGFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gKi8KLSAgaWYgKCpwZHRibCA9PSBOVUxMKQotICAgICpwZHRibCA9IChjX2Rlcml2ZWRfdGJsICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGNfZGVyaXZlZF90YmwpKTsKLSAgZHRibCA9ICpwZHRibDsKLSAgCi0gIC8qIEZpZ3VyZSBDLjE6IG1ha2UgdGFibGUgb2YgSHVmZm1hbiBjb2RlIGxlbmd0aCBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBwID0gMDsKLSAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7Ci0gICAgaSA9IChpbnQpIGh0YmwtPmJpdHNbbF07Ci0gICAgaWYgKGkgPCAwIHx8IHAgKyBpID4gMjU2KQkvKiBwcm90ZWN0IGFnYWluc3QgdGFibGUgb3ZlcnJ1biAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgd2hpbGUgKGktLSkKLSAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKLSAgfQotICBodWZmc2l6ZVtwXSA9IDA7Ci0gIGxhc3RwID0gcDsKLSAgCi0gIC8qIEZpZ3VyZSBDLjI6IGdlbmVyYXRlIHRoZSBjb2RlcyB0aGVtc2VsdmVzICovCi0gIC8qIFdlIGFsc28gdmFsaWRhdGUgdGhhdCB0aGUgY291bnRzIHJlcHJlc2VudCBhIGxlZ2FsIEh1ZmZtYW4gY29kZSB0cmVlLiAqLwotCi0gIGNvZGUgPSAwOwotICBzaSA9IGh1ZmZzaXplWzBdOwotICBwID0gMDsKLSAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7Ci0gICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gc2kpIHsKLSAgICAgIGh1ZmZjb2RlW3ArK10gPSBjb2RlOwotICAgICAgY29kZSsrOwotICAgIH0KLSAgICAvKiBjb2RlIGlzIG5vdyAxIG1vcmUgdGhhbiB0aGUgbGFzdCBjb2RlIHVzZWQgZm9yIGNvZGVsZW5ndGggc2k7IGJ1dAotICAgICAqIGl0IG11c3Qgc3RpbGwgZml0IGluIHNpIGJpdHMsIHNpbmNlIG5vIGNvZGUgaXMgYWxsb3dlZCB0byBiZSBhbGwgb25lcy4KLSAgICAgKi8KLSAgICBpZiAoKChJTlQzMikgY29kZSkgPj0gKCgoSU5UMzIpIDEpIDw8IHNpKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIGNvZGUgPDw9IDE7Ci0gICAgc2krKzsKLSAgfQotICAKLSAgLyogRmlndXJlIEMuMzogZ2VuZXJhdGUgZW5jb2RpbmcgdGFibGVzICovCi0gIC8qIFRoZXNlIGFyZSBjb2RlIGFuZCBzaXplIGluZGV4ZWQgYnkgc3ltYm9sIHZhbHVlICovCi0KLSAgLyogU2V0IGFsbCBjb2RlbGVzcyBzeW1ib2xzIHRvIGhhdmUgY29kZSBsZW5ndGggMDsKLSAgICogdGhpcyBsZXRzIHVzIGRldGVjdCBkdXBsaWNhdGUgVkFMIGVudHJpZXMgaGVyZSwgYW5kIGxhdGVyCi0gICAqIGFsbG93cyBlbWl0X2JpdHMgdG8gZGV0ZWN0IGFueSBhdHRlbXB0IHRvIGVtaXQgc3VjaCBzeW1ib2xzLgotICAgKi8KLSAgTUVNWkVSTyhkdGJsLT5laHVmc2ksIFNJWkVPRihkdGJsLT5laHVmc2kpKTsKLQotICAvKiBUaGlzIGlzIGFsc28gYSBjb252ZW5pZW50IHBsYWNlIHRvIGNoZWNrIGZvciBvdXQtb2YtcmFuZ2UKLSAgICogYW5kIGR1cGxpY2F0ZWQgVkFMIGVudHJpZXMuICBXZSBhbGxvdyAwLi4yNTUgZm9yIEFDIHN5bWJvbHMKLSAgICogYnV0IG9ubHkgMC4uMTUgZm9yIERDLiAgKFdlIGNvdWxkIGNvbnN0cmFpbiB0aGVtIGZ1cnRoZXIKLSAgICogYmFzZWQgb24gZGF0YSBkZXB0aCBhbmQgbW9kZSwgYnV0IHRoaXMgc2VlbXMgZW5vdWdoLikKLSAgICovCi0gIG1heHN5bWJvbCA9IGlzREMgPyAxNSA6IDI1NTsKLQotICBmb3IgKHAgPSAwOyBwIDwgbGFzdHA7IHArKykgewotICAgIGkgPSBodGJsLT5odWZmdmFsW3BdOwotICAgIGlmIChpIDwgMCB8fCBpID4gbWF4c3ltYm9sIHx8IGR0YmwtPmVodWZzaVtpXSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIGR0YmwtPmVodWZjb1tpXSA9IGh1ZmZjb2RlW3BdOwotICAgIGR0YmwtPmVodWZzaVtpXSA9IGh1ZmZzaXplW3BdOwotICB9Ci19Ci0KLQotLyogT3V0cHV0dGluZyBieXRlcyB0byB0aGUgZmlsZSAqLwotCi0vKiBFbWl0IGEgYnl0ZSwgdGFraW5nICdhY3Rpb24nIGlmIG11c3Qgc3VzcGVuZC4gKi8KLSNkZWZpbmUgZW1pdF9ieXRlKHN0YXRlLHZhbCxhY3Rpb24pICBcCi0JeyAqKHN0YXRlKS0+bmV4dF9vdXRwdXRfYnl0ZSsrID0gKEpPQ1RFVCkgKHZhbCk7ICBcCi0JICBpZiAoLS0oc3RhdGUpLT5mcmVlX2luX2J1ZmZlciA9PSAwKSAgXAotCSAgICBpZiAoISBkdW1wX2J1ZmZlcihzdGF0ZSkpICBcCi0JICAgICAgeyBhY3Rpb247IH0gfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1kdW1wX2J1ZmZlciAod29ya2luZ19zdGF0ZSAqIHN0YXRlKQotLyogRW1wdHkgdGhlIG91dHB1dCBidWZmZXI7IHJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIG11c3Qgc3VzcGVuZCAqLwotewotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gc3RhdGUtPmNpbmZvLT5kZXN0OwotCi0gIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKHN0YXRlLT5jaW5mbykpCi0gICAgcmV0dXJuIEZBTFNFOwotICAvKiBBZnRlciBhIHN1Y2Nlc3NmdWwgYnVmZmVyIGR1bXAsIG11c3QgcmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCi0gIHN0YXRlLT5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgc3RhdGUtPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qIE91dHB1dHRpbmcgYml0cyB0byB0aGUgZmlsZSAqLwotCi0vKiBPbmx5IHRoZSByaWdodCAyNCBiaXRzIG9mIHB1dF9idWZmZXIgYXJlIHVzZWQ7IHRoZSB2YWxpZCBiaXRzIGFyZQotICogbGVmdC1qdXN0aWZpZWQgaW4gdGhpcyBwYXJ0LiAgQXQgbW9zdCAxNiBiaXRzIGNhbiBiZSBwYXNzZWQgdG8gZW1pdF9iaXRzCi0gKiBpbiBvbmUgY2FsbCwgYW5kIHdlIG5ldmVyIHJldGFpbiBtb3JlIHRoYW4gNyBiaXRzIGluIHB1dF9idWZmZXIKLSAqIGJldHdlZW4gY2FsbHMsIHNvIDI0IGJpdHMgYXJlIHN1ZmZpY2llbnQuCi0gKi8KLQotSU5MSU5FCi1MT0NBTChib29sZWFuKQotZW1pdF9iaXRzICh3b3JraW5nX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKLS8qIEVtaXQgc29tZSBiaXRzOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgdGlnaHRseS4gKi8KLSAgcmVnaXN0ZXIgSU5UMzIgcHV0X2J1ZmZlciA9IChJTlQzMikgY29kZTsKLSAgcmVnaXN0ZXIgaW50IHB1dF9iaXRzID0gc3RhdGUtPmN1ci5wdXRfYml0czsKLQotICAvKiBpZiBzaXplIGlzIDAsIGNhbGxlciB1c2VkIGFuIGludmFsaWQgSHVmZm1hbiB0YWJsZSBlbnRyeSAqLwotICBpZiAoc2l6ZSA9PSAwKQotICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKLQotICBwdXRfYnVmZmVyICY9ICgoKElOVDMyKSAxKTw8c2l6ZSkgLSAxOyAvKiBtYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiBjb2RlICovCi0gIAotICBwdXRfYml0cyArPSBzaXplOwkJLyogbmV3IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAKLSAgcHV0X2J1ZmZlciA8PD0gMjQgLSBwdXRfYml0czsgLyogYWxpZ24gaW5jb21pbmcgYml0cyAqLwotCi0gIHB1dF9idWZmZXIgfD0gc3RhdGUtPmN1ci5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCi0gIAotICB3aGlsZSAocHV0X2JpdHMgPj0gOCkgewotICAgIGludCBjID0gKGludCkgKChwdXRfYnVmZmVyID4+IDE2KSAmIDB4RkYpOwotICAgIAotICAgIGVtaXRfYnl0ZShzdGF0ZSwgYywgcmV0dXJuIEZBTFNFKTsKLSAgICBpZiAoYyA9PSAweEZGKSB7CQkvKiBuZWVkIHRvIHN0dWZmIGEgemVybyBieXRlPyAqLwotICAgICAgZW1pdF9ieXRlKHN0YXRlLCAwLCByZXR1cm4gRkFMU0UpOwotICAgIH0KLSAgICBwdXRfYnVmZmVyIDw8PSA4OwotICAgIHB1dF9iaXRzIC09IDg7Ci0gIH0KLQotICBzdGF0ZS0+Y3VyLnB1dF9idWZmZXIgPSBwdXRfYnVmZmVyOyAvKiB1cGRhdGUgc3RhdGUgdmFyaWFibGVzICovCi0gIHN0YXRlLT5jdXIucHV0X2JpdHMgPSBwdXRfYml0czsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZmx1c2hfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlKQotewotICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIDB4N0YsIDcpKSAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCi0gICAgcmV0dXJuIEZBTFNFOwotICBzdGF0ZS0+Y3VyLnB1dF9idWZmZXIgPSAwOwkvKiBhbmQgcmVzZXQgYml0LWJ1ZmZlciB0byBlbXB0eSAqLwotICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gMDsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyogRW5jb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1lbmNvZGVfb25lX2Jsb2NrICh3b3JraW5nX3N0YXRlICogc3RhdGUsIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCi0JCSAgY19kZXJpdmVkX3RibCAqZGN0YmwsIGNfZGVyaXZlZF90YmwgKmFjdGJsKQotewotICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgcmVnaXN0ZXIgaW50IGssIHIsIGk7Ci0gIAotICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRi4xLjIuMSAqLwotICAKLSAgdGVtcCA9IHRlbXAyID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKLQotICBpZiAodGVtcCA8IDApIHsKLSAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgIC8qIEZvciBhIG5lZ2F0aXZlIGlucHV0LCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhpbnB1dCkgKi8KLSAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB3ZSBhcmUgb24gYSB0d28ncyBjb21wbGVtZW50IG1hY2hpbmUgKi8KLSAgICB0ZW1wMi0tOwotICB9Ci0gIAotICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gIG5iaXRzID0gMDsKLSAgd2hpbGUgKHRlbXApIHsKLSAgICBuYml0cysrOwotICAgIHRlbXAgPj49IDE7Ci0gIH0KLSAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCi0gICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCi0gICAqLwotICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCi0gICAgRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgCi0gIC8qIEVtaXQgdGhlIEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBkY3RibC0+ZWh1ZmNvW25iaXRzXSwgZGN0YmwtPmVodWZzaVtuYml0c10pKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCi0gIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLwotICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICAKLSAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSBibG9ja1tqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KLSAgICAgIHdoaWxlIChyID4gMTUpIHsKLQlpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29bMHhGMF0sIGFjdGJsLT5laHVmc2lbMHhGMF0pKQotCSAgcmV0dXJuIEZBTFNFOwotCXIgLT0gMTY7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXAyID0gdGVtcDsKLSAgICAgIGlmICh0ZW1wIDwgMCkgewotCXRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0JLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCi0JdGVtcDItLTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KLSAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCi0JbmJpdHMrKzsKLSAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCi0gICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQotCUVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0gICAgICAKLSAgICAgIC8qIEVtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLwotICAgICAgaSA9IChyIDw8IDQpICsgbmJpdHM7Ci0gICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29baV0sIGFjdGJsLT5laHVmc2lbaV0pKQotCXJldHVybiBGQUxTRTsKLQotICAgICAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCi0gICAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICAKLSAgICAgIHIgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCi0gIGlmIChyID4gMCkKLSAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29bMF0sIGFjdGJsLT5laHVmc2lbMF0pKQotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBFbWl0IGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIHByZWRpY3Rpb25zLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1lbWl0X3Jlc3RhcnQgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgaW50IHJlc3RhcnRfbnVtKQotewotICBpbnQgY2k7Ci0KLSAgaWYgKCEgZmx1c2hfYml0cyhzdGF0ZSkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIGVtaXRfYnl0ZShzdGF0ZSwgMHhGRiwgcmV0dXJuIEZBTFNFKTsKLSAgZW1pdF9ieXRlKHN0YXRlLCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSwgcmV0dXJuIEZBTFNFKTsKLQotICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgc3RhdGUtPmNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgIHN0YXRlLT5jdXIubGFzdF9kY192YWxbY2ldID0gMDsKLQotICAvKiBUaGUgcmVzdGFydCBjb3VudGVyIGlzIG5vdCB1cGRhdGVkIHVudGlsIHdlIHN1Y2Nlc3NmdWxseSB3cml0ZSB0aGUgTUNVLiAqLwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBFbmNvZGUgYW5kIG91dHB1dCBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgd29ya2luZ19zdGF0ZSBzdGF0ZTsKLSAgaW50IGJsa24sIGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgc3RhdGUubmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBzdGF0ZS5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOwotICBzdGF0ZS5jaW5mbyA9IGNpbmZvOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgZW1pdF9yZXN0YXJ0KCZzdGF0ZSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSkpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGlmICghIGVuY29kZV9vbmVfYmxvY2soJnN0YXRlLAotCQkJICAgTUNVX2RhdGFbYmxrbl1bMF0sIHN0YXRlLmN1ci5sYXN0X2RjX3ZhbFtjaV0sCi0JCQkgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXSwKLQkJCSAgIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5hY190Ymxfbm9dKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAvKiBVcGRhdGUgbGFzdF9kY192YWwgKi8KLSAgICBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldID0gTUNVX2RhdGFbYmxrbl1bMF1bMF07Ci0gIH0KLQotICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBzdGF0ZS5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZS5jdXIpOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgd29ya2luZ19zdGF0ZSBzdGF0ZTsKLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgLi4uIGZsdXNoX2JpdHMgbmVlZHMgaXQgKi8KLSAgc3RhdGUubmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBzdGF0ZS5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOwotICBzdGF0ZS5jaW5mbyA9IGNpbmZvOwotCi0gIC8qIEZsdXNoIG91dCB0aGUgbGFzdCBkYXRhICovCi0gIGlmICghIGZsdXNoX2JpdHMoJnN0YXRlKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0KLSAgLyogVXBkYXRlIHN0YXRlICovCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7Ci0gIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKLX0KLQotCi0vKgotICogSHVmZm1hbiBjb2Rpbmcgb3B0aW1pemF0aW9uLgotICoKLSAqIFdlIGZpcnN0IHNjYW4gdGhlIHN1cHBsaWVkIGRhdGEgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgdXNlcyBvZiBlYWNoIHN5bWJvbAotICogdGhhdCBpcyB0byBiZSBIdWZmbWFuLWNvZGVkLiAoVGhpcyBwcm9jZXNzIE1VU1QgYWdyZWUgd2l0aCB0aGUgY29kZSBhYm92ZS4pCi0gKiBUaGVuIHdlIGJ1aWxkIGEgSHVmZm1hbiBjb2RpbmcgdHJlZSBmb3IgdGhlIG9ic2VydmVkIGNvdW50cy4KLSAqIFN5bWJvbHMgd2hpY2ggYXJlIG5vdCBuZWVkZWQgYXQgYWxsIGZvciB0aGUgcGFydGljdWxhciBpbWFnZSBhcmUgbm90Ci0gKiBhc3NpZ25lZCBhbnkgY29kZSwgd2hpY2ggc2F2ZXMgc3BhY2UgaW4gdGhlIERIVCBtYXJrZXIgYXMgd2VsbCBhcyBpbgotICogdGhlIGNvbXByZXNzZWQgZGF0YS4KLSAqLwotCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0KLQotLyogUHJvY2VzcyBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLwotCi1MT0NBTCh2b2lkKQotaHRlc3Rfb25lX2Jsb2NrIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkNPRUZQVFIgYmxvY2ssIGludCBsYXN0X2RjX3ZhbCwKLQkJIGxvbmcgZGNfY291bnRzW10sIGxvbmcgYWNfY291bnRzW10pCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBpbnQgbmJpdHM7Ci0gIHJlZ2lzdGVyIGludCBrLCByOwotICAKLSAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KLSAgCi0gIHRlbXAgPSBibG9ja1swXSAtIGxhc3RfZGNfdmFsOwotICBpZiAodGVtcCA8IDApCi0gICAgdGVtcCA9IC10ZW1wOwotICAKLSAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICBuYml0cyA9IDA7Ci0gIHdoaWxlICh0ZW1wKSB7Ci0gICAgbmJpdHMrKzsKLSAgICB0ZW1wID4+PSAxOwotICB9Ci0gIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgotICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgotICAgKi8KLSAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLQotICAvKiBDb3VudCB0aGUgSHVmZm1hbiBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICBkY19jb3VudHNbbmJpdHNdKys7Ci0gIAotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICAKLSAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSBibG9ja1tqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KLSAgICAgIHdoaWxlIChyID4gMTUpIHsKLQlhY19jb3VudHNbMHhGMF0rKzsKLQlyIC09IDE2OwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgICBpZiAodGVtcCA8IDApCi0JdGVtcCA9IC10ZW1wOwotICAgICAgCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgICBuYml0cyA9IDE7CQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLwotICAgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLQluYml0cysrOwotICAgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KLSAgICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotICAgICAgCi0gICAgICAvKiBDb3VudCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCi0gICAgICBhY19jb3VudHNbKHIgPDwgNCkgKyBuYml0c10rKzsKLSAgICAgIAotICAgICAgciA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhlIGxhc3QgY29lZihzKSB3ZXJlIHplcm8sIGVtaXQgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KLSAgaWYgKHIgPiAwKQotICAgIGFjX2NvdW50c1swXSsrOwotfQotCi0KLS8qCi0gKiBUcmlhbC1lbmNvZGUgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCi0gKiBObyBkYXRhIGlzIGFjdHVhbGx5IG91dHB1dCwgc28gbm8gc3VzcGVuc2lvbiByZXR1cm4gaXMgcG9zc2libGUuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X2dhdGhlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGJsa24sIGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBUYWtlIGNhcmUgb2YgcmVzdGFydCBpbnRlcnZhbHMgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotCWVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gICAgICAvKiBVcGRhdGUgcmVzdGFydCBzdGF0ZSAqLwotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBodGVzdF9vbmVfYmxvY2soY2luZm8sIE1DVV9kYXRhW2Jsa25dWzBdLCBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0sCi0JCSAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2NvbXBwdHItPmRjX3RibF9ub10sCi0JCSAgICBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2NvbXBwdHItPmFjX3RibF9ub10pOwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEdlbmVyYXRlIHRoZSBiZXN0IEh1ZmZtYW4gY29kZSB0YWJsZSBmb3IgdGhlIGdpdmVuIGNvdW50cywgZmlsbCBodGJsLgotICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCi0gKgotICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBubyBzeW1ib2wgYmUgYXNzaWduZWQgYSBjb2Rld29yZCBvZiBhbGwKLSAqIG9uZSBiaXRzIChzbyB0aGF0IHBhZGRpbmcgYml0cyBhZGRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCBzZWdtZW50Ci0gKiBjYW4ndCBsb29rIGxpa2UgYSB2YWxpZCBjb2RlKS4gIEJlY2F1c2Ugb2YgdGhlIGNhbm9uaWNhbCBvcmRlcmluZyBvZgotICogY29kZXdvcmRzLCB0aGlzIGp1c3QgbWVhbnMgdGhhdCB0aGVyZSBtdXN0IGJlIGFuIHVudXNlZCBzbG90IGluIHRoZQotICogbG9uZ2VzdCBjb2Rld29yZCBsZW5ndGggY2F0ZWdvcnkuICBTZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzcGVjIHN1Z2dlc3RzCi0gKiByZXNlcnZpbmcgc3VjaCBhIHNsb3QgYnkgcHJldGVuZGluZyB0aGF0IHN5bWJvbCAyNTYgaXMgYSB2YWxpZCBzeW1ib2wKLSAqIHdpdGggY291bnQgMS4gIEluIHRoZW9yeSB0aGF0J3Mgbm90IG9wdGltYWw7IGdpdmluZyBpdCBjb3VudCB6ZXJvIGJ1dAotICogaW5jbHVkaW5nIGl0IGluIHRoZSBzeW1ib2wgc2V0IGFueXdheSBzaG91bGQgZ2l2ZSBhIGJldHRlciBIdWZmbWFuIGNvZGUuCi0gKiBCdXQgdGhlIHRoZW9yZXRpY2FsbHkgYmV0dGVyIGNvZGUgYWN0dWFsbHkgc2VlbXMgdG8gY29tZSBvdXQgd29yc2UgaW4KLSAqIHByYWN0aWNlLCBiZWNhdXNlIGl0IHByb2R1Y2VzIG1vcmUgYWxsLW9uZXMgYnl0ZXMgKHdoaWNoIGluY3VyIHN0dWZmZWQKLSAqIHplcm8gYnl0ZXMgaW4gdGhlIGZpbmFsIGZpbGUpLiAgSW4gYW55IGNhc2UgdGhlIGRpZmZlcmVuY2UgaXMgdGlueS4KLSAqCi0gKiBUaGUgSlBFRyBzdGFuZGFyZCByZXF1aXJlcyBIdWZmbWFuIGNvZGVzIHRvIGJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIGxvbmcuCi0gKiBJZiBzb21lIHN5bWJvbHMgaGF2ZSBhIHZlcnkgc21hbGwgYnV0IG5vbnplcm8gcHJvYmFiaWxpdHksIHRoZSBIdWZmbWFuIHRyZWUKLSAqIG11c3QgYmUgYWRqdXN0ZWQgdG8gbWVldCB0aGUgY29kZSBsZW5ndGggcmVzdHJpY3Rpb24uICBXZSBjdXJyZW50bHkgdXNlCi0gKiB0aGUgYWRqdXN0bWVudCBtZXRob2Qgc3VnZ2VzdGVkIGluIEpQRUcgc2VjdGlvbiBLLjIuICBUaGlzIG1ldGhvZCBpcyAqbm90KgotICogb3B0aW1hbDsgaXQgbWF5IG5vdCBjaG9vc2UgdGhlIGJlc3QgcG9zc2libGUgbGltaXRlZC1sZW5ndGggY29kZS4gIEJ1dAotICogdHlwaWNhbGx5IG9ubHkgdmVyeS1sb3ctZnJlcXVlbmN5IHN5bWJvbHMgd2lsbCBiZSBnaXZlbiBsZXNzLXRoYW4tb3B0aW1hbAotICogbGVuZ3Rocywgc28gdGhlIGNvZGUgaXMgYWxtb3N0IG9wdGltYWwuICBFeHBlcmltZW50YWwgY29tcGFyaXNvbnMgYWdhaW5zdAotICogYW4gb3B0aW1hbCBsaW1pdGVkLWxlbmd0aC1jb2RlIGFsZ29yaXRobSBpbmRpY2F0ZSB0aGF0IHRoZSBkaWZmZXJlbmNlIGlzCi0gKiBtaWNyb3Njb3BpYyAtLS0gdXN1YWxseSBsZXNzIHRoYW4gYSBodW5kcmVkdGggb2YgYSBwZXJjZW50IG9mIHRvdGFsIHNpemUuCi0gKiBTbyB0aGUgZXh0cmEgY29tcGxleGl0eSBvZiBhbiBvcHRpbWFsIGFsZ29yaXRobSBkb2Vzbid0IHNlZW0gd29ydGh3aGlsZS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZ2VuX29wdGltYWxfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkKLXsKLSNkZWZpbmUgTUFYX0NMRU4gMzIJCS8qIGFzc3VtZWQgbWF4aW11bSBpbml0aWFsIGNvZGUgbGVuZ3RoICovCi0gIFVJTlQ4IGJpdHNbTUFYX0NMRU4rMV07CS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aCBrICovCi0gIGludCBjb2Rlc2l6ZVsyNTddOwkJLyogY29kZXNpemVba10gPSBjb2RlIGxlbmd0aCBvZiBzeW1ib2wgayAqLwotICBpbnQgb3RoZXJzWzI1N107CQkvKiBuZXh0IHN5bWJvbCBpbiBjdXJyZW50IGJyYW5jaCBvZiB0cmVlICovCi0gIGludCBjMSwgYzI7Ci0gIGludCBwLCBpLCBqOwotICBsb25nIHY7Ci0KLSAgLyogVGhpcyBhbGdvcml0aG0gaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gSy4yIG9mIHRoZSBKUEVHIHN0YW5kYXJkICovCi0KLSAgTUVNWkVSTyhiaXRzLCBTSVpFT0YoYml0cykpOwotICBNRU1aRVJPKGNvZGVzaXplLCBTSVpFT0YoY29kZXNpemUpKTsKLSAgZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKQotICAgIG90aGVyc1tpXSA9IC0xOwkJLyogaW5pdCBsaW5rcyB0byBlbXB0eSAqLwotICAKLSAgZnJlcVsyNTZdID0gMTsJCS8qIG1ha2Ugc3VyZSAyNTYgaGFzIGEgbm9uemVybyBjb3VudCAqLwotICAvKiBJbmNsdWRpbmcgdGhlIHBzZXVkby1zeW1ib2wgMjU2IGluIHRoZSBIdWZmbWFuIHByb2NlZHVyZSBndWFyYW50ZWVzCi0gICAqIHRoYXQgbm8gcmVhbCBzeW1ib2wgaXMgZ2l2ZW4gY29kZS12YWx1ZSBvZiBhbGwgb25lcywgYmVjYXVzZSAyNTYKLSAgICogd2lsbCBiZSBwbGFjZWQgbGFzdCBpbiB0aGUgbGFyZ2VzdCBjb2Rld29yZCBjYXRlZ29yeS4KLSAgICovCi0KLSAgLyogSHVmZm1hbidzIGJhc2ljIGFsZ29yaXRobSB0byBhc3NpZ24gb3B0aW1hbCBjb2RlIGxlbmd0aHMgdG8gc3ltYm9scyAqLwotCi0gIGZvciAoOzspIHsKLSAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCBub256ZXJvIGZyZXF1ZW5jeSwgc2V0IGMxID0gaXRzIHN5bWJvbCAqLwotICAgIC8qIEluIGNhc2Ugb2YgdGllcywgdGFrZSB0aGUgbGFyZ2VyIHN5bWJvbCBudW1iZXIgKi8KLSAgICBjMSA9IC0xOwotICAgIHYgPSAxMDAwMDAwMDAwTDsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7Ci0gICAgICBpZiAoZnJlcVtpXSAmJiBmcmVxW2ldIDw9IHYpIHsKLQl2ID0gZnJlcVtpXTsKLQljMSA9IGk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgbmV4dCBzbWFsbGVzdCBub256ZXJvIGZyZXF1ZW5jeSwgc2V0IGMyID0gaXRzIHN5bWJvbCAqLwotICAgIC8qIEluIGNhc2Ugb2YgdGllcywgdGFrZSB0aGUgbGFyZ2VyIHN5bWJvbCBudW1iZXIgKi8KLSAgICBjMiA9IC0xOwotICAgIHYgPSAxMDAwMDAwMDAwTDsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7Ci0gICAgICBpZiAoZnJlcVtpXSAmJiBmcmVxW2ldIDw9IHYgJiYgaSAhPSBjMSkgewotCXYgPSBmcmVxW2ldOwotCWMyID0gaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBEb25lIGlmIHdlJ3ZlIG1lcmdlZCBldmVyeXRoaW5nIGludG8gb25lIGZyZXF1ZW5jeSAqLwotICAgIGlmIChjMiA8IDApCi0gICAgICBicmVhazsKLSAgICAKLSAgICAvKiBFbHNlIG1lcmdlIHRoZSB0d28gY291bnRzL3RyZWVzICovCi0gICAgZnJlcVtjMV0gKz0gZnJlcVtjMl07Ci0gICAgZnJlcVtjMl0gPSAwOwotCi0gICAgLyogSW5jcmVtZW50IHRoZSBjb2Rlc2l6ZSBvZiBldmVyeXRoaW5nIGluIGMxJ3MgdHJlZSBicmFuY2ggKi8KLSAgICBjb2Rlc2l6ZVtjMV0rKzsKLSAgICB3aGlsZSAob3RoZXJzW2MxXSA+PSAwKSB7Ci0gICAgICBjMSA9IG90aGVyc1tjMV07Ci0gICAgICBjb2Rlc2l6ZVtjMV0rKzsKLSAgICB9Ci0gICAgCi0gICAgb3RoZXJzW2MxXSA9IGMyOwkJLyogY2hhaW4gYzIgb250byBjMSdzIHRyZWUgYnJhbmNoICovCi0gICAgCi0gICAgLyogSW5jcmVtZW50IHRoZSBjb2Rlc2l6ZSBvZiBldmVyeXRoaW5nIGluIGMyJ3MgdHJlZSBicmFuY2ggKi8KLSAgICBjb2Rlc2l6ZVtjMl0rKzsKLSAgICB3aGlsZSAob3RoZXJzW2MyXSA+PSAwKSB7Ci0gICAgICBjMiA9IG90aGVyc1tjMl07Ci0gICAgICBjb2Rlc2l6ZVtjMl0rKzsKLSAgICB9Ci0gIH0KLQotICAvKiBOb3cgY291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9mIGVhY2ggY29kZSBsZW5ndGggKi8KLSAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgewotICAgIGlmIChjb2Rlc2l6ZVtpXSkgewotICAgICAgLyogVGhlIEpQRUcgc3RhbmRhcmQgc2VlbXMgdG8gdGhpbmsgdGhhdCB0aGlzIGNhbid0IGhhcHBlbiwgKi8KLSAgICAgIC8qIGJ1dCBJJ20gcGFyYW5vaWQuLi4gKi8KLSAgICAgIGlmIChjb2Rlc2l6ZVtpXSA+IE1BWF9DTEVOKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfSFVGRl9DTEVOX09WRVJGTE9XKTsKLQotICAgICAgYml0c1tjb2Rlc2l6ZVtpXV0rKzsKLSAgICB9Ci0gIH0KLQotICAvKiBKUEVHIGRvZXNuJ3QgYWxsb3cgc3ltYm9scyB3aXRoIGNvZGUgbGVuZ3RocyBvdmVyIDE2IGJpdHMsIHNvIGlmIHRoZSBwdXJlCi0gICAqIEh1ZmZtYW4gcHJvY2VkdXJlIGFzc2lnbmVkIGFueSBzdWNoIGxlbmd0aHMsIHdlIG11c3QgYWRqdXN0IHRoZSBjb2RpbmcuCi0gICAqIEhlcmUgaXMgd2hhdCB0aGUgSlBFRyBzcGVjIHNheXMgYWJvdXQgaG93IHRoaXMgbmV4dCBiaXQgd29ya3M6Ci0gICAqIFNpbmNlIHN5bWJvbHMgYXJlIHBhaXJlZCBmb3IgdGhlIGxvbmdlc3QgSHVmZm1hbiBjb2RlLCB0aGUgc3ltYm9scyBhcmUKLSAgICogcmVtb3ZlZCBmcm9tIHRoaXMgbGVuZ3RoIGNhdGVnb3J5IHR3byBhdCBhIHRpbWUuICBUaGUgcHJlZml4IGZvciB0aGUgcGFpcgotICAgKiAod2hpY2ggaXMgb25lIGJpdCBzaG9ydGVyKSBpcyBhbGxvY2F0ZWQgdG8gb25lIG9mIHRoZSBwYWlyOyB0aGVuLAotICAgKiBza2lwcGluZyB0aGUgQklUUyBlbnRyeSBmb3IgdGhhdCBwcmVmaXggbGVuZ3RoLCBhIGNvZGUgd29yZCBmcm9tIHRoZSBuZXh0Ci0gICAqIHNob3J0ZXN0IG5vbnplcm8gQklUUyBlbnRyeSBpcyBjb252ZXJ0ZWQgaW50byBhIHByZWZpeCBmb3IgdHdvIGNvZGUgd29yZHMKLSAgICogb25lIGJpdCBsb25nZXIuCi0gICAqLwotICAKLSAgZm9yIChpID0gTUFYX0NMRU47IGkgPiAxNjsgaS0tKSB7Ci0gICAgd2hpbGUgKGJpdHNbaV0gPiAwKSB7Ci0gICAgICBqID0gaSAtIDI7CQkvKiBmaW5kIGxlbmd0aCBvZiBuZXcgcHJlZml4IHRvIGJlIHVzZWQgKi8KLSAgICAgIHdoaWxlIChiaXRzW2pdID09IDApCi0Jai0tOwotICAgICAgCi0gICAgICBiaXRzW2ldIC09IDI7CQkvKiByZW1vdmUgdHdvIHN5bWJvbHMgKi8KLSAgICAgIGJpdHNbaS0xXSsrOwkJLyogb25lIGdvZXMgaW4gdGhpcyBsZW5ndGggKi8KLSAgICAgIGJpdHNbaisxXSArPSAyOwkJLyogdHdvIG5ldyBzeW1ib2xzIGluIHRoaXMgbGVuZ3RoICovCi0gICAgICBiaXRzW2pdLS07CQkvKiBzeW1ib2wgb2YgdGhpcyBsZW5ndGggaXMgbm93IGEgcHJlZml4ICovCi0gICAgfQotICB9Ci0KLSAgLyogUmVtb3ZlIHRoZSBjb3VudCBmb3IgdGhlIHBzZXVkby1zeW1ib2wgMjU2IGZyb20gdGhlIGxhcmdlc3QgY29kZWxlbmd0aCAqLwotICB3aGlsZSAoYml0c1tpXSA9PSAwKQkJLyogZmluZCBsYXJnZXN0IGNvZGVsZW5ndGggc3RpbGwgaW4gdXNlICovCi0gICAgaS0tOwotICBiaXRzW2ldLS07Ci0gIAotICAvKiBSZXR1cm4gZmluYWwgc3ltYm9sIGNvdW50cyAob25seSBmb3IgbGVuZ3RocyAwLi4xNikgKi8KLSAgTUVNQ09QWShodGJsLT5iaXRzLCBiaXRzLCBTSVpFT0YoaHRibC0+Yml0cykpOwotICAKLSAgLyogUmV0dXJuIGEgbGlzdCBvZiB0aGUgc3ltYm9scyBzb3J0ZWQgYnkgY29kZSBsZW5ndGggKi8KLSAgLyogSXQncyBub3QgcmVhbCBjbGVhciB0byBtZSB3aHkgd2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciB0aGUgY29kZWxlbmd0aAotICAgKiBjaGFuZ2VzIG1hZGUgYWJvdmUsIGJ1dCB0aGUgSlBFRyBzcGVjIHNlZW1zIHRvIHRoaW5rIHRoaXMgd29ya3MuCi0gICAqLwotICBwID0gMDsKLSAgZm9yIChpID0gMTsgaSA8PSBNQVhfQ0xFTjsgaSsrKSB7Ci0gICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgewotICAgICAgaWYgKGNvZGVzaXplW2pdID09IGkpIHsKLQlodGJsLT5odWZmdmFsW3BdID0gKFVJTlQ4KSBqOwotCXArKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBTZXQgc2VudF90YWJsZSBGQUxTRSBzbyB1cGRhdGVkIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCi0gIGh0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgcGFzcyBhbmQgY3JlYXRlIHRoZSBuZXcgSHVmZm1hbiB0YWJsZXMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgZGN0YmwsIGFjdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSkhVRkZfVEJMICoqaHRibHB0cjsKLSAgYm9vbGVhbiBkaWRfZGNbTlVNX0hVRkZfVEJMU107Ci0gIGJvb2xlYW4gZGlkX2FjW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIEl0J3MgaW1wb3J0YW50IG5vdCB0byBhcHBseSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIG1vcmUgdGhhbiBvbmNlCi0gICAqIHBlciB0YWJsZSwgYmVjYXVzZSBpdCBjbG9iYmVycyB0aGUgaW5wdXQgZnJlcXVlbmN5IGNvdW50cyEKLSAgICovCi0gIE1FTVpFUk8oZGlkX2RjLCBTSVpFT0YoZGlkX2RjKSk7Ci0gIE1FTVpFUk8oZGlkX2FjLCBTSVpFT0YoZGlkX2FjKSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmICghIGRpZF9kY1tkY3RibF0pIHsKLSAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2RjdGJsXTsKLSAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQotCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSk7Ci0gICAgICBkaWRfZGNbZGN0YmxdID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCEgZGlkX2FjW2FjdGJsXSkgewotICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbYWN0YmxdOwotICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0JKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAganBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdKTsKLSAgICAgIGRpZF9hY1thY3RibF0gPSBUUlVFOwotICAgIH0KLSAgfQotfQotCi0KLSNlbmRpZiAvKiBFTlRST1BZX09QVF9TVVBQT1JURUQgKi8KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2h1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKLSAgaW50IGk7Ci0KLSAgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7Ci0gIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OwotICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfaHVmZjsKLQotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2ldID0gZW50cm9weS0+YWNfY291bnRfcHRyc1tpXSA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNodWZmLmggYi9saWJqcGVndHdycC9qY2h1ZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1OTlmYy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY2h1ZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBqY2h1ZmYuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzCi0gKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgc2VxdWVudGlhbCBlbmNvZGVyIChqY2h1ZmYuYykgYW5kIHRoZQotICogcHJvZ3Jlc3NpdmUgZW5jb2RlciAoamNwaHVmZi5jKS4gIE5vIG90aGVyIG1vZHVsZXMgbmVlZCB0byBzZWUgdGhlc2UuCi0gKi8KLQotLyogVGhlIGxlZ2FsIHJhbmdlIG9mIGEgRENUIGNvZWZmaWNpZW50IGlzCi0gKiAgLTEwMjQgLi4gKzEwMjMgIGZvciA4LWJpdCBkYXRhOwotICogLTE2Mzg0IC4uICsxNjM4MyBmb3IgMTItYml0IGRhdGEuCi0gKiBIZW5jZSB0aGUgbWFnbml0dWRlIHNob3VsZCBhbHdheXMgZml0IGluIDEwIG9yIDE0IGJpdHMgcmVzcGVjdGl2ZWx5LgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBNQVhfQ09FRl9CSVRTIDEwCi0jZWxzZQotI2RlZmluZSBNQVhfQ09FRl9CSVRTIDE0Ci0jZW5kaWYKLQotLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgZWh1ZmNvWzI1Nl07CS8qIGNvZGUgZm9yIGVhY2ggc3ltYm9sICovCi0gIGNoYXIgZWh1ZnNpWzI1Nl07CQkvKiBsZW5ndGggb2YgY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KLSAgLyogSWYgbm8gY29kZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGEgc3ltYm9sIFMsIGVodWZzaVtTXSBjb250YWlucyAwICovCi19IGNfZGVyaXZlZF90Ymw7Ci0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqcGVnX21ha2VfY19kZXJpdmVkX3RibAlqTWtDRGVyaXZlZAotI2RlZmluZSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlCWpHZW5PcHRUYmwKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLS8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLwotRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCi0JICAgICBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKSk7Ci0KLS8qIEdlbmVyYXRlIGFuIG9wdGltYWwgdGFibGUgZGVmaW5pdGlvbiBnaXZlbiB0aGUgc3BlY2lmaWVkIGNvdW50cyAqLwotRVhURVJOKHZvaWQpIGpwZWdfZ2VuX29wdGltYWxfdGFibGUKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkpOwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNpbml0LmMgYi9saWJqcGVndHdycC9qY2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmZmZlMy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBqY2luaXQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogVGhpcyByb3V0aW5lIGlzIGluIGNoYXJnZSBvZiBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQgYW5kCi0gKiBtYWtpbmcgYW4gaW5pdGlhbGl6YXRpb24gY2FsbCB0byBlYWNoIG9uZS4KLSAqCi0gKiBMb2dpY2FsbHksIHRoaXMgY29kZSBiZWxvbmdzIGluIGpjbWFzdGVyLmMuICBJdCdzIHNwbGl0IG91dCBiZWNhdXNlCi0gKiBsaW5raW5nIHRoaXMgcm91dGluZSBpbXBsaWVzIGxpbmtpbmcgdGhlIGVudGlyZSBjb21wcmVzc2lvbiBsaWJyYXJ5LgotICogRm9yIGEgdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBqY21hc3Rlci5jCi0gKiB3aXRob3V0IGxpbmtpbmcgaW4gdGhlIHdob2xlIGxpYnJhcnkuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGNvbXByZXNzaW9uIG1vZHVsZXMuCi0gKiBUaGlzIGlzIGRvbmUgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBhbiBpbWFnZS4gIFdlIGRldGVybWluZQotICogd2hpY2ggbW9kdWxlcyB3aWxsIGJlIHVzZWQgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBpbml0aWFsaXphdGlvbiBjYWxscy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NvbXByZXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIEluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wgKGluY2x1ZGVzIHBhcmFtZXRlciBjaGVja2luZy9wcm9jZXNzaW5nKSAqLwotICBqaW5pdF9jX21hc3Rlcl9jb250cm9sKGNpbmZvLCBGQUxTRSAvKiBmdWxsIGNvbXByZXNzaW9uICovKTsKLQotICAvKiBQcmVwcm9jZXNzaW5nICovCi0gIGlmICghIGNpbmZvLT5yYXdfZGF0YV9pbikgewotICAgIGppbml0X2NvbG9yX2NvbnZlcnRlcihjaW5mbyk7Ci0gICAgamluaXRfZG93bnNhbXBsZXIoY2luZm8pOwotICAgIGppbml0X2NfcHJlcF9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotICB9Ci0gIC8qIEZvcndhcmQgRENUICovCi0gIGppbml0X2ZvcndhcmRfZGN0KGNpbmZvKTsKLSAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIE5lZWQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciBpbiBhbnkgbXVsdGktcGFzcyBtb2RlLiAqLwotICBqaW5pdF9jX2NvZWZfY29udHJvbGxlcihjaW5mbywKLQkJKGJvb2xlYW4pIChjaW5mby0+bnVtX3NjYW5zID4gMSB8fCBjaW5mby0+b3B0aW1pemVfY29kaW5nKSk7Ci0gIGppbml0X2NfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotCi0gIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBXcml0ZSB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgKFNPSSkgaW1tZWRpYXRlbHkuCi0gICAqIEZyYW1lIGFuZCBzY2FuIGhlYWRlcnMgYXJlIHBvc3Rwb25lZCB0aWxsIGxhdGVyLgotICAgKiBUaGlzIGxldHMgYXBwbGljYXRpb24gaW5zZXJ0IHNwZWNpYWwgbWFya2VycyBhZnRlciB0aGUgU09JLgotICAgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX2hlYWRlcikgKGNpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjbWFpbmN0LmMgYi9saWJqcGVndHdycC9qY21haW5jdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdmZjIxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjbWFpbmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIGpjbWFpbmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCi0gKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBwcmUtcHJvY2Vzc29yIGFuZCB0aGUgSlBFRwotICogY29tcHJlc3NvciBwcm9wZXI7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogTm90ZTogY3VycmVudGx5LCB0aGVyZSBpcyBubyBvcGVyYXRpbmcgbW9kZSBpbiB3aGljaCBhIGZ1bGwtaW1hZ2UgYnVmZmVyCi0gKiBpcyBuZWVkZWQgYXQgdGhpcyBzdGVwLiAgSWYgdGhlcmUgd2VyZSwgdGhhdCBtb2RlIGNvdWxkIG5vdCBiZSB1c2VkIHdpdGgKLSAqICJyYXcgZGF0YSIgaW5wdXQsIHNpbmNlIHRoaXMgbW9kdWxlIGlzIGJ5cGFzc2VkIGluIHRoYXQgY2FzZS4gIEhvd2V2ZXIsCi0gKiB3ZSd2ZSBsZWZ0IHRoZSBjb2RlIGhlcmUgZm9yIHBvc3NpYmxlIHVzZSBpbiBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLSAqLwotI3VuZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBKRElNRU5TSU9OIGN1cl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIGN1cnJlbnQgaU1DVSByb3cgKi8KLSAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIHJlY2VpdmVkIGluIGlNQ1Ugcm93ICovCi0gIGJvb2xlYW4gc3VzcGVuZGVkOwkJLyogcmVtZW1iZXIgaWYgd2Ugc3VzcGVuZGVkIG91dHB1dCAqLwotICBKX0JVRl9NT0RFIHBhc3NfbW9kZTsJCS8qIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgKi8KLQotICAvKiBJZiB1c2luZyBqdXN0IGEgc3RyaXAgYnVmZmVyLCB0aGlzIHBvaW50cyB0byB0aGUgZW50aXJlIHNldCBvZiBidWZmZXJzCi0gICAqICh3ZSBhbGxvY2F0ZSBvbmUgZm9yIGVhY2ggY29tcG9uZW50KS4gIEluIHRoZSBmdWxsLWltYWdlIGNhc2UsIHRoaXMKLSAgICogcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgYWNjZXNzaWJsZSBzdHJpcHMgb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgotICAgKi8KLSAgSlNBTVBBUlJBWSBidWZmZXJbTUFYX0NPTVBPTkVOVFNdOwotCi0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgLyogSWYgdXNpbmcgZnVsbC1pbWFnZSBzdG9yYWdlLCB0aGlzIGFycmF5IGhvbGRzIHBvaW50ZXJzIHRvIHZpcnR1YWwtYXJyYXkKLSAgICogY29udHJvbCBibG9ja3MgZm9yIGVhY2ggY29tcG9uZW50LiAgVW51c2VkIGlmIG5vdCBmdWxsLWltYWdlIHN0b3JhZ2UuCi0gICAqLwotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKLSNlbmRpZgotfSBteV9tYWluX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4KLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOwotI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0KLSAgLyogRG8gbm90aGluZyBpbiByYXctZGF0YSBtb2RlLiAqLwotICBpZiAoY2luZm8tPnJhd19kYXRhX2luKQotICAgIHJldHVybjsKLQotICBtYWluX3B0ci0+Y3VyX2lNQ1Vfcm93ID0gMDsJLyogaW5pdGlhbGl6ZSBjb3VudGVycyAqLwotICBtYWluX3B0ci0+cm93Z3JvdXBfY3RyID0gMDsKLSAgbWFpbl9wdHItPnN1c3BlbmRlZCA9IEZBTFNFOwotICBtYWluX3B0ci0+cGFzc19tb2RlID0gcGFzc19tb2RlOwkvKiBzYXZlIG1vZGUgZm9yIHVzZSBieSBwcm9jZXNzX2RhdGEgKi8KLQotICBzd2l0Y2ggKHBhc3NfbW9kZSkgewotICBjYXNlIEpCVUZfUEFTU19USFJVOgotI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi0gICAgaWYgKG1haW5fcHRyLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gICAgbWFpbl9wdHItPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW47Ci0gICAgYnJlYWs7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgY2FzZSBKQlVGX1NBVkVfU09VUkNFOgotICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKLSAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6Ci0gICAgaWYgKG1haW5fcHRyLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIG1haW5fcHRyLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlIHNpbXBsZSBwYXNzLXRocm91Z2ggbW9kZSwKLSAqIHdoZXJlIHdlIGhhdmUgb25seSBhIHN0cmlwIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICB3aGlsZSAobWFpbl9wdHItPmN1cl9pTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKLSAgICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLwotICAgIGlmIChtYWluX3B0ci0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKLSAgICAgICgqY2luZm8tPnByZXAtPnByZV9wcm9jZXNzX2RhdGEpIChjaW5mbywKLQkJCQkJaW5wdXRfYnVmLCBpbl9yb3dfY3RyLCBpbl9yb3dzX2F2YWlsLAotCQkJCQltYWluX3B0ci0+YnVmZmVyLCAmbWFpbl9wdHItPnJvd2dyb3VwX2N0ciwKLQkJCQkJKEpESU1FTlNJT04pIERDVFNJWkUpOwotCi0gICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGZ1bGwgaU1DVSByb3cgYnVmZmVyZWQsIHJldHVybiB0byBhcHBsaWNhdGlvbiBmb3IKLSAgICAgKiBtb3JlIGRhdGEuICBOb3RlIHRoYXQgcHJlcHJvY2Vzc29yIHdpbGwgYWx3YXlzIHBhZCB0byBmaWxsIHRoZSBpTUNVIHJvdwotICAgICAqIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLgotICAgICAqLwotICAgIGlmIChtYWluX3B0ci0+cm93Z3JvdXBfY3RyICE9IERDVFNJWkUpCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBTZW5kIHRoZSBjb21wbGV0ZWQgcm93IHRvIHRoZSBjb21wcmVzc29yICovCi0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluX3B0ci0+YnVmZmVyKSkgewotICAgICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KLSAgICAgICAqIHN1c3BlbmQgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMgc2l0dWF0aW9uCi0gICAgICAgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKLSAgICAgICAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAotICAgICAgICogdGhpbmsgd2Ugd2VyZSBkb25lLgotICAgICAgICovCi0gICAgICBpZiAoISBtYWluX3B0ci0+c3VzcGVuZGVkKSB7Ci0JKCppbl9yb3dfY3RyKS0tOwotCW1haW5fcHRyLT5zdXNwZW5kZWQgPSBUUlVFOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKLSAgICAgKiBjYWxsIHN1c3BlbmRlZDsgdGhlbiBtYXJrIHRoZSBtYWluIGJ1ZmZlciBlbXB0eS4KLSAgICAgKi8KLSAgICBpZiAobWFpbl9wdHItPnN1c3BlbmRlZCkgewotICAgICAgKCppbl9yb3dfY3RyKSsrOwotICAgICAgbWFpbl9wdHItPnN1c3BlbmRlZCA9IEZBTFNFOwotICAgIH0KLSAgICBtYWluX3B0ci0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBtYWluX3B0ci0+Y3VyX2lNQ1Vfcm93Kys7Ci0gIH0KLX0KLQotCi0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogVGhpcyByb3V0aW5lIGhhbmRsZXMgYWxsIG9mIHRoZSBtb2RlcyB0aGF0IHVzZSBhIGZ1bGwtc2l6ZSBidWZmZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfYnVmZmVyX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKLQkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgYm9vbGVhbiB3cml0aW5nID0gKG1haW5fcHRyLT5wYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKTsKLQotICB3aGlsZSAobWFpbl9wdHItPmN1cl9pTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKLSAgICAvKiBSZWFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgaWYgYXQgdGhlIHN0YXJ0IG9mIGFuIGlNQ1Ugcm93LiAqLwotICAgIGlmIChtYWluX3B0ci0+cm93Z3JvdXBfY3RyID09IDApIHsKLSAgICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JICAgY2krKywgY29tcHB0cisrKSB7Ci0JbWFpbl9wdHItPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBjaW5mbywgbWFpbl9wdHItPndob2xlX2ltYWdlW2NpXSwKLQkgICBtYWluX3B0ci0+Y3VyX2lNQ1Vfcm93ICogKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSwKLQkgICAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSwgd3JpdGluZyk7Ci0gICAgICB9Ci0gICAgICAvKiBJbiBhIHJlYWQgcGFzcywgcHJldGVuZCB3ZSBqdXN0IHJlYWQgc29tZSBzb3VyY2UgZGF0YS4gKi8KLSAgICAgIGlmICghIHdyaXRpbmcpIHsKLQkqaW5fcm93X2N0ciArPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotCW1haW5fcHRyLT5yb3dncm91cF9jdHIgPSBEQ1RTSVpFOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIElmIGEgd3JpdGUgcGFzcywgcmVhZCBpbnB1dCBkYXRhIHVudGlsIHRoZSBjdXJyZW50IGlNQ1Ugcm93IGlzIGZ1bGwuICovCi0gICAgLyogTm90ZTogcHJlcHJvY2Vzc29yIHdpbGwgcGFkIGlmIG5lY2Vzc2FyeSB0byBmaWxsIHRoZSBsYXN0IGlNQ1Ugcm93LiAqLwotICAgIGlmICh3cml0aW5nKSB7Ci0gICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCi0JCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKLQkJCQkJbWFpbl9wdHItPmJ1ZmZlciwgJm1haW5fcHRyLT5yb3dncm91cF9jdHIsCi0JCQkJCShKRElNRU5TSU9OKSBEQ1RTSVpFKTsKLSAgICAgIC8qIFJldHVybiB0byBhcHBsaWNhdGlvbiBpZiB3ZSBuZWVkIG1vcmUgZGF0YSB0byBmaWxsIHRoZSBpTUNVIHJvdy4gKi8KLSAgICAgIGlmIChtYWluX3B0ci0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogRW1pdCBkYXRhLCB1bmxlc3MgdGhpcyBpcyBhIHNpbmstb25seSBwYXNzLiAqLwotICAgIGlmIChtYWluX3B0ci0+cGFzc19tb2RlICE9IEpCVUZfU0FWRV9TT1VSQ0UpIHsKLSAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbl9wdHItPmJ1ZmZlcikpIHsKLQkvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCB0aGVuIHdlIG11c3QgbmVlZCB0bwotCSAqIHN1c3BlbmQgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMgc2l0dWF0aW9uCi0JICogd2UgcHJldGVuZCB3ZSBkaWRuJ3QgeWV0IGNvbnN1bWUgdGhlIGxhc3QgaW5wdXQgcm93OyBvdGhlcndpc2UsIGlmCi0JICogaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGxhc3Qgcm93IG9mIHRoZSBpbWFnZSwgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCi0JICogdGhpbmsgd2Ugd2VyZSBkb25lLgotCSAqLwotCWlmICghIG1haW5fcHRyLT5zdXNwZW5kZWQpIHsKLQkgICgqaW5fcm93X2N0ciktLTsKLQkgIG1haW5fcHRyLT5zdXNwZW5kZWQgPSBUUlVFOwotCX0KLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKLSAgICAgICAqIGNhbGwgc3VzcGVuZGVkOyB0aGVuIG1hcmsgdGhlIG1haW4gYnVmZmVyIGVtcHR5LgotICAgICAgICovCi0gICAgICBpZiAobWFpbl9wdHItPnN1c3BlbmRlZCkgewotCSgqaW5fcm93X2N0cikrKzsKLQltYWluX3B0ci0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgZ2V0IGhlcmUsIHdlIGFyZSBkb25lIHdpdGggdGhpcyBpTUNVIHJvdy4gIE1hcmsgYnVmZmVyIGVtcHR5LiAqLwotICAgIG1haW5fcHRyLT5yb3dncm91cF9jdHIgPSAwOwotICAgIG1haW5fcHRyLT5jdXJfaU1DVV9yb3crKzsKLSAgfQotfQotCi0jZW5kaWYgLyogRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY19tYWluX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgbWFpbl9wdHIgPSAobXlfbWFpbl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICopIG1haW5fcHRyOwotICBtYWluX3B0ci0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgaW4gcmF3LWRhdGEgbW9kZS4gKi8KLSAgaWYgKGNpbmZvLT5yYXdfZGF0YV9pbikKLSAgICByZXR1cm47Ci0KLSAgLyogQ3JlYXRlIHRoZSBidWZmZXIuICBJdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhLCBzbyBlYWNoIGNvbXBvbmVudAotICAgKiBtYXkgYmUgb2YgYSBkaWZmZXJlbnQgc2l6ZS4KLSAgICovCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICAvKiBOb3RlIHdlIHBhZCB0aGUgYm90dG9tIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGlNQ1UgaGVpZ2h0ICovCi0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBtYWluX3B0ci0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSAqIERDVFNJWkUsCi0JIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICB9Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSNlbmRpZgotICB9IGVsc2UgewotI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi0gICAgbWFpbl9wdHItPndob2xlX2ltYWdlWzBdID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSNlbmRpZgotICAgIC8qIEFsbG9jYXRlIGEgc3RyaXAgYnVmZmVyIGZvciBlYWNoIGNvbXBvbmVudCAqLwotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgbWFpbl9wdHItPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCSAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY21hcmtlci5jIGIvbGlianBlZ3R3cnAvamNtYXJrZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZTZjNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY21hcmtlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qCi0gKiBqY21hcmtlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLXR5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KLSAgTV9TT0YwICA9IDB4YzAsCi0gIE1fU09GMSAgPSAweGMxLAotICBNX1NPRjIgID0gMHhjMiwKLSAgTV9TT0YzICA9IDB4YzMsCi0gIAotICBNX1NPRjUgID0gMHhjNSwKLSAgTV9TT0Y2ICA9IDB4YzYsCi0gIE1fU09GNyAgPSAweGM3LAotICAKLSAgTV9KUEcgICA9IDB4YzgsCi0gIE1fU09GOSAgPSAweGM5LAotICBNX1NPRjEwID0gMHhjYSwKLSAgTV9TT0YxMSA9IDB4Y2IsCi0gIAotICBNX1NPRjEzID0gMHhjZCwKLSAgTV9TT0YxNCA9IDB4Y2UsCi0gIE1fU09GMTUgPSAweGNmLAotICAKLSAgTV9ESFQgICA9IDB4YzQsCi0gIAotICBNX0RBQyAgID0gMHhjYywKLSAgCi0gIE1fUlNUMCAgPSAweGQwLAotICBNX1JTVDEgID0gMHhkMSwKLSAgTV9SU1QyICA9IDB4ZDIsCi0gIE1fUlNUMyAgPSAweGQzLAotICBNX1JTVDQgID0gMHhkNCwKLSAgTV9SU1Q1ICA9IDB4ZDUsCi0gIE1fUlNUNiAgPSAweGQ2LAotICBNX1JTVDcgID0gMHhkNywKLSAgCi0gIE1fU09JICAgPSAweGQ4LAotICBNX0VPSSAgID0gMHhkOSwKLSAgTV9TT1MgICA9IDB4ZGEsCi0gIE1fRFFUICAgPSAweGRiLAotICBNX0ROTCAgID0gMHhkYywKLSAgTV9EUkkgICA9IDB4ZGQsCi0gIE1fREhQICAgPSAweGRlLAotICBNX0VYUCAgID0gMHhkZiwKLSAgCi0gIE1fQVBQMCAgPSAweGUwLAotICBNX0FQUDEgID0gMHhlMSwKLSAgTV9BUFAyICA9IDB4ZTIsCi0gIE1fQVBQMyAgPSAweGUzLAotICBNX0FQUDQgID0gMHhlNCwKLSAgTV9BUFA1ICA9IDB4ZTUsCi0gIE1fQVBQNiAgPSAweGU2LAotICBNX0FQUDcgID0gMHhlNywKLSAgTV9BUFA4ICA9IDB4ZTgsCi0gIE1fQVBQOSAgPSAweGU5LAotICBNX0FQUDEwID0gMHhlYSwKLSAgTV9BUFAxMSA9IDB4ZWIsCi0gIE1fQVBQMTIgPSAweGVjLAotICBNX0FQUDEzID0gMHhlZCwKLSAgTV9BUFAxNCA9IDB4ZWUsCi0gIE1fQVBQMTUgPSAweGVmLAotICAKLSAgTV9KUEcwICA9IDB4ZjAsCi0gIE1fSlBHMTMgPSAweGZkLAotICBNX0NPTSAgID0gMHhmZSwKLSAgCi0gIE1fVEVNICAgPSAweDAxLAotICAKLSAgTV9FUlJPUiA9IDB4MTAwCi19IEpQRUdfTUFSS0VSOwotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIHVuc2lnbmVkIGludCBsYXN0X3Jlc3RhcnRfaW50ZXJ2YWw7IC8qIGxhc3QgRFJJIHZhbHVlIGVtaXR0ZWQ7IDAgYWZ0ZXIgU09JICovCi19IG15X21hcmtlcl93cml0ZXI7Ci0KLXR5cGVkZWYgbXlfbWFya2VyX3dyaXRlciAqIG15X21hcmtlcl9wdHI7Ci0KLQotLyoKLSAqIEJhc2ljIG91dHB1dCByb3V0aW5lcy4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiB3aGlsZSB3cml0aW5nIGEgbWFya2VyLgotICogVGhlcmVmb3JlLCBhbiBhcHBsaWNhdGlvbiB1c2luZyBzdXNwZW5zaW9uIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMKLSAqIGVub3VnaCBidWZmZXIgc3BhY2UgZm9yIHRoZSBpbml0aWFsIG1hcmtlcnMgKHR5cC4gNjAwLTcwMCBieXRlcykgYmVmb3JlCi0gKiBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MsIGFuZCBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHRyYWlsaW5nIEVPSQotICogKGEgZmV3IGJ5dGVzKSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcy4gIE11bHRpcGFzcyBjb21wcmVzc2lvbgotICogbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIHdpdGggc3VzcGVuc2lvbiwgc28gdGhvc2UgdHdvIGFyZSB0aGUgb25seQotICogcG9pbnRzIHdoZXJlIG1hcmtlcnMgd2lsbCBiZSB3cml0dGVuLgotICovCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQotLyogRW1pdCBhIGJ5dGUgKi8KLXsKLSAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGNpbmZvLT5kZXN0OwotCi0gICooZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSkrKyA9IChKT0NURVQpIHZhbDsKLSAgaWYgKC0tZGVzdC0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgewotICAgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGNpbmZvKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIG1hcmspCi0vKiBFbWl0IGEgbWFya2VyIGNvZGUgKi8KLXsKLSAgZW1pdF9ieXRlKGNpbmZvLCAweEZGKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSBtYXJrKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF8yYnl0ZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsdWUpCi0vKiBFbWl0IGEgMi1ieXRlIGludGVnZXI7IHRoZXNlIGFyZSBhbHdheXMgTVNCIGZpcnN0IGluIEpQRUcgZmlsZXMgKi8KLXsKLSAgZW1pdF9ieXRlKGNpbmZvLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCB2YWx1ZSAmIDB4RkYpOwotfQotCi0KLS8qCi0gKiBSb3V0aW5lcyB0byB3cml0ZSBzcGVjaWZpYyBtYXJrZXIgdHlwZXMuCi0gKi8KLQotTE9DQUwoaW50KQotZW1pdF9kcXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgpCi0vKiBFbWl0IGEgRFFUIG1hcmtlciAqLwotLyogUmV0dXJucyB0aGUgcHJlY2lzaW9uIHVzZWQgKDAgPSA4Yml0cywgMSA9IDE2Yml0cykgZm9yIGJhc2VsaW5lIGNoZWNraW5nICovCi17Ci0gIEpRVUFOVF9UQkwgKiBxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2luZGV4XTsKLSAgaW50IHByZWM7Ci0gIGludCBpOwotCi0gIGlmIChxdGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIGluZGV4KTsKLQotICBwcmVjID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICBpZiAocXRibC0+cXVhbnR2YWxbaV0gPiAyNTUpCi0gICAgICBwcmVjID0gMTsKLSAgfQotCi0gIGlmICghIHF0YmwtPnNlbnRfdGFibGUpIHsKLSAgICBlbWl0X21hcmtlcihjaW5mbywgTV9EUVQpOwotCi0gICAgZW1pdF8yYnl0ZXMoY2luZm8sIHByZWMgPyBEQ1RTSVpFMioyICsgMSArIDIgOiBEQ1RTSVpFMiArIDEgKyAyKTsKLQotICAgIGVtaXRfYnl0ZShjaW5mbywgaW5kZXggKyAocHJlYzw8NCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICAgIC8qIFRoZSB0YWJsZSBlbnRyaWVzIG11c3QgYmUgZW1pdHRlZCBpbiB6aWd6YWcgb3JkZXIuICovCi0gICAgICB1bnNpZ25lZCBpbnQgcXZhbCA9IHF0YmwtPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV07Ci0gICAgICBpZiAocHJlYykKLQllbWl0X2J5dGUoY2luZm8sIChpbnQpIChxdmFsID4+IDgpKTsKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgJiAweEZGKSk7Ci0gICAgfQotCi0gICAgcXRibC0+c2VudF90YWJsZSA9IFRSVUU7Ci0gIH0KLQotICByZXR1cm4gcHJlYzsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9kaHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNfYWMpCi0vKiBFbWl0IGEgREhUIG1hcmtlciAqLwotewotICBKSFVGRl9UQkwgKiBodGJsOwotICBpbnQgbGVuZ3RoLCBpOwotICAKLSAgaWYgKGlzX2FjKSB7Ci0gICAgaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKLSAgICBpbmRleCArPSAweDEwOwkJLyogb3V0cHV0IGluZGV4IGhhcyBBQyBiaXQgc2V0ICovCi0gIH0gZWxzZSB7Ci0gICAgaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKLSAgfQotCi0gIGlmIChodGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgaW5kZXgpOwotICAKLSAgaWYgKCEgaHRibC0+c2VudF90YWJsZSkgewotICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RIVCk7Ci0gICAgCi0gICAgbGVuZ3RoID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCi0gICAgICBsZW5ndGggKz0gaHRibC0+Yml0c1tpXTsKLSAgICAKLSAgICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoICsgMiArIDEgKyAxNik7Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCk7Ci0gICAgCi0gICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBodGJsLT5iaXRzW2ldKTsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmh1ZmZ2YWxbaV0pOwotICAgIAotICAgIGh0YmwtPnNlbnRfdGFibGUgPSBUUlVFOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfZGFjIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIEVtaXQgYSBEQUMgbWFya2VyICovCi0vKiBTaW5jZSB0aGUgdXNlZnVsIGluZm8gaXMgc28gc21hbGwsIHdlIHdhbnQgdG8gZW1pdCBhbGwgdGhlIHRhYmxlcyBpbiAqLwotLyogb25lIERBQyBtYXJrZXIuICBUaGVyZWZvcmUgdGhpcyByb3V0aW5lIGRvZXMgaXRzIG93biBzY2FuIG9mIHRoZSB0YWJsZS4gKi8KLXsKLSNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLSAgY2hhciBkY19pbl91c2VbTlVNX0FSSVRIX1RCTFNdOwotICBjaGFyIGFjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107Ci0gIGludCBsZW5ndGgsIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKLSAgICBkY19pbl91c2VbaV0gPSBhY19pbl91c2VbaV0gPSAwOwotICAKLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07Ci0gICAgZGNfaW5fdXNlW2NvbXBwdHItPmRjX3RibF9ub10gPSAxOwotICAgIGFjX2luX3VzZVtjb21wcHRyLT5hY190Ymxfbm9dID0gMTsKLSAgfQotICAKLSAgbGVuZ3RoID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspCi0gICAgbGVuZ3RoICs9IGRjX2luX3VzZVtpXSArIGFjX2luX3VzZVtpXTsKLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RBQyk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoKjIgKyAyKTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7Ci0gICAgaWYgKGRjX2luX3VzZVtpXSkgewotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpKTsKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2RjX0xbaV0gKyAoY2luZm8tPmFyaXRoX2RjX1VbaV08PDQpKTsKLSAgICB9Ci0gICAgaWYgKGFjX2luX3VzZVtpXSkgewotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpICsgMHgxMCk7Ci0gICAgICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5hcml0aF9hY19LW2ldKTsKLSAgICB9Ci0gIH0KLSNlbmRpZiAvKiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9kcmkgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIERSSSBtYXJrZXIgKi8KLXsKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRFJJKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCA0KTsJLyogZml4ZWQgbGVuZ3RoICovCi0KLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9zb2YgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKUEVHX01BUktFUiBjb2RlKQotLyogRW1pdCBhIFNPRiBtYXJrZXIgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgZW1pdF9tYXJrZXIoY2luZm8sIGNvZGUpOwotICAKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgKyAyICsgNSArIDEpOyAvKiBsZW5ndGggKi8KLQotICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gU09GIGZpZWxkIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gNjU1MzVMIHx8Ci0gICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gNjU1MzVMKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIDY1NTM1KTsKLQotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCk7Ci0KLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOwotICAgIGVtaXRfYnl0ZShjaW5mbywgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPDwgNCkgKyBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubyk7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9zb3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIFNPUyBtYXJrZXIgKi8KLXsKLSAgaW50IGksIHRkLCB0YTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPUyk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgMiAqIGNpbmZvLT5jb21wc19pbl9zY2FuICsgMiArIDEgKyAzKTsgLyogbGVuZ3RoICovCi0gIAotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5jb21wc19pbl9zY2FuKTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOwotICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkKTsKLSAgICB0ZCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICB0YSA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSAgICAgIC8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW47Ci0gICAgICAgKiBmdXJ0aGVybW9yZSwgSHVmZm1hbiBjb2Rpbmcgb2YgREMgcmVmaW5lbWVudCB1c2VzIG5vIHRhYmxlIGF0IGFsbC4KLSAgICAgICAqIFdlIGVtaXQgMCBmb3IgdW51c2VkIGZpZWxkKHMpOyB0aGlzIGlzIHJlY29tbWVuZGVkIGJ5IHRoZSBQJk0gdGV4dAotICAgICAgICogYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZC4KLSAgICAgICAqLwotICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKSB7Ci0JdGEgPSAwOwkJCS8qIERDIHNjYW4gKi8KLQlpZiAoY2luZm8tPkFoICE9IDAgJiYgIWNpbmZvLT5hcml0aF9jb2RlKQotCSAgdGQgPSAwOwkJLyogbm8gREMgdGFibGUgZWl0aGVyICovCi0gICAgICB9IGVsc2UgewotCXRkID0gMDsJCQkvKiBBQyBzY2FuICovCi0gICAgICB9Ci0gICAgfQotICAgIGVtaXRfYnl0ZShjaW5mbywgKHRkIDw8IDQpICsgdGEpOwotICB9Ci0KLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+U3MpOwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5TZSk7Ci0gIGVtaXRfYnl0ZShjaW5mbywgKGNpbmZvLT5BaCA8PCA0KSArIGNpbmZvLT5BbCk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfamZpZl9hcHAwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIEVtaXQgYSBKRklGLWNvbXBsaWFudCBBUFAwIG1hcmtlciAqLwotewotICAvKgotICAgKiBMZW5ndGggb2YgQVBQMCBibG9jawkoMiBieXRlcykKLSAgICogQmxvY2sgSUQJCQkoNCBieXRlcyAtIEFTQ0lJICJKRklGIikKLSAgICogWmVybyBieXRlCQkJKDEgYnl0ZSB0byB0ZXJtaW5hdGUgdGhlIElEIHN0cmluZykKLSAgICogVmVyc2lvbiBNYWpvciwgTWlub3IJKDIgYnl0ZXMgLSBtYWpvciBmaXJzdCkKLSAgICogVW5pdHMJCQkoMSBieXRlIC0gMHgwMCA9IG5vbmUsIDB4MDEgPSBpbmNoLCAweDAyID0gY20pCi0gICAqIFhkcHUJCQkoMiBieXRlcyAtIGRvdHMgcGVyIHVuaXQgaG9yaXpvbnRhbCkKLSAgICogWWRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCB2ZXJ0aWNhbCkKLSAgICogVGh1bWJuYWlsIFggc2l6ZQkJKDEgYnl0ZSkKLSAgICogVGh1bWJuYWlsIFkgc2l6ZQkJKDEgYnl0ZSkKLSAgICovCi0gIAotICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAwKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNCArIDEgKyAyICsgMSArIDIgKyAyICsgMSArIDEpOyAvKiBsZW5ndGggKi8KLQotICBlbWl0X2J5dGUoY2luZm8sIDB4NEEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiSkZJRiIgKi8KLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQ5KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAwKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uKTsgLyogVmVyc2lvbiBmaWVsZHMgKi8KLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+ZGVuc2l0eV91bml0KTsgLyogUGl4ZWwgc2l6ZSBpbmZvcm1hdGlvbiAqLwotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPlhfZGVuc2l0eSk7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WV9kZW5zaXR5KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJCS8qIE5vIHRodW1ibmFpbCBpbWFnZSAqLwotICBlbWl0X2J5dGUoY2luZm8sIDApOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2Fkb2JlX2FwcDE0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIEVtaXQgYW4gQWRvYmUgQVBQMTQgbWFya2VyICovCi17Ci0gIC8qCi0gICAqIExlbmd0aCBvZiBBUFAxNCBibG9jawkoMiBieXRlcykKLSAgICogQmxvY2sgSUQJCQkoNSBieXRlcyAtIEFTQ0lJICJBZG9iZSIpCi0gICAqIFZlcnNpb24gTnVtYmVyCQkoMiBieXRlcyAtIGN1cnJlbnRseSAxMDApCi0gICAqIEZsYWdzMAkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCi0gICAqIEZsYWdzMQkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCi0gICAqIENvbG9yIHRyYW5zZm9ybQkJKDEgYnl0ZSkKLSAgICoKLSAgICogQWx0aG91Z2ggQWRvYmUgVE4gNTExNiBtZW50aW9ucyBWZXJzaW9uID0gMTAxLCBhbGwgdGhlIEFkb2JlIGZpbGVzCi0gICAqIG5vdyBpbiBjaXJjdWxhdGlvbiBzZWVtIHRvIHVzZSBWZXJzaW9uID0gMTAwLCBzbyB0aGF0J3Mgd2hhdCB3ZSB3cml0ZS4KLSAgICoKLSAgICogV2Ugd3JpdGUgdGhlIGNvbG9yIHRyYW5zZm9ybSBieXRlIGFzIDEgaWYgdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMKLSAgICogWUNiQ3IsIDIgaWYgaXQncyBZQ0NLLCAwIG90aGVyd2lzZS4gIEFkb2JlJ3MgZGVmaW5pdGlvbiBoYXMgdG8gZG8gd2l0aAotICAgKiB3aGV0aGVyIHRoZSBlbmNvZGVyIHBlcmZvcm1lZCBhIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyBwcmV0dHkgdXNlbGVzcy4KLSAgICovCi0gIAotICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAxNCk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgMiArIDUgKyAyICsgMiArIDIgKyAxKTsgLyogbGVuZ3RoICovCi0KLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQxKTsJLyogSWRlbnRpZmllcjogQVNDSUkgIkFkb2JlIiAqLwotICBlbWl0X2J5dGUoY2luZm8sIDB4NjQpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NkYpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NjIpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NjUpOwotICBlbWl0XzJieXRlcyhjaW5mbywgMTAwKTsJLyogVmVyc2lvbiAqLwotICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMCAqLwotICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMSAqLwotICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGVtaXRfYnl0ZShjaW5mbywgMSk7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDEgKi8KLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBlbWl0X2J5dGUoY2luZm8sIDIpOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAyICovCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMCAqLwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIGFsbG93IHdyaXRpbmcgYW4gYXJiaXRyYXJ5IG1hcmtlciB3aXRoIHBhcmFtZXRlcnMuCi0gKiBUaGUgb25seSBpbnRlbmRlZCB1c2UgaXMgdG8gZW1pdCBDT00gb3IgQVBQbiBtYXJrZXJzIGFmdGVyIGNhbGxpbmcKLSAqIHdyaXRlX2ZpbGVfaGVhZGVyIGFuZCBiZWZvcmUgY2FsbGluZyB3cml0ZV9mcmFtZV9oZWFkZXIuCi0gKiBPdGhlciB1c2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGRlc2lyYWJsZSByZXN1bHRzLgotICogQ291bnRpbmcgdGhlIHBhcmFtZXRlciBieXRlcyBwcm9wZXJseSBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9tYXJrZXJfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCi0vKiBFbWl0IGFuIGFyYml0cmFyeSBtYXJrZXIgaGVhZGVyICovCi17Ci0gIGlmIChkYXRhbGVuID4gKHVuc2lnbmVkIGludCkgNjU1MzMpCQkvKiBzYWZldHkgY2hlY2sgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCAoSlBFR19NQVJLRVIpIG1hcmtlcik7Ci0KLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIChkYXRhbGVuICsgMikpOwkvKiB0b3RhbCBsZW5ndGggKi8KLX0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9tYXJrZXJfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCi0vKiBFbWl0IG9uZSBieXRlIG9mIG1hcmtlciBwYXJhbWV0ZXJzIGZvbGxvd2luZyB3cml0ZV9tYXJrZXJfaGVhZGVyICovCi17Ci0gIGVtaXRfYnl0ZShjaW5mbywgdmFsKTsKLX0KLQotCi0vKgotICogV3JpdGUgZGF0YXN0cmVhbSBoZWFkZXIuCi0gKiBUaGlzIGNvbnNpc3RzIG9mIGFuIFNPSSBhbmQgb3B0aW9uYWwgQVBQbiBtYXJrZXJzLgotICogV2UgcmVjb21tZW5kIHVzZSBvZiB0aGUgSkZJRiBtYXJrZXIsIGJ1dCBub3QgdGhlIEFkb2JlIG1hcmtlciwKLSAqIHdoZW4gdXNpbmcgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEuICBUaGUgSkZJRiBtYXJrZXIgc2hvdWxkIE5PVAotICogYmUgdXNlZCBmb3IgYW55IG90aGVyIEpQRUcgY29sb3JzcGFjZS4gIFRoZSBBZG9iZSBtYXJrZXIgaXMgaGVscGZ1bAotICogdG8gZGlzdGluZ3Vpc2ggUkdCLCBDTVlLLCBhbmQgWUNDSyBjb2xvcnNwYWNlcy4KLSAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgYWRkaXRpb25hbCBoZWFkZXIgbWFya2VycyBhZnRlcgotICoganBlZ19zdGFydF9jb21wcmVzcyByZXR1cm5zLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZmlsZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CS8qIGZpcnN0IHRoZSBTT0kgKi8KLQotICAvKiBTT0kgaXMgZGVmaW5lZCB0byByZXNldCByZXN0YXJ0IGludGVydmFsIHRvIDAgKi8KLSAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOwotCi0gIGlmIChjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIpCS8qIG5leHQgYW4gb3B0aW9uYWwgSkZJRiBBUFAwICovCi0gICAgZW1pdF9qZmlmX2FwcDAoY2luZm8pOwotICBpZiAoY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlcikgLyogbmV4dCBhbiBvcHRpb25hbCBBZG9iZSBBUFAxNCAqLwotICAgIGVtaXRfYWRvYmVfYXBwMTQoY2luZm8pOwotfQotCi0KLS8qCi0gKiBXcml0ZSBmcmFtZSBoZWFkZXIuCi0gKiBUaGlzIGNvbnNpc3RzIG9mIERRVCBhbmQgU09GbiBtYXJrZXJzLgotICogTm90ZSB0aGF0IHdlIGRvIG5vdCBlbWl0IHRoZSBTT0YgdW50aWwgd2UgaGF2ZSBlbWl0dGVkIHRoZSBEUVQocykuCi0gKiBUaGlzIGF2b2lkcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggaW5jb3JyZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0Ci0gKiB0cnkgdG8gZXJyb3ItY2hlY2sgdGhlIHF1YW50IHRhYmxlIG51bWJlcnMgYXMgc29vbiBhcyB0aGV5IHNlZSB0aGUgU09GLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZnJhbWVfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGNpLCBwcmVjOwotICBib29sZWFuIGlzX2Jhc2VsaW5lOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgLyogRW1pdCBEUVQgZm9yIGVhY2ggcXVhbnRpemF0aW9uIHRhYmxlLgotICAgKiBOb3RlIHRoYXQgZW1pdF9kcXQoKSBzdXBwcmVzc2VzIGFueSBkdXBsaWNhdGUgdGFibGVzLgotICAgKi8KLSAgcHJlYyA9IDA7Ci0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcHJlYyArPSBlbWl0X2RxdChjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKLSAgfQotICAvKiBub3cgcHJlYyBpcyBub256ZXJvIGlmZiB0aGVyZSBhcmUgYW55IDE2LWJpdCBxdWFudCB0YWJsZXMuICovCi0KLSAgLyogQ2hlY2sgZm9yIGEgbm9uLWJhc2VsaW5lIHNwZWNpZmljYXRpb24uCi0gICAqIE5vdGUgd2UgYXNzdW1lIHRoYXQgSHVmZm1hbiB0YWJsZSBudW1iZXJzIHdvbid0IGJlIGNoYW5nZWQgbGF0ZXIuCi0gICAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwKLSAgICAgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSA4KSB7Ci0gICAgaXNfYmFzZWxpbmUgPSBGQUxTRTsKLSAgfSBlbHNlIHsKLSAgICBpc19iYXNlbGluZSA9IFRSVUU7Ci0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBpZiAoY29tcHB0ci0+ZGNfdGJsX25vID4gMSB8fCBjb21wcHRyLT5hY190Ymxfbm8gPiAxKQotCWlzX2Jhc2VsaW5lID0gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwcmVjICYmIGlzX2Jhc2VsaW5lKSB7Ci0gICAgICBpc19iYXNlbGluZSA9IEZBTFNFOwotICAgICAgLyogSWYgaXQncyBiYXNlbGluZSBleGNlcHQgZm9yIHF1YW50aXplciBzaXplLCB3YXJuIHRoZSB1c2VyICovCi0gICAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDXzE2QklUX1RBQkxFUyk7Ci0gICAgfQotICB9Ci0KLSAgLyogRW1pdCB0aGUgcHJvcGVyIFNPRiBtYXJrZXIgKi8KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgZW1pdF9zb2YoY2luZm8sIE1fU09GOSk7CS8qIFNPRiBjb2RlIGZvciBhcml0aG1ldGljIGNvZGluZyAqLwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKLSAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjIpOwkvKiBTT0YgY29kZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiAqLwotICAgIGVsc2UgaWYgKGlzX2Jhc2VsaW5lKQotICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMCk7CS8qIFNPRiBjb2RlIGZvciBiYXNlbGluZSBpbXBsZW1lbnRhdGlvbiAqLwotICAgIGVsc2UKLSAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjEpOwkvKiBTT0YgY29kZSBmb3Igbm9uLWJhc2VsaW5lIEh1ZmZtYW4gZmlsZSAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNjYW4gaGVhZGVyLgotICogVGhpcyBjb25zaXN0cyBvZiBESFQgb3IgREFDIG1hcmtlcnMsIG9wdGlvbmFsIERSSSwgYW5kIFNPUy4KLSAqIENvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gZm9sbG93aW5nIHRoZSBTT1MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9zY2FuX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0gIGludCBpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIC8qIEVtaXQgYXJpdGggY29uZGl0aW9uaW5nIGluZm8uICBXZSBtYXkgaGF2ZSBzb21lIGR1cGxpY2F0aW9uCi0gICAgICogaWYgdGhlIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBidXQgaXQncyBzbyBzbWFsbCBpdCdzIGhhcmRseQotICAgICAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgotICAgICAqLwotICAgIGVtaXRfZGFjKGNpbmZvKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBFbWl0IEh1ZmZtYW4gdGFibGVzLgotICAgICAqIE5vdGUgdGhhdCBlbWl0X2RodCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotCS8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW4gKi8KLQlpZiAoY2luZm8tPlNzID09IDApIHsKLQkgIGlmIChjaW5mby0+QWggPT0gMCkJLyogREMgbmVlZHMgbm8gdGFibGUgZm9yIHJlZmluZW1lbnQgc2NhbiAqLwotCSAgICBlbWl0X2RodChjaW5mbywgY29tcHB0ci0+ZGNfdGJsX25vLCBGQUxTRSk7Ci0JfSBlbHNlIHsKLQkgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOwotCX0KLSAgICAgIH0gZWxzZSB7Ci0JLyogU2VxdWVudGlhbCBtb2RlOiBuZWVkIGJvdGggREMgYW5kIEFDIHRhYmxlcyAqLwotCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKLQllbWl0X2RodChjaW5mbywgY29tcHB0ci0+YWNfdGJsX25vLCBUUlVFKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBFbWl0IERSSSBpZiByZXF1aXJlZCAtLS0gbm90ZSB0aGF0IERSSSB2YWx1ZSBjb3VsZCBjaGFuZ2UgZm9yIGVhY2ggc2Nhbi4KLSAgICogV2UgYXZvaWQgd2FzdGluZyBzcGFjZSB3aXRoIHVubmVjZXNzYXJ5IERSSXMsIGhvd2V2ZXIuCi0gICAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgIT0gbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBlbWl0X2RyaShjaW5mbyk7Ci0gICAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgfQotCi0gIGVtaXRfc29zKGNpbmZvKTsKLX0KLQotCi0vKgotICogV3JpdGUgZGF0YXN0cmVhbSB0cmFpbGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZmlsZV90cmFpbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKLX0KLQotCi0vKgotICogV3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUtc3BlY2lmaWNhdGlvbiBkYXRhc3RyZWFtLgotICogVGhpcyBjb25zaXN0cyBvZiBTT0ksIERRVCBhbmQgREhUIHRhYmxlcywgYW5kIEVPSS4KLSAqIEFueSB0YWJsZSB0aGF0IGlzIGRlZmluZWQgYW5kIG5vdCBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgd2lsbCBiZQotICogZW1pdHRlZC4gIE5vdGUgdGhhdCBhbGwgdGFibGVzIHdpbGwgYmUgbWFya2VkIHNlbnRfdGFibGUgPSBUUlVFIGF0IGV4aXQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV90YWJsZXNfb25seSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCBpOwotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKLSAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW2ldICE9IE5VTEwpCi0gICAgICAodm9pZCkgZW1pdF9kcXQoY2luZm8sIGkpOwotICB9Ci0KLSAgaWYgKCEgY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgICBpZiAoY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKLQllbWl0X2RodChjaW5mbywgaSwgRkFMU0UpOwotICAgICAgaWYgKGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldICE9IE5VTEwpCi0JZW1pdF9kaHQoY2luZm8sIGksIFRSVUUpOwotICAgIH0KLSAgfQotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0VPSSk7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgbW9kdWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfbWFya2VyX3dyaXRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyOwotCi0gIC8qIENyZWF0ZSB0aGUgc3Vib2JqZWN0ICovCi0gIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X21hcmtlcl93cml0ZXIpKTsKLSAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICopIG1hcmtlcjsKLSAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KLSAgbWFya2VyLT5wdWIud3JpdGVfZmlsZV9oZWFkZXIgPSB3cml0ZV9maWxlX2hlYWRlcjsKLSAgbWFya2VyLT5wdWIud3JpdGVfZnJhbWVfaGVhZGVyID0gd3JpdGVfZnJhbWVfaGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9zY2FuX2hlYWRlciA9IHdyaXRlX3NjYW5faGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX3RyYWlsZXIgPSB3cml0ZV9maWxlX3RyYWlsZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX3RhYmxlc19vbmx5ID0gd3JpdGVfdGFibGVzX29ubHk7Ci0gIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9oZWFkZXIgPSB3cml0ZV9tYXJrZXJfaGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9tYXJrZXJfYnl0ZSA9IHdyaXRlX21hcmtlcl9ieXRlOwotICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgKi8KLSAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNtYXN0ZXIuYyBiL2xpYmpwZWd0d3JwL2pjbWFzdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjQwMjAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNtYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogamNtYXN0ZXIuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hc3RlciBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHBhcmFtZXRlciB2YWxpZGF0aW9uLCBpbml0aWFsIHNldHVwLAotICogYW5kIGludGVyLXBhc3MgY29udHJvbCAoZGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSB3b3JrIAotICogdG8gYmUgZG9uZSBpbiBlYWNoIHBhc3MpLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN0YXRlICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JbWFpbl9wYXNzLAkJLyogaW5wdXQgZGF0YSwgYWxzbyBkbyBmaXJzdCBvdXRwdXQgc3RlcCAqLwotCWh1ZmZfb3B0X3Bhc3MsCQkvKiBIdWZmbWFuIGNvZGUgb3B0aW1pemF0aW9uIHBhc3MgKi8KLQlvdXRwdXRfcGFzcwkJLyogZGF0YSBvdXRwdXQgcGFzcyAqLwotfSBjX3Bhc3NfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBjX3Bhc3NfdHlwZSBwYXNzX3R5cGU7CS8qIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHBhc3MgKi8KLQotICBpbnQgcGFzc19udW1iZXI7CQkvKiAjIG9mIHBhc3NlcyBjb21wbGV0ZWQgKi8KLSAgaW50IHRvdGFsX3Bhc3NlczsJCS8qIHRvdGFsICMgb2YgcGFzc2VzIG5lZWRlZCAqLwotCi0gIGludCBzY2FuX251bWJlcjsJCS8qIGN1cnJlbnQgaW5kZXggaW4gc2Nhbl9pbmZvW10gKi8KLX0gbXlfY29tcF9tYXN0ZXI7Ci0KLXR5cGVkZWYgbXlfY29tcF9tYXN0ZXIgKiBteV9tYXN0ZXJfcHRyOwotCi0KLS8qCi0gKiBTdXBwb3J0IHJvdXRpbmVzIHRoYXQgZG8gdmFyaW91cyBlc3NlbnRpYWwgY2FsY3VsYXRpb25zLgotICovCi0KLUxPQ0FMKHZvaWQpCi1pbml0aWFsX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIG1hc3RlciBzZWxlY3Rpb24gcGhhc2UgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBsb25nIHNhbXBsZXNwZXJyb3c7Ci0gIEpESU1FTlNJT04gamRfc2FtcGxlc3BlcnJvdzsKLQotICAvKiBTYW5pdHkgY2hlY2sgb24gaW1hZ2UgZGltZW5zaW9ucyAqLwotICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCi0gICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCB8fCBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAotICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKLQotICAvKiBXaWR0aCBvZiBhbiBpbnB1dCBzY2FubGluZSBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgSkRJTUVOU0lPTi4gKi8KLSAgc2FtcGxlc3BlcnJvdyA9IChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY2luZm8tPmlucHV0X2NvbXBvbmVudHM7Ci0gIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKLSAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0KLSAgLyogRm9yIG5vdywgcHJlY2lzaW9uIG11c3QgbWF0Y2ggY29tcGlsZWQtaW4gdmFsdWUuLi4gKi8KLSAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSBCSVRTX0lOX0pTQU1QTEUpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BSRUNJU0lPTiwgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKLQotICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBjb21wb25lbnRzIHdvbid0IGV4Y2VlZCBpbnRlcm5hbCBhcnJheSBzaXplcyAqLwotICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICBNQVhfQ09NUE9ORU5UUyk7Ci0KLSAgLyogQ29tcHV0ZSBtYXhpbXVtIHNhbXBsaW5nIGZhY3RvcnM7IGNoZWNrIGZhY3RvciB2YWxpZGl0eSAqLwotICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSAxOwotICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSAxOwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SIHx8Ci0JY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT52X3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1NBTVBMSU5HKTsKLSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yLAotCQkJCSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOwotICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gIH0KLQotICAvKiBDb21wdXRlIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50cyAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEZpbGwgaW4gdGhlIGNvcnJlY3QgY29tcG9uZW50X2luZGV4IHZhbHVlOyBkb24ndCByZWx5IG9uIGFwcGxpY2F0aW9uICovCi0gICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7Ci0gICAgLyogRm9yIGNvbXByZXNzaW9uLCB3ZSBuZXZlciBkbyBEQ1Qgc2NhbGluZy4gKi8KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLwotICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KLSAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKLSAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgIC8qIE1hcmsgY29tcG9uZW50IG5lZWRlZCAodGhpcyBmbGFnIGlzbid0IGFjdHVhbGx5IHVzZWQgZm9yIGNvbXByZXNzaW9uKSAqLwotICAgIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgPSBUUlVFOwotICB9Ci0KLSAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvd3MgKG51bWJlciBvZiB0aW1lcyB0aGF0Ci0gICAqIG1haW4gY29udHJvbGxlciB3aWxsIGNhbGwgY29lZmZpY2llbnQgY29udHJvbGxlcikuCi0gICAqLwotICBjaW5mby0+dG90YWxfaU1DVV9yb3dzID0gKEpESU1FTlNJT04pCi0gICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKLQkJICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Ci19Ci0KLQotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotCi1MT0NBTCh2b2lkKQotdmFsaWRhdGVfc2NyaXB0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFZlcmlmeSB0aGF0IHRoZSBzY2FuIHNjcmlwdCBpbiBjaW5mby0+c2Nhbl9pbmZvW10gaXMgdmFsaWQ7IGFsc28KLSAqIGRldGVybWluZSB3aGV0aGVyIGl0IHVzZXMgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIHNldCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZS4KLSAqLwotewotICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7Ci0gIGludCBzY2Fubm8sIG5jb21wcywgY2ksIGNvZWZpLCB0aGlzaTsKLSAgaW50IFNzLCBTZSwgQWgsIEFsOwotICBib29sZWFuIGNvbXBvbmVudF9zZW50W01BWF9DT01QT05FTlRTXTsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICBpbnQgKiBsYXN0X2JpdHBvc19wdHI7Ci0gIGludCBsYXN0X2JpdHBvc1tNQVhfQ09NUE9ORU5UU11bRENUU0laRTJdOwotICAvKiAtMSB1bnRpbCB0aGF0IGNvZWZmaWNpZW50IGhhcyBiZWVuIHNlZW47IHRoZW4gbGFzdCBBbCBmb3IgaXQgKi8KLSNlbmRpZgotCi0gIGlmIChjaW5mby0+bnVtX3NjYW5zIDw9IDApCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCAwKTsKLQotICAvKiBGb3Igc2VxdWVudGlhbCBKUEVHLCBhbGwgc2NhbnMgbXVzdCBoYXZlIFNzPTAsIFNlPURDVFNJWkUyLTE7Ci0gICAqIGZvciBwcm9ncmVzc2l2ZSBKUEVHLCBubyBzY2FuIGNhbiBoYXZlIHRoaXMuCi0gICAqLwotICBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbzsKLSAgaWYgKHNjYW5wdHItPlNzICE9IDAgfHwgc2NhbnB0ci0+U2UgIT0gRENUU0laRTItMSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBUUlVFOwotICAgIGxhc3RfYml0cG9zX3B0ciA9ICYgbGFzdF9iaXRwb3NbMF1bMF07Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKLSAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKQotCSpsYXN0X2JpdHBvc19wdHIrKyA9IC0xOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IEZBTFNFOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCi0gICAgICBjb21wb25lbnRfc2VudFtjaV0gPSBGQUxTRTsKLSAgfQotCi0gIGZvciAoc2Nhbm5vID0gMTsgc2Nhbm5vIDw9IGNpbmZvLT5udW1fc2NhbnM7IHNjYW5wdHIrKywgc2Nhbm5vKyspIHsKLSAgICAvKiBWYWxpZGF0ZSBjb21wb25lbnQgaW5kZXhlcyAqLwotICAgIG5jb21wcyA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47Ci0gICAgaWYgKG5jb21wcyA8PSAwIHx8IG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBuY29tcHMsIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKLSAgICAgIHRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKLSAgICAgIGlmICh0aGlzaSA8IDAgfHwgdGhpc2kgPj0gY2luZm8tPm51bV9jb21wb25lbnRzKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKLSAgICAgIC8qIENvbXBvbmVudHMgbXVzdCBhcHBlYXIgaW4gU09GIG9yZGVyIHdpdGhpbiBlYWNoIHNjYW4gKi8KLSAgICAgIGlmIChjaSA+IDAgJiYgdGhpc2kgPD0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpLTFdKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKLSAgICB9Ci0gICAgLyogVmFsaWRhdGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyAqLwotICAgIFNzID0gc2NhbnB0ci0+U3M7Ci0gICAgU2UgPSBzY2FucHRyLT5TZTsKLSAgICBBaCA9IHNjYW5wdHItPkFoOwotICAgIEFsID0gc2NhbnB0ci0+QWw7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIC8qIFRoZSBKUEVHIHNwZWMgc2ltcGx5IGdpdmVzIHRoZSByYW5nZXMgMC4uMTMgZm9yIEFoIGFuZCBBbCwgYnV0IHRoYXQKLSAgICAgICAqIHNlZW1zIHdyb25nOiB0aGUgdXBwZXIgYm91bmQgb3VnaHQgdG8gZGVwZW5kIG9uIGRhdGEgcHJlY2lzaW9uLgotICAgICAgICogUGVyaGFwcyB0aGV5IHJlYWxseSBtZWFudCAwLi5OKzEgZm9yIE4tYml0IHByZWNpc2lvbi4KLSAgICAgICAqIEhlcmUgd2UgYWxsb3cgMC4uMTAgZm9yIDgtYml0IGRhdGE7IEFsIGxhcmdlciB0aGFuIDEwIHJlc3VsdHMgaW4KLSAgICAgICAqIG91dC1vZi1yYW5nZSByZWNvbnN0cnVjdGVkIERDIHZhbHVlcyBkdXJpbmcgdGhlIGZpcnN0IERDIHNjYW4sCi0gICAgICAgKiB3aGljaCBtaWdodCBjYXVzZSBwcm9ibGVtcyBmb3Igc29tZSBkZWNvZGVycy4KLSAgICAgICAqLwotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1BWF9BSF9BTCAxMAotI2Vsc2UKLSNkZWZpbmUgTUFYX0FIX0FMIDEzCi0jZW5kaWYKLSAgICAgIGlmIChTcyA8IDAgfHwgU3MgPj0gRENUU0laRTIgfHwgU2UgPCBTcyB8fCBTZSA+PSBEQ1RTSVpFMiB8fAotCSAgQWggPCAwIHx8IEFoID4gTUFYX0FIX0FMIHx8IEFsIDwgMCB8fCBBbCA+IE1BWF9BSF9BTCkKLQlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgICBpZiAoU3MgPT0gMCkgewotCWlmIChTZSAhPSAwKQkJLyogREMgYW5kIEFDIHRvZ2V0aGVyIG5vdCBPSyAqLwotCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgfSBlbHNlIHsKLQlpZiAobmNvbXBzICE9IDEpCS8qIEFDIHNjYW5zIG11c3QgYmUgZm9yIG9ubHkgb25lIGNvbXBvbmVudCAqLwotCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgfQotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7Ci0JbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXVswXTsKLQlpZiAoU3MgIT0gMCAmJiBsYXN0X2JpdHBvc19wdHJbMF0gPCAwKSAvKiBBQyB3aXRob3V0IHByaW9yIERDIHNjYW4gKi8KLQkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLQlmb3IgKGNvZWZpID0gU3M7IGNvZWZpIDw9IFNlOyBjb2VmaSsrKSB7Ci0JICBpZiAobGFzdF9iaXRwb3NfcHRyW2NvZWZpXSA8IDApIHsKLQkgICAgLyogZmlyc3Qgc2NhbiBvZiB0aGlzIGNvZWZmaWNpZW50ICovCi0JICAgIGlmIChBaCAhPSAwKQotCSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLQkgIH0gZWxzZSB7Ci0JICAgIC8qIG5vdCBmaXJzdCBzY2FuICovCi0JICAgIGlmIChBaCAhPSBsYXN0X2JpdHBvc19wdHJbY29lZmldIHx8IEFsICE9IEFoLTEpCi0JICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotCSAgfQotCSAgbGFzdF9iaXRwb3NfcHRyW2NvZWZpXSA9IEFsOwotCX0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBGb3Igc2VxdWVudGlhbCBKUEVHLCBhbGwgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBtdXN0IGJlIHRoZXNlOiAqLwotICAgICAgaWYgKFNzICE9IDAgfHwgU2UgIT0gRENUU0laRTItMSB8fCBBaCAhPSAwIHx8IEFsICE9IDApCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgLyogTWFrZSBzdXJlIGNvbXBvbmVudHMgYXJlIG5vdCBzZW50IHR3aWNlICovCi0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKLQl0aGlzaSA9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV07Ci0JaWYgKGNvbXBvbmVudF9zZW50W3RoaXNpXSkKLQkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKLQljb21wb25lbnRfc2VudFt0aGlzaV0gPSBUUlVFOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIE5vdyB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIGdvdCBzZW50LiAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgIC8qIEZvciBwcm9ncmVzc2l2ZSBtb2RlLCB3ZSBvbmx5IGNoZWNrIHRoYXQgYXQgbGVhc3Qgc29tZSBEQyBkYXRhCi0gICAgICogZ290IHNlbnQgZm9yIGVhY2ggY29tcG9uZW50OyB0aGUgc3BlYyBkb2VzIG5vdCByZXF1aXJlIHRoYXQgYWxsIGJpdHMKLSAgICAgKiBvZiBhbGwgY29lZmZpY2llbnRzIGJlIHRyYW5zbWl0dGVkLiAgV291bGQgaXQgYmUgd2lzZXIgdG8gZW5mb3JjZQotICAgICAqIHRyYW5zbWlzc2lvbiBvZiBhbGwgY29lZmZpY2llbnQgYml0cz8/Ci0gICAgICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBpZiAobGFzdF9iaXRwb3NbY2ldWzBdIDwgMCkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBpZiAoISBjb21wb25lbnRfc2VudFtjaV0pCi0JRVJSRVhJVChjaW5mbywgSkVSUl9NSVNTSU5HX0RBVEEpOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLyogQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotTE9DQUwodm9pZCkKLXNlbGVjdF9zY2FuX3BhcmFtZXRlcnMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2V0IHVwIHRoZSBzY2FuIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHNjYW4gKi8KLXsKLSAgaW50IGNpOwotCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIGlmIChjaW5mby0+c2Nhbl9pbmZvICE9IE5VTEwpIHsKLSAgICAvKiBQcmVwYXJlIGZvciBjdXJyZW50IHNjYW4gLS0tIHRoZSBzY3JpcHQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgKi8KLSAgICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotICAgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciA9IGNpbmZvLT5zY2FuX2luZm8gKyBtYXN0ZXItPnNjYW5fbnVtYmVyOwotCi0gICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBzY2FucHRyLT5jb21wc19pbl9zY2FuOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IHNjYW5wdHItPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXSA9Ci0JJmNpbmZvLT5jb21wX2luZm9bc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXV07Ci0gICAgfQotICAgIGNpbmZvLT5TcyA9IHNjYW5wdHItPlNzOwotICAgIGNpbmZvLT5TZSA9IHNjYW5wdHItPlNlOwotICAgIGNpbmZvLT5BaCA9IHNjYW5wdHItPkFoOwotICAgIGNpbmZvLT5BbCA9IHNjYW5wdHItPkFsOwotICB9Ci0gIGVsc2UKLSNlbmRpZgotICB7Ci0gICAgLyogUHJlcGFyZSBmb3Igc2luZ2xlIHNlcXVlbnRpYWwtSlBFRyBzY2FuIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgKi8KLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOwotICAgIGNpbmZvLT5jb21wc19pbl9zY2FuID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0gJmNpbmZvLT5jb21wX2luZm9bY2ldOwotICAgIH0KLSAgICBjaW5mby0+U3MgPSAwOwotICAgIGNpbmZvLT5TZSA9IERDVFNJWkUyLTE7Ci0gICAgY2luZm8tPkFoID0gMDsKLSAgICBjaW5mby0+QWwgPSAwOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLXBlcl9zY2FuX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBKUEVHIHNjYW4gKi8KLS8qIGNpbmZvLT5jb21wc19pbl9zY2FuIGFuZCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tdIGFyZSBhbHJlYWR5IHNldCAqLwotewotICBpbnQgY2ksIG1jdWJsa3MsIHRtcDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA9PSAxKSB7Ci0gICAgCi0gICAgLyogTm9uaW50ZXJsZWF2ZWQgKHNpbmdsZS1jb21wb25lbnQpIHNjYW4gKi8KLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF07Ci0gICAgCi0gICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KLSAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLSAgICAKLSAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYWx3YXlzIG9uZSBibG9jayBwZXIgTUNVICovCi0gICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKLSAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKLSAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKLSAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gRENUU0laRTsKLSAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IDE7Ci0gICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW5zLCBpdCBpcyBjb252ZW5pZW50IHRvIGRlZmluZSBsYXN0X3Jvd19oZWlnaHQKLSAgICAgKiBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrIHJvd3MgcHJlc2VudCBpbiB0aGUgbGFzdCBpTUNVIHJvdy4KLSAgICAgKi8KLSAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7Ci0gICAgCi0gICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLwotICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMTsKLSAgICBjaW5mby0+TUNVX21lbWJlcnNoaXBbMF0gPSAwOwotICAgIAotICB9IGVsc2UgewotICAgIAotICAgIC8qIEludGVybGVhdmVkIChtdWx0aS1jb21wb25lbnQpIHNjYW4gKi8KLSAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPD0gMCB8fCBjaW5mby0+Y29tcHNfaW5fc2NhbiA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+Y29tcHNfaW5fc2NhbiwKLQkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOwotICAgIAotICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCi0gICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotICAgIAotICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMDsKLSAgICAKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAgIC8qIFNhbXBsaW5nIGZhY3RvcnMgZ2l2ZSAjIG9mIGJsb2NrcyBvZiBjb21wb25lbnQgaW4gZWFjaCBNQ1UgKi8KLSAgICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIERDVFNJWkU7Ci0gICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCi0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOwotICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7Ci0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOwotICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLwotICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7Ci0gICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gQ19NQVhfQkxPQ0tTX0lOX01DVSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7Ci0gICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgewotCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qIENvbnZlcnQgcmVzdGFydCBzcGVjaWZpZWQgaW4gcm93cyB0byBhY3R1YWwgTUNVIGNvdW50LiAqLwotICAvKiBOb3RlIHRoYXQgY291bnQgbXVzdCBmaXQgaW4gMTYgYml0cywgc28gd2UgcHJvdmlkZSBsaW1pdGluZy4gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPiAwKSB7Ci0gICAgbG9uZyBub21pbmFsID0gKGxvbmcpIGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgKiAobG9uZykgY2luZm8tPk1DVXNfcGVyX3JvdzsKLSAgICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIE1JTihub21pbmFsLCA2NTUzNUwpOwotICB9Ci19Ci0KLQotLyoKLSAqIFBlci1wYXNzIHNldHVwLgotICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuICBXZSBkZXRlcm1pbmUgd2hpY2ggbW9kdWxlcwotICogd2lsbCBiZSBhY3RpdmUgZHVyaW5nIHRoaXMgcGFzcyBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIHN0YXJ0X3Bhc3MgY2FsbHMuCi0gKiBXZSBhbHNvIHNldCBpc19sYXN0X3Bhc3MgdG8gaW5kaWNhdGUgd2hldGhlciBhbnkgbW9yZSBwYXNzZXMgd2lsbCBiZQotICogcmVxdWlyZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVwYXJlX2Zvcl9wYXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7Ci0gIGNhc2UgbWFpbl9wYXNzOgotICAgIC8qIEluaXRpYWwgcGFzczogd2lsbCBjb2xsZWN0IGlucHV0IGRhdGEsIGFuZCBkbyBlaXRoZXIgSHVmZm1hbgotICAgICAqIG9wdGltaXphdGlvbiBvciBkYXRhIG91dHB1dCBmb3IgdGhlIGZpcnN0IHNjYW4uCi0gICAgICovCi0gICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7Ci0gICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9pbikgewotICAgICAgKCpjaW5mby0+Y2NvbnZlcnQtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgKCpjaW5mby0+cHJlcC0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7Ci0gICAgfQotICAgICgqY2luZm8tPmZkY3QtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBjaW5mby0+b3B0aW1pemVfY29kaW5nKTsKLSAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sCi0JCQkJKG1hc3Rlci0+dG90YWxfcGFzc2VzID4gMSA/Ci0JCQkJIEpCVUZfU0FWRV9BTkRfUEFTUyA6IEpCVUZfUEFTU19USFJVKSk7Ci0gICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7Ci0gICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKLSAgICAgIC8qIE5vIGltbWVkaWF0ZSBkYXRhIG91dHB1dDsgcG9zdHBvbmUgd3JpdGluZyBmcmFtZS9zY2FuIGhlYWRlcnMgKi8KLSAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFdpbGwgd3JpdGUgZnJhbWUvc2NhbiBoZWFkZXJzIGF0IGZpcnN0IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGNhbGwgKi8KLSAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gVFJVRTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gIGNhc2UgaHVmZl9vcHRfcGFzczoKLSAgICAvKiBEbyBIdWZmbWFuIG9wdGltaXphdGlvbiBmb3IgYSBzY2FuIGFmdGVyIHRoZSBmaXJzdCBvbmUuICovCi0gICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7Ci0gICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotICAgIGlmIChjaW5mby0+U3MgIT0gMCB8fCBjaW5mby0+QWggPT0gMCB8fCBjaW5mby0+YXJpdGhfY29kZSkgewotICAgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBUUlVFKTsKLSAgICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKLSAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogU3BlY2lhbCBjYXNlOiBIdWZmbWFuIERDIHJlZmluZW1lbnQgc2NhbnMgbmVlZCBubyBIdWZmbWFuIHRhYmxlCi0gICAgICogYW5kIHRoZXJlZm9yZSB3ZSBjYW4gc2tpcCB0aGUgb3B0aW1pemF0aW9uIHBhc3MgZm9yIHRoZW0uCi0gICAgICovCi0gICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKLSAgICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Ci0gICAgLypGQUxMVEhST1VHSCovCi0jZW5kaWYKLSAgY2FzZSBvdXRwdXRfcGFzczoKLSAgICAvKiBEbyBhIGRhdGEtb3V0cHV0IHBhc3MuICovCi0gICAgLyogV2UgbmVlZCBub3QgcmVwZWF0IHBlci1zY2FuIHNldHVwIGlmIHByaW9yIG9wdGltaXphdGlvbiBwYXNzIGRpZCBpdC4gKi8KLSAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKSB7Ci0gICAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKLSAgICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKLSAgICB9Ci0gICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBGQUxTRSk7Ci0gICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOwotICAgIC8qIFdlIGVtaXQgZnJhbWUvc2NhbiBoZWFkZXJzIG5vdyAqLwotICAgIGlmIChtYXN0ZXItPnNjYW5fbnVtYmVyID09IDApCi0gICAgICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZyYW1lX2hlYWRlcikgKGNpbmZvKTsKLSAgICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3NjYW5faGVhZGVyKSAoY2luZm8pOwotICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICB9Ci0KLSAgbWFzdGVyLT5wdWIuaXNfbGFzdF9wYXNzID0gKG1hc3Rlci0+cGFzc19udW1iZXIgPT0gbWFzdGVyLT50b3RhbF9wYXNzZXMtMSk7Ci0KLSAgLyogU2V0IHVwIHByb2dyZXNzIG1vbml0b3IncyBwYXNzIGluZm8gaWYgcHJlc2VudCAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gbWFzdGVyLT50b3RhbF9wYXNzZXM7Ci0gIH0KLX0KLQotCi0vKgotICogU3BlY2lhbCBzdGFydC1vZi1wYXNzIGhvb2suCi0gKiBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3dyaXRlX3NjYW5saW5lcyBpZiBjYWxsX3Bhc3Nfc3RhcnR1cCBpcyBUUlVFLgotICogSW4gc2luZ2xlLXBhc3MgcHJvY2Vzc2luZywgd2UgbmVlZCB0aGlzIGhvb2sgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCi0gKiB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgZHVyaW5nIGpwZWdfc3RhcnRfY29tcHJlc3M7IHdlIHdhbnQgdG8gbGV0IHRoZQotICogYXBwbGljYXRpb24gd3JpdGUgQ09NIG1hcmtlcnMgZXRjLiBiZXR3ZWVuIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIHRoZQotICoganBlZ193cml0ZV9zY2FubGluZXMgbG9vcC4KLSAqIEluIG11bHRpLXBhc3MgcHJvY2Vzc2luZywgdGhpcyByb3V0aW5lIGlzIG5vdCB1c2VkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcGFzc19zdGFydHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsgLyogcmVzZXQgZmxhZyBzbyBjYWxsIG9ubHkgb25jZSAqLwotCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOwotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3NjYW5faGVhZGVyKSAoY2luZm8pOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgZW5kIG9mIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19tYXN0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIC8qIFRoZSBlbnRyb3B5IGNvZGVyIGFsd2F5cyBuZWVkcyBhbiBlbmQtb2YtcGFzcyBjYWxsLAotICAgKiBlaXRoZXIgdG8gYW5hbHl6ZSBzdGF0aXN0aWNzIG9yIHRvIGZsdXNoIGl0cyBvdXRwdXQgYnVmZmVyLgotICAgKi8KLSAgKCpjaW5mby0+ZW50cm9weS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0KLSAgLyogVXBkYXRlIHN0YXRlIGZvciBuZXh0IHBhc3MgKi8KLSAgc3dpdGNoIChtYXN0ZXItPnBhc3NfdHlwZSkgewotICBjYXNlIG1haW5fcGFzczoKLSAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG91dHB1dCBvZiBzY2FuIDAgKGFmdGVyIG9wdGltaXphdGlvbikKLSAgICAgKiBvciBvdXRwdXQgb2Ygc2NhbiAxIChpZiBubyBvcHRpbWl6YXRpb24pLgotICAgICAqLwotICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7Ci0gICAgaWYgKCEgY2luZm8tPm9wdGltaXplX2NvZGluZykKLSAgICAgIG1hc3Rlci0+c2Nhbl9udW1iZXIrKzsKLSAgICBicmVhazsKLSAgY2FzZSBodWZmX29wdF9wYXNzOgotICAgIC8qIG5leHQgcGFzcyBpcyBhbHdheXMgb3V0cHV0IG9mIGN1cnJlbnQgc2NhbiAqLwotICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugb3V0cHV0X3Bhc3M6Ci0gICAgLyogbmV4dCBwYXNzIGlzIGVpdGhlciBvcHRpbWl6YXRpb24gb3Igb3V0cHV0IG9mIG5leHQgc2NhbiAqLwotICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQotICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBodWZmX29wdF9wYXNzOwotICAgIG1hc3Rlci0+c2Nhbl9udW1iZXIrKzsKLSAgICBicmVhazsKLSAgfQotCi0gIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBtYXN0ZXIgY29tcHJlc3Npb24gY29udHJvbC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfbWFzdGVyX2NvbnRyb2wgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHRyYW5zY29kZV9vbmx5KQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKLQotICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXlfY29tcF9tYXN0ZXIpKTsKLSAgY2luZm8tPm1hc3RlciA9IChzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqKSBtYXN0ZXI7Ci0gIG1hc3Rlci0+cHViLnByZXBhcmVfZm9yX3Bhc3MgPSBwcmVwYXJlX2Zvcl9wYXNzOwotICBtYXN0ZXItPnB1Yi5wYXNzX3N0YXJ0dXAgPSBwYXNzX3N0YXJ0dXA7Ci0gIG1hc3Rlci0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfbWFzdGVyOwotICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSBGQUxTRTsKLQotICAvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzLCBkZXRlcm1pbmUgZGVyaXZlZCB2YWx1ZXMgKi8KLSAgaW5pdGlhbF9zZXR1cChjaW5mbyk7Ci0KLSAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgewotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgIHZhbGlkYXRlX3NjcmlwdChjaW5mbyk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7Ci0gICAgY2luZm8tPm51bV9zY2FucyA9IDE7Ci0gIH0KLQotICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCS8qICBURU1QT1JBUlkgSEFDSyA/Pz8gKi8KLSAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsgLyogYXNzdW1lIGRlZmF1bHQgdGFibGVzIG5vIGdvb2QgZm9yIHByb2dyZXNzaXZlIG1vZGUgKi8KLQotICAvKiBJbml0aWFsaXplIG15IHByaXZhdGUgc3RhdGUgKi8KLSAgaWYgKHRyYW5zY29kZV9vbmx5KSB7Ci0gICAgLyogbm8gbWFpbiBwYXNzIGluIHRyYW5zY29kaW5nICovCi0gICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCi0gICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7Ci0gICAgZWxzZQotICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKLSAgfSBlbHNlIHsKLSAgICAvKiBmb3Igbm9ybWFsIGNvbXByZXNzaW9uLCBmaXJzdCBwYXNzIGlzIGFsd2F5cyB0aGlzIHR5cGU6ICovCi0gICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBtYWluX3Bhc3M7Ci0gIH0KLSAgbWFzdGVyLT5zY2FuX251bWJlciA9IDA7Ci0gIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOwotICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKLSAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnMgKiAyOwotICBlbHNlCi0gICAgbWFzdGVyLT50b3RhbF9wYXNzZXMgPSBjaW5mby0+bnVtX3NjYW5zOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbWFwaS5jIGIvbGlianBlZ3R3cnAvamNvbWFwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjFmYTc1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb21hcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogamNvbWFwaS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIHJvdXRpbmVzIHRoYXQgYXJlIHVzZWQgZm9yIGJvdGgKLSAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24sCi0gKiBidXQgZG9uJ3QgZGVzdHJveSB0aGUgb2JqZWN0IGl0c2VsZi4KLSAqCi0gKiBGb3IgdGhpcywgd2UgbWVyZWx5IGNsZWFuIHVwIGFsbCB0aGUgbm9ucGVybWFuZW50IG1lbW9yeSBwb29scy4KLSAqIE5vdGUgdGhhdCB0ZW1wIGZpbGVzICh2aXJ0dWFsIGFycmF5cykgYXJlIG5vdCBhbGxvd2VkIHRvIGJlbG9uZyB0bwotICogdGhlIHBlcm1hbmVudCBwb29sLCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gY2xvc2UgYWxsIHRlbXAgZmlsZXMgaGVyZS4KLSAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncwotICogcmVzcG9uc2liaWxpdHkuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Fib3J0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGludCBwb29sOwotCi0gIC8qIERvIG5vdGhpbmcgaWYgY2FsbGVkIG9uIGEgbm90LWluaXRpYWxpemVkIG9yIGRlc3Ryb3llZCBKUEVHIG9iamVjdC4gKi8KLSAgaWYgKGNpbmZvLT5tZW0gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogUmVsZWFzaW5nIHBvb2xzIGluIHJldmVyc2Ugb3JkZXIgbWlnaHQgaGVscCBhdm9pZCBmcmFnbWVudGF0aW9uCi0gICAqIHdpdGggc29tZSAoYnJhaW4tZGFtYWdlZCkgbWFsbG9jIGxpYnJhcmllcy4KLSAgICovCi0gIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPiBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgICgqY2luZm8tPm1lbS0+ZnJlZV9wb29sKSAoY2luZm8sIHBvb2wpOwotICB9Ci0KLSAgLyogUmVzZXQgb3ZlcmFsbCBzdGF0ZSBmb3IgcG9zc2libGUgcmV1c2Ugb2Ygb2JqZWN0ICovCi0gIGlmIChjaW5mby0+aXNfZGVjb21wcmVzc29yKSB7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKLSAgICAvKiBUcnkgdG8ga2VlcCBhcHBsaWNhdGlvbiBmcm9tIGFjY2Vzc2luZyBub3ctZGVsZXRlZCBtYXJrZXIgbGlzdC4KLSAgICAgKiBBIGJpdCBrbHVkZ3kgdG8gZG8gaXQgaGVyZSwgYnV0IHRoaXMgaXMgdGhlIG1vc3QgY2VudHJhbCBwbGFjZS4KLSAgICAgKi8KLSAgICAoKGpfZGVjb21wcmVzc19wdHIpIGNpbmZvKS0+bWFya2VyX2xpc3QgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfU1RBUlQ7Ci0gIH0KLX0KLQotCi0vKgotICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIG9iamVjdC4KLSAqCi0gKiBFdmVyeXRoaW5nIGdldHMgZGVhbGxvY2F0ZWQgZXhjZXB0IHRoZSBtYXN0ZXIganBlZ19jb21wcmVzc19zdHJ1Y3QgaXRzZWxmCi0gKiBhbmQgdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0LiAgQm90aCBvZiB0aGVzZSBhcmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0gKiBhbmQgbXVzdCBiZSBmcmVlZCwgaWYgbmVjZXNzYXJ5LCBieSB0aGUgYXBwbGljYXRpb24uICAoT2Z0ZW4gdGhleSBhcmUgb24KLSAqIHRoZSBzdGFjayBhbmQgc28gZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBhbnl3YXkuKQotICogQ2xvc2luZyBhIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBpZiBuZWNlc3NhcnksIGlzIHRoZSBhcHBsaWNhdGlvbidzCi0gKiByZXNwb25zaWJpbGl0eS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZGVzdHJveSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBXZSBuZWVkIG9ubHkgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gcmVsZWFzZSBldmVyeXRoaW5nLiAqLwotICAvKiBOQjogbWVtIHBvaW50ZXIgaXMgTlVMTCBpZiBtZW1vcnkgbWdyIGZhaWxlZCB0byBpbml0aWFsaXplLiAqLwotICBpZiAoY2luZm8tPm1lbSAhPSBOVUxMKQotICAgICgqY2luZm8tPm1lbS0+c2VsZl9kZXN0cnVjdCkgKGNpbmZvKTsKLSAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBiZSBzYWZlIGlmIGpwZWdfZGVzdHJveSBpcyBjYWxsZWQgdHdpY2UgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IDA7CS8qIG1hcmsgaXQgZGVzdHJveWVkICovCi19Ci0KLQotLyoKLSAqIENvbnZlbmllbmNlIHJvdXRpbmVzIGZvciBhbGxvY2F0aW5nIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCi0gKiAoV291bGQganV0aWxzLmMgYmUgYSBtb3JlIHJlYXNvbmFibGUgcGxhY2UgdG8gcHV0IHRoZXNlPykKLSAqLwotCi1HTE9CQUwoSlFVQU5UX1RCTCAqKQotanBlZ19hbGxvY19xdWFudF90YWJsZSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBKUVVBTlRfVEJMICp0Ymw7Ci0KLSAgdGJsID0gKEpRVUFOVF9UQkwgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpRVUFOVF9UQkwpKTsKLSAgdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7CS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGZhbHNlIGluIGFueSBuZXcgdGFibGUgKi8KLSAgcmV0dXJuIHRibDsKLX0KLQotCi1HTE9CQUwoSkhVRkZfVEJMICopCi1qcGVnX2FsbG9jX2h1ZmZfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgSkhVRkZfVEJMICp0Ymw7Ci0KLSAgdGJsID0gKEpIVUZGX1RCTCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpIChjaW5mbywgSlBPT0xfUEVSTUFORU5ULCBTSVpFT0YoSkhVRkZfVEJMKSk7Ci0gIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCi0gIHJldHVybiB0Ymw7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLmJjYyBiL2xpYmpwZWd0d3JwL2pjb25maWcuYmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmM1M2ZmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcuYmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogamNvbmZpZy5iY2MgLS0tIGpjb25maWcuaCBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSBvbiBNUy1ET1Mgb3IgT1MvMi4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSNpZmRlZiBfX01TRE9TX18KLSNkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMJLyogZm9yIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwgKi8KLSNlbmRpZgotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgkvKiB0aGlzIGFzc3VtZXMgeW91IGhhdmUgLXctc3R1IGluIENGTEFHUyAqLwotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNpZmRlZiBfX01TRE9TX18KLSNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLwotI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLwotI2RlZmluZSBVU0VfRk1FTQkJLyogQm9ybGFuZCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBCb3JsYW5kIGhhcyBzZXRtb2RlKCkgKi8KLSNpZmRlZiBfX01TRE9TX18KLSNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLwotI2VuZGlmCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5jZmcgYi9saWJqcGVndHdycC9qY29uZmlnLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMDRmYS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIGpjb25maWcuY2ZnIC0tLSBzb3VyY2UgZmlsZSBlZGl0ZWQgYnkgY29uZmlndXJlIHNjcmlwdCAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI3VuZGVmIEhBVkVfUFJPVE9UWVBFUwotI3VuZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotI3VuZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKLSN1bmRlZiB2b2lkCi0jdW5kZWYgY29uc3QKLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jdW5kZWYgSEFWRV9TVERERUZfSAotI3VuZGVmIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotLyogRGVmaW5lIHRoaXMgaWYgeW91IGdldCB3YXJuaW5ncyBhYm91dCB1bmRlZmluZWQgc3RydWN0dXJlcy4gKi8KLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0jdW5kZWYgSU5MSU5FCi0vKiBUaGVzZSBhcmUgZm9yIGNvbmZpZ3VyaW5nIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAqLwotI3VuZGVmIERFRkFVTFRfTUFYX01FTQotI3VuZGVmIE5PX01LVEVNUAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBwZXJjZW50LWRvbmUgcHJvZ3Jlc3MgcmVwb3J0cyBmcm9tIGNqcGVnL2RqcGVnLiAqLwotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5kaiBiL2xpYmpwZWd0d3JwL2pjb25maWcuZGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTlhOWQuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy5kagorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIGpjb25maWcuZGogLS0tIGpjb25maWcuaCBmb3IgREpHUFAgKERlbG9yaWUncyBHTlUgQyBwb3J0KSBvbiBNUy1ET1MuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMJLyogREpHUFAgdXNlcyBmbGF0IDMyLWJpdCBhZGRyZXNzaW5nICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLwotI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTmVlZGVkIHRvIG1ha2Ugb25lLWZpbGUgc3R5bGUgd29yayBpbiBESkdQUCAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5kb2MgYi9saWJqcGVndHdycC9qY29uZmlnLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4ZDFjMC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogamNvbmZpZy5kb2MKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bwotICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgotICoKLSAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKLSAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKLSAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgotICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KLSAqCi0gKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCi0gKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCi0gKi8KLQotCi0vKgotICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCi0gKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCi0gKi8KLQotLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KLSAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCi0gKi8KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0KLS8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPwotICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPwotICovCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0KLS8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KLSAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAotICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgotICovCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotCi0vKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgotICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0KLS8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgotICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgotICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KLSAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCi0gKi8KLSNkZWZpbmUgSEFWRV9TVERERUZfSAotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KLSAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCi0gKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgotICovCi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKLSAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCi0gKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCi0gKi8KLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0KLS8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAotICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgotICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KLSAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAotICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCi0gKi8KLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKLSAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCi0gKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0KLS8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bwotICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCi0gKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAotICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQotICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKLSAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgotICovCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotCi0vKgotICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKLSAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCi0gKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQotICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KLSAqLwotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKLSAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKLSAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCi0gKi8KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0KLS8qCi0gKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKLSAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCi0gKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KLSAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0vKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAotICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgotICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0Ci0gKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KLSAqLwotI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgotICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcwotICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgotICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotCi0vKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAotICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCi0gKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgotICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCi0gKi8KLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQKLQotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5oIGIvbGlianBlZ3R3cnAvamNvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE5ODE3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBhbmRyb2lkIGpjb25maWcuaCAqLwotLyoKLSAqIGpjb25maWcuZG9jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8KLSAqIGN1c3RvbWl6ZSB0aGUgSlBFRyBzb2Z0d2FyZSBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbS4KLSAqCi0gKiBUaGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGluc3RhbGxhdGlvbiBhcmUgc3RvcmVkCi0gKiBpbiBqY29uZmlnLmguICBPbiBtYW55IG1hY2hpbmVzLCBqY29uZmlnLmggY2FuIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5Ci0gKiBvciBjb3BpZWQgZnJvbSBvbmUgb2YgdGhlICJjYW5uZWQiIGpjb25maWcgZmlsZXMgdGhhdCB3ZSBzdXBwbHkuICBCdXQgaWYKLSAqIHlvdSBuZWVkIHRvIGdlbmVyYXRlIGEgamNvbmZpZy5oIGZpbGUgYnkgaGFuZCwgdGhpcyBmaWxlIHRlbGxzIHlvdSBob3cuCi0gKgotICogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0tLSBJVCBXT04nVCBBQ0NPTVBMSVNIIEFOWVRISU5HLgotICogRURJVCBBIENPUFkgTkFNRUQgSkNPTkZJRy5ILgotICovCi0KLQotLyoKLSAqIFRoZXNlIHN5bWJvbHMgaW5kaWNhdGUgdGhlIHByb3BlcnRpZXMgb2YgeW91ciBtYWNoaW5lIG9yIGNvbXBpbGVyLgotICogI2RlZmluZSB0aGUgc3ltYm9sIGlmIHllcywgI3VuZGVmIGl0IGlmIG5vLgotICovCi0KLS8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZXM/Ci0gKiAoSWYgbm90LCB5b3UgYWxzbyBuZWVkIHRvIHVzZSBhbnNpMmtuciwgc2VlIGluc3RhbGwuZG9jKQotICovCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotCi0vKiBEb2VzIHlvdXIgY29tcGlsZXIgc3VwcG9ydCB0aGUgZGVjbGFyYXRpb24gInVuc2lnbmVkIGNoYXIiID8KLSAqIEhvdyBhYm91dCAidW5zaWduZWQgc2hvcnQiID8KLSAqLwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotCi0vKiBEZWZpbmUgInZvaWQiIGFzICJjaGFyIiBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyBhYm91dCB0eXBlIHZvaWQuCi0gKiBOT1RFOiBiZSBzdXJlIHRvIGRlZmluZSB2b2lkIHN1Y2ggdGhhdCAidm9pZCAqIiByZXByZXNlbnRzIHRoZSBtb3N0IGdlbmVyYWwKLSAqIHBvaW50ZXIgdHlwZSwgZS5nLiwgdGhhdCByZXR1cm5lZCBieSBtYWxsb2MoKS4KLSAqLwotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLQotLyogRGVmaW5lICJjb25zdCIgYXMgZW1wdHkgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGtub3cgdGhlICJjb25zdCIga2V5d29yZC4KLSAqLwotLyogI2RlZmluZSBjb25zdCAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiBhbiBvcmRpbmFyeSAiY2hhciIgdHlwZSBpcyB1bnNpZ25lZC4KLSAqIElmIHlvdSdyZSBub3Qgc3VyZSwgbGVhdmluZyBpdCB1bmRlZmluZWQgd2lsbCB3b3JrIGF0IHNvbWUgY29zdCBpbiBzcGVlZC4KLSAqIElmIHlvdSBkZWZpbmVkIEhBVkVfVU5TSUdORURfQ0hBUiB0aGVuIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGlzIG1pbmltYWwuCi0gKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGhhcyBhbiBBTlNJLWNvbmZvcm1pbmcgPHN0ZGRlZi5oPiBmaWxlLgotICovCi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkbGliLmg+IGZpbGUuCi0gKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGFuIEFOU0kvU3lzViA8c3RyaW5nLmg+LAotICogYnV0IGRvZXMgaGF2ZSBhIEJTRC1zdHlsZSA8c3RyaW5ncy5oPi4KLSAqLwotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0eXBlZGVmIHNpemVfdCBpbiBhbnkgb2YgdGhlCi0gKiBBTlNJLXN0YW5kYXJkIHBsYWNlcyAoc3RkZGVmLmgsIHN0ZGxpYi5oLCBvciBzdGRpby5oKSwgYnV0IHBsYWNlcyBpdCBpbgotICogPHN5cy90eXBlcy5oPiBpbnN0ZWFkLgotICovCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotCi0vKiBGb3IgODB4ODYgbWFjaGluZXMsIHlvdSBuZWVkIHRvIGRlZmluZSBORUVEX0ZBUl9QT0lOVEVSUywKLSAqIHVubGVzcyB5b3UgYXJlIHVzaW5nIGEgbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwgb3IgODAzODYgZmxhdC1tZW1vcnkgbW9kZS4KLSAqIE9uIGxlc3MgYnJhaW4tZGFtYWdlZCBDUFVzIHRoaXMgc3ltYm9sIG11c3Qgbm90IGJlIGRlZmluZWQuCi0gKiAoRGVmaW5pbmcgdGhpcyBzeW1ib2wgY2F1c2VzIGxhcmdlIGRhdGEgc3RydWN0dXJlcyB0byBiZSByZWZlcmVuY2VkIHRocm91Z2gKLSAqICJmYXIiIHBvaW50ZXJzIGFuZCB0byBiZSBhbGxvY2F0ZWQgd2l0aCBhIHNwZWNpYWwgdmVyc2lvbiBvZiBtYWxsb2MuKQotICovCi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91ciBsaW5rZXIgbmVlZHMgZ2xvYmFsIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiBsZXNzCi0gKiB0aGFuIHRoZSBmaXJzdCAxNSBjaGFyYWN0ZXJzLgotICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotCi0vKiBBbHRob3VnaCBhIHJlYWwgQU5TSSBDIGNvbXBpbGVyIGNhbiBkZWFsIHBlcmZlY3RseSB3ZWxsIHdpdGggcG9pbnRlcnMgdG8KLSAqIHVuc3BlY2lmaWVkIHN0cnVjdHVyZXMgKHNlZSAiaW5jb21wbGV0ZSB0eXBlcyIgaW4gdGhlIHNwZWMpLCBhIGZldyBwcmUtQU5TSQotICogYW5kIHBzZXVkby1BTlNJIGNvbXBpbGVycyBnZXQgY29uZnVzZWQuICBUbyBrZWVwIG9uZSBvZiB0aGVzZSBib3pvcyBoYXBweSwKLSAqIGRlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTi4gIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UKLSAqIGFjdHVhbGx5IGdldCAibWlzc2luZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiIgd2FybmluZ3Mgb3IgZXJyb3JzIHdoaWxlCi0gKiBjb21waWxpbmcgdGhlIEpQRUcgY29kZS4KLSAqLwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhZmZlY3QgY29kZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBKUEVHIGxpYnJhcnksCi0gKiBidXQgdGhleSBkb24ndCBuZWVkIHRvIGJlIHZpc2libGUgdG8gYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5LgotICogVG8gbWluaW1pemUgYXBwbGljYXRpb24gbmFtZXNwYWNlIHBvbGx1dGlvbiwgdGhlIHN5bWJvbHMgd29uJ3QgYmUKLSAqIGRlZmluZWQgdW5sZXNzIEpQRUdfSU5URVJOQUxTIGhhcyBiZWVuIGRlZmluZWQuCi0gKi8KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdXIgY29tcGlsZXIgaW1wbGVtZW50cyAiPj4iIG9uIHNpZ25lZCB2YWx1ZXMgYXMgYSBsb2dpY2FsCi0gKiAodW5zaWduZWQpIHNoaWZ0OyBsZWF2ZSBpdCB1bmRlZmluZWQgaWYgIj4+IiBpcyBhIHNpZ25lZCAoYXJpdGhtZXRpYykgc2hpZnQsCi0gKiB3aGljaCBpcyB0aGUgbm9ybWFsIGFuZCByYXRpb25hbCBkZWZpbml0aW9uLgotICovCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotCi0vKgotICogVGhlIHJlbWFpbmluZyBvcHRpb25zIGRvIG5vdCBhZmZlY3QgdGhlIEpQRUcgbGlicmFyeSBwcm9wZXIsCi0gKiBidXQgb25seSB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZy9kanBlZyAoc2VlIGNqcGVnLmMsIGRqcGVnLmMpLgotICogT3RoZXIgYXBwbGljYXRpb25zIGNhbiBpZ25vcmUgdGhlc2UuCi0gKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotLyogVGhlc2UgZGVmaW5lcyBpbmRpY2F0ZSB3aGljaCBpbWFnZSAobm9uLUpQRUcpIGZpbGUgZm9ybWF0cyBhcmUgYWxsb3dlZC4gKi8KLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gbmFtZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgb24gdGhlIGNvbW1hbmQKLSAqIGxpbmUsIHJhdGhlciB0aGFuIHVzaW5nIHN0ZG91dCBhbmQgb3B0aW9uYWxseSBzdGRpbi4gIFlvdSBNVVNUIGRvIHRoaXMgaWYKLSAqIHlvdXIgc3lzdGVtIGNhbid0IGNvcGUgd2l0aCBiaW5hcnkgSS9PIHRvIHN0ZGluL3N0ZG91dC4gIFNlZSBjb21tZW50cyBhdAotICogaGVhZCBvZiBjanBlZy5jIG9yIGRqcGVnLmMuCi0gKi8KLSN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBuZWVkcyBleHBsaWNpdCBjbGVhbnVwIG9mIHRlbXBvcmFyeSBmaWxlcy4KLSAqIFRoaXMgaXMgY3J1Y2lhbCB1bmRlciBNUy1ET1MsIHdoZXJlIHRoZSB0ZW1wb3JhcnkgImZpbGVzIiBtYXkgYmUgYXJlYXMKLSAqIG9mIGV4dGVuZGVkIG1lbW9yeTsgb24gbW9zdCBvdGhlciBzeXN0ZW1zIGl0J3Mgbm90IGFzIGltcG9ydGFudC4KLSAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLQotLyogQnkgZGVmYXVsdCwgd2Ugb3BlbiBpbWFnZSBmaWxlcyB3aXRoIGZvcGVuKC4uLiwicmIiKSBvciBmb3BlbiguLi4sIndiIikuCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzeXN0ZW1zIHRoYXQgZGlzdGluZ3Vpc2ggdGV4dCBmaWxlcyBmcm9tIGJpbmFyeSBmaWxlcywKLSAqIGFuZCBpcyBoYXJtbGVzcyBvbiBtb3N0IHN5c3RlbXMgdGhhdCBkb24ndC4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGUgcmFyZQotICogc3lzdGVtcyB0aGF0IGNvbXBsYWlucyBhYm91dCB0aGUgImIiIHNwZWMsIGRlZmluZSB0aGlzIHN5bWJvbC4KLSAqLwotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBwZXJjZW50LWRvbmUgcHJvZ3Jlc3MgcmVwb3J0cyBmcm9tIGNqcGVnL2RqcGVnLgotICovCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCi0KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcubWFjIGIvbGlianBlZ3R3cnAvamNvbmZpZy5tYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTNlZmUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy5tYWMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBqY29uZmlnLm1hYyAtLS0gamNvbmZpZy5oIGZvciBDb2RlV2FycmlvciBvbiBBcHBsZSBNYWNpbnRvc2ggKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNkZWZpbmUgVVNFX01BQ19NRU1NR1IJCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW1hYy5jICovCi0KLSNkZWZpbmUgQUxJR05fVFlQRSBsb25nCQkvKiBOZWVkZWQgZm9yIDY4MHgwIE1hY3MgKi8KLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVVNFX0NDT01NQU5ECQkvKiBDb21tYW5kIGxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogQmluYXJ5IEkvTyB0aHJ1IHN0ZGluL3N0ZG91dCBkb2Vzbid0IHdvcmsgKi8KLQotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLm1hbnggYi9saWJqcGVndHdycC9qY29uZmlnLm1hbngKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDBkMDAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy5tYW54CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogamNvbmZpZy5tYW54IC0tLSBqY29uZmlnLmggZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgTWFueCBBenRlYyBDIHZlciA1LnguICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KLQotI2RlZmluZSBTSE9SVHhTSE9SVF8zMgkJLyogcHJvZHVjZXMgYmV0dGVyIERDVCBjb2RlIHdpdGggQXp0ZWMgQyAqLwotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQotI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZGVmaW5lIHNpZ25hbF9jYXRjaGVyIF9hYm9ydAkvKiBoYWNrIGZvciBBenRlYyBDIG5hbWluZyByZXF1aXJlbWVudHMgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjb25maWcubWM2IGIvbGlianBlZ3R3cnAvamNvbmZpZy5tYzYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTA4MmQuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy5tYzYKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBqY29uZmlnLm1jNiAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgQyBvbiBNUy1ET1MsIHZlcnNpb24gNi4wMEEgJiB1cC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSNkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMJLyogZm9yIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwgKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtZG9zLmMgKi8KLQotI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLwotCi0jZGVmaW5lIFVTRV9GTUVNCQkvKiBNaWNyb3NvZnQgaGFzIF9mbWVtY3B5KCkgYW5kIF9mbWVtc2V0KCkgKi8KLQotI2RlZmluZSBORUVEX0ZIRUFQTUlOCQkvKiBmYXIgaGVhcCBtYW5hZ2VtZW50IHJvdXRpbmVzIGFyZSBicm9rZW4gKi8KLQotI2RlZmluZSBTSE9SVHhMQ09OU1RfMzIJCS8qIGVuYWJsZSBjb21waWxlci1zcGVjaWZpYyBEQ1Qgb3B0aW1pemF0aW9uICovCi0vKiBOb3RlOiB0aGUgYWJvdmUgZGVmaW5lIGlzIGtub3duIHRvIGltcHJvdmUgdGhlIGNvZGUgd2l0aCBNaWNyb3NvZnQgQyA2LjAwQS4KLSAqIEkgZG8gbm90IGtub3cgd2hldGhlciBpdCBpcyBnb29kIGZvciBsYXRlciBjb21waWxlciB2ZXJzaW9ucy4KLSAqIFBsZWFzZSByZXBvcnQgYW55IGluZm8gb24gdGhpcyBwb2ludCB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0LgotICovCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBNaWNyb3NvZnQgaGFzIHNldG1vZGUoKSAqLwotI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbWRvcy5jICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy5zYXMgYi9saWJqcGVndHdycC9qY29uZmlnLnNhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkYWMyMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLnNhcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGpjb25maWcuc2FzIC0tLSBqY29uZmlnLmggZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgU0FTIEMgNi4wIGFuZCB1cC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNkZWZpbmUgVEVNUF9ESVJFQ1RPUlkgIkpQRUdUTVA6IgkvKiByZWNvbW1lbmRlZCBzZXR0aW5nIGZvciBBbWlnYSAqLwotCi0jZGVmaW5lIE5PX01LVEVNUAkJLyogU0FTIEMgZG9lc24ndCBoYXZlIG1rdGVtcCgpICovCi0KLSNkZWZpbmUgU0hPUlR4U0hPUlRfMzIJCS8qIHByb2R1Y2VzIGJldHRlciBEQ1QgY29kZSB3aXRoIFNBUyBDICovCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0jZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLnN0IGIvbGlianBlZ3R3cnAvamNvbmZpZy5zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMWI3YS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY29uZmlnLnN0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogamNvbmZpZy5zdCAtLS0gamNvbmZpZy5oIGZvciBBdGFyaSBTVC9TVEUvVFQgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHN1cHByZXNzIHVuZGVmaW5lZC1zdHJ1Y3R1cmUgd2FybmluZ3MgKi8KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZGVmaW5lIEFMSUdOX1RZUEUgIGxvbmcJLyogYXBwYXJlbnRseSBkb3VibGUgaXMgYSB3ZWlyZCBzaXplPyAqLwotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAtLSB1bmRlZiBpZiB5b3UgbGlrZSBVbml4IHN0eWxlICovCi0vKiBOb3RlOiBpZiB5b3UgdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUsIHlvdSBtYXkgbmVlZCB0byBkZWZpbmUKLSAqIFVTRV9TRVRNT0RFLiAgU29tZSBBdGFyaSBjb21waWxlcnMgcmVxdWlyZSBpdCwgc29tZSBkbyBub3QuCi0gKi8KLSNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBuZWVkZWQgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamNvbmZpZy52YyBiL2xpYmpwZWd0d3JwL2pjb25maWcudmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjkxYzcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamNvbmZpZy52YworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIGpjb25maWcudmMgLS0tIGpjb25maWcuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgb24gV2luZG93cyA5NSBvciBOVC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCi0KLSNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgotI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCi0vKiAjZGVmaW5lIHZvaWQgY2hhciAqLwotLyogI2RlZmluZSBjb25zdCAqLwotI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiB3ZSBwcmVzdW1lIGEgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLS8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tICovCi0jaWZuZGVmIF9fUlBDTkRSX0hfXwkJLyogZG9uJ3QgY29uZmxpY3QgaWYgcnBjbmRyLmggYWxyZWFkeSByZWFkICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKLSNlbmRpZgotI2RlZmluZSBIQVZFX0JPT0xFQU4JCS8qIHByZXZlbnQgam1vcmVjZmcuaCBmcm9tIHJlZGVmaW5pbmcgaXQgKi8KLQotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLQotI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotCi0jaWZkZWYgSlBFR19DSlBFR19ESlBFRwotCi0jZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotCi0jZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIG9wdGlvbmFsICovCi0jZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBNaWNyb3NvZnQgaGFzIHNldG1vZGUoKSAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLnZtcyBiL2xpYmpwZWd0d3JwL2pjb25maWcudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE2ZmZiLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogamNvbmZpZy52bXMgLS0tIGpjb25maWcuaCBmb3IgdXNlIG9uIERpZ2l0YWwgVk1TLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogTmVlZGVkIG9uIFZNUyAqLwotI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKLSN1bmRlZiBET05UX1VTRV9CX01PREUKLSN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCi0KLSNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qY29uZmlnLndhdCBiL2xpYmpwZWd0d3JwL2pjb25maWcud2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M1NDViLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjb25maWcud2F0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogamNvbmZpZy53YXQgLS0tIGpjb25maWcuaCBmb3IgV2F0Y29tIEMvQysrIG9uIE1TLURPUyBvciBPUy8yLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jZGVmaW5lIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgSEFWRV9TVERERUZfSAotI2RlZmluZSBIQVZFX1NURExJQl9ICi0jdW5kZWYgTkVFRF9CU0RfU1RSSU5HUwotI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKLSN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBXYXRjb20gdXNlcyBmbGF0IDMyLWJpdCBhZGRyZXNzaW5nICovCi0jdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLwotI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTmVlZGVkIHRvIG1ha2Ugb25lLWZpbGUgc3R5bGUgd29yayBpbiBXYXRjb20gKi8KLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLwotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjcGFyYW0uYyBiL2xpYmpwZWd0d3JwL2pjcGFyYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkY2Y2MS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY3BhcmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLyoKLSAqIGpjcGFyYW0uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIG9wdGlvbmFsIGRlZmF1bHQtc2V0dGluZyBjb2RlIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogQXBwbGljYXRpb25zIGRvIG5vdCBoYXZlIHRvIHVzZSB0aGlzIGZpbGUsIGJ1dCB0aG9zZSB0aGF0IGRvbid0IHVzZSBpdAotICogbXVzdCBrbm93IGEgbG90IG1vcmUgYWJvdXQgdGhlIGlubmFyZHMgb2YgdGhlIEpQRUcgY29kZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIFF1YW50aXphdGlvbiB0YWJsZSBzZXR1cCByb3V0aW5lcwotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hZGRfcXVhbnRfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAotCQkgICAgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotLyogRGVmaW5lIGEgcXVhbnRpemF0aW9uIHRhYmxlIGVxdWFsIHRvIHRoZSBiYXNpY190YWJsZSB0aW1lcwotICogYSBzY2FsZSBmYWN0b3IgKGdpdmVuIGFzIGEgcGVyY2VudGFnZSkuCi0gKiBJZiBmb3JjZV9iYXNlbGluZSBpcyBUUlVFLCB0aGUgY29tcHV0ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJpZXMKLSAqIGFyZSBsaW1pdGVkIHRvIDEuLjI1NSBmb3IgSlBFRyBiYXNlbGluZSBjb21wYXRpYmlsaXR5LgotICovCi17Ci0gIEpRVUFOVF9UQkwgKiogcXRibHB0cjsKLSAgaW50IGk7Ci0gIGxvbmcgdGVtcDsKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICBpZiAod2hpY2hfdGJsIDwgMCB8fCB3aGljaF90YmwgPj0gTlVNX1FVQU5UX1RCTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfRFFUX0lOREVYLCB3aGljaF90YmwpOwotCi0gIHF0YmxwdHIgPSAmIGNpbmZvLT5xdWFudF90YmxfcHRyc1t3aGljaF90YmxdOwotCi0gIGlmICgqcXRibHB0ciA9PSBOVUxMKQotICAgICpxdGJscHRyID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICB0ZW1wID0gKChsb25nKSBiYXNpY190YWJsZVtpXSAqIHNjYWxlX2ZhY3RvciArIDUwTCkgLyAxMDBMOwotICAgIC8qIGxpbWl0IHRoZSB2YWx1ZXMgdG8gdGhlIHZhbGlkIHJhbmdlICovCi0gICAgaWYgKHRlbXAgPD0gMEwpIHRlbXAgPSAxTDsKLSAgICBpZiAodGVtcCA+IDMyNzY3TCkgdGVtcCA9IDMyNzY3TDsgLyogbWF4IHF1YW50aXplciBuZWVkZWQgZm9yIDEyIGJpdHMgKi8KLSAgICBpZiAoZm9yY2VfYmFzZWxpbmUgJiYgdGVtcCA+IDI1NUwpCi0gICAgICB0ZW1wID0gMjU1TDsJCS8qIGxpbWl0IHRvIGJhc2VsaW5lIHJhbmdlIGlmIHJlcXVlc3RlZCAqLwotICAgICgqcXRibHB0ciktPnF1YW50dmFsW2ldID0gKFVJTlQxNikgdGVtcDsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgc2VudF90YWJsZSBGQUxTRSBzbyB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLwotICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9saW5lYXJfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBzY2FsZV9mYWN0b3IsCi0JCQkgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKLS8qIFNldCBvciBjaGFuZ2UgdGhlICdxdWFsaXR5JyAocXVhbnRpemF0aW9uKSBzZXR0aW5nLCB1c2luZyBkZWZhdWx0IHRhYmxlcwotICogYW5kIGEgc3RyYWlnaHQgcGVyY2VudGFnZS1zY2FsaW5nIHF1YWxpdHkgc2NhbGUuICBJbiBtb3N0IGNhc2VzIGl0J3MgYmV0dGVyCi0gKiB0byB1c2UganBlZ19zZXRfcXVhbGl0eSAoYmVsb3cpOyB0aGlzIGVudHJ5IHBvaW50IGlzIHByb3ZpZGVkIGZvcgotICogYXBwbGljYXRpb25zIHRoYXQgaW5zaXN0IG9uIGEgbGluZWFyIHBlcmNlbnRhZ2Ugc2NhbGluZy4KLSAqLwotewotICAvKiBUaGVzZSBhcmUgdGhlIHNhbXBsZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIEpQRUcgc3BlYyBzZWN0aW9uIEsuMS4KLSAgICogVGhlIHNwZWMgc2F5cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gcHJvZHVjZSAiZ29vZCIgcXVhbGl0eSwgYW5kCi0gICAqIHdoZW4gZGl2aWRlZCBieSAyLCAidmVyeSBnb29kIiBxdWFsaXR5LgotICAgKi8KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibFtEQ1RTSVpFMl0gPSB7Ci0gICAgMTYsICAxMSwgIDEwLCAgMTYsICAyNCwgIDQwLCAgNTEsICA2MSwKLSAgICAxMiwgIDEyLCAgMTQsICAxOSwgIDI2LCAgNTgsICA2MCwgIDU1LAotICAgIDE0LCAgMTMsICAxNiwgIDI0LCAgNDAsICA1NywgIDY5LCAgNTYsCi0gICAgMTQsICAxNywgIDIyLCAgMjksICA1MSwgIDg3LCAgODAsICA2MiwKLSAgICAxOCwgIDIyLCAgMzcsICA1NiwgIDY4LCAxMDksIDEwMywgIDc3LAotICAgIDI0LCAgMzUsICA1NSwgIDY0LCAgODEsIDEwNCwgMTEzLCAgOTIsCi0gICAgNDksICA2NCwgIDc4LCAgODcsIDEwMywgMTIxLCAxMjAsIDEwMSwKLSAgICA3MiwgIDkyLCAgOTUsICA5OCwgMTEyLCAxMDAsIDEwMywgIDk5Ci0gIH07Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibFtEQ1RTSVpFMl0gPSB7Ci0gICAgMTcsICAxOCwgIDI0LCAgNDcsICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICAxOCwgIDIxLCAgMjYsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDI0LCAgMjYsICA1NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgNDcsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5Ci0gIH07Ci0KLSAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NhbGluZyAqLwotICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMCwgc3RkX2x1bWluYW5jZV9xdWFudF90YmwsCi0JCSAgICAgICBzY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKTsKLSAganBlZ19hZGRfcXVhbnRfdGFibGUoY2luZm8sIDEsIHN0ZF9jaHJvbWluYW5jZV9xdWFudF90YmwsCi0JCSAgICAgICBzY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKTsKLX0KLQotCi1HTE9CQUwoaW50KQotanBlZ19xdWFsaXR5X3NjYWxpbmcgKGludCBxdWFsaXR5KQotLyogQ29udmVydCBhIHVzZXItc3BlY2lmaWVkIHF1YWxpdHkgcmF0aW5nIHRvIGEgcGVyY2VudGFnZSBzY2FsaW5nIGZhY3RvcgotICogZm9yIGFuIHVuZGVybHlpbmcgcXVhbnRpemF0aW9uIHRhYmxlLCB1c2luZyBvdXIgcmVjb21tZW5kZWQgc2NhbGluZyBjdXJ2ZS4KLSAqIFRoZSBpbnB1dCAncXVhbGl0eScgZmFjdG9yIHNob3VsZCBiZSAwICh0ZXJyaWJsZSkgdG8gMTAwICh2ZXJ5IGdvb2QpLgotICovCi17Ci0gIC8qIFNhZmV0eSBsaW1pdCBvbiBxdWFsaXR5IGZhY3Rvci4gIENvbnZlcnQgMCB0byAxIHRvIGF2b2lkIHplcm8gZGl2aWRlLiAqLwotICBpZiAocXVhbGl0eSA8PSAwKSBxdWFsaXR5ID0gMTsKLSAgaWYgKHF1YWxpdHkgPiAxMDApIHF1YWxpdHkgPSAxMDA7Ci0KLSAgLyogVGhlIGJhc2ljIHRhYmxlIGlzIHVzZWQgYXMtaXMgKHNjYWxpbmcgMTAwKSBmb3IgYSBxdWFsaXR5IG9mIDUwLgotICAgKiBRdWFsaXRpZXMgNTAuLjEwMCBhcmUgY29udmVydGVkIHRvIHNjYWxpbmcgcGVyY2VudGFnZSAyMDAgLSAyKlE7Ci0gICAqIG5vdGUgdGhhdCBhdCBRPTEwMCB0aGUgc2NhbGluZyBpcyAwLCB3aGljaCB3aWxsIGNhdXNlIGpwZWdfYWRkX3F1YW50X3RhYmxlCi0gICAqIHRvIG1ha2UgYWxsIHRoZSB0YWJsZSBlbnRyaWVzIDEgKGhlbmNlLCBtaW5pbXVtIHF1YW50aXphdGlvbiBsb3NzKS4KLSAgICogUXVhbGl0aWVzIDEuLjUwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDUwMDAvUS4KLSAgICovCi0gIGlmIChxdWFsaXR5IDwgNTApCi0gICAgcXVhbGl0eSA9IDUwMDAgLyBxdWFsaXR5OwotICBlbHNlCi0gICAgcXVhbGl0eSA9IDIwMCAtIHF1YWxpdHkqMjsKLQotICByZXR1cm4gcXVhbGl0eTsKLX0KLQotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2V0X3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgcXVhbGl0eSwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKLS8qIFNldCBvciBjaGFuZ2UgdGhlICdxdWFsaXR5JyAocXVhbnRpemF0aW9uKSBzZXR0aW5nLCB1c2luZyBkZWZhdWx0IHRhYmxlcy4KLSAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHF1YWxpdHktYWRqdXN0aW5nIGVudHJ5IHBvaW50IGZvciB0eXBpY2FsIHVzZXIKLSAqIGludGVyZmFjZXM7IG9ubHkgdGhvc2Ugd2hvIHdhbnQgZGV0YWlsZWQgY29udHJvbCBvdmVyIHF1YW50aXphdGlvbiB0YWJsZXMKLSAqIHdvdWxkIHVzZSB0aGUgcHJlY2VkaW5nIHRocmVlIHJvdXRpbmVzIGRpcmVjdGx5LgotICovCi17Ci0gIC8qIENvbnZlcnQgdXNlciAwLTEwMCByYXRpbmcgdG8gcGVyY2VudGFnZSBzY2FsaW5nICovCi0gIHF1YWxpdHkgPSBqcGVnX3F1YWxpdHlfc2NhbGluZyhxdWFsaXR5KTsKLQotICAvKiBTZXQgdXAgc3RhbmRhcmQgcXVhbGl0eSB0YWJsZXMgKi8KLSAganBlZ19zZXRfbGluZWFyX3F1YWxpdHkoY2luZm8sIHF1YWxpdHksIGZvcmNlX2Jhc2VsaW5lKTsKLX0KLQotCi0vKgotICogSHVmZm1hbiB0YWJsZSBzZXR1cCByb3V0aW5lcwotICovCi0KLUxPQ0FMKHZvaWQpCi1hZGRfaHVmZl90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCUpIVUZGX1RCTCAqKmh0YmxwdHIsIGNvbnN0IFVJTlQ4ICpiaXRzLCBjb25zdCBVSU5UOCAqdmFsKQotLyogRGVmaW5lIGEgSHVmZm1hbiB0YWJsZSAqLwotewotICBpbnQgbnN5bWJvbHMsIGxlbjsKLQotICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLSAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogQ29weSB0aGUgbnVtYmVyLW9mLXN5bWJvbHMtb2YtZWFjaC1jb2RlLWxlbmd0aCBjb3VudHMgKi8KLSAgTUVNQ09QWSgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBTSVpFT0YoKCpodGJscHRyKS0+Yml0cykpOwotCi0gIC8qIFZhbGlkYXRlIHRoZSBjb3VudHMuICBXZSBkbyB0aGlzIGhlcmUgbWFpbmx5IHNvIHdlIGNhbiBjb3B5IHRoZSByaWdodAotICAgKiBudW1iZXIgb2Ygc3ltYm9scyBmcm9tIHRoZSB2YWxbXSBhcnJheSwgd2l0aG91dCByaXNraW5nIG1hcmNoaW5nIG9mZgotICAgKiB0aGUgZW5kIG9mIG1lbW9yeS4gIGpjaHVmZi5jIHdpbGwgZG8gYSBtb3JlIHRob3JvdWdoIHRlc3QgbGF0ZXIuCi0gICAqLwotICBuc3ltYm9scyA9IDA7Ci0gIGZvciAobGVuID0gMTsgbGVuIDw9IDE2OyBsZW4rKykKLSAgICBuc3ltYm9scyArPSBiaXRzW2xlbl07Ci0gIGlmIChuc3ltYm9scyA8IDEgfHwgbnN5bWJvbHMgPiAyNTYpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0KLSAgTUVNQ09QWSgoKmh0YmxwdHIpLT5odWZmdmFsLCB2YWwsIG5zeW1ib2xzICogU0laRU9GKFVJTlQ4KSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCi0gICgqaHRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKLX0KLQotCi1MT0NBTCh2b2lkKQotc3RkX2h1ZmZfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNldCB1cCB0aGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgKGNmLiBKUEVHIHN0YW5kYXJkIHNlY3Rpb24gSy4zKSAqLwotLyogSU1QT1JUQU5UOiB0aGVzZSBhcmUgb25seSB2YWxpZCBmb3IgOC1iaXQgZGF0YSBwcmVjaXNpb24hICovCi17Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2RjX2x1bWluYW5jZVsxN10gPQotICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9kY19sdW1pbmFuY2VbXSA9Ci0gICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKLSAgCi0gIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2RjX2Nocm9taW5hbmNlWzE3XSA9Ci0gICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCB9OwotICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2Nocm9taW5hbmNlW10gPQotICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07Ci0gIAotICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19hY19sdW1pbmFuY2VbMTddID0KLSAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdkIH07Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfbHVtaW5hbmNlW10gPQotICAgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwKLSAgICAgIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCi0gICAgICAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLCAweDA4LAotICAgICAgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKLSAgICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsCi0gICAgICAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LAotICAgICAgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCi0gICAgICAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LAotICAgICAgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwKLSAgICAgIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksCi0gICAgICAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LAotICAgICAgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKLSAgICAgIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCi0gICAgICAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAotICAgICAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwKLSAgICAgIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsCi0gICAgICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAotICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwKLSAgICAgIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCi0gICAgICAweGY5LCAweGZhIH07Ci0gIAotICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19hY19jaHJvbWluYW5jZVsxN10gPQotICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDIsIDQsIDQsIDMsIDQsIDcsIDUsIDQsIDQsIDAsIDEsIDIsIDB4NzcgfTsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19jaHJvbWluYW5jZVtdID0KLSAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsCi0gICAgICAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAotICAgICAgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKLSAgICAgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsCi0gICAgICAweDE1LCAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LAotICAgICAgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNiwKLSAgICAgIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCi0gICAgICAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAotICAgICAgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwKLSAgICAgIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCi0gICAgICAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgMHg3OSwgMHg3YSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKLSAgICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCi0gICAgICAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAotICAgICAgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwKLSAgICAgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsCi0gICAgICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLAotICAgICAgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwKLSAgICAgIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksCi0gICAgICAweGVhLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAotICAgICAgMHhmOSwgMHhmYSB9OwotICAKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1swXSwKLQkJIGJpdHNfZGNfbHVtaW5hbmNlLCB2YWxfZGNfbHVtaW5hbmNlKTsKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1swXSwKLQkJIGJpdHNfYWNfbHVtaW5hbmNlLCB2YWxfYWNfbHVtaW5hbmNlKTsKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1sxXSwKLQkJIGJpdHNfZGNfY2hyb21pbmFuY2UsIHZhbF9kY19jaHJvbWluYW5jZSk7Ci0gIGFkZF9odWZmX3RhYmxlKGNpbmZvLCAmY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbMV0sCi0JCSBiaXRzX2FjX2Nocm9taW5hbmNlLCB2YWxfYWNfY2hyb21pbmFuY2UpOwotfQotCi0KLS8qCi0gKiBEZWZhdWx0IHBhcmFtZXRlciBzZXR1cCBmb3IgY29tcHJlc3Npb24uCi0gKgotICogQXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgY2hvb3NlIHRvIHVzZSB0aGlzIHJvdXRpbmUgbXVzdCBkbyB0aGVpcgotICogb3duIHNldHVwIG9mIGFsbCB0aGVzZSBwYXJhbWV0ZXJzLiAgQWx0ZXJuYXRlbHksIHlvdSBjYW4gY2FsbCB0aGlzCi0gKiB0byBlc3RhYmxpc2ggZGVmYXVsdHMgYW5kIHRoZW4gYWx0ZXIgcGFyYW1ldGVycyBzZWxlY3RpdmVseS4gIFRoaXMKLSAqIGlzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaCBzaW5jZSwgaWYgd2UgYWRkIGFueSBuZXcgcGFyYW1ldGVycywKLSAqIHlvdXIgY29kZSB3aWxsIHN0aWxsIHdvcmsgKHRoZXknbGwgYmUgc2V0IHRvIHJlYXNvbmFibGUgZGVmYXVsdHMpLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfZGVmYXVsdHMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgaTsKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiBBbGxvY2F0ZSBjb21wX2luZm8gYXJyYXkgbGFyZ2UgZW5vdWdoIGZvciBtYXhpbXVtIGNvbXBvbmVudCBjb3VudC4KLSAgICogQXJyYXkgaXMgbWFkZSBwZXJtYW5lbnQgaW4gY2FzZSBhcHBsaWNhdGlvbiB3YW50cyB0byBjb21wcmVzcwotICAgKiBtdWx0aXBsZSBpbWFnZXMgYXQgc2FtZSBwYXJhbSBzZXR0aW5ncy4KLSAgICovCi0gIGlmIChjaW5mby0+Y29tcF9pbmZvID09IE5VTEwpCi0gICAgY2luZm8tPmNvbXBfaW5mbyA9IChqcGVnX2NvbXBvbmVudF9pbmZvICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCQkgIE1BWF9DT01QT05FTlRTICogU0laRU9GKGpwZWdfY29tcG9uZW50X2luZm8pKTsKLQotICAvKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcgbm90IGRlcGVuZGVudCBvbiB0aGUgY29sb3Igc3BhY2UgKi8KLQotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSBCSVRTX0lOX0pTQU1QTEU7Ci0gIC8qIFNldCB1cCB0d28gcXVhbnRpemF0aW9uIHRhYmxlcyB1c2luZyBkZWZhdWx0IHF1YWxpdHkgb2YgNzUgKi8KLSAganBlZ19zZXRfcXVhbGl0eShjaW5mbywgNzUsIFRSVUUpOwotICAvKiBTZXQgdXAgdHdvIEh1ZmZtYW4gdGFibGVzICovCi0gIHN0ZF9odWZmX3RhYmxlcyhjaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0IGFyaXRobWV0aWMgY29kaW5nIGNvbmRpdGlvbmluZyAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5hcml0aF9kY19MW2ldID0gMDsKLSAgICBjaW5mby0+YXJpdGhfZGNfVVtpXSA9IDE7Ci0gICAgY2luZm8tPmFyaXRoX2FjX0tbaV0gPSA1OwotICB9Ci0KLSAgLyogRGVmYXVsdCBpcyBubyBtdWx0aXBsZS1zY2FuIG91dHB1dCAqLwotICBjaW5mby0+c2Nhbl9pbmZvID0gTlVMTDsKLSAgY2luZm8tPm51bV9zY2FucyA9IDA7Ci0KLSAgLyogRXhwZWN0IG5vcm1hbCBzb3VyY2UgaW1hZ2UsIG5vdCByYXcgZG93bnNhbXBsZWQgZGF0YSAqLwotICBjaW5mby0+cmF3X2RhdGFfaW4gPSBGQUxTRTsKLQotICAvKiBVc2UgSHVmZm1hbiBjb2RpbmcsIG5vdCBhcml0aG1ldGljIGNvZGluZywgYnkgZGVmYXVsdCAqLwotICBjaW5mby0+YXJpdGhfY29kZSA9IEZBTFNFOwotCi0gIC8qIEJ5IGRlZmF1bHQsIGRvbid0IGRvIGV4dHJhIHBhc3NlcyB0byBvcHRpbWl6ZSBlbnRyb3B5IGNvZGluZyAqLwotICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gRkFMU0U7Ci0gIC8qIFRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyBhcmUgb25seSB2YWxpZCBmb3IgOC1iaXQgZGF0YSBwcmVjaXNpb24uCi0gICAqIElmIHRoZSBwcmVjaXNpb24gaXMgaGlnaGVyLCBmb3JjZSBvcHRpbWl6YXRpb24gb24gc28gdGhhdCB1c2FibGUKLSAgICogdGFibGVzIHdpbGwgYmUgY29tcHV0ZWQuICBUaGlzIHRlc3QgY2FuIGJlIHJlbW92ZWQgaWYgZGVmYXVsdCB0YWJsZXMKLSAgICogYXJlIHN1cHBsaWVkIHRoYXQgYXJlIHZhbGlkIGZvciB0aGUgZGVzaXJlZCBwcmVjaXNpb24uCi0gICAqLwotICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uID4gOCkKLSAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsKLQotICAvKiBCeSBkZWZhdWx0LCB1c2UgdGhlIHNpbXBsZXIgbm9uLWNvc2l0ZWQgc2FtcGxpbmcgYWxpZ25tZW50ICovCi0gIGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nID0gRkFMU0U7Ci0KLSAgLyogTm8gaW5wdXQgc21vb3RoaW5nICovCi0gIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yID0gMDsKLQotICAvKiBEQ1QgYWxnb3JpdGhtIHByZWZlcmVuY2UgKi8KLSAgY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0RFRkFVTFQ7Ci0KLSAgLyogTm8gcmVzdGFydCBtYXJrZXJzICovCi0gIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gMDsKLSAgY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7Ci0KLSAgLyogRmlsbCBpbiBkZWZhdWx0IEpGSUYgbWFya2VyIHBhcmFtZXRlcnMuICBOb3RlIHRoYXQgd2hldGhlciB0aGUgbWFya2VyCi0gICAqIHdpbGwgYWN0dWFsbHkgYmUgd3JpdHRlbiBpcyBkZXRlcm1pbmVkIGJ5IGpwZWdfc2V0X2NvbG9yc3BhY2UuCi0gICAqCi0gICAqIEJ5IGRlZmF1bHQsIHRoZSBsaWJyYXJ5IGVtaXRzIEpGSUYgdmVyc2lvbiBjb2RlIDEuMDEuCi0gICAqIEFuIGFwcGxpY2F0aW9uIHRoYXQgd2FudHMgdG8gZW1pdCBKRklGIDEuMDIgZXh0ZW5zaW9uIG1hcmtlcnMgc2hvdWxkIHNldAotICAgKiBKRklGX21pbm9yX3ZlcnNpb24gdG8gMi4gIFdlIGNvdWxkIHByb2JhYmx5IGdldCBhd2F5IHdpdGgganVzdCBkZWZhdWx0aW5nCi0gICAqIHRvIDEuMDIsIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgc29tZSBkZWNvZGVycyBpbiB1c2UgdGhhdCB3aWxsIGNvbXBsYWluCi0gICAqIGFib3V0IHRoYXQ7IHNheWluZyAxLjAxIHNob3VsZCBtaW5pbWl6ZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotICAgKi8KLSAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IDE7IC8qIERlZmF1bHQgSkZJRiB2ZXJzaW9uID0gMS4wMSAqLwotICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gMTsKLSAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IDA7CS8qIFBpeGVsIHNpemUgaXMgdW5rbm93biBieSBkZWZhdWx0ICovCi0gIGNpbmZvLT5YX2RlbnNpdHkgPSAxOwkJLyogUGl4ZWwgYXNwZWN0IHJhdGlvIGlzIHNxdWFyZSBieSBkZWZhdWx0ICovCi0gIGNpbmZvLT5ZX2RlbnNpdHkgPSAxOwotCi0gIC8qIENob29zZSBKUEVHIGNvbG9yc3BhY2UgYmFzZWQgb24gaW5wdXQgc3BhY2UsIHNldCBkZWZhdWx0cyBhY2NvcmRpbmdseSAqLwotCi0gIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlKGNpbmZvKTsKLX0KLQotCi0vKgotICogU2VsZWN0IGFuIGFwcHJvcHJpYXRlIEpQRUcgY29sb3JzcGFjZSBmb3IgaW5fY29sb3Jfc3BhY2UuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2RlZmF1bHRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19ZQ2JDcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19ZQ2JDcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX0NNWUs6Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX0NNWUspOyAvKiBCeSBkZWZhdWx0LCBubyB0cmFuc2xhdGlvbiAqLwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ0NLOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19ZQ0NLKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfVU5LTk9XTjoKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfVU5LTk9XTik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gIH0KLX0KLQotCi0vKgotICogU2V0IHRoZSBKUEVHIGNvbG9yc3BhY2UsIGFuZCBjaG9vc2UgY29sb3JzcGFjZS1kZXBlbmRlbnQgZGVmYXVsdCB2YWx1ZXMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKQotewotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgaW50IGNpOwotCi0jZGVmaW5lIFNFVF9DT01QKGluZGV4LGlkLGhzYW1wLHZzYW1wLHF1YW50LGRjdGJsLGFjdGJsKSAgXAotICAoY29tcHB0ciA9ICZjaW5mby0+Y29tcF9pbmZvW2luZGV4XSwgXAotICAgY29tcHB0ci0+Y29tcG9uZW50X2lkID0gKGlkKSwgXAotICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IChoc2FtcCksIFwKLSAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPSAodnNhbXApLCBcCi0gICBjb21wcHRyLT5xdWFudF90Ymxfbm8gPSAocXVhbnQpLCBcCi0gICBjb21wcHRyLT5kY190Ymxfbm8gPSAoZGN0YmwpLCBcCi0gICBjb21wcHRyLT5hY190Ymxfbm8gPSAoYWN0YmwpICkKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiBGb3IgYWxsIGNvbG9yc3BhY2VzLCB3ZSB1c2UgUSBhbmQgSHVmZiB0YWJsZXMgMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMsCi0gICAqIHRhYmxlcyAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLgotICAgKi8KLQotICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IGNvbG9yc3BhY2U7Ci0KLSAgY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gRkFMU0U7IC8qIE5vIG1hcmtlciBmb3Igbm9uLUpGSUYgY29sb3JzcGFjZXMgKi8KLSAgY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlciA9IEZBTFNFOyAvKiB3cml0ZSBubyBBZG9iZSBtYXJrZXIgYnkgZGVmYXVsdCAqLwotCi0gIHN3aXRjaCAoY29sb3JzcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gVFJVRTsgLyogV3JpdGUgYSBKRklGIG1hcmtlciAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDE7Ci0gICAgLyogSkZJRiBzcGVjaWZpZXMgY29tcG9uZW50IElEIDEgKi8KLSAgICBTRVRfQ09NUCgwLCAxLCAxLDEsIDAsIDAsMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1JHQjoKLSAgICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gVFJVRTsgLyogd3JpdGUgQWRvYmUgbWFya2VyIHRvIGZsYWcgUkdCICovCi0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKLSAgICBTRVRfQ09NUCgwLCAweDUyIC8qICdSJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDEsIDB4NDcgLyogJ0cnICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMiwgMHg0MiAvKiAnQicgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gVFJVRTsgLyogV3JpdGUgYSBKRklGIG1hcmtlciAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDM7Ci0gICAgLyogSkZJRiBzcGVjaWZpZXMgY29tcG9uZW50IElEcyAxLDIsMyAqLwotICAgIC8qIFdlIGRlZmF1bHQgdG8gMngyIHN1YnNhbXBsZXMgb2YgY2hyb21pbmFuY2UgKi8KLSAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOwotICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gVFJVRTsgLyogd3JpdGUgQWRvYmUgbWFya2VyIHRvIGZsYWcgQ01ZSyAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDQ7Ci0gICAgU0VUX0NPTVAoMCwgMHg0MyAvKiAnQycgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgxLCAweDREIC8qICdNJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDIsIDB4NTkgLyogJ1knICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMywgMHg0QiAvKiAnSycgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gVFJVRTsgLyogd3JpdGUgQWRvYmUgbWFya2VyIHRvIGZsYWcgWUNDSyAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDQ7Ci0gICAgU0VUX0NPTVAoMCwgMSwgMiwyLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDEsIDIsIDEsMSwgMSwgMSwxKTsKLSAgICBTRVRfQ09NUCgyLCAzLCAxLDEsIDEsIDEsMSk7Ci0gICAgU0VUX0NPTVAoMywgNCwgMiwyLCAwLCAwLDApOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19VTktOT1dOOgotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOwotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICAgIE1BWF9DT01QT05FTlRTKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIFNFVF9DT01QKGNpLCBjaSwgMSwxLCAwLCAwLDApOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0KLUxPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCi1maWxsX2Ffc2NhbiAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgY2ksCi0JICAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCi0vKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBzcGVjaWZpZWQgY29tcG9uZW50ICovCi17Ci0gIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSAxOwotICBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbMF0gPSBjaTsKLSAgc2NhbnB0ci0+U3MgPSBTczsKLSAgc2NhbnB0ci0+U2UgPSBTZTsKLSAgc2NhbnB0ci0+QWggPSBBaDsKLSAgc2NhbnB0ci0+QWwgPSBBbDsKLSAgc2NhbnB0cisrOwotICByZXR1cm4gc2NhbnB0cjsKLX0KLQotTE9DQUwoanBlZ19zY2FuX2luZm8gKikKLWZpbGxfc2NhbnMgKGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciwgaW50IG5jb21wcywKLQkgICAgaW50IFNzLCBpbnQgU2UsIGludCBBaCwgaW50IEFsKQotLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBvbmUgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLXsKLSAgaW50IGNpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgewotICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSAxOwotICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOwotICAgIHNjYW5wdHItPlNzID0gU3M7Ci0gICAgc2NhbnB0ci0+U2UgPSBTZTsKLSAgICBzY2FucHRyLT5BaCA9IEFoOwotICAgIHNjYW5wdHItPkFsID0gQWw7Ci0gICAgc2NhbnB0cisrOwotICB9Ci0gIHJldHVybiBzY2FucHRyOwotfQotCi1MT0NBTChqcGVnX3NjYW5faW5mbyAqKQotZmlsbF9kY19zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLCBpbnQgQWgsIGludCBBbCkKLS8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgaW50ZXJsZWF2ZWQgREMgc2NhbiBpZiBwb3NzaWJsZSwgZWxzZSBOIHNjYW5zICovCi17Ci0gIGludCBjaTsKLQotICBpZiAobmNvbXBzIDw9IE1BWF9DT01QU19JTl9TQ0FOKSB7Ci0gICAgLyogU2luZ2xlIGludGVybGVhdmVkIERDIHNjYW4gKi8KLSAgICBzY2FucHRyLT5jb21wc19pbl9zY2FuID0gbmNvbXBzOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykKLSAgICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV0gPSBjaTsKLSAgICBzY2FucHRyLT5TcyA9IHNjYW5wdHItPlNlID0gMDsKLSAgICBzY2FucHRyLT5BaCA9IEFoOwotICAgIHNjYW5wdHItPkFsID0gQWw7Ci0gICAgc2NhbnB0cisrOwotICB9IGVsc2UgewotICAgIC8qIE5vbmludGVybGVhdmVkIERDIHNjYW4gZm9yIGVhY2ggY29tcG9uZW50ICovCi0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAwLCBBaCwgQWwpOwotICB9Ci0gIHJldHVybiBzY2FucHRyOwotfQotCi0KLS8qCi0gKiBDcmVhdGUgYSByZWNvbW1lbmRlZCBwcm9ncmVzc2l2ZS1KUEVHIHNjcmlwdC4KLSAqIGNpbmZvLT5udW1fY29tcG9uZW50cyBhbmQgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgbXVzdCBiZSBjb3JyZWN0LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgbmNvbXBzID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICBpbnQgbnNjYW5zOwotICBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7Ci0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgLyogRmlndXJlIHNwYWNlIG5lZWRlZCBmb3Igc2NyaXB0LiAgQ2FsY3VsYXRpb24gbXVzdCBtYXRjaCBjb2RlIGJlbG93ISAqLwotICBpZiAobmNvbXBzID09IDMgJiYgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgLyogQ3VzdG9tIHNjcmlwdCBmb3IgWUNiQ3IgY29sb3IgaW1hZ2VzLiAqLwotICAgIG5zY2FucyA9IDEwOwotICB9IGVsc2UgewotICAgIC8qIEFsbC1wdXJwb3NlIHNjcmlwdCBmb3Igb3RoZXIgY29sb3Igc3BhY2VzLiAqLwotICAgIGlmIChuY29tcHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIG5zY2FucyA9IDYgKiBuY29tcHM7CS8qIDIgREMgKyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KLSAgICBlbHNlCi0gICAgICBuc2NhbnMgPSAyICsgNCAqIG5jb21wczsJLyogMiBEQyBzY2FuczsgNCBBQyBzY2FucyBwZXIgY29tcG9uZW50ICovCi0gIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc2NyaXB0LgotICAgKiBXZSBuZWVkIHRvIHB1dCBpdCBpbiB0aGUgcGVybWFuZW50IHBvb2wgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcGVyZm9ybXMKLSAgICogbXVsdGlwbGUgY29tcHJlc3Npb25zIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNldHRpbmdzLiAgVG8gYXZvaWQgYSBtZW1vcnkKLSAgICogbGVhayBpZiBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBpcyBjYWxsZWQgcmVwZWF0ZWRseSBmb3IgdGhlIHNhbWUgSlBFRwotICAgKiBvYmplY3QsIHdlIHRyeSB0byByZS11c2UgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3BhY2UsIGFuZCB3ZSBhbGxvY2F0ZQotICAgKiBlbm91Z2ggc3BhY2UgdG8gaGFuZGxlIFlDYkNyIGV2ZW4gaWYgaW5pdGlhbGx5IGFza2VkIGZvciBncmF5c2NhbGUuCi0gICAqLwotICBpZiAoY2luZm8tPnNjcmlwdF9zcGFjZSA9PSBOVUxMIHx8IGNpbmZvLT5zY3JpcHRfc3BhY2Vfc2l6ZSA8IG5zY2FucykgewotICAgIGNpbmZvLT5zY3JpcHRfc3BhY2Vfc2l6ZSA9IE1BWChuc2NhbnMsIDEwKTsKLSAgICBjaW5mby0+c2NyaXB0X3NwYWNlID0gKGpwZWdfc2Nhbl9pbmZvICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCWNpbmZvLT5zY3JpcHRfc3BhY2Vfc2l6ZSAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOwotICB9Ci0gIHNjYW5wdHIgPSBjaW5mby0+c2NyaXB0X3NwYWNlOwotICBjaW5mby0+c2Nhbl9pbmZvID0gc2NhbnB0cjsKLSAgY2luZm8tPm51bV9zY2FucyA9IG5zY2FuczsKLQotICBpZiAobmNvbXBzID09IDMgJiYgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgLyogQ3VzdG9tIHNjcmlwdCBmb3IgWUNiQ3IgY29sb3IgaW1hZ2VzLiAqLwotICAgIC8qIEluaXRpYWwgREMgc2NhbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7Ci0gICAgLyogSW5pdGlhbCBBQyBzY2FuOiBnZXQgc29tZSBsdW1hIGRhdGEgb3V0IGluIGEgaHVycnkgKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMCwgMSwgNSwgMCwgMik7Ci0gICAgLyogQ2hyb21hIGRhdGEgaXMgdG9vIHNtYWxsIHRvIGJlIHdvcnRoIGV4cGVuZGluZyBtYW55IHNjYW5zIG9uICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDIsIDEsIDYzLCAwLCAxKTsKLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMSwgMSwgNjMsIDAsIDEpOwotICAgIC8qIENvbXBsZXRlIHNwZWN0cmFsIHNlbGVjdGlvbiBmb3IgbHVtYSBBQyAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCA2LCA2MywgMCwgMik7Ci0gICAgLyogUmVmaW5lIG5leHQgYml0IG9mIGx1bWEgQUMgKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMCwgMSwgNjMsIDIsIDEpOwotICAgIC8qIEZpbmlzaCBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDApOwotICAgIC8qIEZpbmlzaCBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDEsIDApOwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMSwgMCk7Ci0gICAgLyogTHVtYSBib3R0b20gYml0IGNvbWVzIGxhc3Qgc2luY2UgaXQncyB1c3VhbGx5IGxhcmdlc3Qgc2NhbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMSwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCi0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIGZpcnN0IHBhc3MgKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDEpOwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgNSwgMCwgMik7Ci0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCA2LCA2MywgMCwgMik7Ci0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHNlY29uZCBwYXNzICovCi0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMiwgMSk7Ci0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIGZpbmFsIHBhc3MgKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDApOwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgNjMsIDEsIDApOwotICB9Ci0jaWZkZWYgTkVFRFNfQVJNX0VSUkFUQV83NTQzMTlfNzU0MzIwCi0gIGFzbSB2b2xhdGlsZSAoICJ2bW92IHMwLHMwXG4iICk7Ci0jZW5kaWYKLQotfQotCi0jZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjcGh1ZmYuYyBiL2xpYmpwZWd0d3JwL2pjcGh1ZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmOTE3OC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY3BodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotLyoKLSAqIGpjcGh1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KLSAqCi0gKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKLSAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKLSAqIHN1c3BlbnNpb24uCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCi0KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotCi0vKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLwotICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOwotCi0gIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgotICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgotICAgKi8KLSAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLwotICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLwotICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCi0KLSAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLwotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi0KLSAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLwotICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLwotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCi0gIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KLSAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KLSAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLwotCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLwotICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KLSAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKLSAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KLSAgICovCi0gIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCi0gIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOwotfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7Ci0KLXR5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7Ci0KLS8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0Ci0gKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAotICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCi0gKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KLSAqLwotCi0jZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLwotCi0vKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KLSAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKLSAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgotICovCi0KLSNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOwotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAotCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKLQkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCi0JIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQotI2Vsc2UKLSNkZWZpbmUgSVNISUZUX1RFTVBTCi0jZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCi17ICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGJvb2xlYW4gaXNfRENfYmFuZDsKLSAgaW50IGNpLCB0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGVudHJvcHktPmNpbmZvID0gY2luZm87Ci0gIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7Ci0KLSAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7Ci0KLSAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KLQotICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCi0gIGlmIChjaW5mby0+QWggPT0gMCkgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OwotICAgIGVsc2UKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7Ci0gICAgZWxzZSB7Ci0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOwotICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLwotICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKLQllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7Ci0gICAgfQotICB9Ci0gIGlmIChnYXRoZXJfc3RhdGlzdGljcykKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7Ci0gIGVsc2UKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKLQotICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQotICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgotICAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gICAgLyogR2V0IHRhYmxlIGluZGV4ICovCi0gICAgaWYgKGlzX0RDX2JhbmQpIHsKLSAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLwotCWNvbnRpbnVlOwotICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgfQotICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgewotICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KLSAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLwotICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCi0gICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7Ci0gICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KLSAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKLQllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KLSAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCi0gICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAotCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7Ci0gICAgfQotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLwotICBlbnRyb3B5LT5FT0JSVU4gPSAwOwotICBlbnRyb3B5LT5CRSA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCi0gIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOwotICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOwotfQotCi0KLS8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCi0gKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCi0gKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KLSAqLwotCi0vKiBFbWl0IGEgYnl0ZSAqLwotI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCi0JeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKLQkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKLQkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KLQotCi1MT0NBTCh2b2lkKQotZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCi0vKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KLXsKLSAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OwotCi0gIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKLSAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0gIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci19Ci0KLQotLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCi0KLS8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCi0gKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKLSAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgotICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KLSAqLwotCi1JTkxJTkUKLUxPQ0FMKHZvaWQpCi1lbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKLS8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCi17Ci0gIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCi0gIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7Ci0gIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOwotCi0gIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCi0gIGlmIChzaXplID09IDApCi0gICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7Ci0KLSAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQotICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLwotCi0gIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KLSAgCi0gIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCi0gIAotICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCi0KLSAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCi0KLSAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKLSAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKLSAgICAKLSAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7Ci0gICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KLSAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKLSAgICB9Ci0gICAgcHV0X2J1ZmZlciA8PD0gODsKLSAgICBwdXRfYml0cyAtPSA4OwotICB9Ci0KLSAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KLSAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKLX0KLQotCi1MT0NBTCh2b2lkKQotZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKLXsKLSAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCi0gIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KLSAgZW50cm9weS0+cHV0X2JpdHMgPSAwOwotfQotCi0KLS8qCi0gKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgotICovCi0KLUlOTElORQotTE9DQUwodm9pZCkKLWVtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQotewotICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKLSAgZWxzZSB7Ci0gICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOwotICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKLSAgfQotfQotCi0KLS8qCi0gKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KLSAqLwotCi1MT0NBTCh2b2lkKQotZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCi0JCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCi17Ci0gIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKLSAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCi0KLSAgd2hpbGUgKG5iaXRzID4gMCkgewotICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7Ci0gICAgYnVmc3RhcnQrKzsKLSAgICBuYml0cy0tOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KLSAqLwotCi1MT0NBTCh2b2lkKQotZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKLQotICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KLSAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOwotICAgIG5iaXRzID0gMDsKLSAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQotICAgICAgbmJpdHMrKzsKLSAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KLSAgICBpZiAobmJpdHMgPiAxNCkKLSAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOwotCi0gICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKLSAgICBpZiAobmJpdHMpCi0gICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7Ci0KLSAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOwotCi0gICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCi0gICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKLSAgICBlbnRyb3B5LT5CRSA9IDA7Ci0gIH0KLX0KLQotCi0vKgotICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCi17Ci0gIGludCBjaTsKLQotICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLQotICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgewotICAgIGZsdXNoX2JpdHMoZW50cm9weSk7Ci0gICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOwotICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7Ci0gIH0KLQotICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKLSAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKLSAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLwotICAgIGVudHJvcHktPkVPQlJVTiA9IDA7Ci0gICAgZW50cm9weS0+QkUgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAotICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgaW50IGJsa24sIGNpOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIElTSElGVF9URU1QUwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCi0gICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KLSAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgotICAgICAqLwotICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKLQotICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCi0gICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOwotICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOwotCi0gICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KLSAgICB0ZW1wMiA9IHRlbXA7Ci0gICAgaWYgKHRlbXAgPCAwKSB7Ci0gICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLwotICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCi0gICAgICB0ZW1wMi0tOwotICAgIH0KLSAgICAKLSAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgbmJpdHMgPSAwOwotICAgIHdoaWxlICh0ZW1wKSB7Ci0gICAgICBuYml0cysrOwotICAgICAgdGVtcCA+Pj0gMTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCi0gICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KLSAgICAgKi8KLSAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0gICAgCi0gICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOwotICAgIAotICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLwotICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLwotICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLwotICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7Ci0gIH0KLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOwotICByZWdpc3RlciBpbnQgbmJpdHM7Ci0gIHJlZ2lzdGVyIGludCByLCBrOwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgSkJMT0NLUk9XIGJsb2NrOwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KLSAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLQotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLwotICAKLSAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KLSAgIAotICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKLSAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQotICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCi0gICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCi0gICAgICovCi0gICAgaWYgKHRlbXAgPCAwKSB7Ci0gICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCi0gICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLwotICAgICAgdGVtcDIgPSB+dGVtcDsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCi0gICAgICB0ZW1wMiA9IHRlbXA7Ci0gICAgfQotICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLwotICAgIGlmICh0ZW1wID09IDApIHsKLSAgICAgIHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCi0gICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCi0gICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCi0gICAgd2hpbGUgKHIgPiAxNSkgewotICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKLSAgICAgIHIgLT0gMTY7Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLwotICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCi0gICAgICBuYml0cysrOwotICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCi0gICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLQotICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLwotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7Ci0KLSAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKLQotICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLwotICB9Ci0KLSAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KLSAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLwotICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKLSAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBpbnQgYmxrbjsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCi0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotCi0gICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCi0gICAgdGVtcCA9ICgqYmxvY2spWzBdOwotICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGludCByLCBrOwotICBpbnQgRU9COwotICBjaGFyICpCUl9idWZmZXI7Ci0gIHVuc2lnbmVkIGludCBCUjsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCi0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLwotICBibG9jayA9IE1DVV9kYXRhWzBdOwotCi0gIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKLSAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCi0gICAqLwotICBFT0IgPSAwOwotICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOwotICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcwotICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5Ci0gICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpZiAodGVtcCA8IDApCi0gICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLwotICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KLSAgICBpZiAodGVtcCA9PSAxKQotICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLwotICB9Ci0KLSAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCi0gIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCi0KLSAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCi0gICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgewotICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwotICAgICAgLyogRW1pdCBaUkwgKi8KLSAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7Ci0gICAgICByIC09IDE2OwotICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KLSAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKLSAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCi0gICAgICBCUiA9IDA7Ci0gICAgfQotCi0gICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgotICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKLSAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCi0gICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCi0gICAgICovCi0gICAgaWYgKHRlbXAgPiAxKSB7Ci0gICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KLSAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KLSAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLQotICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLwotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKLQotICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCi0gICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7Ci0KLSAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLwotICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKLSAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLwotICAgIEJSID0gMDsKLSAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KLSAgfQotCi0gIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KLSAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLwotICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCi0gICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6Ci0gICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOwotICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KLSAgICAgKi8KLSAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gIH0KLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLwotICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgZmx1c2hfYml0cyhlbnRyb3B5KTsKLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBib29sZWFuIGlzX0RDX2JhbmQ7Ci0gIGludCBjaSwgdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSkhVRkZfVEJMICoqaHRibHB0cjsKLSAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLwotICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLQotICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKLQotICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQotICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCi0gICAqLwotICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBpZiAoaXNfRENfYmFuZCkgewotICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCi0JY29udGludWU7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICB9Ci0gICAgaWYgKCEgZGlkW3RibF0pIHsKLSAgICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOwotICAgICAgZWxzZQotICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOwotICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0gICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOwotICAgICAgZGlkW3RibF0gPSBUUlVFOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7Ci0gIGludCBpOwotCi0gIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7Ci0gIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OwotICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7Ci0KLSAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7Ci0gICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLSAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLwotfQotCi0jZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjcHJlcGN0LmMgYi9saWJqcGVndHdycC9qY3ByZXBjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkzMzMzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjcHJlcGN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIGpjcHJlcGN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgotICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIGNvbG9yIGNvbnZlcnNpb24sIGRvd25zYW1wbGluZywKLSAqIGFuZCBlZGdlIGV4cGFuc2lvbiBzdGVwcy4KLSAqCi0gKiBNb3N0IG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlcmluZyBpbnB1dCByb3dzCi0gKiBhcyByZXF1aXJlZCBieSB0aGUgZG93bnNhbXBsZXIuICBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSBoZWFkIG9mCi0gKiBqY3NhbXBsZS5jIGZvciB0aGUgZG93bnNhbXBsZXIncyBuZWVkcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogQXQgcHJlc2VudCwgamNzYW1wbGUuYyBjYW4gcmVxdWVzdCBjb250ZXh0IHJvd3Mgb25seSBmb3Igc21vb3RoaW5nLgotICogSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWxzbyBuZWVkIGNvbnRleHQgcm93cyBmb3IgQ0NJUjYwMSBzYW1wbGluZwotICogb3Igb3RoZXIgbW9yZS1jb21wbGV4IGRvd25zYW1wbGluZyBwcm9jZWR1cmVzLiAgVGhlIGNvZGUgdG8gc3VwcG9ydAotICogY29udGV4dCByb3dzIHNob3VsZCBiZSBjb21waWxlZCBvbmx5IGlmIG5lZWRlZC4KLSAqLwotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSNkZWZpbmUgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotI2VuZGlmCi0KLQotLyoKLSAqIEZvciB0aGUgc2ltcGxlIChuby1jb250ZXh0LXJvdykgY2FzZSwgd2UganVzdCBuZWVkIHRvIGJ1ZmZlciBvbmUKLSAqIHJvdyBncm91cCdzIHdvcnRoIG9mIHBpeGVscyBmb3IgdGhlIGRvd25zYW1wbGluZyBzdGVwLiAgQXQgdGhlIGJvdHRvbSBvZgotICogdGhlIGltYWdlLCB3ZSBwYWQgdG8gYSBmdWxsIHJvdyBncm91cCBieSByZXBsaWNhdGluZyB0aGUgbGFzdCBwaXhlbCByb3cuCi0gKiBUaGUgZG93bnNhbXBsZXIncyBsYXN0IG91dHB1dCByb3cgaXMgdGhlbiByZXBsaWNhdGVkIGlmIG5lZWRlZCB0byBwYWQKLSAqIG91dCB0byBhIGZ1bGwgaU1DVSByb3cuCi0gKgotICogV2hlbiBwcm92aWRpbmcgY29udGV4dCByb3dzLCB3ZSBtdXN0IGJ1ZmZlciB0aHJlZSByb3cgZ3JvdXBzJyB3b3J0aCBvZgotICogcGl4ZWxzLiAgVGhyZWUgcm93IGdyb3VwcyBhcmUgcGh5c2ljYWxseSBhbGxvY2F0ZWQsIGJ1dCB0aGUgcm93IHBvaW50ZXIKLSAqIGFycmF5cyBhcmUgbWFkZSBmaXZlIHJvdyBncm91cHMgaGlnaCwgd2l0aCB0aGUgZXh0cmEgcG9pbnRlcnMgYWJvdmUgYW5kCi0gKiBiZWxvdyAid3JhcHBpbmcgYXJvdW5kIiB0byBwb2ludCB0byB0aGUgbGFzdCBhbmQgZmlyc3QgcmVhbCByb3cgZ3JvdXBzLgotICogVGhpcyBhbGxvd3MgdGhlIGRvd25zYW1wbGVyIHRvIGFjY2VzcyB0aGUgcHJvcGVyIGNvbnRleHQgcm93cy4KLSAqIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIGNyZWF0ZSBkdW1teSBjb250ZXh0IHJvd3MgYnkKLSAqIGNvcHlpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuICBUaGlzIGNvcHlpbmcgY291bGQgYmUgYXZvaWRlZAotICogYnkgcG9pbnRlciBoYWNraW5nIGFzIGlzIGRvbmUgaW4gamRtYWluY3QuYywgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCB0aGUKLSAqIHRyb3VibGUgb24gdGhlIGNvbXByZXNzaW9uIHNpZGUuCi0gKi8KLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIERvd25zYW1wbGluZyBpbnB1dCBidWZmZXIuICBUaGlzIGJ1ZmZlciBob2xkcyBjb2xvci1jb252ZXJ0ZWQgZGF0YQotICAgKiB1bnRpbCB3ZSBoYXZlIGVub3VnaCB0byBkbyBhIGRvd25zYW1wbGUgc3RlcC4KLSAgICovCi0gIEpTQU1QQVJSQVkgY29sb3JfYnVmW01BWF9DT01QT05FTlRTXTsKLQotICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBzb3VyY2UgaW1hZ2UgKi8KLSAgaW50IG5leHRfYnVmX3JvdzsJCS8qIGluZGV4IG9mIG5leHQgcm93IHRvIHN0b3JlIGluIGNvbG9yX2J1ZiAqLwotCi0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAkvKiBvbmx5IG5lZWRlZCBmb3IgY29udGV4dCBjYXNlICovCi0gIGludCB0aGlzX3Jvd19ncm91cDsJCS8qIHN0YXJ0aW5nIHJvdyBpbmRleCBvZiBncm91cCB0byBwcm9jZXNzICovCi0gIGludCBuZXh0X2J1Zl9zdG9wOwkJLyogZG93bnNhbXBsZSB3aGVuIHdlIHJlYWNoIHRoaXMgaW5kZXggKi8KLSNlbmRpZgotfSBteV9wcmVwX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfcHJlcF9jb250cm9sbGVyICogbXlfcHJlcF9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19wcmVwIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X3ByZXBfcHRyIHByZXAgPSAobXlfcHJlcF9wdHIpIGNpbmZvLT5wcmVwOwotCi0gIGlmIChwYXNzX21vZGUgIT0gSkJVRl9QQVNTX1RIUlUpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgcHJlcC0+cm93c190b19nbyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIC8qIE1hcmsgdGhlIGNvbnZlcnNpb24gYnVmZmVyIGVtcHR5ICovCi0gIHByZXAtPm5leHRfYnVmX3JvdyA9IDA7Ci0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotICAvKiBQcmVzZXQgYWRkaXRpb25hbCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGNvbnRleHQgbW9kZS4KLSAgICogVGhlc2UgYXJlbid0IHVzZWQgaW4gbm9uLWNvbnRleHQgbW9kZSwgc28gd2UgbmVlZG4ndCB0ZXN0IHdoaWNoIG1vZGUuCi0gICAqLwotICBwcmVwLT50aGlzX3Jvd19ncm91cCA9IDA7Ci0gIC8qIFNldCBuZXh0X2J1Zl9zdG9wIHRvIHN0b3AgYWZ0ZXIgdHdvIHJvdyBncm91cHMgaGF2ZSBiZWVuIHJlYWQgaW4uICovCi0gIHByZXAtPm5leHRfYnVmX3N0b3AgPSAyICogY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotI2VuZGlmCi19Ci0KLQotLyoKLSAqIEV4cGFuZCBhbiBpbWFnZSB2ZXJ0aWNhbGx5IGZyb20gaGVpZ2h0IGlucHV0X3Jvd3MgdG8gaGVpZ2h0IG91dHB1dF9yb3dzLAotICogYnkgZHVwbGljYXRpbmcgdGhlIGJvdHRvbSByb3cuCi0gKi8KLQotTE9DQUwodm9pZCkKLWV4cGFuZF9ib3R0b21fZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBKRElNRU5TSU9OIG51bV9jb2xzLAotCQkgICAgaW50IGlucHV0X3Jvd3MsIGludCBvdXRwdXRfcm93cykKLXsKLSAgcmVnaXN0ZXIgaW50IHJvdzsKLQotICBmb3IgKHJvdyA9IGlucHV0X3Jvd3M7IHJvdyA8IG91dHB1dF9yb3dzOyByb3crKykgewotICAgIGpjb3B5X3NhbXBsZV9yb3dzKGltYWdlX2RhdGEsIGlucHV0X3Jvd3MtMSwgaW1hZ2VfZGF0YSwgcm93LAotCQkgICAgICAxLCBudW1fY29scyk7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNpbXBsZSBuby1jb250ZXh0IGNhc2UuCi0gKgotICogUHJlcHJvY2Vzc29yIG91dHB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKLSAqIGlzIGRlZmluZWQgdG8gYmUgdl9zYW1wX2ZhY3RvciBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4KLSAqIERvd25zYW1wbGluZyB3aWxsIHByb2R1Y2UgdGhpcyBtdWNoIGRhdGEgZnJvbSBlYWNoIG1heF92X3NhbXBfZmFjdG9yCi0gKiBpbnB1dCByb3dzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlX3Byb2Nlc3NfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCSAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCBudW1yb3dzLCBjaTsKLSAgSkRJTUVOU0lPTiBpbnJvd3M7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIHdoaWxlICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwgJiYKLQkgKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKLSAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIHRvIGZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLiAqLwotICAgIGlucm93cyA9IGluX3Jvd3NfYXZhaWwgLSAqaW5fcm93X2N0cjsKLSAgICBudW1yb3dzID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC0gcHJlcC0+bmV4dF9idWZfcm93OwotICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7Ci0gICAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgaW5wdXRfYnVmICsgKmluX3Jvd19jdHIsCi0JCQkJICAgICAgIHByZXAtPmNvbG9yX2J1ZiwKLQkJCQkgICAgICAgKEpESU1FTlNJT04pIHByZXAtPm5leHRfYnVmX3JvdywKLQkJCQkgICAgICAgbnVtcm93cyk7Ci0gICAgKmluX3Jvd19jdHIgKz0gbnVtcm93czsKLSAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKLSAgICBwcmVwLT5yb3dzX3RvX2dvIC09IG51bXJvd3M7Ci0gICAgLyogSWYgYXQgYm90dG9tIG9mIGltYWdlLCBwYWQgdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgotCXByZXAtPm5leHRfYnVmX3JvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0JZXhwYW5kX2JvdHRvbV9lZGdlKHByZXAtPmNvbG9yX2J1ZltjaV0sIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJCSAgIHByZXAtPm5leHRfYnVmX3JvdywgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICAgIH0KLSAgICAgIHByZXAtPm5leHRfYnVmX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgLyogSWYgd2UndmUgZmlsbGVkIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgZW1wdHkgaXQuICovCi0gICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPmRvd25zYW1wbGUpIChjaW5mbywKLQkJCQkJcHJlcC0+Y29sb3JfYnVmLCAoSkRJTUVOU0lPTikgMCwKLQkJCQkJb3V0cHV0X2J1ZiwgKm91dF9yb3dfZ3JvdXBfY3RyKTsKLSAgICAgIHByZXAtPm5leHRfYnVmX3JvdyA9IDA7Ci0gICAgICAoKm91dF9yb3dfZ3JvdXBfY3RyKSsrOwotICAgIH0KLSAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0aGUgb3V0cHV0IHRvIGEgZnVsbCBpTUNVIGhlaWdodC4KLSAgICAgKiBOb3RlIHdlIGFzc3VtZSB0aGUgY2FsbGVyIGlzIHByb3ZpZGluZyBhIG9uZS1pTUNVLWhlaWdodCBvdXRwdXQgYnVmZmVyIQotICAgICAqLwotICAgIGlmIChwcmVwLT5yb3dzX3RvX2dvID09IDAgJiYKLQkqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgewotICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgICBjaSsrLCBjb21wcHRyKyspIHsKLQlleHBhbmRfYm90dG9tX2VkZ2Uob3V0cHV0X2J1ZltjaV0sCi0JCQkgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCQkJICAgKGludCkgKCpvdXRfcm93X2dyb3VwX2N0ciAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAotCQkJICAgKGludCkgKG91dF9yb3dfZ3JvdXBzX2F2YWlsICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikpOwotICAgICAgfQotICAgICAgKm91dF9yb3dfZ3JvdXBfY3RyID0gb3V0X3Jvd19ncm91cHNfYXZhaWw7Ci0gICAgICBicmVhazsJCQkvKiBjYW4gZXhpdCBvdXRlciBsb29wIHdpdGhvdXQgdGVzdCAqLwotICAgIH0KLSAgfQotfQotCi0KLSNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgY29udGV4dCBjYXNlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlX3Byb2Nlc3NfY29udGV4dCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkgICAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCBudW1yb3dzLCBjaTsKLSAgaW50IGJ1Zl9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiAzOwotICBKRElNRU5TSU9OIGlucm93czsKLQotICB3aGlsZSAoKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKLSAgICBpZiAoKmluX3Jvd19jdHIgPCBpbl9yb3dzX2F2YWlsKSB7Ci0gICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIHRvIGZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLiAqLwotICAgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOwotICAgICAgbnVtcm93cyA9IHByZXAtPm5leHRfYnVmX3N0b3AgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7Ci0gICAgICBudW1yb3dzID0gKGludCkgTUlOKChKRElNRU5TSU9OKSBudW1yb3dzLCBpbnJvd3MpOwotICAgICAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgaW5wdXRfYnVmICsgKmluX3Jvd19jdHIsCi0JCQkJCSBwcmVwLT5jb2xvcl9idWYsCi0JCQkJCSAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAotCQkJCQkgbnVtcm93cyk7Ci0gICAgICAvKiBQYWQgYXQgdG9wIG9mIGltYWdlLCBpZiBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgICAgIGlmIChwcmVwLT5yb3dzX3RvX2dvID09IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKLQlmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLQkgIGludCByb3c7Ci0JICBmb3IgKHJvdyA9IDE7IHJvdyA8PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IHJvdysrKSB7Ci0JICAgIGpjb3B5X3NhbXBsZV9yb3dzKHByZXAtPmNvbG9yX2J1ZltjaV0sIDAsCi0JCQkgICAgICBwcmVwLT5jb2xvcl9idWZbY2ldLCAtcm93LAotCQkJICAgICAgMSwgY2luZm8tPmltYWdlX3dpZHRoKTsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOwotICAgICAgcHJlcC0+bmV4dF9idWZfcm93ICs9IG51bXJvd3M7Ci0gICAgICBwcmVwLT5yb3dzX3RvX2dvIC09IG51bXJvd3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFJldHVybiBmb3IgbW9yZSBkYXRhLCB1bmxlc3Mgd2UgYXJlIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLwotICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gIT0gMCkKLQlicmVhazsKLSAgICAgIC8qIFdoZW4gYXQgYm90dG9tIG9mIGltYWdlLCBwYWQgdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93IDwgcHJlcC0+bmV4dF9idWZfc3RvcCkgewotCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotCSAgZXhwYW5kX2JvdHRvbV9lZGdlKHByZXAtPmNvbG9yX2J1ZltjaV0sIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJCSAgICAgcHJlcC0+bmV4dF9idWZfcm93LCBwcmVwLT5uZXh0X2J1Zl9zdG9wKTsKLQl9Ci0JcHJlcC0+bmV4dF9idWZfcm93ID0gcHJlcC0+bmV4dF9idWZfc3RvcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogSWYgd2UndmUgZ290dGVuIGVub3VnaCBkYXRhLCBkb3duc2FtcGxlIGEgcm93IGdyb3VwLiAqLwotICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPT0gcHJlcC0+bmV4dF9idWZfc3RvcCkgewotICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAotCQkJCQlwcmVwLT5jb2xvcl9idWYsCi0JCQkJCShKRElNRU5TSU9OKSBwcmVwLT50aGlzX3Jvd19ncm91cCwKLQkJCQkJb3V0cHV0X2J1ZiwgKm91dF9yb3dfZ3JvdXBfY3RyKTsKLSAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7Ci0gICAgICAvKiBBZHZhbmNlIHBvaW50ZXJzIHdpdGggd3JhcGFyb3VuZCBhcyBuZWNlc3NhcnkuICovCi0gICAgICBwcmVwLT50aGlzX3Jvd19ncm91cCArPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgICBpZiAocHJlcC0+dGhpc19yb3dfZ3JvdXAgPj0gYnVmX2hlaWdodCkKLQlwcmVwLT50aGlzX3Jvd19ncm91cCA9IDA7Ci0gICAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID49IGJ1Zl9oZWlnaHQpCi0JcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKLSAgICAgIHByZXAtPm5leHRfYnVmX3N0b3AgPSBwcmVwLT5uZXh0X2J1Zl9yb3cgKyBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSB0aGUgd3JhcHBlZC1hcm91bmQgZG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlciBuZWVkZWQgZm9yIGNvbnRleHQgbW9kZS4KLSAqLwotCi1MT0NBTCh2b2lkKQotY3JlYXRlX2NvbnRleHRfYnVmZmVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCByZ3JvdXBfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICBpbnQgY2ksIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKU0FNUEFSUkFZIHRydWVfYnVmZmVyLCBmYWtlX2J1ZmZlcjsKLQotICAvKiBHcmFiIGVub3VnaCBzcGFjZSBmb3IgZmFrZSByb3cgcG9pbnRlcnMgZm9yIGFsbCB0aGUgY29tcG9uZW50czsKLSAgICogd2UgbmVlZCBmaXZlIHJvdyBncm91cHMnIHdvcnRoIG9mIHBvaW50ZXJzIGZvciBlYWNoIGNvbXBvbmVudC4KLSAgICovCi0gIGZha2VfYnVmZmVyID0gKEpTQU1QQVJSQVkpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoY2luZm8tPm51bV9jb21wb25lbnRzICogNSAqIHJncm91cF9oZWlnaHQpICoKLQkJCQlTSVpFT0YoSlNBTVBST1cpKTsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgYnVmZmVyIHNwYWNlICgzIHJvdyBncm91cHMpIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCi0gICAgICogaG9yaXpvbnRhbGx5IHdpdGhpbiB0aGUgYnVmZmVyLCBpZiBpdCBzbyBjaG9vc2VzLgotICAgICAqLwotICAgIHRydWVfYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSAoKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFICoKLQkJICAgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotICAgICAgIChKRElNRU5TSU9OKSAoMyAqIHJncm91cF9oZWlnaHQpKTsKLSAgICAvKiBDb3B5IHRydWUgYnVmZmVyIHJvdyBwb2ludGVycyBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIGZha2Ugcm93IGFycmF5ICovCi0gICAgTUVNQ09QWShmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQsIHRydWVfYnVmZmVyLAotCSAgICAzICogcmdyb3VwX2hlaWdodCAqIFNJWkVPRihKU0FNUFJPVykpOwotICAgIC8qIEZpbGwgaW4gdGhlIGFib3ZlIGFuZCBiZWxvdyB3cmFwYXJvdW5kIHBvaW50ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cF9oZWlnaHQ7IGkrKykgewotICAgICAgZmFrZV9idWZmZXJbaV0gPSB0cnVlX2J1ZmZlclsyICogcmdyb3VwX2hlaWdodCArIGldOwotICAgICAgZmFrZV9idWZmZXJbNCAqIHJncm91cF9oZWlnaHQgKyBpXSA9IHRydWVfYnVmZmVyW2ldOwotICAgIH0KLSAgICBwcmVwLT5jb2xvcl9idWZbY2ldID0gZmFrZV9idWZmZXIgKyByZ3JvdXBfaGVpZ2h0OwotICAgIGZha2VfYnVmZmVyICs9IDUgKiByZ3JvdXBfaGVpZ2h0OyAvKiBwb2ludCB0byBzcGFjZSBmb3IgbmV4dCBjb21wb25lbnQgKi8KLSAgfQotfQotCi0jZW5kaWYgLyogQ09OVEVYVF9ST1dTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIHByZXByb2Nlc3NpbmcgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfcHJlcF9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9wcmVwX3B0ciBwcmVwOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKQkJLyogc2FmZXR5IGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIHByZXAgPSAobXlfcHJlcF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfcHJlcF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5wcmVwID0gKHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyICopIHByZXA7Ci0gIHByZXAtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19wcmVwOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBjb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4KLSAgICogV2UgbWFrZSB0aGUgYnVmZmVyIHdpZGUgZW5vdWdoIHRvIGFsbG93IHRoZSBkb3duc2FtcGxlciB0byBlZGdlLWV4cGFuZAotICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCi0gICAqLwotICBpZiAoY2luZm8tPmRvd25zYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgLyogU2V0IHVwIHRvIHByb3ZpZGUgY29udGV4dCByb3dzICovCi0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfY29udGV4dDsKLSAgICBjcmVhdGVfY29udGV4dF9idWZmZXIoY2luZm8pOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvKiBObyBjb250ZXh0LCBqdXN0IG1ha2UgaXQgdGFsbCBlbm91Z2ggZm9yIG9uZSByb3cgZ3JvdXAgKi8KLSAgICBwcmVwLT5wdWIucHJlX3Byb2Nlc3NfZGF0YSA9IHByZV9wcm9jZXNzX2RhdGE7Ci0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBwcmVwLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgotCQkJY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjc2FtcGxlLmMgYi9saWJqcGVndHdycC9qY3NhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTJlYzg3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pjc2FtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoKLSAqIGpjc2FtcGxlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkb3duc2FtcGxpbmcgcm91dGluZXMuCi0gKgotICogRG93bnNhbXBsaW5nIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIG9mIGVhY2ggY29tcG9uZW50LAotICogZnJvbSB3aGljaCB0aGUgZG93bnNhbXBsZXIgcHJvZHVjZXMgdl9zYW1wX2ZhY3RvciBzYW1wbGUgcm93cy4KLSAqIEEgc2luZ2xlIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgaW4gZWFjaCBjYWxsIHRvIHRoZSBkb3duc2FtcGxlciBtb2R1bGUuCi0gKgotICogVGhlIGRvd25zYW1wbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlZGdlLWV4cGFuc2lvbiBvZiBpdHMgb3V0cHV0IGRhdGEKLSAqIHRvIGZpbGwgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIERDVCBibG9ja3MgaG9yaXpvbnRhbGx5LiAgVGhlIHNvdXJjZSBidWZmZXIKLSAqIG1heSBiZSBtb2RpZmllZCBpZiBpdCBpcyBoZWxwZnVsIGZvciB0aGlzIHB1cnBvc2UgKHRoZSBzb3VyY2UgYnVmZmVyIGlzCi0gKiBhbGxvY2F0ZWQgd2lkZSBlbm91Z2ggdG8gY29ycmVzcG9uZCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgd2lkdGgpLgotICogVGhlIGNhbGxlciAodGhlIHByZXAgY29udHJvbGxlcikgaXMgcmVzcG9uc2libGUgZm9yIHZlcnRpY2FsIHBhZGRpbmcuCi0gKgotICogVGhlIGRvd25zYW1wbGVyIG1heSByZXF1ZXN0ICJjb250ZXh0IHJvd3MiIGJ5IHNldHRpbmcgbmVlZF9jb250ZXh0X3Jvd3MKLSAqIGR1cmluZyBzdGFydHVwLiAgSW4gdGhpcyBjYXNlLCB0aGUgaW5wdXQgYXJyYXlzIHdpbGwgY29udGFpbiBhdCBsZWFzdAotICogb25lIHJvdyBncm91cCdzIHdvcnRoIG9mIHBpeGVscyBhYm92ZSBhbmQgYmVsb3cgdGhlIHBhc3NlZC1pbiBkYXRhOwotICogdGhlIGNhbGxlciB3aWxsIGNyZWF0ZSBkdW1teSByb3dzIGF0IGltYWdlIHRvcCBhbmQgYm90dG9tIGJ5IHJlcGxpY2F0aW5nCi0gKiB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4KLSAqCi0gKiBBbiBleGNlbGxlbnQgcmVmZXJlbmNlIGZvciBpbWFnZSByZXNhbXBsaW5nIGlzCi0gKiAgIERpZ2l0YWwgSW1hZ2UgV2FycGluZywgR2VvcmdlIFdvbGJlcmcsIDE5OTAuCi0gKiAgIFB1Yi4gYnkgSUVFRSBDb21wdXRlciBTb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLiBJU0JOIDAtODE4Ni04OTQ0LTcuCi0gKgotICogVGhlIGRvd25zYW1wbGluZyBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIGEgc2ltcGxlIGF2ZXJhZ2Ugb2YgdGhlIHNvdXJjZQotICogcGl4ZWxzIGNvdmVyZWQgYnkgdGhlIG91dHB1dCBwaXhlbC4gIFRoZSBoaS1mYWx1dGluIHNhbXBsaW5nIGxpdGVyYXR1cmUKLSAqIHJlZmVycyB0byB0aGlzIGFzIGEgImJveCBmaWx0ZXIiLiAgSW4gZ2VuZXJhbCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgYm94Ci0gKiBmaWx0ZXIgYXJlIG5vdCB2ZXJ5IGdvb2QsIGJ1dCBmb3IgdGhlIHNwZWNpZmljIGNhc2VzIHdlIG5vcm1hbGx5IHVzZSAoMToxCi0gKiBhbmQgMjoxIHJhdGlvcykgdGhlIGJveCBpcyBlcXVpdmFsZW50IHRvIGEgInRyaWFuZ2xlIGZpbHRlciIgd2hpY2ggaXMgbm90Ci0gKiBuZWFybHkgc28gYmFkLiAgSWYgeW91IGludGVuZCB0byB1c2Ugb3RoZXIgc2FtcGxpbmcgcmF0aW9zLCB5b3UnZCBiZSB3ZWxsCi0gKiBhZHZpc2VkIHRvIGltcHJvdmUgdGhpcyBjb2RlLgotICoKLSAqIEEgc2ltcGxlIGlucHV0LXNtb290aGluZyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkLiAgVGhpcyBpcyBtYWlubHkgaW50ZW5kZWQKLSAqIGZvciBjbGVhbmluZyB1cCBjb2xvci1kaXRoZXJlZCBHSUYgaW5wdXQgZmlsZXMgKGlmIHlvdSBmaW5kIGl0IGluYWRlcXVhdGUsCi0gKiB3ZSBzdWdnZXN0IHVzaW5nIGFuIGV4dGVybmFsIGZpbHRlcmluZyBwcm9ncmFtIHN1Y2ggYXMgcG5tY29udm9sKS4gIFdoZW4KLSAqIGVuYWJsZWQsIGVhY2ggaW5wdXQgcGl4ZWwgUCBpcyByZXBsYWNlZCBieSBhIHdlaWdodGVkIHN1bSBvZiBpdHNlbGYgYW5kIGl0cwotICogZWlnaHQgbmVpZ2hib3JzLiAgUCdzIHdlaWdodCBpcyAxLTgqU0YgYW5kIGVhY2ggbmVpZ2hib3IncyB3ZWlnaHQgaXMgU0YsCi0gKiB3aGVyZSBTRiA9IChzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNCkuCi0gKiBDdXJyZW50bHksIHNtb290aGluZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgMmgydiBzYW1wbGluZyBmYWN0b3JzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZG93bnNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBkb3duc2FtcGxlMV9wdHIsCi0JCShqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpKTsKLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kb3duc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBEb3duc2FtcGxpbmcgbWV0aG9kIHBvaW50ZXJzLCBvbmUgcGVyIGNvbXBvbmVudCAqLwotICBkb3duc2FtcGxlMV9wdHIgbWV0aG9kc1tNQVhfQ09NUE9ORU5UU107Ci19IG15X2Rvd25zYW1wbGVyOwotCi10eXBlZGVmIG15X2Rvd25zYW1wbGVyICogbXlfZG93bnNhbXBsZV9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgZG93bnNhbXBsaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrIGZvciBub3cgKi8KLX0KLQotCi0vKgotICogRXhwYW5kIGEgY29tcG9uZW50IGhvcml6b250YWxseSBmcm9tIHdpZHRoIGlucHV0X2NvbHMgdG8gd2lkdGggb3V0cHV0X2NvbHMsCi0gKiBieSBkdXBsaWNhdGluZyB0aGUgcmlnaHRtb3N0IHNhbXBsZXMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWV4cGFuZF9yaWdodF9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIGludCBudW1fcm93cywKLQkJICAgSkRJTUVOU0lPTiBpbnB1dF9jb2xzLCBKRElNRU5TSU9OIG91dHB1dF9jb2xzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgcGl4dmFsOwotICByZWdpc3RlciBpbnQgY291bnQ7Ci0gIGludCByb3c7Ci0gIGludCBudW1jb2xzID0gKGludCkgKG91dHB1dF9jb2xzIC0gaW5wdXRfY29scyk7Ci0KLSAgaWYgKG51bWNvbHMgPiAwKSB7Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICAgIHB0ciA9IGltYWdlX2RhdGFbcm93XSArIGlucHV0X2NvbHM7Ci0gICAgICBwaXh2YWwgPSBwdHJbLTFdOwkJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgZm9yIChjb3VudCA9IG51bWNvbHM7IGNvdW50ID4gMDsgY291bnQtLSkKLQkqcHRyKysgPSBwaXh2YWw7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIERvIGRvd25zYW1wbGluZyBmb3IgYSB3aG9sZSByb3cgZ3JvdXAgKGFsbCBjb21wb25lbnRzKS4KLSAqCi0gKiBJbiB0aGlzIHZlcnNpb24gd2Ugc2ltcGx5IGRvd25zYW1wbGUgZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXNlcF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2luZGV4LAotCQlKU0FNUElNQUdFIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cF9pbmRleCkKLXsKLSAgbXlfZG93bnNhbXBsZV9wdHIgZG93bnNhbXBsZSA9IChteV9kb3duc2FtcGxlX3B0cikgY2luZm8tPmRvd25zYW1wbGU7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgaW5fcHRyLCBvdXRfcHRyOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaW5fcHRyID0gaW5wdXRfYnVmW2NpXSArIGluX3Jvd19pbmRleDsKLSAgICBvdXRfcHRyID0gb3V0cHV0X2J1ZltjaV0gKyAob3V0X3Jvd19ncm91cF9pbmRleCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgICgqZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0pIChjaW5mbywgY29tcHB0ciwgaW5fcHRyLCBvdXRfcHRyKTsKLSAgfQotfQotCi0KLS8qCi0gKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCi0gKiBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGFyYml0cmFyeSBpbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MsIHdpdGhvdXQgc21vb3RoaW5nLgotICogTm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBpcyBub3QgYWN0dWFsbHkgdXNlZCBmb3IgY3VzdG9tYXJ5IHNhbXBsaW5nIHJhdGlvcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWludF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCUpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgaW50IGlucm93LCBvdXRyb3csIGhfZXhwYW5kLCB2X2V4cGFuZCwgbnVtcGl4LCBudW1waXgyLCBoLCB2OwotICBKRElNRU5TSU9OIG91dGNvbCwgb3V0Y29sX2g7CS8qIG91dGNvbF9oID09IG91dGNvbCpoX2V4cGFuZCAqLwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKLSAgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgSU5UMzIgb3V0dmFsdWU7Ci0KLSAgaF9leHBhbmQgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICB2X2V4cGFuZCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAvIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gIG51bXBpeCA9IGhfZXhwYW5kICogdl9leHBhbmQ7Ci0gIG51bXBpeDIgPSBudW1waXgvMjsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiBoX2V4cGFuZCk7Ci0KLSAgaW5yb3cgPSAwOwotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBmb3IgKG91dGNvbCA9IDAsIG91dGNvbF9oID0gMDsgb3V0Y29sIDwgb3V0cHV0X2NvbHM7Ci0JIG91dGNvbCsrLCBvdXRjb2xfaCArPSBoX2V4cGFuZCkgewotICAgICAgb3V0dmFsdWUgPSAwOwotICAgICAgZm9yICh2ID0gMDsgdiA8IHZfZXhwYW5kOyB2KyspIHsKLQlpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3crdl0gKyBvdXRjb2xfaDsKLQlmb3IgKGggPSAwOyBoIDwgaF9leHBhbmQ7IGgrKykgewotCSAgb3V0dmFsdWUgKz0gKElOVDMyKSBHRVRKU0FNUExFKCppbnB0cisrKTsKLQl9Ci0gICAgICB9Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChvdXR2YWx1ZSArIG51bXBpeDIpIC8gbnVtcGl4KTsKLSAgICB9Ci0gICAgaW5yb3cgKz0gdl9leHBhbmQ7Ci0gIH0KLX0KLQotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIGZ1bGwtc2l6ZSBjb21wb25lbnQsCi0gKiB3aXRob3V0IHNtb290aGluZy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZ1bGxzaXplX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCi17Ci0gIC8qIENvcHkgdGhlIGRhdGEgKi8KLSAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfZGF0YSwgMCwgb3V0cHV0X2RhdGEsIDAsCi0JCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsIGNpbmZvLT5pbWFnZV93aWR0aCk7Ci0gIC8qIEVkZ2UtZXhwYW5kICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKG91dHB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUpOwotfQotCi0KLS8qCi0gKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbCwKLSAqIHdpdGhvdXQgc21vb3RoaW5nLgotICoKLSAqIEEgbm90ZSBhYm91dCB0aGUgImJpYXMiIGNhbGN1bGF0aW9uczogd2hlbiByb3VuZGluZyBmcmFjdGlvbmFsIHZhbHVlcyB0bwotICogaW50ZWdlciwgd2UgZG8gbm90IHdhbnQgdG8gYWx3YXlzIHJvdW5kIDAuNSB1cCB0byB0aGUgbmV4dCBpbnRlZ2VyLgotICogSWYgd2UgZGlkIHRoYXQsIHdlJ2QgaW50cm9kdWNlIGEgbm90aWNlYWJsZSBiaWFzIHRvd2FyZHMgbGFyZ2VyIHZhbHVlcy4KLSAqIEluc3RlYWQsIHRoaXMgY29kZSBpcyBhcnJhbmdlZCBzbyB0aGF0IDAuNSB3aWxsIGJlIHJvdW5kZWQgdXAgb3IgZG93biBhdAotICogYWx0ZXJuYXRlIHBpeGVsIGxvY2F0aW9ucyAoYSBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgcGF0dGVybikuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgaW50IG91dHJvdzsKLSAgSkRJTUVOU0lPTiBvdXRjb2w7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgYmlhczsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKLQotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbb3V0cm93XTsKLSAgICBiaWFzID0gMDsJCQkvKiBiaWFzID0gMCwxLDAsMSwuLi4gZm9yIHN1Y2Nlc3NpdmUgc2FtcGxlcyAqLwotICAgIGZvciAob3V0Y29sID0gMDsgb3V0Y29sIDwgb3V0cHV0X2NvbHM7IG91dGNvbCsrKSB7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChHRVRKU0FNUExFKCppbnB0cikgKyBHRVRKU0FNUExFKGlucHRyWzFdKQotCQkJICAgICAgKyBiaWFzKSA+PiAxKTsKLSAgICAgIGJpYXMgXj0gMTsJCS8qIDA9PjEsIDE9PjAgKi8KLSAgICAgIGlucHRyICs9IDI7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzdGFuZGFyZCBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwsCi0gKiB3aXRob3V0IHNtb290aGluZy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgaW5yb3csIG91dHJvdzsKLSAgSkRJTUVOU0lPTiBvdXRjb2w7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgYmlhczsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKLQotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgYmlhcyA9IDE7CQkJLyogYmlhcyA9IDEsMiwxLDIsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KLSAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgewotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JCQkgICAgICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pCi0JCQkgICAgICArIGJpYXMpID4+IDIpOwotICAgICAgYmlhcyBePSAzOwkJLyogMT0+MiwgMj0+MSAqLwotICAgICAgaW5wdHIwICs9IDI7IGlucHRyMSArPSAyOwotICAgIH0KLSAgICBpbnJvdyArPSAyOwotICB9Ci19Ci0KLQotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzdGFuZGFyZCBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwsCi0gKiB3aXRoIHNtb290aGluZy4gIE9uZSByb3cgb2YgY29udGV4dCBpcyByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJCUpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgaW50IGlucm93LCBvdXRyb3c7Ci0gIEpESU1FTlNJT04gY29sY3RyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGFib3ZlX3B0ciwgYmVsb3dfcHRyLCBvdXRwdHI7Ci0gIElOVDMyIG1lbWJlcnN1bSwgbmVpZ2hzdW0sIG1lbWJlcnNjYWxlLCBuZWlnaHNjYWxlOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSAtIDEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciArIDIsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7Ci0KLSAgLyogV2UgZG9uJ3QgYm90aGVyIHRvIGZvcm0gdGhlIGluZGl2aWR1YWwgInNtb290aGVkIiBpbnB1dCBwaXhlbCB2YWx1ZXM7Ci0gICAqIHdlIGNhbiBkaXJlY3RseSBjb21wdXRlIHRoZSBvdXRwdXQgd2hpY2ggaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGZvdXIKLSAgICogc21vb3RoZWQgdmFsdWVzLiAgRWFjaCBvZiB0aGUgZm91ciBtZW1iZXIgcGl4ZWxzIGNvbnRyaWJ1dGVzIGEgZnJhY3Rpb24KLSAgICogKDEtOCpTRikgdG8gaXRzIG93biBzbW9vdGhlZCBpbWFnZSBhbmQgYSBmcmFjdGlvbiBTRiB0byBlYWNoIG9mIHRoZSB0aHJlZQotICAgKiBvdGhlciBzbW9vdGhlZCBwaXhlbHMsIHRoZXJlZm9yZSBhIHRvdGFsIGZyYWN0aW9uICgxLTUqU0YpLzQgdG8gdGhlIGZpbmFsCi0gICAqIG91dHB1dC4gIFRoZSBmb3VyIGNvcm5lci1hZGphY2VudCBuZWlnaGJvciBwaXhlbHMgY29udHJpYnV0ZSBhIGZyYWN0aW9uCi0gICAqIFNGIHRvIGp1c3Qgb25lIHNtb290aGVkIHBpeGVsLCBvciBTRi80IHRvIHRoZSBmaW5hbCBvdXRwdXQ7IHdoaWxlIHRoZQotICAgKiBlaWdodCBlZGdlLWFkamFjZW50IG5laWdoYm9ycyBjb250cmlidXRlIFNGIHRvIGVhY2ggb2YgdHdvIHNtb290aGVkCi0gICAqIHBpeGVscywgb3IgU0YvMiBvdmVyYWxsLiAgSW4gb3JkZXIgdG8gdXNlIGludGVnZXIgYXJpdGhtZXRpYywgdGhlc2UKLSAgICogZmFjdG9ycyBhcmUgc2NhbGVkIGJ5IDJeMTYgPSA2NTUzNi4KLSAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgotICAgKi8KLQotICBtZW1iZXJzY2FsZSA9IDE2Mzg0IC0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA4MDsgLyogc2NhbGVkICgxLTUqU0YpLzQgKi8KLSAgbmVpZ2hzY2FsZSA9IGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogMTY7IC8qIHNjYWxlZCBTRi80ICovCi0KLSAgaW5yb3cgPSAwOwotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOwotICAgIGFib3ZlX3B0ciA9IGlucHV0X2RhdGFbaW5yb3ctMV07Ci0gICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtpbnJvdysyXTsKLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uOiBwcmV0ZW5kIGNvbHVtbiAtMSBpcyBzYW1lIGFzIGNvbHVtbiAwICovCi0gICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7Ci0gICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsyXSkgKwotCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMl0pOwotICAgIG5laWdoc3VtICs9IG5laWdoc3VtOwotICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsyXSkgKwotCQlHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMl0pOwotICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0gICAgaW5wdHIwICs9IDI7IGlucHRyMSArPSAyOyBhYm92ZV9wdHIgKz0gMjsgYmVsb3dfcHRyICs9IDI7Ci0KLSAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKLSAgICAgIC8qIHN1bSBvZiBwaXhlbHMgZGlyZWN0bHkgbWFwcGVkIHRvIHRoaXMgb3V0cHV0IGVsZW1lbnQgKi8KLSAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKwotCQkgIEdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7Ci0gICAgICAvKiBzdW0gb2YgZWRnZS1uZWlnaGJvciBwaXhlbHMgKi8KLSAgICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCi0JCSBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pICsKLQkJIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsyXSkgKwotCQkgR0VUSlNBTVBMRShpbnB0cjFbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKLSAgICAgIC8qIFRoZSBlZGdlLW5laWdoYm9ycyBjb3VudCB0d2ljZSBhcyBtdWNoIGFzIGNvcm5lci1uZWlnaGJvcnMgKi8KLSAgICAgIG5laWdoc3VtICs9IG5laWdoc3VtOwotICAgICAgLyogQWRkIGluIHRoZSBjb3JuZXItbmVpZ2hib3JzICovCi0gICAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKGFib3ZlX3B0clstMV0pICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKLQkJICBHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMl0pOwotICAgICAgLyogZm9ybSBmaW5hbCBvdXRwdXQgc2NhbGVkIHVwIGJ5IDJeMTYgKi8KLSAgICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICAgLyogcm91bmQsIGRlc2NhbGUgYW5kIG91dHB1dCBpdCAqLwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOwotICAgIH0KLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkJR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKwotCSAgICAgICBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRShpbnB0cjBbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7Ci0gICAgbmVpZ2hzdW0gKz0gbmVpZ2hzdW07Ci0gICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCi0JCUdFVEpTQU1QTEUoYmVsb3dfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSk7Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0ciA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0KLSAgICBpbnJvdyArPSAyOwotICB9Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAotICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHIsCi0JCQkgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgb3V0cm93OwotICBKRElNRU5TSU9OIGNvbGN0cjsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOwotICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKLSAgaW50IGNvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyk7Ci0KLSAgLyogRWFjaCBvZiB0aGUgZWlnaHQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGVzIGEgZnJhY3Rpb24gU0YgdG8gdGhlCi0gICAqIHNtb290aGVkIHBpeGVsLCB3aGlsZSB0aGUgbWFpbiBwaXhlbCBjb250cmlidXRlcyAoMS04KlNGKS4gIEluIG9yZGVyCi0gICAqIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlIGZhY3RvcnMgYXJlIG11bHRpcGxpZWQgYnkgMl4xNiA9IDY1NTM2LgotICAgKiBBbHNvIHJlY2FsbCB0aGF0IFNGID0gc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQuCi0gICAqLwotCi0gIG1lbWJlcnNjYWxlID0gNjU1MzZMIC0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA1MTJMOyAvKiBzY2FsZWQgMS04KlNGICovCi0gIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDY0OyAvKiBzY2FsZWQgU0YgKi8KLQotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbb3V0cm93XTsKLSAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW291dHJvdy0xXTsKLSAgICBiZWxvd19wdHIgPSBpbnB1dF9kYXRhW291dHJvdysxXTsKLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCi0gICAgY29sc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKyspICsgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKyspICsKLQkgICAgIEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKwotCQkgR0VUSlNBTVBMRSgqaW5wdHIpOwotICAgIG5laWdoc3VtID0gY29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOwotICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0gICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKLQotICAgIGZvciAoY29sY3RyID0gb3V0cHV0X2NvbHMgLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotICAgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7Ci0gICAgICBhYm92ZV9wdHIrKzsgYmVsb3dfcHRyKys7Ci0gICAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKwotCQkgICBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgICBuZWlnaHN1bSA9IGxhc3Rjb2xzdW0gKyAoY29sc3VtIC0gbWVtYmVyc3VtKSArIG5leHRjb2xzdW07Ci0gICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0gICAgICBsYXN0Y29sc3VtID0gY29sc3VtOyBjb2xzdW0gPSBuZXh0Y29sc3VtOwotICAgIH0KLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBjb2xzdW07Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0ciA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0KLSAgfQotfQotCi0jZW5kaWYgLyogSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgZG93bnNhbXBsaW5nLgotICogTm90ZSB0aGF0IHdlIG11c3Qgc2VsZWN0IGEgcm91dGluZSBmb3IgZWFjaCBjb21wb25lbnQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kb3duc2FtcGxlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGU7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIGJvb2xlYW4gc21vb3Rob2sgPSBUUlVFOwotCi0gIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfZG93bnNhbXBsZXIpKTsKLSAgY2luZm8tPmRvd25zYW1wbGUgPSAoc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgKikgZG93bnNhbXBsZTsKLSAgZG93bnNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rvd25zYW1wbGU7Ci0gIGRvd25zYW1wbGUtPnB1Yi5kb3duc2FtcGxlID0gc2VwX2Rvd25zYW1wbGU7Ci0gIGRvd25zYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOwotCi0gIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7Ci0KLSAgLyogVmVyaWZ5IHdlIGNhbiBoYW5kbGUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIGFuZCBzZXQgdXAgbWV0aG9kIHBvaW50ZXJzICovCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCi0JY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECi0gICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX3Ntb290aF9kb3duc2FtcGxlOwotCWRvd25zYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgotCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgICAgc21vb3Rob2sgPSBGQUxTRTsKLSAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9kb3duc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCi0JICAgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgICAgIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvcikgewotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9zbW9vdGhfZG93bnNhbXBsZTsKLQlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOwotICAgICAgfSBlbHNlCi0jZW5kaWYKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSA9PSAwICYmCi0JICAgICAgIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSA9PSAwKSB7Ci0gICAgICBzbW9vdGhvayA9IEZBTFNFOwotICAgICAgZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBpbnRfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwpOwotICB9Ci0KLSNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECi0gIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAmJiAhc21vb3Rob2spCi0gICAgVFJBQ0VNUyhjaW5mbywgMCwgSlRSQ19TTU9PVEhfTk9USU1QTCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pjdHJhbnMuYyBiL2xpYmpwZWd0d3JwL2pjdHJhbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3NGVkMS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qY3RyYW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoKLSAqIGpjdHJhbnMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAotICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgotICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1MT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7Ci1MT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKLQotCi0vKgotICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCi0gKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgotICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgotICoKLSAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgotICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAotICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKLSAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQotICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCi0gIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7Ci0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCi0gIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKLSAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCi0gIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCi0gKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCi0gKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcwotICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKLXsKLSAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOwotICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKLSAgaW50IHRibG5vLCBjaSwgY29lZmk7Ci0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLwotICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOwotICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOwotICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCi0gIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOwotICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KLSAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgotICAgKi8KLSAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKLSAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKLSAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7Ci0gIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCi0gIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7Ci0gICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7Ci0gICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107Ci0gICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKLQkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7Ci0gICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAotCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCi0JICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7Ci0gICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7Ci0gICAgfQotICB9Ci0gIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KLSAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCi0gICAqLwotICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOwotICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCi0gICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAotCSAgICAgTUFYX0NPTVBPTkVOVFMpOwotICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOwotICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKLSAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKLSAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOwotICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7Ci0gICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87Ci0gICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQotICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KLSAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgotICAgICAqLwotICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOwotICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKLQlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKLSAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOwotICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOwotICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKLSAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7Ci0JaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCi0JICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7Ci0gICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgotICAgICAqLwotICB9Ci0gIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KLSAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQotICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAotICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCi0gICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAotICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCi0gICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCi0gICAqLwotICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7Ci0gICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7Ci0gICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247Ci0gICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247Ci0gICAgfQotICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKLSAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7Ci0gICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OwotICB9Ci19Ci0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCi0gKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCi0gKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQotewotICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCi0gICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgotICAgKi8KLSAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOwotICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KLSAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7Ci0KLSAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLwotICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKLQotICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKLQotICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLwotICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgotICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KLSAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KLSAgICovCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50Ci0gKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5Ci0gKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKLSAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAotICogaW4gdGhlIGFycmF5cy4KLSAqLwotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLwotICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KLSAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KLSAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KLQotICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KLSAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOwotCi0gIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCi0gIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci19IG15X2NvZWZfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKLQotCi1MT0NBTCh2b2lkKQotc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KLSAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KLSAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCi0gICAqLwotICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7Ci0gICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OwotICB9Ci0KLSAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLQotICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKLSAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KLSAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCi0gKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgotICoKLSAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKLSAgSkRJTUVOU0lPTiBzdGFydF9jb2w7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gIH0KLQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOwotCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAotCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKLQlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7Ci0JICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAotCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7Ci0JICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KLQkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOwotCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKLQkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0JICB9IGVsc2UgewotCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCi0JICAgIHhpbmRleCA9IDA7Ci0JICB9Ci0JICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgotCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6Ci0JICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCi0JICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCi0JICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KLQkgICAqLwotCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKLQkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKLQkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKLQkgICAgYmxrbisrOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgewotCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKLSNpZmRlZiBORUVEU19BUk1fRVJSQVRBXzc1NDMxOV83NTQzMjAKLSAgICBhc20gdm9sYXRpbGUgKCAidm1vdiBzMCxzMFxuIiApOwotI2VuZGlmCi0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgY29lZi0+aU1DVV9yb3dfbnVtKys7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSNpZmRlZiBORUVEU19BUk1fRVJSQVRBXzc1NDMxOV83NTQzMjAKLSAgYXNtIHZvbGF0aWxlICggInZtb3YgczAsczBcbiIgKTsKLSNlbmRpZgotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLgotICoKLSAqIEVhY2ggcGFzc2VkIGNvZWZmaWNpZW50IGFycmF5IG11c3QgYmUgdGhlIHJpZ2h0IHNpemUgZm9yIHRoYXQKLSAqIGNvZWZmaWNpZW50OiB3aWR0aF9pbl9ibG9ja3Mgd2lkZSBhbmQgaGVpZ2h0X2luX2Jsb2NrcyBoaWdoLAotICogd2l0aCB1bml0aGVpZ2h0IGF0IGxlYXN0IHZfc2FtcF9mYWN0b3IuCi0gKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zZW5jb2RlX2NvZWZfY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKLXsKLSAgbXlfY29lZl9wdHIgY29lZjsKLSAgSkJMT0NLUk9XIGJ1ZmZlcjsKLSAgaW50IGk7Ci0KLSAgY29lZiA9IChteV9jb2VmX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKLSAgY29lZi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2NvZWY7Ci0gIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3Nfb3V0cHV0OwotCi0gIC8qIFNhdmUgcG9pbnRlciB0byB2aXJ0dWFsIGFycmF5cyAqLwotICBjb2VmLT53aG9sZV9pbWFnZSA9IGNvZWZfYXJyYXlzOwotCi0gIC8qIEFsbG9jYXRlIGFuZCBwcmUtemVybyBzcGFjZSBmb3IgZHVtbXkgRENUIGJsb2Nrcy4gKi8KLSAgYnVmZmVyID0gKEpCTE9DS1JPVykKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCUNfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgYnVmZmVyLCBDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOwotICBmb3IgKGkgPSAwOyBpIDwgQ19NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7Ci0gICAgY29lZi0+ZHVtbXlfYnVmZmVyW2ldID0gYnVmZmVyICsgaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRhcGltaW4uYyBiL2xpYmpwZWd0d3JwL2pkYXBpbWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTYwN2UuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRhcGltaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKgotICogamRhcGltaW4uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCi0gKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCi0gKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlCi0gKiB0cmFuc2NvZGluZy1vbmx5IGNhc2UuCi0gKgotICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCi0gKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpkYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNvbWFwaS5jIGZvciByb3V0aW5lcwotICogc2hhcmVkIGJ5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamR0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcKLSAqIGNhc2UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCi0gKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfQ3JlYXRlRGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQotewotICBpbnQgaTsKLQotICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KLSAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCi0gIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKLSAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAotCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7Ci0KLSAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KLSAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0Ci0gICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgotICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKLSAgICogY29tcGxhaW4gaGVyZS4KLSAgICovCi0gIHsKLSAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOwotICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLwotICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOwotICAgIGNpbmZvLT5lcnIgPSBlcnI7Ci0gICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7Ci0gIH0KLSAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IFRSVUU7Ci0gIGNpbmZvLT50aWxlX2RlY29kZSA9IEZBTFNFOwotCi0gIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KLSAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCi0gIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7Ci0gIGNpbmZvLT5zcmMgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQotICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIG1hcmtlciBwcm9jZXNzb3Igc28gYXBwbGljYXRpb24gY2FuIG92ZXJyaWRlIG1ldGhvZHMKLSAgICogZm9yIENPTSwgQVBQbiBtYXJrZXJzIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIuCi0gICAqLwotICBjaW5mby0+bWFya2VyX2xpc3QgPSBOVUxMOwotICBqaW5pdF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKLQotICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgb3ZlcmFsbCBpbnB1dCBjb250cm9sbGVyLiAqLwotICBqaW5pdF9pbnB1dF9jb250cm9sbGVyKGNpbmZvKTsKLQotICAvKiBPSywgSSdtIHJlYWR5ICovCi0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7Ci19Ci0KLQotLyoKLSAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZXN0cm95X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLwotfQotCi0KLS8qCi0gKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKLSAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hYm9ydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCi19Ci0KLQotLyoKLSAqIFNldCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBHdWVzcyB0aGUgaW5wdXQgY29sb3JzcGFjZSwgYW5kIHNldCBvdXRwdXQgY29sb3JzcGFjZSBhY2NvcmRpbmdseS4gKi8KLSAgLyogKFdpc2ggSlBFRyBjb21taXR0ZWUgaGFkIHByb3ZpZGVkIGEgcmVhbCB3YXkgdG8gc3BlY2lmeSB0aGlzLi4uKSAqLwotICAvKiBOb3RlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBvdXIgZ3Vlc3Nlcy4gKi8KLSAgc3dpdGNoIChjaW5mby0+bnVtX2NvbXBvbmVudHMpIHsKLSAgY2FzZSAxOgotICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSAzOgotICAgIGlmIChjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7Ci0gICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogSkZJRiBpbXBsaWVzIFlDYkNyICovCi0gICAgfSBlbHNlIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7Ci0gICAgICBjYXNlIDA6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogYXNzdW1lIGl0J3MgWUNiQ3IgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogU2F3IG5vIHNwZWNpYWwgbWFya2VycywgdHJ5IHRvIGd1ZXNzIGZyb20gdGhlIGNvbXBvbmVudCBJRHMgKi8KLSAgICAgIGludCBjaWQwID0gY2luZm8tPmNvbXBfaW5mb1swXS5jb21wb25lbnRfaWQ7Ci0gICAgICBpbnQgY2lkMSA9IGNpbmZvLT5jb21wX2luZm9bMV0uY29tcG9uZW50X2lkOwotICAgICAgaW50IGNpZDIgPSBjaW5mby0+Y29tcF9pbmZvWzJdLmNvbXBvbmVudF9pZDsKLQotICAgICAgaWYgKGNpZDAgPT0gMSAmJiBjaWQxID09IDIgJiYgY2lkMiA9PSAzKQotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgSkZJRiB3L291dCBtYXJrZXIgKi8KLSAgICAgIGVsc2UgaWYgKGNpZDAgPT0gODIgJiYgY2lkMSA9PSA3MSAmJiBjaWQyID09IDY2KQotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogQVNDSUkgJ1InLCAnRycsICdCJyAqLwotICAgICAgZWxzZSB7Ci0JVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfVU5LTk9XTl9JRFMsIGNpZDAsIGNpZDEsIGNpZDIpOwotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLwotICAgICAgfQotICAgIH0KLSAgICAvKiBBbHdheXMgZ3Vlc3MgUkdCIGlzIHByb3BlciBvdXRwdXQgY29sb3JzcGFjZS4gKi8KLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSA0OgotICAgIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7Ci0gICAgICBjYXNlIDA6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOyAvKiBhc3N1bWUgaXQncyBZQ0NLICovCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vIHNwZWNpYWwgbWFya2VycywgYXNzdW1lIHN0cmFpZ2h0IENNWUsuICovCi0gICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOwotICAgIH0KLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGRlZmF1bHQ6Ci0gICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBTZXQgZGVmYXVsdHMgZm9yIG90aGVyIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KLSAgY2luZm8tPnNjYWxlX251bSA9IDE7CQkvKiAxOjEgc2NhbGluZyAqLwotICBjaW5mby0+c2NhbGVfZGVub20gPSAxOwotICBjaW5mby0+b3V0cHV0X2dhbW1hID0gMS4wOwotICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBGQUxTRTsKLSAgY2luZm8tPnJhd19kYXRhX291dCA9IEZBTFNFOwotICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKLSAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBUUlVFOwotICBjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nID0gVFJVRTsKLSAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IEZBTFNFOwotICAvKiBXZSBzZXQgdGhlc2UgaW4gY2FzZSBhcHBsaWNhdGlvbiBvbmx5IHNldHMgcXVhbnRpemVfY29sb3JzLiAqLwotICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFOwotI2Vsc2UKLSAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7Ci0jZW5kaWYKLSAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKLSAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKLSAgLyogSW5pdGlhbGl6ZSBmb3Igbm8gbW9kZSBjaGFuZ2UgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLSAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOwotICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7Ci0gIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKLX0KLQotCi0vKgotICogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlLgotICogTmVlZCBvbmx5IGluaXRpYWxpemUgSlBFRyBvYmplY3QgYW5kIHN1cHBseSBhIGRhdGEgc291cmNlIGJlZm9yZSBjYWxsaW5nLgotICoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHJlYWQgYXMgZmFyIGFzIHRoZSBmaXJzdCBTT1MgbWFya2VyIChpZSwgYWN0dWFsIHN0YXJ0IG9mCi0gKiBjb21wcmVzc2VkIGRhdGEpLCBhbmQgd2lsbCBzYXZlIGFsbCB0YWJsZXMgYW5kIHBhcmFtZXRlcnMgaW4gdGhlIEpQRUcKLSAqIG9iamVjdC4gIEl0IHdpbGwgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdAotICogdmFsdWVzLCBhbmQgZmluYWxseSByZXR1cm4gSlBFR19IRUFERVJfT0suICBPbiByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtYXkKLSAqIGFkanVzdCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzLgotICogKE9yLCBpZiB0aGUgYXBwbGljYXRpb24gb25seSB3YW50ZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSBwYXJhbWV0ZXJzLAotICogdGhlIGRhdGEgbmVlZCBub3QgYmUgZGVjb21wcmVzc2VkLiAgSW4gdGhhdCBjYXNlLCBjYWxsIGpwZWdfYWJvcnQgb3IKLSAqIGpwZWdfZGVzdHJveSB0byByZWxlYXNlIGFueSB0ZW1wb3Jhcnkgc3BhY2UuKQotICogSWYgYW4gYWJicmV2aWF0ZWQgKHRhYmxlcyBvbmx5KSBkYXRhc3RyZWFtIGlzIHByZXNlbnRlZCwgdGhlIHJvdXRpbmUgd2lsbAotICogcmV0dXJuIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZIHVwb24gcmVhY2hpbmcgRU9JLiAgVGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCi0gKiByZS11c2UgdGhlIEpQRUcgb2JqZWN0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW0ocykuCi0gKiBJdCBpcyB1bm5lY2Vzc2FyeSAoYnV0IE9LKSB0byBjYWxsIGpwZWdfYWJvcnQgaW4gdGhpcyBjYXNlLgotICogVGhlIEpQRUdfU1VTUEVOREVEIHJldHVybiBjb2RlIG9ubHkgb2NjdXJzIGlmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUKLSAqIHJlcXVlc3RzIHN1c3BlbnNpb24gb2YgdGhlIGRlY29tcHJlc3Nvci4gIEluIHRoaXMgY2FzZSB0aGUgYXBwbGljYXRpb24KLSAqIHNob3VsZCBsb2FkIG1vcmUgc291cmNlIGRhdGEgYW5kIHRoZW4gcmUtY2FsbCBqcGVnX3JlYWRfaGVhZGVyIHRvIHJlc3VtZQotICogcHJvY2Vzc2luZy4KLSAqIElmIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZCBhbmQgcmVxdWlyZV9pbWFnZSBpcyBUUlVFLCB0aGVuIHRoZQotICogcmV0dXJuIGNvZGUgbmVlZCBub3QgYmUgaW5zcGVjdGVkIHNpbmNlIG9ubHkgSlBFR19IRUFERVJfT0sgaXMgcG9zc2libGUuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIG5vdyBqdXN0IGEgZnJvbnQgZW5kIHRvIGpwZWdfY29uc3VtZV9pbnB1dCwgd2l0aCBzb21lCi0gKiBleHRyYSBlcnJvciBjaGVja2luZy4KLSAqLwotCi1HTE9CQUwoaW50KQotanBlZ19yZWFkX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiByZXF1aXJlX2ltYWdlKQotewotICBpbnQgcmV0Y29kZTsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RBUlQgJiYKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0lOSEVBREVSKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgcmV0Y29kZSA9IGpwZWdfY29uc3VtZV9pbnB1dChjaW5mbyk7Ci0KLSAgc3dpdGNoIChyZXRjb2RlKSB7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoKLSAgICByZXRjb2RlID0gSlBFR19IRUFERVJfT0s7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX0VPSToKLSAgICBpZiAocmVxdWlyZV9pbWFnZSkJCS8qIENvbXBsYWluIGlmIGFwcGxpY2F0aW9uIHdhbnRlZCBhbiBpbWFnZSAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19JTUFHRSk7Ci0gICAgLyogUmVzZXQgdG8gc3RhcnQgc3RhdGU7IGl0IHdvdWxkIGJlIHNhZmVyIHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCi0gICAgICogY2FsbCBqcGVnX2Fib3J0LCBidXQgd2UgY2FuJ3QgY2hhbmdlIGl0IG5vdyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgotICAgICAqIEEgc2lkZSBlZmZlY3QgaXMgdG8gZnJlZSBhbnkgdGVtcG9yYXJ5IG1lbW9yeSAodGhlcmUgc2hvdWxkbid0IGJlIGFueSkuCi0gICAgICovCi0gICAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHNldHMgc3RhdGUgPSBEU1RBVEVfU1RBUlQgKi8KLSAgICByZXRjb2RlID0gSlBFR19IRUFERVJfVEFCTEVTX09OTFk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19TVVNQRU5ERUQ6Ci0gICAgLyogbm8gd29yayAqLwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLQotLyoKLSAqIENvbnN1bWUgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgdGhlIGRlY29tcHJlc3NvciByZXF1aXJlcy4KLSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBvbmNlIHRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGhhcwotICogYmVlbiBjcmVhdGVkIGFuZCBhIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB1cC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgZXNzZW50aWFsbHkgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgaGFuZGxlcyBhIGNvdXBsZQotICogb2YgY3JpdGljYWwgc3RhdGUtdHJhbnNpdGlvbiBhY3Rpb25zLCBuYW1lbHkgaW5pdGlhbCBzZXR1cCBhbmQKLSAqIHRyYW5zaXRpb24gZnJvbSBoZWFkZXIgc2Nhbm5pbmcgdG8gcmVhZHktZm9yLXN0YXJ0X2RlY29tcHJlc3MuCi0gKiBBbGwgdGhlIGFjdHVhbCBpbnB1dCBpcyBkb25lIHZpYSB0aGUgaW5wdXQgY29udHJvbGxlcidzIGNvbnN1bWVfaW5wdXQKLSAqIG1ldGhvZC4KLSAqLwotCi1HTE9CQUwoaW50KQotanBlZ19jb25zdW1lX2lucHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgcmV0Y29kZSA9IEpQRUdfU1VTUEVOREVEOwotCi0gIC8qIE5COiBldmVyeSBwb3NzaWJsZSBEU1RBVEUgdmFsdWUgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGlzIHN3aXRjaCAqLwotICBzd2l0Y2ggKGNpbmZvLT5nbG9iYWxfc3RhdGUpIHsKLSAgY2FzZSBEU1RBVEVfU1RBUlQ6Ci0gICAgLyogU3RhcnQtb2YtZGF0YXN0cmVhbSBhY3Rpb25zOiByZXNldCBhcHByb3ByaWF0ZSBtb2R1bGVzICovCi0gICAgKCpjaW5mby0+aW5wdXRjdGwtPnJlc2V0X2lucHV0X2NvbnRyb2xsZXIpIChjaW5mbyk7Ci0gICAgLyogSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbidzIGRhdGEgc291cmNlIG1vZHVsZSAqLwotICAgICgqY2luZm8tPnNyYy0+aW5pdF9zb3VyY2UpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9JTkhFQURFUjsKLSAgICAvKkZBTExUSFJPVUdIKi8KLSAgY2FzZSBEU1RBVEVfSU5IRUFERVI6Ci0gICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpIHsgLyogRm91bmQgU09TLCBwcmVwYXJlIHRvIGRlY29tcHJlc3MgKi8KLSAgICAgIC8qIFNldCB1cCBkZWZhdWx0IHBhcmFtZXRlcnMgYmFzZWQgb24gaGVhZGVyIGRhdGEgKi8KLSAgICAgIGRlZmF1bHRfZGVjb21wcmVzc19wYXJtcyhjaW5mbyk7Ci0gICAgICAvKiBTZXQgZ2xvYmFsIHN0YXRlOiByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLwotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRUFEWTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRFNUQVRFX1JFQURZOgotICAgIC8qIENhbid0IGFkdmFuY2UgcGFzdCBmaXJzdCBTT1MgdW50aWwgc3RhcnRfZGVjb21wcmVzcyBpcyBjYWxsZWQgKi8KLSAgICByZXRjb2RlID0gSlBFR19SRUFDSEVEX1NPUzsKLSAgICBicmVhazsKLSAgY2FzZSBEU1RBVEVfUFJFTE9BRDoKLSAgY2FzZSBEU1RBVEVfUFJFU0NBTjoKLSAgY2FzZSBEU1RBVEVfU0NBTk5JTkc6Ci0gIGNhc2UgRFNUQVRFX1JBV19PSzoKLSAgY2FzZSBEU1RBVEVfQlVGSU1BR0U6Ci0gIGNhc2UgRFNUQVRFX0JVRlBPU1Q6Ci0gIGNhc2UgRFNUQVRFX1NUT1BQSU5HOgotICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICB9Ci0gIHJldHVybiByZXRjb2RlOwotfQotCi0KLS8qCi0gKiBIYXZlIHdlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGlucHV0IGZpbGU/Ci0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2lucHV0X2NvbXBsZXRlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBDaGVjayBmb3IgdmFsaWQganBlZyBvYmplY3QgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfU1RBUlQgfHwKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQ7Ci19Ci0KLQotLyoKLSAqIElzIHRoZXJlIG1vcmUgdGhhbiBvbmUgc2Nhbj8KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfaGFzX211bHRpcGxlX3NjYW5zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBPbmx5IHZhbGlkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgY29tcGxldGVzICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlIDwgRFNUQVRFX1JFQURZIHx8Ci0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID4gRFNUQVRFX1NUT1BQSU5HKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FuczsKLX0KLQotCi0vKgotICogRmluaXNoIEpQRUcgZGVjb21wcmVzc2lvbi4KLSAqCi0gKiBUaGlzIHdpbGwgbm9ybWFsbHkganVzdCB2ZXJpZnkgdGhlIGZpbGUgdHJhaWxlciBhbmQgcmVsZWFzZSB0ZW1wIHN0b3JhZ2UuCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19maW5pc2hfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICAvKiBUZXJtaW5hdGUgZmluYWwgcGFzcyBvZiBub24tYnVmZmVyZWQgbW9kZSAqLwotI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0jZW5kaWYKLSAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UT09fTElUVExFX0RBVEEpOwotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpIHsKLSAgICAvKiBGaW5pc2hpbmcgYWZ0ZXIgYSBidWZmZXJlZC1pbWFnZSBvcGVyYXRpb24gKi8KLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOwotICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1NUT1BQSU5HKSB7Ci0gICAgLyogU1RPUFBJTkcgPSByZXBlYXQgY2FsbCBhZnRlciBhIHN1c3BlbnNpb24sIGFueXRoaW5nIGVsc2UgaXMgZXJyb3IgKi8KLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICB9Ci0gIC8qIFJlYWQgdW50aWwgRU9JICovCi0jaWZuZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgd2hpbGUgKCEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLwotICB9Ci0jZW5kaWYKLSAgLyogRG8gZmluYWwgY2xlYW51cCAqLwotICAoKmNpbmZvLT5zcmMtPnRlcm1fc291cmNlKSAoY2luZm8pOwotICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLwotICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZGFwaXN0ZC5jIGIvbGlianBlZ3R3cnAvamRhcGlzdGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyMzNkZi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGFwaXN0ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBqZGFwaXN0ZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBkZWNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCi0gKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2UuICBUaGV5IGFyZSBub3QgdXNlZCBieSBhCi0gKiB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IGlmIGFuIGFwcGxpY2F0aW9uIGxpbmtzIGluCi0gKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MsIGl0IHdpbGwgZW5kIHVwIGxpbmtpbmcgaW4gdGhlIGVudGlyZSBkZWNvbXByZXNzb3IuCi0gKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamRhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQotICogd2hvbGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IGludG8gYSB0cmFuc2NvZGVyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTE9DQUwoYm9vbGVhbikgb3V0cHV0X3Bhc3Nfc2V0dXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIERlY29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24uCi0gKiBqcGVnX3JlYWRfaGVhZGVyIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCi0gKgotICogSWYgYSBtdWx0aXBhc3Mgb3BlcmF0aW5nIG1vZGUgd2FzIHNlbGVjdGVkLCB0aGlzIHdpbGwgZG8gYWxsIGJ1dCB0aGUKLSAqIGxhc3QgcGFzcywgYW5kIHRodXMgbWF5IHRha2UgYSBncmVhdCBkZWFsIG9mIHRpbWUuCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19zdGFydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKLSAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIG1hc3RlciBjb250cm9sLCBzZWxlY3QgYWN0aXZlIG1vZHVsZXMgKi8KLSAgICBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyhjaW5mbyk7Ci0gICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgICAgLyogTm8gbW9yZSB3b3JrIGhlcmU7IGV4cGVjdGluZyBqcGVnX3N0YXJ0X291dHB1dCBuZXh0ICovCi0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRklNQUdFOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFTE9BRDsKLSAgfQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUFJFTE9BRCkgewotICAgIC8qIElmIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBhYnNvcmIgdGhlbSBhbGwgaW50byB0aGUgY29lZiBidWZmZXIgKi8KLSAgICBpZiAoY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICAgIGZvciAoOzspIHsKLQlpbnQgcmV0Y29kZTsKLQkvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0JaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKQotCSAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0JLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLwotCXJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLQlpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKLQkgIHJldHVybiBGQUxTRTsKLQlpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQotCSAgYnJlYWs7Ci0JLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCi0JaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCi0JICAgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7Ci0JICBpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKLQkgICAgLyogamRtYXN0ZXIgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCi0JICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLQkgIH0KLQl9Ci0gICAgICB9Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotICAgIH0KLSAgICBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOwotICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogUGVyZm9ybSBhbnkgZHVtbXkgb3V0cHV0IHBhc3NlcywgYW5kIHNldCB1cCBmb3IgdGhlIGZpbmFsIHBhc3MgKi8KLSAgcmV0dXJuIG91dHB1dF9wYXNzX3NldHVwKGNpbmZvKTsKLX0KLQotLyoKLSAqIFRpbGUgZGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KLSAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfc3RhcnRfdGlsZV9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKLSAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIG1hc3RlciBjb250cm9sLCBzZWxlY3QgYWN0aXZlIG1vZHVsZXMgKi8KLSAgICBjaW5mby0+dGlsZV9kZWNvZGUgPSBUUlVFOwotICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKLSAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRklNQUdFOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFTE9BRDsKLSAgfQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUFJFTE9BRCkgewotICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLwotICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOwotfQotCi0KLS8qCi0gKiBTZXQgdXAgZm9yIGFuIG91dHB1dCBwYXNzLCBhbmQgcGVyZm9ybSBhbnkgZHVtbXkgcGFzcyhlcykgbmVlZGVkLgotICogQ29tbW9uIHN1YnJvdXRpbmUgZm9yIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBhbmQganBlZ19zdGFydF9vdXRwdXQuCi0gKiBFbnRyeTogZ2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU4gb25seSBpZiBwcmV2aW91c2x5IHN1c3BlbmRlZC4KLSAqIEV4aXQ6IElmIGRvbmUsIHJldHVybnMgVFJVRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgZm9yIHByb3BlciBvdXRwdXQgbW9kZS4KLSAqICAgICAgIElmIHN1c3BlbmRlZCwgcmV0dXJucyBGQUxTRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTi4KLSAqLwotCi1MT0NBTChib29sZWFuKQotb3V0cHV0X3Bhc3Nfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKSB7Ci0gICAgLyogRmlyc3QgY2FsbDogZG8gcGFzcyBzZXR1cCAqLwotICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IDA7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOOwotICB9Ci0gIC8qIExvb3Agb3ZlciBhbnkgcmVxdWlyZWQgZHVtbXkgcGFzc2VzICovCi0gIHdoaWxlIChjaW5mby0+bWFzdGVyLT5pc19kdW1teV9wYXNzKSB7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gICAgLyogQ3JhbmsgdGhyb3VnaCB0aGUgZHVtbXkgcGFzcyAqLwotICAgIHdoaWxlIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICAgIEpESU1FTlNJT04gbGFzdF9zY2FubGluZTsKLSAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgfQotICAgICAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KLSAgICAgIGxhc3Rfc2NhbmxpbmUgPSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOwotICAgICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUEFSUkFZKSBOVUxMLAotCQkJCSAgICAmY2luZm8tPm91dHB1dF9zY2FubGluZSwgKEpESU1FTlNJT04pIDApOwotICAgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPT0gbGFzdF9zY2FubGluZSkKLQlyZXR1cm4gRkFMU0U7CQkvKiBObyBwcm9ncmVzcyBtYWRlLCBtdXN0IHN1c3BlbmQgKi8KLSAgICB9Ci0gICAgLyogRmluaXNoIHVwIGR1bW15IHBhc3MsIGFuZCBzZXQgdXAgZm9yIGFub3RoZXIgb25lICovCi0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotICB9Ci0gIC8qIFJlYWR5IGZvciBhcHBsaWNhdGlvbiB0byBkcml2ZSBvdXRwdXQgcGFzcyB0aHJvdWdoCi0gICAqIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ19yZWFkX3Jhd19kYXRhLgotICAgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IGNpbmZvLT5yYXdfZGF0YV9vdXQgPyBEU1RBVEVfUkFXX09LIDogRFNUQVRFX1NDQU5OSU5HOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogUmVhZCBzb21lIHNjYW5saW5lcyBvZiBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGxpbmVzIGFjdHVhbGx5IHJlYWQuCi0gKiBUaGlzIG1heSBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQgaW4gc2V2ZXJhbCBjYXNlcywKLSAqIGluY2x1ZGluZyBib3R0b20gb2YgaW1hZ2UsIGRhdGEgc291cmNlIHN1c3BlbnNpb24sIGFuZCBvcGVyYXRpbmcKLSAqIG1vZGVzIHRoYXQgZW1pdCBtdWx0aXBsZSBzY2FubGluZXMgYXQgYSB0aW1lLgotICoKLSAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBzaW5jZQotICogdGhpcyBsaWtlbHkgc2lnbmFscyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIGVycm9yLiAgSG93ZXZlciwKLSAqIGFuIG92ZXJzaXplIGJ1ZmZlciAobWF4X2xpbmVzID4gc2NhbmxpbmVzIHJlbWFpbmluZykgaXMgbm90IGFuIGVycm9yLgotICovCi0KLUdMT0JBTChKRElNRU5TSU9OKQotanBlZ19yZWFkX3NjYW5saW5lcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBzY2FubGluZXMsCi0JCSAgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCi17Ci0gIEpESU1FTlNJT04gcm93X2N0cjsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU0NBTk5JTkcpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KLSAgcm93X2N0ciA9IDA7Ci0gICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBtYXhfbGluZXMpOwotICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IHJvd19jdHI7Ci0gIHJldHVybiByb3dfY3RyOwotfQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGpwZWcgZGVjb2RlciB0byBkZWNvbXByZXNzaW5nIGEgcmVjdGFuZ2xlIHdpdGggc2l6ZSBvZiAod2lkdGgsIGhlaWdodCkKLSAqIGFuZCBpdHMgdXBwZXItbGVmdCBjb3JuZXIgbG9jYXRlZCBhdCAoc3RhcnRfeCwgc3RhcnRfeSkuCi0gKiBBbGlnbiBzdGFydF94IGFuZCBzdGFydF95IHRvIG11bHRpcGxpZXMgb2YgaU1DVSB3aWR0aCBhbmQgaGVpZ2h0LCByZXNwZWN0aXZlbHkuCi0gKiBBbHNvLCB0aGUgbmV3IHJlYWRlciBwb3NpdGlvbiBhbmQgc2FtcGxlZCBpbWFnZSBzaXplIHdpbGwgYmUgcmV0dXJuZWQgaW4KLSAqIChzdGFydF94LCBzdGFydF95KSBhbmQgKHdpZHRoLCBoZWlnaHQpLCByZXNwZWN0aXZlbHkuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2luaXRfcmVhZF90aWxlX3NjYW5saW5lKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4LAotCQkgICAgIGludCAqc3RhcnRfeCwgaW50ICpzdGFydF95LCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkKLXsKLSAgLy8gQ2FsY3VsYXRlcyB0aGUgYm91bmRhcnkgb2YgaU1DVQotICBpbnQgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKLSAgaW50IGxpbmVzX3Blcl9pTUNVX2NvbCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkU7Ci0gIGludCByb3dfb2Zmc2V0ID0gKnN0YXJ0X3kgLyBsaW5lc19wZXJfaU1DVV9yb3c7Ci0gIGludCBjb2xfbGVmdF9ib3VuZGFyeSA9ICgoKnN0YXJ0X3ggLyBsaW5lc19wZXJfaU1DVV9jb2wpCi0gICAgICAgICAgICAvIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUpICogaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZTsKLSAgaW50IGNvbF9yaWdodF9ib3VuZGFyeSA9Ci0gICAgICAgICAgICAgICAgICBqZGl2X3JvdW5kX3VwKCpzdGFydF94ICsgKndpZHRoLCBsaW5lc19wZXJfaU1DVV9jb2wpOwotCi0gIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uc190b19za2lwID0KLSAgICAgICpzdGFydF94IC8gbGluZXNfcGVyX2lNQ1VfY29sIC0gY29sX2xlZnRfYm91bmRhcnk7Ci0KLSAgKmhlaWdodCA9ICgqc3RhcnRfeSAtIHJvd19vZmZzZXQgKiBsaW5lc19wZXJfaU1DVV9yb3cpICsgKmhlaWdodDsKLSAgKnN0YXJ0X3ggPSBjb2xfbGVmdF9ib3VuZGFyeSAqIGxpbmVzX3Blcl9pTUNVX2NvbDsKLSAgKnN0YXJ0X3kgPSByb3dfb2Zmc2V0ICogbGluZXNfcGVyX2lNQ1Vfcm93OwotICBjaW5mby0+aW1hZ2Vfd2lkdGggPSBqbWluKGNpbmZvLT5vcmlnaW5hbF9pbWFnZV93aWR0aCwKLSAgICAgICAgICBjb2xfcmlnaHRfYm91bmRhcnkgKiBsaW5lc19wZXJfaU1DVV9jb2wpIC0KLSAgICAgICAgICBjb2xfbGVmdF9ib3VuZGFyeSAqIGxpbmVzX3Blcl9pTUNVX2NvbDsKLSAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKLSAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IHJvd19vZmZzZXQ7Ci0KLSAgLy8gVXBkYXRlcyBKUEVHIGRlY29kZXIgcGFyYW1ldGVyCi0gIGppbml0X2NvbG9yX2RlY29udmVydGVyKGNpbmZvKTsKLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLSAgamluaXRfdXBzYW1wbGVyKGNpbmZvKTsKLSAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gIGVsc2UKLSAgICBqcGVnX2RlY29tcHJlc3NfcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotCi0gIGludCBzYW1wbGVfc2l6ZSA9IERDVFNJWkUgLyBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLQotICAqaGVpZ2h0ID0gamRpdl9yb3VuZF91cCgqaGVpZ2h0LCBzYW1wbGVfc2l6ZSk7Ci0gICp3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSBsaW5lc19wZXJfaU1DVV9yb3cgKiByb3dfb2Zmc2V0IC8gc2FtcGxlX3NpemU7Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGE7Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4ID0KLSAgICAgIGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleDsKLSAgY2luZm8tPmVudHJvcHktPmluZGV4ID0gaW5kZXg7Ci0gIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IHJvd19vZmZzZXQ7Ci0gIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPSByb3dfb2Zmc2V0OwotICBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5ID0gY29sX2xlZnRfYm91bmRhcnk7Ci0gIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX3JpZ2h0X2JvdW5kYXJ5ID0gY29sX3JpZ2h0X2JvdW5kYXJ5OwotICBjaW5mby0+Y29lZi0+Y29sdW1uX2xlZnRfYm91bmRhcnkgPQotICAgICAgY29sX2xlZnRfYm91bmRhcnkgLyBpbmRleC0+TUNVX3NhbXBsZV9zaXplOwotICBjaW5mby0+Y29lZi0+Y29sdW1uX3JpZ2h0X2JvdW5kYXJ5ID0KLSAgICAgIGpkaXZfcm91bmRfdXAoY29sX3JpZ2h0X2JvdW5kYXJ5LCBpbmRleC0+TUNVX3NhbXBsZV9zaXplKTsKLX0KLQotLyoKLSAqIFJlYWQgYSBzY2FubGluZSBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICoKLSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGFjdHVhbGx5IHJlYWQuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3JlYWRfdGlsZV9zY2FubGluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgsCi0gICAgICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzKQotewotICAvLyBDYWxjdWxhdGVzIHRoZSBib3VuZGFyeSBvZiBpTUNVCi0gIGludCBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotICBpbnQgbGluZXNfcGVyX2lNQ1VfY29sID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRTsKLSAgaW50IHNhbXBsZV9zaXplID0gRENUU0laRSAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICBKRElNRU5TSU9OIHJvd19jdHIgPSAwOwotCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCAxKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSAlIChsaW5lc19wZXJfaU1DVV9yb3cgLyBzYW1wbGVfc2l6ZSkgPT0gMCkgewotICAgICAgLy8gU2V0IHRoZSByZWFkIGhlYWQgdG8gdGhlIG5leHQgaU1DVSByb3cKLSAgICAgIGludCBpTUNVX3Jvd19vZmZzZXQgPSBjaW5mby0+b3V0cHV0X3NjYW5saW5lIC8KLSAgICAgICAgICAgIChsaW5lc19wZXJfaU1DVV9yb3cgLyBzYW1wbGVfc2l6ZSk7Ci0gICAgICBpbnQgb2Zmc2V0X2RhdGFfY29sX3Bvc2l0aW9uID0gY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fbGVmdF9ib3VuZGFyeSAvCi0gICAgICAgICAgICBpbmRleC0+TUNVX3NhbXBsZV9zaXplOwotICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXRfZGF0YSA9Ci0gICAgICAgICAgaW5kZXgtPnNjYW5bMF0ub2Zmc2V0W2lNQ1Vfcm93X29mZnNldF1bb2Zmc2V0X2RhdGFfY29sX3Bvc2l0aW9uXTsKLSAgICAgICgqY2luZm8tPmVudHJvcHktPmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIpIChjaW5mbywgb2Zmc2V0X2RhdGEpOwotICAgIH0KLSAgICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgc2NhbmxpbmVzLCAmcm93X2N0ciwgMSk7Ci0gIH0KLQotICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IHJvd19jdHI7Ci0gIHJldHVybiByb3dfY3RyOwotfQotCi0vKgotICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHJlYWQgcmF3IGRhdGEuCi0gKiBQcm9jZXNzZXMgZXhhY3RseSBvbmUgaU1DVSByb3cgcGVyIGNhbGwsIHVubGVzcyBzdXNwZW5kZWQuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3JlYWRfcmF3X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKLQkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKQotewotICBKRElNRU5TSU9OIGxpbmVzX3Blcl9pTUNVX3JvdzsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUkFXX09LKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lID49IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KSB7Ci0gICAgV0FSTk1TKGNpbmZvLCBKV1JOX1RPT19NVUNIX0RBVEEpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLSAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgfQotCi0gIC8qIFZlcmlmeSB0aGF0IGF0IGxlYXN0IG9uZSBpTUNVIHJvdyBjYW4gYmUgcmV0dXJuZWQuICovCi0gIGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICBpZiAobWF4X2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOwotCi0gIC8qIERlY29tcHJlc3MgZGlyZWN0bHkgaW50byB1c2VyJ3MgYnVmZmVyLiAqLwotICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpCi0gICAgcmV0dXJuIDA7CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KLQotICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KLSAgY2luZm8tPm91dHB1dF9zY2FubGluZSArPSBsaW5lc19wZXJfaU1DVV9yb3c7Ci0gIHJldHVybiBsaW5lc19wZXJfaU1DVV9yb3c7Ci19Ci0KLQotLyogQWRkaXRpb25hbCBlbnRyeSBwb2ludHMgZm9yIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCi0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIG91dHB1dCBwYXNzIGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUuCi0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX3N0YXJ0X291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYW5fbnVtYmVyKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfQlVGSU1BR0UgJiYKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogTGltaXQgc2NhbiBudW1iZXIgdG8gdmFsaWQgcmFuZ2UgKi8KLSAgaWYgKHNjYW5fbnVtYmVyIDw9IDApCi0gICAgc2Nhbl9udW1iZXIgPSAxOwotICBpZiAoY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCAmJgotICAgICAgc2Nhbl9udW1iZXIgPiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIpCi0gICAgc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7Ci0gIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBzY2FuX251bWJlcjsKLSAgLyogUGVyZm9ybSBhbnkgZHVtbXkgb3V0cHV0IHBhc3NlcywgYW5kIHNldCB1cCBmb3IgdGhlIHJlYWwgcGFzcyAqLwotICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYWZ0ZXIgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KLSAqCi0gKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgotICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCi0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2ZpbmlzaF9vdXRwdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU0NBTk5JTkcgfHwKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SQVdfT0spICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIC8qIFRlcm1pbmF0ZSB0aGlzIHBhc3MuICovCi0gICAgLyogV2UgZG8gbm90IHJlcXVpcmUgdGhlIHdob2xlIHBhc3MgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZC4gKi8KLSAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRlBPU1Q7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfQlVGUE9TVCkgewotICAgIC8qIEJVRlBPU1QgPSByZXBlYXQgY2FsbCBhZnRlciBhIHN1c3BlbnNpb24sIGFueXRoaW5nIGVsc2UgaXMgZXJyb3IgKi8KLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICB9Ci0gIC8qIFJlYWQgbWFya2VycyBsb29raW5nIGZvciBTT1Mgb3IgRU9JICovCi0gIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPD0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgotCSAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKLSAgICBpZiAoKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICByZXR1cm4gRkFMU0U7CQkvKiBTdXNwZW5kLCBjb21lIGJhY2sgbGF0ZXIgKi8KLSAgfQotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRklNQUdFOwotICByZXR1cm4gVFJVRTsKLX0KLQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRhdGFkc3QuYyBiL2xpYmpwZWd0d3JwL2pkYXRhZHN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjZmYjAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRhdGFkc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogamRhdGFkc3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbXByZXNzaW9uIGRhdGEgZGVzdGluYXRpb24gcm91dGluZXMgZm9yIHRoZSBjYXNlIG9mCi0gKiBlbWl0dGluZyBKUEVHIGRhdGEgdG8gYSBmaWxlIChvciBhbnkgc3RkaW8gc3RyZWFtKS4gIFdoaWxlIHRoZXNlIHJvdXRpbmVzCi0gKiBhcmUgc3VmZmljaWVudCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMsIHNvbWUgd2lsbCB3YW50IHRvIHVzZSBhIGRpZmZlcmVudAotICogZGVzdGluYXRpb24gbWFuYWdlci4KLSAqIElNUE9SVEFOVDogd2UgYXNzdW1lIHRoYXQgZndyaXRlKCkgd2lsbCBjb3JyZWN0bHkgdHJhbnNjcmliZSBhbiBhcnJheSBvZgotICogSk9DVEVUcyBpbnRvIDgtYml0LXdpZGUgZWxlbWVudHMgb24gZXh0ZXJuYWwgc3RvcmFnZS4gIElmIGNoYXIgaXMgd2lkZXIKLSAqIHRoYW4gOCBiaXRzIG9uIHlvdXIgbWFjaGluZSwgeW91IG1heSBuZWVkIHRvIGRvIHNvbWUgdHdlYWtpbmcuCi0gKi8KLQotLyogdGhpcyBpcyBub3QgYSBjb3JlIGxpYnJhcnkgbW9kdWxlLCBzbyBpdCBkb2Vzbid0IGRlZmluZSBKUEVHX0lOVEVSTkFMUyAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImplcnJvci5oIgotCi0KLS8qIEV4cGFuZGVkIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0IGZvciBzdGRpbyBvdXRwdXQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgRklMRSAqIG91dGZpbGU7CQkvKiB0YXJnZXQgc3RyZWFtICovCi0gIEpPQ1RFVCAqIGJ1ZmZlcjsJCS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwotfSBteV9kZXN0aW5hdGlvbl9tZ3I7Ci0KLXR5cGVkZWYgbXlfZGVzdGluYXRpb25fbWdyICogbXlfZGVzdF9wdHI7Ci0KLSNkZWZpbmUgT1VUUFVUX0JVRl9TSVpFICA0MDk2CS8qIGNob29zZSBhbiBlZmZpY2llbnRseSBmd3JpdGUnYWJsZSBzaXplICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgZGVzdGluYXRpb24gLS0tIGNhbGxlZCBieSBqcGVnX3N0YXJ0X2NvbXByZXNzCi0gKiBiZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWluaXRfZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9kZXN0X3B0ciBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKLQotICAvKiBBbGxvY2F0ZSB0aGUgb3V0cHV0IGJ1ZmZlciAtLS0gaXQgd2lsbCBiZSByZWxlYXNlZCB3aGVuIGRvbmUgd2l0aCBpbWFnZSAqLwotICBkZXN0LT5idWZmZXIgPSAoSk9DVEVUICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgT1VUUFVUX0JVRl9TSVpFICogU0laRU9GKEpPQ1RFVCkpOwotCi0gIGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+YnVmZmVyOwotICBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIgPSBPVVRQVVRfQlVGX1NJWkU7Ci19Ci0KLQotLyoKLSAqIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyIC0tLSBjYWxsZWQgd2hlbmV2ZXIgYnVmZmVyIGZpbGxzIHVwLgotICoKLSAqIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCB0aGlzIHNob3VsZCB3cml0ZSB0aGUgZW50aXJlIG91dHB1dCBidWZmZXIKLSAqIChpZ25vcmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXh0X291dHB1dF9ieXRlICYgZnJlZV9pbl9idWZmZXIpLAotICogcmVzZXQgdGhlIHBvaW50ZXIgJiBjb3VudCB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciwgYW5kIHJldHVybiBUUlVFCi0gKiBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkdW1wZWQuCi0gKgotICogSW4gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBiZSBhYmxlIHRvIHN1c3BlbmQgY29tcHJlc3Npb24gZHVlIHRvIG91dHB1dAotICogb3ZlcnJ1biwgYSBGQUxTRSByZXR1cm4gaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBjYW5ub3QgYmUgZW1wdGllZCBub3cuCi0gKiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGNvbXByZXNzb3Igd2lsbCByZXR1cm4gdG8gaXRzIGNhbGxlciAocG9zc2libHkgd2l0aAotICogYW4gaW5kaWNhdGlvbiB0aGF0IGl0IGhhcyBub3QgYWNjZXB0ZWQgYWxsIHRoZSBzdXBwbGllZCBzY2FubGluZXMpLiAgVGhlCi0gKiBhcHBsaWNhdGlvbiBzaG91bGQgcmVzdW1lIGNvbXByZXNzaW9uIGFmdGVyIGl0IGhhcyBtYWRlIG1vcmUgcm9vbSBpbiB0aGUKLSAqIG91dHB1dCBidWZmZXIuICBOb3RlIHRoYXQgdGhlcmUgYXJlIHN1YnN0YW50aWFsIHJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlIG9mCi0gKiBzdXNwZW5zaW9uIC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCi0gKgotICogV2hlbiBzdXNwZW5kaW5nLCB0aGUgY29tcHJlc3NvciB3aWxsIGJhY2sgdXAgdG8gYSBjb252ZW5pZW50IHJlc3RhcnQgcG9pbnQKLSAqICh0eXBpY2FsbHkgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVSkuIG5leHRfb3V0cHV0X2J5dGUgJiBmcmVlX2luX2J1ZmZlcgotICogaW5kaWNhdGUgd2hlcmUgdGhlIHJlc3RhcnQgcG9pbnQgd2lsbCBiZSBpZiB0aGUgY3VycmVudCBjYWxsIHJldHVybnMgRkFMU0UuCi0gKiBEYXRhIGJleW9uZCB0aGlzIHBvaW50IHdpbGwgYmUgcmVnZW5lcmF0ZWQgYWZ0ZXIgcmVzdW1wdGlvbiwgc28gZG8gbm90Ci0gKiB3cml0ZSBpdCBvdXQgd2hlbiBlbXB0eWluZyB0aGUgYnVmZmVyIGV4dGVybmFsbHkuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbXB0eV9vdXRwdXRfYnVmZmVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfZGVzdF9wdHIgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7Ci0KLSAgaWYgKEpGV1JJVEUoZGVzdC0+b3V0ZmlsZSwgZGVzdC0+YnVmZmVyLCBPVVRQVVRfQlVGX1NJWkUpICE9Ci0gICAgICAoc2l6ZV90KSBPVVRQVVRfQlVGX1NJWkUpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLQotICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPmJ1ZmZlcjsKLSAgZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyID0gT1VUUFVUX0JVRl9TSVpFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBUZXJtaW5hdGUgZGVzdGluYXRpb24gLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9jb21wcmVzcwotICogYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbi4gIFVzdWFsbHkgbmVlZHMgdG8gZmx1c2ggYnVmZmVyLgotICoKLSAqIE5COiAqbm90KiBjYWxsZWQgYnkganBlZ19hYm9ydCBvciBqcGVnX2Rlc3Ryb3k7IHN1cnJvdW5kaW5nCi0gKiBhcHBsaWNhdGlvbiBtdXN0IGRlYWwgd2l0aCBhbnkgY2xlYW51cCB0aGF0IHNob3VsZCBoYXBwZW4gZXZlbgotICogZm9yIGVycm9yIGV4aXQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi10ZXJtX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfZGVzdF9wdHIgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7Ci0gIHNpemVfdCBkYXRhY291bnQgPSBPVVRQVVRfQlVGX1NJWkUgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogV3JpdGUgYW55IGRhdGEgcmVtYWluaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgaWYgKGRhdGFjb3VudCA+IDApIHsKLSAgICBpZiAoSkZXUklURShkZXN0LT5vdXRmaWxlLCBkZXN0LT5idWZmZXIsIGRhdGFjb3VudCkgIT0gZGF0YWNvdW50KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLSAgfQotICBmZmx1c2goZGVzdC0+b3V0ZmlsZSk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KLSAgaWYgKGZlcnJvcihkZXN0LT5vdXRmaWxlKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotfQotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciBvdXRwdXQgdG8gYSBzdGRpbyBzdHJlYW0uCi0gKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IG9wZW5lZCB0aGUgc3RyZWFtLCBhbmQgaXMgcmVzcG9uc2libGUKLSAqIGZvciBjbG9zaW5nIGl0IGFmdGVyIGZpbmlzaGluZyBjb21wcmVzc2lvbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc3RkaW9fZGVzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBvdXRmaWxlKQotewotICBteV9kZXN0X3B0ciBkZXN0OwotCi0gIC8qIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QgaXMgbWFkZSBwZXJtYW5lbnQgc28gdGhhdCBtdWx0aXBsZSBKUEVHIGltYWdlcwotICAgKiBjYW4gYmUgd3JpdHRlbiB0byB0aGUgc2FtZSBmaWxlIHdpdGhvdXQgcmUtZXhlY3V0aW5nIGpwZWdfc3RkaW9fZGVzdC4KLSAgICogVGhpcyBtYWtlcyBpdCBkYW5nZXJvdXMgdG8gdXNlIHRoaXMgbWFuYWdlciBhbmQgYSBkaWZmZXJlbnQgZGVzdGluYXRpb24KLSAgICogbWFuYWdlciBzZXJpYWxseSB3aXRoIHRoZSBzYW1lIEpQRUcgb2JqZWN0LCBiZWNhdXNlIHRoZWlyIHByaXZhdGUgb2JqZWN0Ci0gICAqIHNpemVzIG1heSBiZSBkaWZmZXJlbnQuICBDYXZlYXQgcHJvZ3JhbW1lci4KLSAgICovCi0gIGlmIChjaW5mby0+ZGVzdCA9PSBOVUxMKSB7CS8qIGZpcnN0IHRpbWUgZm9yIHRoaXMgSlBFRyBvYmplY3Q/ICovCi0gICAgY2luZm8tPmRlc3QgPSAoc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCQkgIFNJWkVPRihteV9kZXN0aW5hdGlvbl9tZ3IpKTsKLSAgfQotCi0gIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OwotICBkZXN0LT5wdWIuaW5pdF9kZXN0aW5hdGlvbiA9IGluaXRfZGVzdGluYXRpb247Ci0gIGRlc3QtPnB1Yi5lbXB0eV9vdXRwdXRfYnVmZmVyID0gZW1wdHlfb3V0cHV0X2J1ZmZlcjsKLSAgZGVzdC0+cHViLnRlcm1fZGVzdGluYXRpb24gPSB0ZXJtX2Rlc3RpbmF0aW9uOwotICBkZXN0LT5vdXRmaWxlID0gb3V0ZmlsZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkYXRhc3JjLmMgYi9saWJqcGVndHdycC9qZGF0YXNyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM3NTJiLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkYXRhc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIGpkYXRhc3JjLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNvbXByZXNzaW9uIGRhdGEgc291cmNlIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgotICogcmVhZGluZyBKUEVHIGRhdGEgZnJvbSBhIGZpbGUgKG9yIGFueSBzdGRpbyBzdHJlYW0pLiAgV2hpbGUgdGhlc2Ugcm91dGluZXMKLSAqIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgc29tZSB3aWxsIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50Ci0gKiBzb3VyY2UgbWFuYWdlci4KLSAqIElNUE9SVEFOVDogd2UgYXNzdW1lIHRoYXQgZnJlYWQoKSB3aWxsIGNvcnJlY3RseSB0cmFuc2NyaWJlIGFuIGFycmF5IG9mCi0gKiBKT0NURVRzIGZyb20gOC1iaXQtd2lkZSBlbGVtZW50cyBvbiBleHRlcm5hbCBzdG9yYWdlLiAgSWYgY2hhciBpcyB3aWRlcgotICogdGhhbiA4IGJpdHMgb24geW91ciBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZSB0d2Vha2luZy4KLSAqLwotCi0vKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamVycm9yLmgiCi0KLQotLyogRXhwYW5kZWQgZGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBzdGRpbyBpbnB1dCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgRklMRSAqIGluZmlsZTsJCS8qIHNvdXJjZSBzdHJlYW0gKi8KLSAgSk9DVEVUICogYnVmZmVyOwkJLyogc3RhcnQgb2YgYnVmZmVyICovCi0gIGJvb2xlYW4gc3RhcnRfb2ZfZmlsZTsJLyogaGF2ZSB3ZSBnb3R0ZW4gYW55IGRhdGEgeWV0PyAqLwotfSBteV9zb3VyY2VfbWdyOwotCi10eXBlZGVmIG15X3NvdXJjZV9tZ3IgKiBteV9zcmNfcHRyOwotCi0jZGVmaW5lIElOUFVUX0JVRl9TSVpFICA0MDk2CS8qIGNob29zZSBhbiBlZmZpY2llbnRseSBmcmVhZCdhYmxlIHNpemUgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyCi0gKiBiZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWluaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9zcmNfcHRyIHNyYyA9IChteV9zcmNfcHRyKSBjaW5mby0+c3JjOwotCi0gIC8qIFdlIHJlc2V0IHRoZSBlbXB0eS1pbnB1dC1maWxlIGZsYWcgZm9yIGVhY2ggaW1hZ2UsCi0gICAqIGJ1dCB3ZSBkb24ndCBjbGVhciB0aGUgaW5wdXQgYnVmZmVyLgotICAgKiBUaGlzIGlzIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHJlYWRpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gb25lIHNvdXJjZS4KLSAgICovCi0gIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IFRSVUU7Ci19Ci0KLQotLyoKLSAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBpcyBlbXB0aWVkLgotICoKLSAqIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCB0aGlzIHNob3VsZCByZWFkIGZyZXNoIGRhdGEgaW50byB0aGUgYnVmZmVyCi0gKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlICYgYnl0ZXNfaW5fYnVmZmVyKSwKLSAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQotICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvCi0gKiBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUuCi0gKgotICogVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBFT0YgcmV0dXJuLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbgotICogcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzIGEgY2hvaWNlIG9mIEVSUkVYSVQoKSBvciBpbnNlcnRpbmcgZmFrZSBkYXRhIGludG8KLSAqIHRoZSBidWZmZXIuICBJbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYQotICogZmFrZSBFT0kgbWFya2VyIGlzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUKLSAqIGRlY29tcHJlc3NvciB0byBvdXRwdXQgaG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEhvd2V2ZXIsCi0gKiB0aGUgcmVzdWx0aW5nIGVycm9yIG1lc3NhZ2UgaXMgbWlzbGVhZGluZyBpZiB0aGUgcmVhbCBwcm9ibGVtIGlzIGFuIGVtcHR5Ci0gKiBpbnB1dCBmaWxlLCBzbyB3ZSBoYW5kbGUgdGhhdCBjYXNlIHNwZWNpYWxseS4KLSAqCi0gKiBJbiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gc3VzcGVuZCBjb21wcmVzc2lvbiBkdWUgdG8gaW5wdXQKLSAqIG5vdCBiZWluZyBhdmFpbGFibGUgeWV0LCBhIEZBTFNFIHJldHVybiBpbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGRhdGEgY2FuIGJlCi0gKiBvYnRhaW5lZCByaWdodCBub3csIGJ1dCBtb3JlIG1heSBiZSBmb3J0aGNvbWluZyBsYXRlci4gIEluIHRoaXMgc2l0dWF0aW9uLAotICogdGhlIGRlY29tcHJlc3NvciB3aWxsIHJldHVybiB0byBpdHMgY2FsbGVyICh3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCi0gKiBudW1iZXIgb2Ygc2NhbmxpbmVzIGl0IGhhcyByZWFkLCBpZiBhbnkpLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXN1bWUKLSAqIGRlY29tcHJlc3Npb24gYWZ0ZXIgaXQgaGFzIGxvYWRlZCBtb3JlIGRhdGEgaW50byB0aGUgaW5wdXQgYnVmZmVyLiAgTm90ZQotICogdGhhdCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2Ygc3VzcGVuc2lvbiAtLS0gc2VlCi0gKiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqCi0gKiBXaGVuIHN1c3BlbmRpbmcsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50Ci0gKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X2lucHV0X2J5dGUgJiBieXRlc19pbl9idWZmZXIKLSAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgotICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCBtdXN0IGJlIHJlc2Nhbm5lZCBhZnRlciByZXN1bXB0aW9uLCBzbyBtb3ZlIGl0IHRvCi0gKiB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGl0LgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7Ci0gIHNpemVfdCBuYnl0ZXM7Ci0KLSAgbmJ5dGVzID0gSkZSRUFEKHNyYy0+aW5maWxlLCBzcmMtPmJ1ZmZlciwgSU5QVVRfQlVGX1NJWkUpOwotCi0gIGlmIChuYnl0ZXMgPD0gMCkgewotICAgIGlmIChzcmMtPnN0YXJ0X29mX2ZpbGUpCS8qIFRyZWF0IGVtcHR5IGlucHV0IGZpbGUgYXMgZmF0YWwgZXJyb3IgKi8KLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOwotICAgIFdBUk5NUyhjaW5mbywgSldSTl9KUEVHX0VPRik7Ci0gICAgLyogSW5zZXJ0IGEgZmFrZSBFT0kgbWFya2VyICovCi0gICAgc3JjLT5idWZmZXJbMF0gPSAoSk9DVEVUKSAweEZGOwotICAgIHNyYy0+YnVmZmVyWzFdID0gKEpPQ1RFVCkgSlBFR19FT0k7Ci0gICAgbmJ5dGVzID0gMjsKLSAgfQotCi0gIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IHNyYy0+YnVmZmVyOwotICBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSBuYnl0ZXM7Ci0gIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IEZBTFNFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBTa2lwIGRhdGEgLS0tIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCi0gKiB1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLgotICoKLSAqIFdyaXRlcnMgb2Ygc3VzcGVuZGFibGUtaW5wdXQgYXBwbGljYXRpb25zIG11c3Qgbm90ZSB0aGF0IHNraXBfaW5wdXRfZGF0YQotICogaXMgbm90IGdyYW50ZWQgdGhlIHJpZ2h0IHRvIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybi4gIElmIHRoZSBza2lwIGV4dGVuZHMKLSAqIGJleW9uZCB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciwgdGhlIGJ1ZmZlciBjYW4gYmUgbWFya2VkIGVtcHR5IHNvCi0gKiB0aGF0IHRoZSBuZXh0IHJlYWQgd2lsbCBjYXVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyIGNhbGwgdGhhdCBjYW4gc3VzcGVuZC4KLSAqIEFycmFuZ2luZyBmb3IgYWRkaXRpb25hbCBieXRlcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIHJlbG9hZGluZyB0aGUgaW5wdXQKLSAqIGJ1ZmZlciBpcyB0aGUgYXBwbGljYXRpb24gd3JpdGVyJ3MgcHJvYmxlbS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXNraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCi17Ci0gIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7Ci0KLSAgLyogSnVzdCBhIGR1bWIgaW1wbGVtZW50YXRpb24gZm9yIG5vdy4gIENvdWxkIHVzZSBmc2VlaygpIGV4Y2VwdAotICAgKiBpdCBkb2Vzbid0IHdvcmsgb24gcGlwZXMuICBOb3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aAotICAgKiBhbnkgdHJvdWJsZSBhbnl3YXkgLS0tIGxhcmdlIHNraXBzIGFyZSBpbmZyZXF1ZW50LgotICAgKi8KLSAgaWYgKG51bV9ieXRlcyA+IDApIHsKLSAgICB3aGlsZSAobnVtX2J5dGVzID4gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcikgewotICAgICAgbnVtX2J5dGVzIC09IChsb25nKSBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXI7Ci0gICAgICAodm9pZCkgZmlsbF9pbnB1dF9idWZmZXIoY2luZm8pOwotICAgICAgLyogbm90ZSB3ZSBhc3N1bWUgdGhhdCBmaWxsX2lucHV0X2J1ZmZlciB3aWxsIG5ldmVyIHJldHVybiBGQUxTRSwKLSAgICAgICAqIHNvIHN1c3BlbnNpb24gbmVlZCBub3QgYmUgaGFuZGxlZC4KLSAgICAgICAqLwotICAgIH0KLSAgICBzcmMtPnB1Yi5uZXh0X2lucHV0X2J5dGUgKz0gKHNpemVfdCkgbnVtX2J5dGVzOwotICAgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciAtPSAoc2l6ZV90KSBudW1fYnl0ZXM7Ci0gIH0KLX0KLQotCi0vKgotICogQW4gYWRkaXRpb25hbCBtZXRob2QgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyBpcyB0aGUKLSAqIHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gdGhlIHByZXNlbmNlIG9mIFJTVCBtYXJrZXJzLgotICogRm9yIHRoZSBtb21lbnQsIHRoaXMgc291cmNlIG1vZHVsZSBqdXN0IHVzZXMgdGhlIGRlZmF1bHQgcmVzeW5jIG1ldGhvZAotICogcHJvdmlkZWQgYnkgdGhlIEpQRUcgbGlicmFyeS4gIFRoYXQgbWV0aG9kIGFzc3VtZXMgdGhhdCBubyBiYWNrdHJhY2tpbmcKLSAqIGlzIHBvc3NpYmxlLgotICovCi0KLQotLyoKLSAqIFRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCi0gKiBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KLSAqCi0gKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZwotICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KLSAqIGZvciBlcnJvciBleGl0LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotdGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgbmVjZXNzYXJ5IGhlcmUgKi8KLX0KLQotCi0vKgotICogUHJlcGFyZSBmb3IgaW5wdXQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4KLSAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBzdHJlYW0sIGFuZCBpcyByZXNwb25zaWJsZQotICogZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGRlY29tcHJlc3Npb24uCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3N0ZGlvX3NyYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKLXsKLSAgbXlfc3JjX3B0ciBzcmM7Ci0KLSAgLyogVGhlIHNvdXJjZSBvYmplY3QgYW5kIGlucHV0IGJ1ZmZlciBhcmUgbWFkZSBwZXJtYW5lbnQgc28gdGhhdCBhIHNlcmllcwotICAgKiBvZiBKUEVHIGltYWdlcyBjYW4gYmUgcmVhZCBmcm9tIHRoZSBzYW1lIGZpbGUgYnkgY2FsbGluZyBqcGVnX3N0ZGlvX3NyYwotICAgKiBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgb25lLiAgKElmIHdlIGRpc2NhcmRlZCB0aGUgYnVmZmVyIGF0IHRoZSBlbmQgb2YKLSAgICogb25lIGltYWdlLCB3ZSdkIGxpa2VseSBsb3NlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBvbmUuKQotICAgKiBUaGlzIG1ha2VzIGl0IHVuc2FmZSB0byB1c2UgdGhpcyBtYW5hZ2VyIGFuZCBhIGRpZmZlcmVudCBzb3VyY2UKLSAgICogbWFuYWdlciBzZXJpYWxseSB3aXRoIHRoZSBzYW1lIEpQRUcgb2JqZWN0LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCi0gICAqLwotICBpZiAoY2luZm8tPnNyYyA9PSBOVUxMKSB7CS8qIGZpcnN0IHRpbWUgZm9yIHRoaXMgSlBFRyBvYmplY3Q/ICovCi0gICAgY2luZm8tPnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCQkgIFNJWkVPRihteV9zb3VyY2VfbWdyKSk7Ci0gICAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7Ci0gICAgc3JjLT5idWZmZXIgPSAoSk9DVEVUICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCQkgIElOUFVUX0JVRl9TSVpFICogU0laRU9GKEpPQ1RFVCkpOwotICB9Ci0KLSAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7Ci0gIHNyYy0+cHViLmluaXRfc291cmNlID0gaW5pdF9zb3VyY2U7Ci0gIHNyYy0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gZmlsbF9pbnB1dF9idWZmZXI7Ci0gIHNyYy0+cHViLnNraXBfaW5wdXRfZGF0YSA9IHNraXBfaW5wdXRfZGF0YTsKLSAgc3JjLT5wdWIucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OyAvKiB1c2UgZGVmYXVsdCBtZXRob2QgKi8KLSAgc3JjLT5wdWIudGVybV9zb3VyY2UgPSB0ZXJtX3NvdXJjZTsKLSAgc3JjLT5pbmZpbGUgPSBpbmZpbGU7Ci0gIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IDA7IC8qIGZvcmNlcyBmaWxsX2lucHV0X2J1ZmZlciBvbiBmaXJzdCByZWFkICovCi0gIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7IC8qIHVudGlsIGJ1ZmZlciBsb2FkZWQgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkY29lZmN0LmMgYi9saWJqcGVndHdycC9qZGNvZWZjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNlNTZmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkY29lZmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM4ICswLDAgQEAKLS8qCi0gKiBqZGNvZWZjdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyIGZvciBkZWNvbXByZXNzaW9uLgotICogVGhpcyBjb250cm9sbGVyIGlzIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3Blci4KLSAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGVudHJvcHkgZGVjb2RpbmcgYW5kIGludmVyc2UtRENUIHN0ZXBzLgotICoKLSAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoaXMgY29udHJvbGxlciBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4KLSAqIGlucHV0LW9yaWVudGVkIHByb2Nlc3NpbmcgYW5kIG91dHB1dC1vcmllbnRlZCBwcm9jZXNzaW5nLgotICogQWxzbywgdGhlIGlucHV0IHNpZGUgKG9ubHkpIGlzIHVzZWQgd2hlbiByZWFkaW5nIGEgZmlsZSBmb3IgdHJhbnNjb2RpbmcuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0vKiBCbG9jayBzbW9vdGhpbmcgaXMgb25seSBhcHBsaWNhYmxlIGZvciBwcm9ncmVzc2l2ZSBKUEVHLCBzbzogKi8KLSNpZm5kZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSN1bmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0jZW5kaWYKLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBUaGVzZSB2YXJpYWJsZXMga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgaW5wdXQgc2lkZS4gKi8KLSAgLyogY2luZm8tPmlucHV0X2lNQ1Vfcm93IGlzIGFsc28gdXNlZCBmb3IgdGhpcy4gKi8KLSAgSkRJTUVOU0lPTiBNQ1VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCi0gIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCi0gIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCi0KLSAgLyogVGhlIG91dHB1dCBzaWRlJ3MgbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYnkgY2luZm8tPm91dHB1dF9pTUNVX3Jvdy4gKi8KLQotICAvKiBJbiBzaW5nbGUtcGFzcyBtb2RlcywgaXQncyBzdWZmaWNpZW50IHRvIGJ1ZmZlciBqdXN0IG9uZSBNQ1UuCi0gICAqIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlIG9mIERfTUFYX0JMT0NLU19JTl9NQ1UgY29lZmZpY2llbnQgYmxvY2tzLAotICAgKiBhbmQgbGV0IHRoZSBlbnRyb3B5IGRlY29kZXIgd3JpdGUgaW50byB0aGF0IHdvcmtzcGFjZSBlYWNoIHRpbWUuCi0gICAqIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2ggaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOwotICAgKiB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZCB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQKLSAgICogYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCi0gICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcwotICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzOyBpdCBpcyB1c2VkIG9ubHkgYnkgdGhlIGlucHV0IHNpZGUuCi0gICAqLwotICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltEX01BWF9CTE9DS1NfSU5fTUNVXTsKLQotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAvKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB3ZSBuZWVkIGEgdmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOwotI2VuZGlmCi0KLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gIC8qIFdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLCB3ZSBsYXRjaCBjb2VmZmljaWVudCBBbCB2YWx1ZXMgaGVyZSAqLwotICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7Ci0jZGVmaW5lIFNBVkVEX0NPRUZTICA2CQkvKiB3ZSBzYXZlIGNvZWZfYml0c1swLi41XSAqLwotI2VuZGlmCi19IG15X2NvZWZfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihpbnQpIGRlY29tcHJlc3Nfb25lcGFzcwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7Ci0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi1NRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX2RhdGEKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOwotI2VuZGlmCi0jaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotTE9DQUwoYm9vbGVhbikgc21vb3RoaW5nX29rIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19zbW9vdGhfZGF0YQotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7Ci0jZW5kaWYKLQotCi1MT0NBTCh2b2lkKQotc3RhcnRfaU1DVV9yb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBSZXNldCB3aXRoaW4taU1DVS1yb3cgY291bnRlcnMgZm9yIGEgbmV3IHJvdyAoaW5wdXQgc2lkZSkgKi8KLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KLSAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KLSAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCi0gICAqLwotICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7Ci0gICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93IDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OwotICB9Ci0KLSAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIGlucHV0IHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IDA7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSWYgbXVsdGlwYXNzLCBjaGVjayB0byBzZWUgd2hldGhlciB0byB1c2UgYmxvY2sgc21vb3RoaW5nIG9uIHRoaXMgcGFzcyAqLwotICBpZiAoY29lZi0+cHViLmNvZWZfYXJyYXlzICE9IE5VTEwpIHsKLSAgICBpZiAoY2luZm8tPmRvX2Jsb2NrX3Ntb290aGluZyAmJiBzbW9vdGhpbmdfb2soY2luZm8pKQotICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfc21vb3RoX2RhdGE7Ci0gICAgZWxzZQotICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKLSAgfQotI2VuZGlmCi0gIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPSAwOwotfQotCi0KLS8qCi0gKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBzaW5nbGUtcGFzcyBjYXNlLgotICogQWx3YXlzIGF0dGVtcHRzIHRvIGVtaXQgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpLgotICogSW5wdXQgYW5kIG91dHB1dCBtdXN0IHJ1biBpbiBsb2Nrc3RlcCBzaW5jZSB3ZSBoYXZlIG9ubHkgYSBvbmUtTUNVIGJ1ZmZlci4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgotICoKLSAqIE5COiBvdXRwdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAotICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWRlY29tcHJlc3Nfb25lcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBKRElNRU5TSU9OIGxhc3RfTUNVX2NvbCA9IGNpbmZvLT5NQ1VzX3Blcl9yb3cgLSAxOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldCwgdXNlZnVsX3dpZHRoOwotICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sLCBvdXRwdXRfY29sOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOwotCi0jaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQotICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlKSB7Ci0gICAgbGFzdF9NQ1VfY29sID0KLSAgICAgICAgKGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX3JpZ2h0X2JvdW5kYXJ5IC0KLSAgICAgICAgIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX2xlZnRfYm91bmRhcnkpIC0gMTsKLSAgfQotI2VuZGlmCi0KLSAgLyogTG9vcCB0byBwcm9jZXNzIGFzIG11Y2ggYXMgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+TUNVX2N0cjsgTUNVX2NvbF9udW0gPD0gbGFzdF9NQ1VfY29sOwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBUcnkgdG8gZmV0Y2ggYW4gTUNVLiAgRW50cm9weSBkZWNvZGVyIGV4cGVjdHMgYnVmZmVyIHRvIGJlIHplcm9lZC4gKi8KLSAgICAgIGlmIChNQ1VfY29sX251bSA8ICh1bnNpZ25lZCBpbnQpY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXApIHsKLSAgICAgICAgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYpIChjaW5mbyk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyWzBdLAotCQkoc2l6ZV90KSAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSkpOwotICAgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0JICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCSAgY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOwotCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCi0gICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cwotICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKLSAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCi0gICAgICAgKi8KLSAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0JY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLQlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0JICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7Ci0JICBjb250aW51ZTsKLQl9Ci0JaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKLQl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCi0JCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKLQlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKLQkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0Jc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8Ci0JICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKLQkgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2NvbDsKLQkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCB1c2VmdWxfd2lkdGg7IHhpbmRleCsrKSB7Ci0JICAgICAgKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLAotCQkgICAgICAgIChKQ09FRlBUUikgY29lZi0+TUNVX2J1ZmZlcltibGtuK3hpbmRleF0sCi0JCSAgICAgICAgb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7Ci0JICAgICAgb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0JICAgIH0KLQkgIH0KLQkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOwotCSAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0JfQotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgY2luZm8tPm91dHB1dF9pTUNVX3JvdysrOwotICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKLSAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotCi0vKgotICogRHVtbXkgY29uc3VtZS1pbnB1dCByb3V0aW5lIGZvciBzaW5nbGUtcGFzcyBvcGVyYXRpb24uCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWR1bW15X2NvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwkvKiBBbHdheXMgaW5kaWNhdGUgbm90aGluZyB3YXMgZG9uZSAqLwotfQotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0vKgotICogQ29uc3VtZSBpbnB1dCBkYXRhIGFuZCBzdG9yZSBpdCBpbiB0aGUgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuCi0gKiBXZSByZWFkIGFzIG11Y2ggYXMgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpIHBlciBjYWxsLAotICogaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjYW4uCi0gKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotY29uc3VtZV9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OwotICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBmb3IgdGhlIGNvbXBvbmVudHMgdXNlZCBpbiB0aGlzIHNjYW4uICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBidWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCi0gICAgICAgY2luZm8tPnRpbGVfZGVjb2RlID8gMCA6IGNpbmZvLT5pbnB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0gICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgIC8qIE5vdGU6IGVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQsCi0gICAgICogYnV0IHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBtZW1vcnkgbWFuYWdlcgotICAgICAqIGJlY2F1c2Ugd2UgcmVxdWVzdGVkIGEgcHJlLXplcm9lZCBhcnJheS4KLSAgICAgKi8KLSAgfQotICB1bnNpZ25lZCBpbnQgTUNVc19wZXJfcm93ID0gY2luZm8tPk1DVXNfcGVyX3JvdzsKLSNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKLSAgICBpbnQgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGg7Ci0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgewotICAgICAgLy8gSW50ZXJsZWF2ZWQKLSAgICAgIGlNQ1Vfd2lkdGhfVG9fTUNVX3dpZHRoID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTm9uLWludGVydmxlYXZlZAotICAgICAgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+aF9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgTUNVc19wZXJfcm93ID0gam1pbihNQ1VzX3Blcl9yb3csCi0gICAgICAgIChjaW5mby0+Y29lZi0+Y29sdW1uX3JpZ2h0X2JvdW5kYXJ5IC0gY2luZm8tPmNvZWYtPmNvbHVtbl9sZWZ0X2JvdW5kYXJ5KQotICAgICAgICAqIGNpbmZvLT5lbnRyb3B5LT5pbmRleC0+TUNVX3NhbXBsZV9zaXplICogaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGgpOwotICB9Ci0jZW5kaWYKLQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgIC8vIGNvbmZpZ3VyZSBodWZmbWFuIGRlY29kZXIKLSNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgewotICAgICAgaHVmZm1hbl9zY2FuX2hlYWRlciBzY2FuX2hlYWRlciA9Ci0gICAgICAgICAgICBjaW5mby0+ZW50cm9weS0+aW5kZXgtPnNjYW5bY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyXTsKLSAgICAgIGludCBjb2xfb2Zmc2V0ID0gY2luZm8tPmNvZWYtPmNvbHVtbl9sZWZ0X2JvdW5kYXJ5OwotICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikgKGNpbmZvLAotICAgICAgICAgICAgICBzY2FuX2hlYWRlci5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XQotICAgICAgICAgICAgICBbY29sX29mZnNldCArIHlvZmZzZXQgKiBzY2FuX2hlYWRlci5NQ1VzX3Blcl9yb3ddKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIHplcm8gYWxsIGJsb2NrcwotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IE1DVXNfcGVyX3JvdzsKLSAgICAgICAgICBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAgICAgc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0gICAgICAgIGZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLSAgICAgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7Ci0gICAgICAgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7Ci0gICAgICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0jaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQotICAgICAgICAgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSAmJiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gMCkgewotICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHByZS16ZXJvIG91cnNlbHZlcy4KLSAgICAgICAgICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24tMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoU0laRU9GKEpCTE9DSykpKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgewotICAgICAgICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0gICAgICAgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0gICAgICAgIGNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKLSAgICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCi0gICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLS8qCi0gKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBjb2VmZmljaWVudCBidWZmZXIuCi0gKiBSZWFkIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KSBwZXIgY2FsbC4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotY29uc3VtZV9kYXRhX211bHRpX3NjYW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZtYW5faW5kZXggKmluZGV4ID0gY2luZm8tPmVudHJvcHktPmluZGV4OwotICBpbnQgaSwgcmV0Y29kZSwgY2k7Ci0gIGludCBtY3UgPSBjaW5mby0+aW5wdXRfaU1DVV9yb3c7Ci0gIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgewotICAgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbywgaW5kZXgtPnNjYW5baV0uYml0c3RyZWFtX29mZnNldCk7Ci0gICAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IG1jdTsKLSAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gICAgLy8gQ29uc3VtZSBTT1MgYW5kIERIVCBoZWFkZXJzCi0gICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX21hcmtlcnMpIChjaW5mbywgaW5kZXgsIGkpOwotICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IG1jdTsKLSAgICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSBpOwotICAgIGNpbmZvLT5lbnRyb3B5LT5pbmRleCA9IGluZGV4OwotICAgIC8vIENvbnN1bWUgc2NhbiBibG9jayBkYXRhCi0gICAgY29uc3VtZV9kYXRhKGNpbmZvKTsKLSAgfQotICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSBtY3UgKyAxOwotICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOwotICBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gMDsKLSAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLX0KLQotLyoKLSAqIFNhbWUgYXMgY29uc3VtZV9kYXRhLCBleHBlY3QgZm9yIHNhdmluZyB0aGUgSHVmZm1hbiBkZWNvZGUgaW5mb3JtYXRpb24KLSAqIC0gYml0c3RyZWFtIG9mZnNldCBhbmQgREMgY29lZmZpY2llbnQgdG8gaW5kZXguCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KLSAgaW50IGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKLSAgSkRJTUVOU0lPTiBzdGFydF9jb2w7Ci0gIEpCTE9DS1JPVyBidWZmZXJfcHRyOwotCi0gIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW5faGVhZGVyID0gaW5kZXgtPnNjYW4gKyBjdXJyZW50X3NjYW47Ci0gIHNjYW5faGVhZGVyLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0KLSAgc2l6ZV90IGFsbG9jYXRlX3NpemUgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cKLSAgICAgICogamRpdl9yb3VuZF91cChjaW5mby0+TUNVc19wZXJfcm93LCBpbmRleC0+TUNVX3NhbXBsZV9zaXplKQotICAgICAgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSk7Ci0gIHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XSA9Ci0gICAgICAgIChodWZmbWFuX29mZnNldF9kYXRhKiltYWxsb2MoYWxsb2NhdGVfc2l6ZSk7Ci0gIGluZGV4LT5tZW1fdXNlZCArPSBhbGxvY2F0ZV9zaXplOwotCi0gIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldF9kYXRhID0gc2Nhbl9oZWFkZXItPm9mZnNldFtjaW5mby0+aW5wdXRfaU1DVV9yb3ddOwotCi0gIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8vIFJlY29yZCBodWZmbWFuIGJpdCBvZmZzZXQKLSAgICAgIGlmIChNQ1VfY29sX251bSAlIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgPT0gMCkgewotICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICAgICAgKGNpbmZvLCBvZmZzZXRfZGF0YSk7Ci0gICAgICAgICsrb2Zmc2V0X2RhdGE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYpIChjaW5mbykpIHsKLSAgICAgICAgLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotICAgICAgICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotICAgICAgICBjb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07Ci0gICAgICAgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPk1DVV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLwotICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0gIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOwotfQotCi0vKgotICogU2FtZSBhcyBjb25zdW1lX2RhdGEsIGV4cGVjdCBmb3Igc2F2aW5nIHRoZSBIdWZmbWFuIGRlY29kZSBpbmZvcm1hdGlvbgotICogLSBiaXRzdHJlYW0gb2Zmc2V0IGFuZCBEQyBjb2VmZmljaWVudCB0byBpbmRleC4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXhfcHJvZ3Jlc3NpdmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgY3VycmVudF9zY2FuKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OwotICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgaW50IGZhY3RvciA9IDQ7IC8vIG1heGltdW0gZmFjdG9yIGlzIDQuCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgIGZhY3RvciA9IGptaW4oZmFjdG9yLCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmhfc2FtcF9mYWN0b3IpOwotCi0gIGludCBzYW1wbGVfc2l6ZSA9IGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgKiBmYWN0b3I7Ci0gIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW5faGVhZGVyID0gaW5kZXgtPnNjYW4gKyBjdXJyZW50X3NjYW47Ci0gIHNjYW5faGVhZGVyLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gIHNjYW5faGVhZGVyLT5NQ1VzX3Blcl9yb3cgPSBqZGl2X3JvdW5kX3VwKGNpbmZvLT5NQ1VzX3Blcl9yb3csIHNhbXBsZV9zaXplKTsKLSAgc2Nhbl9oZWFkZXItPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+Y29tcHNfaW5fc2NhbjsKLQotICBzaXplX3QgYWxsb2NhdGVfc2l6ZSA9IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdwotICAgICAgKiBzY2FuX2hlYWRlci0+TUNVc19wZXJfcm93ICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEpOwotICBzY2FuX2hlYWRlci0+b2Zmc2V0W2NpbmZvLT5pbnB1dF9pTUNVX3Jvd10gPQotICAgICAgICAoaHVmZm1hbl9vZmZzZXRfZGF0YSopbWFsbG9jKGFsbG9jYXRlX3NpemUpOwotICBpbmRleC0+bWVtX3VzZWQgKz0gYWxsb2NhdGVfc2l6ZTsKLQotICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXRfZGF0YSA9IHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XTsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICAwLCAvLyBPbmx5IG5lZWQgb25lIHJvdyBidWZmZXIKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gIH0KLSAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLyogRm9yIGVhY2ggTUNVLCB3ZSBsb29wIHRocm91Z2ggZGlmZmVyZW50IGNvbG9yIGNvbXBvbmVudHMuCi0gICAgICAgKiBUaGVuLCBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQgd2Ugd2lsbCBnZXQgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVAotICAgICAgICogYmxvY2tzIGluIHRoZSB2aXJ0dWFsIGJ1ZmZlci4KLSAgICAgICAqLwotICAgICAgYmxrbiA9IDA7IC8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICAgIHN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOwotICAgICAgICAvKiBHZXQgdGhlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUIGJsb2NrcyBpbgotICAgICAgICAgKiB0aGUgdmlydHVhbCBidWZmZXIgaW4gYSBjb2xvciBjb21wb25lbnQgb2YgdGhlIE1DVS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLSAgICAgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7Ci0gICAgICAgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7Ci0gICAgICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0gICAgICAgICAgICBpZiAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IDApIHsKLSAgICAgICAgICAgICAgLy8gbmVlZCB0byBkbyBwcmUtemVybyBieSBvdXJzZWxmLgotICAgICAgICAgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIChTSVpFT0YoSkJMT0NLKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gUmVjb3JkIGh1ZmZtYW4gYml0IG9mZnNldAotICAgICAgaWYgKE1DVV9jb2xfbnVtICUgc2FtcGxlX3NpemUgPT0gMCkgewotICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICAgICAgKGNpbmZvLCBvZmZzZXRfZGF0YSk7Ci0gICAgICAgICsrb2Zmc2V0X2RhdGE7Ci0gICAgICB9Ci0gICAgICAvKiBUcnkgdG8gZmV0Y2ggdGhlIE1DVS4gKi8KLSAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKLQkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0JY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKLQljb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07Ci0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIH0KLSAgKCpjaW5mby0+ZW50cm9weS0+Z2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKQotICAgICAgICAoY2luZm8sICZzY2FuX2hlYWRlci0+cHJldl9NQ1Vfb2Zmc2V0KTsKLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCi0gICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLS8qCi0gKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBtdWx0aS1wYXNzIGNhc2UuCi0gKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCi0gKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KLSAqCi0gKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotZGVjb21wcmVzc19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgSkRJTUVOU0lPTiBibG9ja19udW07Ci0gIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzOwotICBKQkxPQ0tBUlJBWSBidWZmZXI7Ci0gIEpCTE9DS1JPVyBidWZmZXJfcHRyOwotICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKLQotICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLwotICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDwgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciB8fAotCSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKLQkgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8PSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICB9Ci0KLSAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQotICAgICAgY29udGludWU7Ci0gICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KLSAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotICAgICAgIGNpbmZvLT50aWxlX2RlY29kZSA/IDAgOiBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLwotICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IDwgbGFzdF9pTUNVX3JvdykKLSAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGVsc2UgewotICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZTsgaXQgaXMgaW5wdXQtc2lkZS1kZXBlbmRlbnQhICovCi0gICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIH0KLSAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07Ci0gICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOwotICAgIGludCB3aWR0aF9pbl9ibG9ja3MgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0gICAgaW50IHN0YXJ0X2Jsb2NrID0gMDsKLSNpZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgewotICAgICAgLy8gd2lkdGhfaW5fYmxvY2tzIGZvciBhIGNvbXBvbmVudCBkZXBlbmRzIG9uIGl0cyBoX3NhbXBfZmFjdG9yLgotICAgICAgd2lkdGhfaW5fYmxvY2tzID0gam1pbih3aWR0aF9pbl9ibG9ja3MsCi0gICAgICAgIChjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9yaWdodF9ib3VuZGFyeSAtCi0gICAgICAgICBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5KSAqCi0gICAgICAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKLSAgICAgIHN0YXJ0X2Jsb2NrID0gY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXAgKgotICAgICAgICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgIH0KLSNlbmRpZgotICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCi0gICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgewotICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOwotICAgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2Jsb2NrICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgICAgYnVmZmVyX3B0ciArPSBzdGFydF9ibG9jazsKLSAgICAgIGZvciAoYmxvY2tfbnVtID0gc3RhcnRfYmxvY2s7IGJsb2NrX251bSA8ICh1bnNpZ25lZCBpbnQpd2lkdGhfaW5fYmxvY2tzOyBibG9ja19udW0rKykgewotCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSBidWZmZXJfcHRyLAotCQkJb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7Ci0JYnVmZmVyX3B0cisrOwotCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgICAgfQotICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotCi0KLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0KLS8qCi0gKiBUaGlzIGNvZGUgYXBwbGllcyBpbnRlcmJsb2NrIHNtb290aGluZyBhcyBkZXNjcmliZWQgYnkgc2VjdGlvbiBLLjgKLSAqIG9mIHRoZSBKUEVHIHN0YW5kYXJkOiB0aGUgZmlyc3QgNSBBQyBjb2VmZmljaWVudHMgYXJlIGVzdGltYXRlZCBmcm9tCi0gKiB0aGUgREMgdmFsdWVzIG9mIGEgRENUIGJsb2NrIGFuZCBpdHMgOCBuZWlnaGJvcmluZyBibG9ja3MuCi0gKiBXZSBhcHBseSBzbW9vdGhpbmcgb25seSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRyBkZWNvZGluZywgYW5kIG9ubHkgaWYKLSAqIHRoZSBjb2VmZmljaWVudHMgaXQgY2FuIGVzdGltYXRlIGFyZSBub3QgeWV0IGtub3duIHRvIGZ1bGwgcHJlY2lzaW9uLgotICovCi0KLS8qIE5hdHVyYWwtb3JkZXIgYXJyYXkgcG9zaXRpb25zIG9mIHRoZSBmaXJzdCA1IHppZ3phZy1vcmRlciBjb2VmZmljaWVudHMgKi8KLSNkZWZpbmUgUTAxX1BPUyAgMQotI2RlZmluZSBRMTBfUE9TICA4Ci0jZGVmaW5lIFEyMF9QT1MgIDE2Ci0jZGVmaW5lIFExMV9QT1MgIDkKLSNkZWZpbmUgUTAyX1BPUyAgMgotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpY2FibGUgYW5kIHNhZmUuCi0gKiBXZSBhbHNvIGxhdGNoIHRoZSBjdXJyZW50IHN0YXRlcyBvZiB0aGUgY29lZl9iaXRzW10gZW50cmllcyBmb3IgdGhlCi0gKiBBQyBjb2VmZmljaWVudHM7IG90aGVyd2lzZSwgaWYgdGhlIGlucHV0IHNpZGUgb2YgdGhlIGRlY29tcHJlc3NvcgotICogYWR2YW5jZXMgaW50byBhIG5ldyBzY2FuLCB3ZSBtaWdodCB0aGluayB0aGUgY29lZmZpY2llbnRzIGFyZSBrbm93bgotICogbW9yZSBhY2N1cmF0ZWx5IHRoYW4gdGhleSByZWFsbHkgYXJlLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1zbW9vdGhpbmdfb2sgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBib29sZWFuIHNtb290aGluZ191c2VmdWwgPSBGQUxTRTsKLSAgaW50IGNpLCBjb2VmaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlFVQU5UX1RCTCAqIHF0YWJsZTsKLSAgaW50ICogY29lZl9iaXRzOwotICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7Ci0KLSAgaWYgKCEgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwgY2luZm8tPmNvZWZfYml0cyA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBBbGxvY2F0ZSBsYXRjaCBhcmVhIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgaWYgKGNvZWYtPmNvZWZfYml0c19sYXRjaCA9PSBOVUxMKQotICAgIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IChpbnQgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBjaW5mby0+bnVtX2NvbXBvbmVudHMgKgotCQkJCSAgKFNBVkVEX0NPRUZTICogU0laRU9GKGludCkpKTsKLSAgY29lZl9iaXRzX2xhdGNoID0gY29lZi0+Y29lZl9iaXRzX2xhdGNoOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQWxsIGNvbXBvbmVudHMnIHF1YW50aXphdGlvbiB2YWx1ZXMgbXVzdCBhbHJlYWR5IGJlIGxhdGNoZWQuICovCi0gICAgaWYgKChxdGFibGUgPSBjb21wcHRyLT5xdWFudF90YWJsZSkgPT0gTlVMTCkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAvKiBWZXJpZnkgREMgJiBmaXJzdCA1IEFDIHF1YW50aXplcnMgYXJlIG5vbnplcm8gdG8gYXZvaWQgemVyby1kaXZpZGUuICovCi0gICAgaWYgKHF0YWJsZS0+cXVhbnR2YWxbMF0gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTAxX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTEwX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTIwX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTExX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTAyX1BPU10gPT0gMCkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAvKiBEQyB2YWx1ZXMgbXVzdCBiZSBhdCBsZWFzdCBwYXJ0bHkga25vd24gZm9yIGFsbCBjb21wb25lbnRzLiAqLwotICAgIGNvZWZfYml0cyA9IGNpbmZvLT5jb2VmX2JpdHNbY2ldOwotICAgIGlmIChjb2VmX2JpdHNbMF0gPCAwKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIEJsb2NrIHNtb290aGluZyBpcyBoZWxwZnVsIGlmIHNvbWUgQUMgY29lZmZpY2llbnRzIHJlbWFpbiBpbmFjY3VyYXRlLiAqLwotICAgIGZvciAoY29lZmkgPSAxOyBjb2VmaSA8PSA1OyBjb2VmaSsrKSB7Ci0gICAgICBjb2VmX2JpdHNfbGF0Y2hbY29lZmldID0gY29lZl9iaXRzW2NvZWZpXTsKLSAgICAgIGlmIChjb2VmX2JpdHNbY29lZmldICE9IDApCi0Jc21vb3RoaW5nX3VzZWZ1bCA9IFRSVUU7Ci0gICAgfQotICAgIGNvZWZfYml0c19sYXRjaCArPSBTQVZFRF9DT0VGUzsKLSAgfQotCi0gIHJldHVybiBzbW9vdGhpbmdfdXNlZnVsOwotfQotCi0KLS8qCi0gKiBWYXJpYW50IG9mIGRlY29tcHJlc3NfZGF0YSBmb3IgdXNlIHdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1kZWNvbXByZXNzX3Ntb290aF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgSkRJTUVOU0lPTiBibG9ja19udW0sIGxhc3RfYmxvY2tfY29sdW1uOwotICBpbnQgY2ksIGJsb2NrX3JvdywgYmxvY2tfcm93cywgYWNjZXNzX3Jvd3M7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHIsIHByZXZfYmxvY2tfcm93LCBuZXh0X2Jsb2NrX3JvdzsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2w7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7Ci0gIGJvb2xlYW4gZmlyc3Rfcm93LCBsYXN0X3JvdzsKLSAgSkJMT0NLIHdvcmtzcGFjZTsKLSAgaW50ICpjb2VmX2JpdHM7Ci0gIEpRVUFOVF9UQkwgKnF1YW50dGJsOwotICBJTlQzMiBRMDAsUTAxLFEwMixRMTAsUTExLFEyMCwgbnVtOwotICBpbnQgREMxLERDMixEQzMsREM0LERDNSxEQzYsREM3LERDOCxEQzk7Ci0gIGludCBBbCwgcHJlZDsKLQotICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLwotICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDw9IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKLQkgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyKSB7Ci0gICAgICAvKiBJZiBpbnB1dCBpcyB3b3JraW5nIG9uIGN1cnJlbnQgc2Nhbiwgd2Ugb3JkaW5hcmlseSB3YW50IGl0IHRvCi0gICAgICAgKiBoYXZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCByb3cuICBCdXQgaWYgaW5wdXQgc2NhbiBpcyBEQywKLSAgICAgICAqIHdlIHdhbnQgaXQgdG8ga2VlcCBvbmUgcm93IGFoZWFkIHNvIHRoYXQgbmV4dCBibG9jayByb3cncyBEQwotICAgICAgICogdmFsdWVzIGFyZSB1cCB0byBkYXRlLgotICAgICAgICovCi0gICAgICBKRElNRU5TSU9OIGRlbHRhID0gKGNpbmZvLT5TcyA9PSAwKSA/IDEgOiAwOwotICAgICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA+IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crZGVsdGEpCi0JYnJlYWs7Ci0gICAgfQotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICB9Ci0KLSAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQotICAgICAgY29udGludWU7Ci0gICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCi0gICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KSB7Ci0gICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93cyAqIDI7IC8qIHRoaXMgYW5kIG5leHQgaU1DVSByb3cgKi8KLSAgICAgIGxhc3Rfcm93ID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmU7IGl0IGlzIGlucHV0LXNpZGUtZGVwZW5kZW50ISAqLwotICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93czsgLyogdGhpcyBpTUNVIHJvdyBvbmx5ICovCi0gICAgICBsYXN0X3JvdyA9IFRSVUU7Ci0gICAgfQotICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCi0gICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPiAwKSB7Ci0gICAgICBhY2Nlc3Nfcm93cyArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyAvKiBwcmlvciBpTUNVIHJvdyB0b28gKi8KLSAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotCSAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyAtIDEpICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7Ci0gICAgICBidWZmZXIgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsJLyogcG9pbnQgdG8gY3VycmVudCBpTUNVIHJvdyAqLwotICAgICAgZmlyc3Rfcm93ID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotCSAoSkRJTUVOU0lPTikgMCwgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7Ci0gICAgICBmaXJzdF9yb3cgPSBUUlVFOwotICAgIH0KLSAgICAvKiBGZXRjaCBjb21wb25lbnQtZGVwZW5kZW50IGluZm8gKi8KLSAgICBjb2VmX2JpdHMgPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggKyAoY2kgKiBTQVZFRF9DT0VGUyk7Ci0gICAgcXVhbnR0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKLSAgICBRMDAgPSBxdWFudHRibC0+cXVhbnR2YWxbMF07Ci0gICAgUTAxID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMV9QT1NdOwotICAgIFExMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMTBfUE9TXTsKLSAgICBRMjAgPSBxdWFudHRibC0+cXVhbnR2YWxbUTIwX1BPU107Ci0gICAgUTExID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMV9QT1NdOwotICAgIFEwMiA9IHF1YW50dGJsLT5xdWFudHZhbFtRMDJfUE9TXTsKLSAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07Ci0gICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOwotICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCi0gICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgewotICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOwotICAgICAgaWYgKGZpcnN0X3JvdyAmJiBibG9ja19yb3cgPT0gMCkKLQlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7Ci0gICAgICBlbHNlCi0JcHJldl9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93LTFdOwotICAgICAgaWYgKGxhc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSBibG9ja19yb3dzLTEpCi0JbmV4dF9ibG9ja19yb3cgPSBidWZmZXJfcHRyOwotICAgICAgZWxzZQotCW5leHRfYmxvY2tfcm93ID0gYnVmZmVyW2Jsb2NrX3JvdysxXTsKLSAgICAgIC8qIFdlIGZldGNoIHRoZSBzdXJyb3VuZGluZyBEQyB2YWx1ZXMgdXNpbmcgYSBzbGlkaW5nLXJlZ2lzdGVyIGFwcHJvYWNoLgotICAgICAgICogSW5pdGlhbGl6ZSBhbGwgbmluZSBoZXJlIHNvIGFzIHRvIGRvIHRoZSByaWdodCB0aGluZyBvbiBuYXJyb3cgcGljcy4KLSAgICAgICAqLwotICAgICAgREMxID0gREMyID0gREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMF1bMF07Ci0gICAgICBEQzQgPSBEQzUgPSBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzBdWzBdOwotICAgICAgREM3ID0gREM4ID0gREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMF1bMF07Ci0gICAgICBvdXRwdXRfY29sID0gMDsKLSAgICAgIGxhc3RfYmxvY2tfY29sdW1uID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzIC0gMTsKLSAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDw9IGxhc3RfYmxvY2tfY29sdW1uOyBibG9ja19udW0rKykgewotCS8qIEZldGNoIGN1cnJlbnQgRENUIGJsb2NrIGludG8gd29ya3NwYWNlIHNvIHdlIGNhbiBtb2RpZnkgaXQuICovCi0JamNvcHlfYmxvY2tfcm93KGJ1ZmZlcl9wdHIsIChKQkxPQ0tST1cpIHdvcmtzcGFjZSwgKEpESU1FTlNJT04pIDEpOwotCS8qIFVwZGF0ZSBEQyB2YWx1ZXMgKi8KLQlpZiAoYmxvY2tfbnVtIDwgbGFzdF9ibG9ja19jb2x1bW4pIHsKLQkgIERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzFdWzBdOwotCSAgREM2ID0gKGludCkgYnVmZmVyX3B0clsxXVswXTsKLQkgIERDOSA9IChpbnQpIG5leHRfYmxvY2tfcm93WzFdWzBdOwotCX0KLQkvKiBDb21wdXRlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBwZXIgSy44LgotCSAqIEFuIGVzdGltYXRlIGlzIGFwcGxpZWQgb25seSBpZiBjb2VmZmljaWVudCBpcyBzdGlsbCB6ZXJvLAotCSAqIGFuZCBpcyBub3Qga25vd24gdG8gYmUgZnVsbHkgYWNjdXJhdGUuCi0JICovCi0JLyogQUMwMSAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzFdKSAhPSAwICYmIHdvcmtzcGFjZVsxXSA9PSAwKSB7Ci0JICBudW0gPSAzNiAqIFEwMCAqIChEQzQgLSBEQzYpOwotCSAgaWYgKG51bSA+PSAwKSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpICsgbnVtKSAvIChRMDE8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgIH0gZWxzZSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpIC0gbnVtKSAvIChRMDE8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgICAgcHJlZCA9IC1wcmVkOwotCSAgfQotCSAgd29ya3NwYWNlWzFdID0gKEpDT0VGKSBwcmVkOwotCX0KLQkvKiBBQzEwICovCi0JaWYgKChBbD1jb2VmX2JpdHNbMl0pICE9IDAgJiYgd29ya3NwYWNlWzhdID09IDApIHsKLQkgIG51bSA9IDM2ICogUTAwICogKERDMiAtIERDOCk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgKyBudW0pIC8gKFExMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgLSBudW0pIC8gKFExMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbOF0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIEFDMjAgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1szXSkgIT0gMCAmJiB3b3Jrc3BhY2VbMTZdID09IDApIHsKLQkgIG51bSA9IDkgKiBRMDAgKiAoREMyICsgREM4IC0gMipEQzUpOwotCSAgaWYgKG51bSA+PSAwKSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpICsgbnVtKSAvIChRMjA8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgIH0gZWxzZSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpIC0gbnVtKSAvIChRMjA8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgICAgcHJlZCA9IC1wcmVkOwotCSAgfQotCSAgd29ya3NwYWNlWzE2XSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogQUMxMSAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzRdKSAhPSAwICYmIHdvcmtzcGFjZVs5XSA9PSAwKSB7Ci0JICBudW0gPSA1ICogUTAwICogKERDMSAtIERDMyAtIERDNyArIERDOSk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgKyBudW0pIC8gKFExMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgLSBudW0pIC8gKFExMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbOV0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIEFDMDIgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1s1XSkgIT0gMCAmJiB3b3Jrc3BhY2VbMl0gPT0gMCkgewotCSAgbnVtID0gOSAqIFEwMCAqIChEQzQgKyBEQzYgLSAyKkRDNSk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgKyBudW0pIC8gKFEwMjw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgLSBudW0pIC8gKFEwMjw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbMl0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIE9LLCBkbyB0aGUgSURDVCAqLwotCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSB3b3Jrc3BhY2UsCi0JCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKLQkvKiBBZHZhbmNlIGZvciBuZXh0IGNvbHVtbiAqLwotCURDMSA9IERDMjsgREMyID0gREMzOwotCURDNCA9IERDNTsgREM1ID0gREM2OwotCURDNyA9IERDODsgREM4ID0gREM5OwotCWJ1ZmZlcl9wdHIrKywgcHJldl9ibG9ja19yb3crKywgbmV4dF9ibG9ja19yb3crKzsKLQlvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLSAgICAgIH0KLSAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgIH0KLSAgfQotCi0gIGlmICgrKyhjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCi0gICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLSNlbmRpZiAvKiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kX2NvZWZfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9jb2VmX3B0ciBjb2VmOwotCi0gIGNvZWYgPSAobXlfY29lZl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICopIGNvZWY7Ci0gIGNvZWYtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKLSAgY29lZi0+cHViLnN0YXJ0X291dHB1dF9wYXNzID0gc3RhcnRfb3V0cHV0X3Bhc3M7Ci0gIGNvZWYtPnB1Yi5jb2x1bW5fbGVmdF9ib3VuZGFyeSA9IDA7Ci0gIGNvZWYtPnB1Yi5jb2x1bW5fcmlnaHRfYm91bmRhcnkgPSAwOwotICBjb2VmLT5wdWIuTUNVX2NvbHVtbnNfdG9fc2tpcCA9IDA7Ci0jaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotICBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPSBOVUxMOwotI2VuZGlmCi0KLSNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSAgICAgIC8qIEFsbG9jYXRlIG9uZSBpTUNVIHJvdyB2aXJ0dWFsIGFycmF5LCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0gICAgICAgKiBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQsIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIGhfc2FtcF9mYWN0b3IKLSAgICAgICAqIERDVCBibG9ja3MgaW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uLgotICAgICAgICovCi0gICAgICBpbnQgY2ksIGFjY2Vzc19yb3dzOwotICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgICAgYWNjZXNzX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBUUlVFLAotCSAgIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIC8vIG9uZSBpTUNVIHJvdwotCSAgIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cyk7Ci0gICAgICB9Ci0gICAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgICAgICAgY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXhfcHJvZ3Jlc3NpdmU7Ci0gICAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gY29uc3VtZV9kYXRhX211bHRpX3NjYW47Ci0gICAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBjb2VmLT53aG9sZV9pbWFnZTsgLyogbGluayB0byB2aXJ0dWFsIGFycmF5cyAqLwotICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfb25lcGFzczsKLSAgICB9IGVsc2UgewotICAgICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlLU1DVSBidWZmZXIuICovCi0gICAgICBKQkxPQ0tST1cgYnVmZmVyOwotICAgICAgaW50IGk7Ci0KLSAgICAgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgRF9NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKLSAgICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7Ci0gICAgICB9Ci0gICAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgICAgICAgY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXhfYmFzZWxpbmU7Ci0gICAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gZHVtbXlfY29uc3VtZV9kYXRhOwotICAgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLwotICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCi0gICAgLyogTm90ZSB3ZSBhc2sgZm9yIGEgcHJlLXplcm9lZCBhcnJheS4gKi8KLSAgICBpbnQgY2ksIGFjY2Vzc19yb3dzOwotICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGFjY2Vzc19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gICAgICAvKiBJZiBibG9jayBzbW9vdGhpbmcgY291bGQgYmUgdXNlZCwgbmVlZCBhIGJpZ2dlciB3aW5kb3cgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKLQlhY2Nlc3Nfcm93cyAqPSAzOwotI2VuZGlmCi0gICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgVFJVRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cyk7Ci0gICAgfQotICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBjb25zdW1lX2RhdGE7Ci0gICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKLSAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBjb2VmLT53aG9sZV9pbWFnZTsgLyogbGluayB0byB2aXJ0dWFsIGFycmF5cyAqLwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KLSAgICBKQkxPQ0tST1cgYnVmZmVyOwotICAgIGludCBpOwotCi0gICAgYnVmZmVyID0gKEpCTE9DS1JPVykKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCSAgRF9NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRF9NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7Ci0gICAgICBjb2VmLT5NQ1VfYnVmZmVyW2ldID0gYnVmZmVyICsgaTsKLSAgICB9Ci0gICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGR1bW15X2NvbnN1bWVfZGF0YTsKLSAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19vbmVwYXNzOwotICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkY29sb3IuYyBiL2xpYmpwZWd0d3JwL2pkY29sb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2NTE5ZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGNvbG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzYgKzAsMCBAQAotLyoKLSAqIGpkY29sb3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQcml2YXRlIHN0YXRlIGZvciBZQ0MtPlJHQiBjb252ZXJzaW9uICovCi0gIGludCAqIENyX3JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIFIgY29udmVyc2lvbiAqLwotICBpbnQgKiBDYl9iX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBCIGNvbnZlcnNpb24gKi8KLSAgSU5UMzIgKiBDcl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBHIGNvbnZlcnNpb24gKi8KLSAgSU5UMzIgKiBDYl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBHIGNvbnZlcnNpb24gKi8KLX0gbXlfY29sb3JfZGVjb252ZXJ0ZXI7Ci0KLXR5cGVkZWYgbXlfY29sb3JfZGVjb252ZXJ0ZXIgKiBteV9jY29udmVydF9wdHI7Ci0KLQotI2lmZGVmIEFORFJPSURfUkdCCi0KLS8qIERlY2xhcmF0aW9ucyBmb3Igb3JkZXJlZCBkaXRoZXJpbmcuCi0gKiAKLSAqIFdlIHVzZSA0eDQgb3JkZXJlZCBkaXRoZXIgYXJyYXkgcGFja2VkIGludG8gMzIgYml0cy4gVGhpcyBhcnJheSBpcwotICogc3VmZmljZW50IGZvciBkaXRoZXJpbmcgUkdCXzg4OCB0byBSR0JfNTY1LgotICovCi0KLSNkZWZpbmUgRElUSEVSX01BU0sgICAgICAgICAweDMKLSNkZWZpbmUgRElUSEVSX1JPVEFURSh4KSAgICAoKCh4KTw8MjQpIHwgKCgoeCk+PjgpJjB4MDBGRkZGRkYpKQotc3RhdGljIGNvbnN0IElOVDMyIGRpdGhlcl9tYXRyaXhbNF0gPSB7Ci0gIDB4MDAwODAyMEEsCi0gIDB4MEMwNDBFMDYsCi0gIDB4MDMwQjAxMDksCi0gIDB4MEYwNzBEMDUKLX07Ci0KLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqIFlDYkNyIC0+IFJHQiBjb252ZXJzaW9uOiBtb3N0IGNvbW1vbiBjYXNlICoqKioqKioqKioqKioqLwotCi0vKgotICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQotICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KLSAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCi0gKglSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgotICoJRyA9IFkgLSAwLjM0NDE0ICogQ2IgLSAwLjcxNDE0ICogQ3IKLSAqCUIgPSBZICsgMS43NzIwMCAqIENiCi0gKiB3aGVyZSBDYiBhbmQgQ3IgcmVwcmVzZW50IHRoZSBpbmNvbWluZyB2YWx1ZXMgbGVzcyBDRU5URVJKU0FNUExFLgotICogKFRoZXNlIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSBUSUZGIDYuMCBzZWN0aW9uIDIxLCBkYXRlZCAzLUp1bmUtOTIuKQotICoKLSAqIFRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHdlIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMKLSAqIGFzIGludGVnZXJzIHNjYWxlZCB1cCBieSAyXjE2IChhYm91dCA0IGRpZ2l0cyBwcmVjaXNpb24pOyB3ZSBoYXZlIHRvIGRpdmlkZQotICogdGhlIHByb2R1Y3RzIGJ5IDJeMTYsIHdpdGggYXBwcm9wcmlhdGUgcm91bmRpbmcsIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIuCi0gKiBOb3RpY2UgdGhhdCBZLCBiZWluZyBhbiBpbnRlZ3JhbCBpbnB1dCwgZG9lcyBub3QgY29udHJpYnV0ZSBhbnkgZnJhY3Rpb24KLSAqIHNvIGl0IG5lZWQgbm90IHBhcnRpY2lwYXRlIGluIHRoZSByb3VuZGluZy4KLSAqCi0gKiBGb3IgZXZlbiBtb3JlIHNwZWVkLCB3ZSBhdm9pZCBkb2luZyBhbnkgbXVsdGlwbGljYXRpb25zIGluIHRoZSBpbm5lciBsb29wCi0gKiBieSBwcmVjYWxjdWxhdGluZyB0aGUgY29uc3RhbnRzIHRpbWVzIENiIGFuZCBDciBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcy4KLSAqIEZvciA4LWJpdCBKU0FNUExFcyB0aGlzIGlzIHZlcnkgcmVhc29uYWJsZSAob25seSAyNTYgZW50cmllcyBwZXIgdGFibGUpOwotICogZm9yIDEyLWJpdCBzYW1wbGVzIGl0IGlzIHN0aWxsIGFjY2VwdGFibGUuICBJdCdzIG5vdCB2ZXJ5IHJlYXNvbmFibGUgZm9yCi0gKiAxNi1iaXQgc2FtcGxlcywgYnV0IGlmIHlvdSB3YW50IGxvc3NsZXNzIHN0b3JhZ2UgeW91IHNob3VsZG4ndCBiZSBjaGFuZ2luZwotICogY29sb3JzcGFjZSBhbnl3YXkuCi0gKiBUaGUgQ3I9PlIgYW5kIENiPT5CIHZhbHVlcyBjYW4gYmUgcm91bmRlZCB0byBpbnRlZ2VycyBpbiBhZHZhbmNlOyB0aGUKLSAqIHZhbHVlcyBmb3IgdGhlIEcgY2FsY3VsYXRpb24gYXJlIGxlZnQgc2NhbGVkIHVwLCBzaW5jZSB3ZSBtdXN0IGFkZCB0aGVtCi0gKiB0b2dldGhlciBiZWZvcmUgcm91bmRpbmcuCi0gKi8KLQotI2RlZmluZSBTQ0FMRUJJVFMJMTYJLyogc3BlZWRpZXN0IHJpZ2h0LXNoaWZ0IG9uIHNvbWUgbWFjaGluZXMgKi8KLSNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQotI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRhYmxlcyBmb3IgWUNDLT5SR0IgY29sb3JzcGFjZSBjb252ZXJzaW9uLgotICovCi0KLUxPQ0FMKHZvaWQpCi1idWlsZF95Y2NfcmdiX3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIGludCBpOwotICBJTlQzMiB4OwotICBTSElGVF9URU1QUwotCi0gIGNjb252ZXJ0LT5Dcl9yX3RhYiA9IChpbnQgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKLSAgY2NvbnZlcnQtPkNiX2JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOwotICBjY29udmVydC0+Q3JfZ190YWIgPSAoSU5UMzIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotICBjY29udmVydC0+Q2JfZ190YWIgPSAoSU5UMzIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotCi0gIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgewotICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KLSAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLwotICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCi0gICAgY2NvbnZlcnQtPkNyX3JfdGFiW2ldID0gKGludCkKLSAgICAgICAgICAgICAgICAgICAgUklHSFRfU0hJRlQoRklYKDEuNDAyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOwotICAgIC8qIENiPT5CIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNzcyMDAgKiB4ICovCi0gICAgY2NvbnZlcnQtPkNiX2JfdGFiW2ldID0gKGludCkKLSAgICAgICAgICAgICAgICAgICAgUklHSFRfU0hJRlQoRklYKDEuNzcyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOwotICAgIC8qIENyPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC43MTQxNCAqIHggKi8KLSAgICBjY29udmVydC0+Q3JfZ190YWJbaV0gPSAoLSBGSVgoMC43MTQxNCkpICogeDsKLSAgICAvKiBDYj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuMzQ0MTQgKiB4ICovCi0gICAgLyogV2UgYWxzbyBhZGQgaW4gT05FX0hBTEYgc28gdGhhdCBuZWVkIG5vdCBkbyBpdCBpbiBpbm5lciBsb29wICovCi0gICAgY2NvbnZlcnQtPkNiX2dfdGFiW2ldID0gKC0gRklYKDAuMzQ0MTQpKSAqIHggKyBPTkVfSEFMRjsKLSAgfQotI2lmZGVmIE5FRURTX0FSTV9FUlJBVEFfNzU0MzE5Xzc1NDMyMAotICBhc20gdm9sYXRpbGUgKCAidm1vdiBzMCxzMFxuIiApOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgY29sb3JzcGFjZS4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgY2hhbmdlIGZyb20gbm9uaW50ZXJsZWF2ZWQsIG9uZS1wbGFuZS1wZXItY29tcG9uZW50IGZvcm1hdAotICogdG8gaW50ZXJsZWF2ZWQtcGl4ZWwgZm9ybWF0LiAgVGhlIG91dHB1dCBidWZmZXIgaXMgdGhlcmVmb3JlIHRocmVlIHRpbWVzCi0gKiBhcyB3aWRlIGFzIHRoZSBpbnB1dCBidWZmZXIuCi0gKiBBIHN0YXJ0aW5nIHJvdyBvZmZzZXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIGlucHV0IGJ1ZmZlci4gIFRoZSBjYWxsZXIKLSAqIGNhbiBlYXNpbHkgYWRqdXN0IHRoZSBwYXNzZWQgb3V0cHV0X2J1ZiB2YWx1ZSB0byBhY2NvbW1vZGF0ZSBhbnkgcm93Ci0gKiBvZmZzZXQgcmVxdWlyZWQgb24gdGhhdCBzaWRlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQoteWNjX3JnYl9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0jaWZkZWYgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotLyoKLSAqIENvbnZlcnRzIFlDQy0+UkdCODg4IHVzaW5nIFZlTnVtIGluc3RydWN0aW9ucy4KLSAqLwotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSkRJTUVOU0lPTiByb3c7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCAoSkRJTUVOU0lPTiludW1fcm93czsgcm93KyspCi0gIHsKLSAgICBpbnB0cjAgICAgID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxICAgICA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiAgICAgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLQotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0KLSAgICB5dnVwMmJncjg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAsCi0gICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMSwKLSAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gIH0KLX0KLSNlbHNlCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOwotICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKLSAgU0hJRlRfVEVNUFMKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgeSAgPSBHRVRKU0FNUExFKGlucHRyMFtjb2xdKTsKLSAgICAgIGNiID0gR0VUSlNBTVBMRShpbnB0cjFbY29sXSk7Ci0gICAgICBjciA9IEdFVEpTQU1QTEUoaW5wdHIyW2NvbF0pOwotICAgICAgLyogUmFuZ2UtbGltaXRpbmcgaXMgZXNzZW50aWFsIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IERDVCBsb3NzZXMuICovCi0gICAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKLSAgICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVCSVRTKSldOwotICAgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07Ci0gICAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotTUVUSE9EREVGKHZvaWQpCi15Y2NfcmdiYV84ODg4X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0gICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLSNpZmRlZiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi0vKgotICogQ29udmVydHMgWUNDLT5SR0JBODg4OCB1c2luZyBWZU51bSBpbnN0cnVjdGlvbnMuCi0gKi8KLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpESU1FTlNJT04gcm93OwotCi0gIGZvciAocm93ID0gMDsgcm93IDwgKEpESU1FTlNJT04pbnVtX3Jvd3M7IHJvdysrKQotICB7Ci0gICAgaW5wdHIwICAgICA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSAgICAgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgICAgID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLQotICAgIHl2dXAyYWJncjg4ODhfdmVudW0oKFVJTlQ4KikgaW5wdHIwLAotICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gIH0KLX0KLQotI2Vsc2UKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7Ci0gIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOwotICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7Ci0gICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KLSAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRUJJVFMpKV07Ci0gICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKLSAgICAgIG91dHB0cltSR0JfQUxQSEFdID0gIDB4RkY7Ci0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0KLU1FVEhPRERFRih2b2lkKQoteWNjX3JnYl81NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotI2lmIGRlZmluZWQoQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSkKLS8qCi0gKiBDb252ZXJ0cyBZQ0MtPlJHQjU2NSB1c2luZyBWZU51bSBpbnN0cnVjdGlvbnMuCi0gKi8KLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpESU1FTlNJT04gcm93OwotCi0gIGZvciAocm93ID0gMDsgcm93IDwgKEpESU1FTlNJT04pbnVtX3Jvd3M7IHJvdysrKQotICB7Ci0gICAgaW5wdHIwICAgICA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSAgICAgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgICAgID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLQotICAgIHl2dXAycmdiNTY1X3ZlbnVtKChVSU5UOCopIGlucHRyMCwKLSAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfQotfQotI2Vsc2UKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7Ci0gIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBJTlQzMiByZ2I7Ci0gICAgdW5zaWduZWQgaW50IHIsIGcsIGI7Ci0gICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICAKLSAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7Ci0gICAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgICAgIHIgPSByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07Ci0gICAgICAgIGcgPSByYW5nZV9saW1pdFt5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKV07Ci0gICAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07Ci0gICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgICAgICBvdXRwdHIgKz0gMjsKLSAgICAgICAgbnVtX2NvbHMtLTsKLSAgICB9Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgewotICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFt5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotCi0gICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07Ci0gICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOwotICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKLSAgICAgIG91dHB0ciArPSA0OwotICAgIH0KLSAgICBpZiAobnVtX2NvbHMmMSkgewotICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFt5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgIH0KLSAgfQotfQotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NfcmdiXzU2NURfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKLSAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7Ci0gIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBJTlQzMiByZ2I7Ci0gICAgdW5zaWduZWQgaW50IHIsIGcsIGI7Ci0gICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7Ci0gICAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIENycnRhYltjcl0sIGQwKV07Ci0gICAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSksIGQwKV07Ci0gICAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07Ci0gICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgICAgICBvdXRwdHIgKz0gMjsKLSAgICAgICAgbnVtX2NvbHMtLTsKLSAgICB9Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgewotICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgQ3JydGFiW2NyXSwgZDApXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSksIGQwKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBDYmJ0YWJbY2JdLCBkMCldOwotICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIENycnRhYltjcl0sIGQwKV07Ci0gICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOwotICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKLSAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7Ci0gICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOwotICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKLSAgICAgIG91dHB0ciArPSA0OwotICAgIH0KLSAgICBpZiAobnVtX2NvbHMmMSkgewotICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgQ3JydGFiW2NyXSwgZDApXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSksIGQwKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBDYmJ0YWJbY2JdLCBkMCldOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKiogQ2FzZXMgb3RoZXIgdGhhbiBZQ2JDciAtPiBSR0IoQSkgKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotTUVUSE9EREVGKHZvaWQpCi1yZ2JfcmdiYV84ODg4X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0gICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgICpvdXRwdHIrKyA9ICppbnB0cjArKzsKLSAgICAgICpvdXRwdHIrKyA9ICppbnB0cjErKzsKLSAgICAgICpvdXRwdHIrKyA9ICppbnB0cjIrKzsKLSAgICAgICpvdXRwdHIrKyA9IDB4RkY7Ci0gICAgfQotICB9Ci19Ci0KLU1FVEhPRERFRih2b2lkKQotcmdiX3JnYl81NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgU0hJRlRfVEVNUFMKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgSU5UMzIgcmdiOwotICAgIHVuc2lnbmVkIGludCByLCBnLCBiOwotICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgewotICAgICAgICByID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgICAgICBnID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICAgICAgb3V0cHRyICs9IDI7Ci0gICAgICAgIG51bV9jb2xzLS07Ci0gICAgfQotICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKLSAgICAgIHIgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICBnID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgYiA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAgIHIgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgICBnID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgYiA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICAgIGlmIChudW1fY29scyYxKSB7Ci0gICAgICByID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKLSAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgICAgYiA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgfQotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfcmdiXzU2NURfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIElOVDMyIHJnYjsKLSAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKLSAgICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihHRVRKU0FNUExFKCppbnB0cjArKyksIGQwKV07Ci0gICAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coR0VUSlNBTVBMRSgqaW5wdHIxKyspLCBkMCldOwotICAgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKEdFVEpTQU1QTEUoKmlucHRyMisrKSwgZDApXTsKLSAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgICAgIG91dHB0ciArPSAyOwotICAgICAgICBudW1fY29scy0tOwotICAgIH0KLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKEdFVEpTQU1QTEUoKmlucHRyMCsrKSwgZDApXTsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coR0VUSlNBTVBMRSgqaW5wdHIxKyspLCBkMCldOwotICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIrKyksIGQwKV07Ci0gICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihHRVRKU0FNUExFKCppbnB0cjArKyksIGQwKV07Ci0gICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKEdFVEpTQU1QTEUoKmlucHRyMSsrKSwgZDApXTsKLSAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKyspLCBkMCldOwotICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICAgIGlmIChudW1fY29scyYxKSB7Ci0gICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKEdFVEpTQU1QTEUoKmlucHRyMCksIGQwKV07Ci0gICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKEdFVEpTQU1QTEUoKmlucHRyMSksIGQwKV07Ci0gICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKEdFVEpTQU1QTEUoKmlucHRyMiksIGQwKV07Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgfQotICB9Ci19Ci0KLSNlbmRpZgotCi0vKgotICogQ29sb3IgY29udmVyc2lvbiBmb3Igbm8gY29sb3JzcGFjZSBjaGFuZ2U6IGp1c3QgY29weSB0aGUgZGF0YSwKLSAqIGNvbnZlcnRpbmcgZnJvbSBzZXBhcmF0ZS1wbGFuZXMgdG8gaW50ZXJsZWF2ZWQgcmVwcmVzZW50YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1udWxsX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvdW50OwotICByZWdpc3RlciBpbnQgbnVtX2NvbXBvbmVudHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICBpbnQgY2k7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGZvciAoY2kgPSAwOyBjaSA8IG51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBpbnB0ciA9IGlucHV0X2J1ZltjaV1baW5wdXRfcm93XTsKLSAgICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF0gKyBjaTsKLSAgICAgIGZvciAoY291bnQgPSBudW1fY29sczsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0JKm91dHB0ciA9ICppbnB0cisrOwkvKiBuZWVkbid0IGJvdGhlciB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCi0Jb3V0cHRyICs9IG51bV9jb21wb25lbnRzOwotICAgICAgfQotICAgIH0KLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdXRfYnVmKys7Ci0gIH0KLX0KLQotCi0vKgotICogQ29sb3IgY29udmVyc2lvbiBmb3IgZ3JheXNjYWxlOiBqdXN0IGNvcHkgdGhlIGRhdGEuCi0gKiBUaGlzIGFsc28gd29ya3MgZm9yIFlDYkNyIC0+IGdyYXlzY2FsZSBjb252ZXJzaW9uLCBpbiB3aGljaAotICogd2UganVzdCBjb3B5IHRoZSBZIChsdW1pbmFuY2UpIGNvbXBvbmVudCBhbmQgaWdub3JlIGNocm9taW5hbmNlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZ3JheXNjYWxlX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIGpjb3B5X3NhbXBsZV9yb3dzKGlucHV0X2J1ZlswXSwgKGludCkgaW5wdXRfcm93LCBvdXRwdXRfYnVmLCAwLAotCQkgICAgbnVtX3Jvd3MsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBDb252ZXJ0IGdyYXlzY2FsZSB0byBSR0I6IGp1c3QgZHVwbGljYXRlIHRoZSBncmF5bGV2ZWwgdGhyZWUgdGltZXMuCi0gKiBUaGlzIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCB0byBjb3BlCi0gKiB3aXRoIGdyYXlzY2FsZSBhcyBhIHNlcGFyYXRlIGNhc2UuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ncmF5X3JnYl9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLQkJICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgLyogV2UgY2FuIGRpc3BlbnNlIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSAgICAgIG91dHB0cltSR0JfUkVEXSA9IG91dHB0cltSR0JfR1JFRU5dID0gb3V0cHRyW1JHQl9CTFVFXSA9IGlucHRyW2NvbF07Ci0gICAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKLSAgICB9Ci0gIH0KLX0KLQotI2lmZGVmIEFORFJPSURfUkdCCi1NRVRIT0RERUYodm9pZCkKLWdyYXlfcmdiYV84ODg4X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICAvKiBXZSBjYW4gZGlzcGVuc2Ugd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgb3V0cHRyW1JHQl9SRURdID0gb3V0cHRyW1JHQl9HUkVFTl0gPSBvdXRwdHJbUkdCX0JMVUVdID0gaW5wdHJbY29sXTsKLSAgICAgIG91dHB0cltSR0JfQUxQSEFdID0gMHhmZjsKLSAgICAgIG91dHB0ciArPSA0OwotICAgIH0KLSAgfQotfQotCi1NRVRIT0RERUYodm9pZCkKLWdyYXlfcmdiXzU2NV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLSAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBJTlQzMiByZ2I7Ci0gICAgdW5zaWduZWQgaW50IGc7Ci0gICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgewotICAgICAgICBnID0gKmlucHRyKys7Ci0gICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOwotICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgICAgIG91dHB0ciArPSAyOwotICAgICAgICBudW1fY29scy0tOwotICAgIH0KLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7Ci0gICAgICBnID0gKmlucHRyKys7Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKLSAgICAgIGcgPSAqaW5wdHIrKzsKLSAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpKTsKLSAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7Ci0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gICAgaWYgKG51bV9jb2xzJjEpIHsKLSAgICAgIGcgPSAqaW5wdHI7Ci0gICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKLSAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICB9Ci0gIH0KLX0KLQotTUVUSE9EREVGKHZvaWQpCi1ncmF5X3JnYl81NjVEX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBJTlQzMiByZ2I7Ci0gICAgdW5zaWduZWQgaW50IGc7Ci0gICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgewotICAgICAgICBnID0gKmlucHRyKys7Ci0gICAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoZywgZDApXTsKLSAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7Ci0gICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKLSAgICAgICAgb3V0cHRyICs9IDI7Ci0gICAgICAgIG51bV9jb2xzLS07Ci0gICAgfQotICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKLSAgICAgIGcgPSAqaW5wdHIrKzsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoZywgZDApXTsKLSAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOwotICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICAgIGcgPSAqaW5wdHIrKzsKLSAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoZywgZDApXTsKLSAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpKTsKLSAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7Ci0gICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgICAgb3V0cHRyICs9IDQ7Ci0gICAgfQotICAgIGlmIChudW1fY29scyYxKSB7Ci0gICAgICBnID0gKmlucHRyOwotICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOwotICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7Ci0gICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7Ci0gICAgfQotICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEFkb2JlLXN0eWxlIFlDQ0stPkNNWUsgY29udmVyc2lvbi4KLSAqIFdlIGNvbnZlcnQgWUNiQ3IgdG8gUj0xLUMsIEc9MS1NLCBhbmQgQj0xLVkgdXNpbmcgdGhlIHNhbWUKLSAqIGNvbnZlcnNpb24gYXMgYWJvdmUsIHdoaWxlIHBhc3NpbmcgSyAoYmxhY2spIHVuY2hhbmdlZC4KLSAqIFdlIGFzc3VtZSBidWlsZF95Y2NfcmdiX3RhYmxlIGhhcyBiZWVuIGNhbGxlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXljY2tfY215a19jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMiwgaW5wdHIzOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KLSAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOwotICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKLSAgU0hJRlRfVEVNUFMKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107Ci0gICAgaW5wdHIzID0gaW5wdXRfYnVmWzNdW2lucHV0X3Jvd107Ci0gICAgaW5wdXRfcm93Kys7Ci0gICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgeSAgPSBHRVRKU0FNUExFKGlucHRyMFtjb2xdKTsKLSAgICAgIGNiID0gR0VUSlNBTVBMRShpbnB0cjFbY29sXSk7Ci0gICAgICBjciA9IEdFVEpTQU1QTEUoaW5wdHIyW2NvbF0pOwotICAgICAgLyogUmFuZ2UtbGltaXRpbmcgaXMgZXNzZW50aWFsIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IERDVCBsb3NzZXMuICovCi0gICAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtNQVhKU0FNUExFIC0gKHkgKyBDcnJ0YWJbY3JdKV07ICAgLyogcmVkICovCi0gICAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFtNQVhKU0FNUExFIC0gKHkgKyAgICAgICAgICAgICAgICAgLyogZ3JlZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRUJJVFMpKSldOwotICAgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ2JidGFiW2NiXSldOyAgIC8qIGJsdWUgKi8KLSAgICAgIC8qIEsgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkICovCi0gICAgICBvdXRwdHJbM10gPSBpbnB0cjNbY29sXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFIGhlcmUgKi8KLSAgICAgIG91dHB0ciArPSA0OwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBFbXB0eSBtZXRob2QgZm9yIHN0YXJ0X3Bhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2Rjb2xvciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayBuZWVkZWQgKi8KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9jb2xvcl9kZWNvbnZlcnRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0OwotICBpbnQgY2k7Ci0KLSAgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2NvbG9yX2RlY29udmVydGVyKSk7Ci0gIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciAqKSBjY29udmVydDsKLSAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kY29sb3I7Ci0KLSAgLyogTWFrZSBzdXJlIG51bV9jb21wb25lbnRzIGFncmVlcyB3aXRoIGpwZWdfY29sb3Jfc3BhY2UgKi8KLSAgc3dpdGNoIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19SR0I6Ci0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6CQkJLyogSkNTX1VOS05PV04gY2FuIGJlIGFueXRoaW5nICovCi0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogU2V0IG91dF9jb2xvcl9jb21wb25lbnRzIGFuZCBjb252ZXJzaW9uIG1ldGhvZCBiYXNlZCBvbiByZXF1ZXN0ZWQgc3BhY2UuCi0gICAqIEFsc28gY2xlYXIgdGhlIGNvbXBvbmVudF9uZWVkZWQgZmxhZ3MgZm9yIGFueSB1bnVzZWQgY29tcG9uZW50cywKLSAgICogc28gdGhhdCBlYXJsaWVyIHBpcGVsaW5lIHN0YWdlcyBjYW4gYXZvaWQgdXNlbGVzcyBjb21wdXRhdGlvbi4KLSAgICovCi0KLSAgc3dpdGNoIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAxOwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFIHx8Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKLSAgICAgIC8qIEZvciBjb2xvci0+Z3JheXNjYWxlIGNvbnZlcnNpb24sIG9ubHkgdGhlIFkgKDApIGNvbXBvbmVudCBpcyBuZWVkZWQgKi8KLSAgICAgIGZvciAoY2kgPSAxOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykKLQljaW5mby0+Y29tcF9pbmZvW2NpXS5jb21wb25lbnRfbmVlZGVkID0gRkFMU0U7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCOgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7Ci0gICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl9jb252ZXJ0OwotI2lmbmRlZiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi0gICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSNpZmRlZiBBTkRST0lEX1JHQgotICBjYXNlIEpDU19SR0JBXzg4ODg6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiYV84ODg4X2NvbnZlcnQ7Ci0gICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiYV84ODg4X2NvbnZlcnQ7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiYV84ODg4X2NvbnZlcnQ7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCXzU2NToKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOwotICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9OT05FKSB7Ci0gICAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfNTY1X2NvbnZlcnQ7Ci0jaWYgIWRlZmluZWQoQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSkKLSAgICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwotICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7Ci0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiXzU2NV9jb252ZXJ0OwotICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl9yZ2JfNTY1X2NvbnZlcnQ7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBvbmx5IG9yZGVyZWQgZGl0aGVyIGlzIHN1cHBvcnRlZCAqLwotICAgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgewotI2lmIGRlZmluZWQoQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSkKLSAgICAgICAgLyogVXNlIFZlTnVtIHJvdXRpbmUgZXZlbiBpZiBkaXRoZXJpbmcgb3B0aW9uIGlzIHNlbGVjdGVkLiAqLwotICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiXzU2NV9jb252ZXJ0OwotI2Vsc2UKLSAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl81NjVEX2NvbnZlcnQ7Ci0gICAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLSAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYl81NjVEX2NvbnZlcnQ7Ci0gICAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX3JnYl81NjVEX2NvbnZlcnQ7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIH0KLSAgICBicmVhazsKLSNlbmRpZgotICAgIAotICBjYXNlIEpDU19DTVlLOgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7Ci0gICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ0NLKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NrX2NteWtfY29udmVydDsKLSAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIC8qIFBlcm1pdCBudWxsIGNvbnZlcnNpb24gdG8gc2FtZSBvdXRwdXQgc3BhY2UgKi8KLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgewotICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIH0gZWxzZQkJCS8qIHVuc3VwcG9ydGVkIG5vbi1udWxsIGNvbnZlcnNpb24gKi8KLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IDE7IC8qIHNpbmdsZSBjb2xvcm1hcHBlZCBvdXRwdXQgY29tcG9uZW50ICovCi0gIGVsc2UKLSAgICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZGN0LmggYi9saWJqcGVndHdycC9qZGN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTkyYTIuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBqZGN0LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgaW5jbHVkZSBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmb3J3YXJkIGFuZAotICogaW52ZXJzZSBEQ1QgbW9kdWxlcy4gIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgcHJpdmF0ZSB0byB0aGUgRENUIG1hbmFnZXJzCi0gKiAoamNkY3RtZ3IuYywgamRkY3RtZ3IuYykgYW5kIHRoZSBpbmRpdmlkdWFsIERDVCBhbGdvcml0aG1zLgotICogVGhlIGluZGl2aWR1YWwgRENUIGFsZ29yaXRobXMgYXJlIGtlcHQgaW4gc2VwYXJhdGUgZmlsZXMgdG8gZWFzZSAKLSAqIG1hY2hpbmUtZGVwZW5kZW50IHR1bmluZyAoZS5nLiwgYXNzZW1ibHkgY29kaW5nKS4KLSAqLwotCi0KLS8qCi0gKiBBIGZvcndhcmQgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIGEgd29yayBhcmVhIG9mIHR5cGUgRENURUxFTVtdOwotICogdGhlIERDVCBpcyB0byBiZSBwZXJmb3JtZWQgaW4tcGxhY2UgaW4gdGhhdCBidWZmZXIuICBUeXBlIERDVEVMRU0gaXMgaW50Ci0gKiBmb3IgOC1iaXQgc2FtcGxlcywgSU5UMzIgZm9yIDEyLWJpdCBzYW1wbGVzLiAgKE5PVEU6IEZsb2F0aW5nLXBvaW50IERDVAotICogaW1wbGVtZW50YXRpb25zIHVzZSBhbiBhcnJheSBvZiB0eXBlIEZBU1RfRkxPQVQsIGluc3RlYWQuKQotICogVGhlIERDVCBpbnB1dHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNpZ25lZCAocmFuZ2UgKy1DRU5URVJKU0FNUExFKS4KLSAqIFRoZSBEQ1Qgb3V0cHV0cyBhcmUgcmV0dXJuZWQgc2NhbGVkIHVwIGJ5IGEgZmFjdG9yIG9mIDg7IHRoZXkgdGhlcmVmb3JlCi0gKiBoYXZlIGEgcmFuZ2Ugb2YgKy04SyBmb3IgOC1iaXQgZGF0YSwgKy0xMjhLIGZvciAxMi1iaXQgZGF0YS4gIFRoaXMKLSAqIGNvbnZlbnRpb24gaW1wcm92ZXMgYWNjdXJhY3kgaW4gaW50ZWdlciBpbXBsZW1lbnRhdGlvbnMgYW5kIHNhdmVzIHNvbWUKLSAqIHdvcmsgaW4gZmxvYXRpbmctcG9pbnQgb25lcy4KLSAqIFF1YW50aXphdGlvbiBvZiB0aGUgb3V0cHV0IGNvZWZmaWNpZW50cyBpcyBkb25lIGJ5IGpjZGN0bWdyLmMuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci10eXBlZGVmIGludCBEQ1RFTEVNOwkJLyogMTYgb3IgMzIgYml0cyBpcyBmaW5lICovCi0jZWxzZQotdHlwZWRlZiBJTlQzMiBEQ1RFTEVNOwkJLyogbXVzdCBoYXZlIDMyIGJpdHMgKi8KLSNlbmRpZgotCi10eXBlZGVmIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciwgKERDVEVMRU0gKiBkYXRhKSk7Ci10eXBlZGVmIEpNRVRIT0Qodm9pZCwgZmxvYXRfRENUX21ldGhvZF9wdHIsIChGQVNUX0ZMT0FUICogZGF0YSkpOwotCi0KLS8qCi0gKiBBbiBpbnZlcnNlIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byB0aGUgaW5wdXQgSkJMT0NLIGFuZCBhIHBvaW50ZXIKLSAqIHRvIGFuIG91dHB1dCBzYW1wbGUgYXJyYXkuICBUaGUgcm91dGluZSBtdXN0IGRlcXVhbnRpemUgdGhlIGlucHV0IGRhdGEgYXMKLSAqIHdlbGwgYXMgcGVyZm9ybSB0aGUgSURDVDsgZm9yIGRlcXVhbnRpemF0aW9uLCBpdCB1c2VzIHRoZSBtdWx0aXBsaWVyIHRhYmxlCi0gKiBwb2ludGVkIHRvIGJ5IGNvbXBwdHItPmRjdF90YWJsZS4gIFRoZSBvdXRwdXQgZGF0YSBpcyB0byBiZSBwbGFjZWQgaW50byB0aGUKLSAqIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBhIHNwZWNpZmllZCBjb2x1bW4uICAoQW55IHJvdyBvZmZzZXQgbmVlZGVkIHdpbGwKLSAqIGJlIGFwcGxpZWQgdG8gdGhlIGFycmF5IHBvaW50ZXIgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byB0aGUgSURDVCBjb2RlLikKLSAqIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZW1pdHRlZCBieSB0aGUgSURDVCByb3V0aW5lIGlzCi0gKiBEQ1Rfc2NhbGVkX3NpemUgKiBEQ1Rfc2NhbGVkX3NpemUuCi0gKi8KLQotLyogdHlwZWRlZiBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGlzIGRlY2xhcmVkIGluIGpwZWdpbnQuaCAqLwotCi0vKgotICogRWFjaCBJRENUIHJvdXRpbmUgaGFzIGl0cyBvd24gaWRlYXMgYWJvdXQgdGhlIGJlc3QgZGN0X3RhYmxlIGVsZW1lbnQgdHlwZS4KLSAqLwotCi10eXBlZGVmIE1VTFRJUExJRVIgSVNMT1dfTVVMVF9UWVBFOyAvKiBzaG9ydCBvciBpbnQsIHdoaWNoZXZlciBpcyBmYXN0ZXIgKi8KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotdHlwZWRlZiBNVUxUSVBMSUVSIElGQVNUX01VTFRfVFlQRTsgLyogMTYgYml0cyBpcyBPSywgdXNlIHNob3J0IGlmIGZhc3RlciAqLwotI2RlZmluZSBJRkFTVF9TQ0FMRV9CSVRTICAyCS8qIGZyYWN0aW9uYWwgYml0cyBpbiBzY2FsZSBmYWN0b3JzICovCi0jZWxzZQotdHlwZWRlZiBJTlQzMiBJRkFTVF9NVUxUX1RZUEU7CS8qIG5lZWQgMzIgYml0cyBmb3Igc2NhbGVkIHF1YW50aXplcnMgKi8KLSNkZWZpbmUgSUZBU1RfU0NBTEVfQklUUyAgMTMJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KLSNlbmRpZgotdHlwZWRlZiBGQVNUX0ZMT0FUIEZMT0FUX01VTFRfVFlQRTsgLyogcHJlZmVycmVkIGZsb2F0aW5nIHR5cGUgKi8KLQotCi0vKgotICogRWFjaCBJRENUIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJhbmdlLWxpbWl0aW5nIGl0cyByZXN1bHRzIGFuZAotICogY29udmVydGluZyB0aGVtIHRvIHVuc2lnbmVkIGZvcm0gKDAuLk1BWEpTQU1QTEUpLiAgVGhlIHJhdyBvdXRwdXRzIGNvdWxkCi0gKiBiZSBxdWl0ZSBmYXIgb3V0IG9mIHJhbmdlIGlmIHRoZSBpbnB1dCBkYXRhIGlzIGNvcnJ1cHQsIHNvIGEgYnVsbGV0cHJvb2YKLSAqIHJhbmdlLWxpbWl0aW5nIHN0ZXAgaXMgcmVxdWlyZWQuICBXZSB1c2UgYSBtYXNrLWFuZC10YWJsZS1sb29rdXAgbWV0aG9kCi0gKiB0byBkbyB0aGUgY29tYmluZWQgb3BlcmF0aW9ucyBxdWlja2x5LiAgU2VlIHRoZSBjb21tZW50cyB3aXRoCi0gKiBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChpbiBqZG1hc3Rlci5jKSBmb3IgbW9yZSBpbmZvLgotICovCi0KLSNkZWZpbmUgSURDVF9yYW5nZV9saW1pdChjaW5mbykgICgoY2luZm8pLT5zYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFKQotCi0jZGVmaW5lIFJBTkdFX01BU0sgIChNQVhKU0FNUExFICogNCArIDMpIC8qIDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZXMgKi8KLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19mZGN0X2lzbG93CQlqRkRpc2xvdwotI2RlZmluZSBqcGVnX2ZkY3RfaWZhc3QJCWpGRGlmYXN0Ci0jZGVmaW5lIGpwZWdfZmRjdF9mbG9hdAkJakZEZmxvYXQKLSNkZWZpbmUganBlZ19pZGN0X2lzbG93CQlqUkRpc2xvdwotI2RlZmluZSBqcGVnX2lkY3RfaWZhc3QJCWpSRGlmYXN0Ci0jZGVmaW5lIGpwZWdfaWRjdF9mbG9hdAkJalJEZmxvYXQKLSNkZWZpbmUganBlZ19pZGN0XzR4NAkJalJENHg0Ci0jZGVmaW5lIGpwZWdfaWRjdF8yeDIJCWpSRDJ4MgotI2RlZmluZSBqcGVnX2lkY3RfMXgxCQlqUkQxeDEKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLS8qIEV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIERDVCByb3V0aW5lcy4gKi8KLQotRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9pc2xvdyBKUFAoKERDVEVMRU0gKiBkYXRhKSk7Ci1FWFRFUk4odm9pZCkganBlZ19mZGN0X2lmYXN0IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZkY3RfZmxvYXQgSlBQKChGQVNUX0ZMT0FUICogZGF0YSkpOwotCi1FWFRFUk4odm9pZCkganBlZ19pZGN0X2lzbG93Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfaWZhc3QKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9mbG9hdAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0XzR4NAotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0XzJ4MgotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0XzF4MQotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci0KLQotLyoKLSAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYzsgdGhlc2UgYXJlIHVzZWQgYnkgbWFueQotICogYnV0IG5vdCBhbGwgb2YgdGhlIERDVC9JRENUIG1vZHVsZXMuCi0gKgotICogQWxsIHZhbHVlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBJTlQzMi4KLSAqIEZyYWN0aW9uYWwgY29uc3RhbnRzIGFyZSBzY2FsZWQgbGVmdCBieSBDT05TVF9CSVRTIGJpdHMuCi0gKiBDT05TVF9CSVRTIGlzIGRlZmluZWQgd2l0aGluIGVhY2ggbW9kdWxlIHVzaW5nIHRoZXNlIG1hY3JvcywKLSAqIGFuZCBtYXkgZGlmZmVyIGZyb20gb25lIG1vZHVsZSB0byB0aGUgbmV4dC4KLSAqLwotCi0jZGVmaW5lIE9ORQkoKElOVDMyKSAxKQotI2RlZmluZSBDT05TVF9TQ0FMRSAoT05FIDw8IENPTlNUX0JJVFMpCi0KLS8qIENvbnZlcnQgYSBwb3NpdGl2ZSByZWFsIGNvbnN0YW50IHRvIGFuIGludGVnZXIgc2NhbGVkIGJ5IENPTlNUX1NDQUxFLgotICogQ2F1dGlvbjogc29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLAotICogdGh1cyBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KLSAqLwotCi0jZGVmaW5lIEZJWCh4KQkoKElOVDMyKSAoKHgpICogQ09OU1RfU0NBTEUgKyAwLjUpKQotCi0vKiBEZXNjYWxlIGFuZCBjb3JyZWN0bHkgcm91bmQgYW4gSU5UMzIgdmFsdWUgdGhhdCdzIHNjYWxlZCBieSBOIGJpdHMuCi0gKiBXZSBhc3N1bWUgUklHSFRfU0hJRlQgcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHksIHNvIGFkZGluZwotICogdGhlIGZ1ZGdlIGZhY3RvciBpcyBjb3JyZWN0IGZvciBlaXRoZXIgc2lnbiBvZiBYLgotICovCi0KLSNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCgoeCkgKyAoT05FIDw8ICgobiktMSkpLCBuKQotCi0vKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCi0gKiBUaGlzIG1hY3JvIGlzIHVzZWQgb25seSB3aGVuIHRoZSB0d28gaW5wdXRzIHdpbGwgYWN0dWFsbHkgYmUgbm8gbW9yZSB0aGFuCi0gKiAxNiBiaXRzIHdpZGUsIHNvIHRoYXQgYSAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYQotICogZnVsbCAzMngzMiBtdWx0aXBseS4gIFRoaXMgcHJvdmlkZXMgYSB1c2VmdWwgc3BlZWR1cCBvbiBtYW55IG1hY2hpbmVzLgotICogVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBhIDE2eDE2LT4zMiBtdWx0aXBseSBwb3J0YWJseQotICogaW4gQywgYnV0IHNvbWUgQyBjb21waWxlcnMgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgeW91IHByb3ZpZGUgdGhlCi0gKiBjb3JyZWN0IGNvbWJpbmF0aW9uIG9mIGNhc3RzLgotICovCi0KLSNpZmRlZiBTSE9SVHhTSE9SVF8zMgkJLyogbWF5IHdvcmsgaWYgJ2ludCcgaXMgMzIgYml0cyAqLwotI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgoKElOVDE2KSAodmFyKSkgKiAoKElOVDE2KSAoY29uc3QpKSkKLSNlbmRpZgotI2lmZGVmIFNIT1JUeExDT05TVF8zMgkJLyoga25vd24gdG8gd29yayB3aXRoIE1pY3Jvc29mdCBDIDYuMCAqLwotI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgoKElOVDE2KSAodmFyKSkgKiAoKElOVDMyKSAoY29uc3QpKSkKLSNlbmRpZgotCi0jaWZuZGVmIE1VTFRJUExZMTZDMTYJCS8qIGRlZmF1bHQgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCi0jZW5kaWYKLQotLyogU2FtZSBleGNlcHQgYm90aCBpbnB1dHMgYXJlIHZhcmlhYmxlcy4gKi8KLQotI2lmZGVmIFNIT1JUeFNIT1JUXzMyCQkvKiBtYXkgd29yayBpZiAnaW50JyBpcyAzMiBiaXRzICovCi0jZGVmaW5lIE1VTFRJUExZMTZWMTYodmFyMSx2YXIyKSAgKCgoSU5UMTYpICh2YXIxKSkgKiAoKElOVDE2KSAodmFyMikpKQotI2VuZGlmCi0KLSNpZm5kZWYgTVVMVElQTFkxNlYxNgkJLyogZGVmYXVsdCBkZWZpbml0aW9uICovCi0jZGVmaW5lIE1VTFRJUExZMTZWMTYodmFyMSx2YXIyKSAgKCh2YXIxKSAqICh2YXIyKSkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRkY3RtZ3IuYyBiL2xpYmpwZWd0d3JwL2pkZGN0bWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NGJmYTcuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRkY3RtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogamRkY3RtZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW52ZXJzZS1EQ1QgbWFuYWdlbWVudCBsb2dpYy4KLSAqIFRoaXMgY29kZSBzZWxlY3RzIGEgcGFydGljdWxhciBJRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCi0gKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzLiAgTm8gY29kZSBpbiB0aGlzIGZpbGUKLSAqIGlzIGV4ZWN1dGVkIHBlciBJRENUIHN0ZXAsIG9ubHkgZHVyaW5nIG91dHB1dCBwYXNzIHNldHVwLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgSURDVCByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY29lZmZpY2llbnQKLSAqIGRlcXVhbnRpemF0aW9uIGFzIHdlbGwgYXMgdGhlIElEQ1QgcHJvcGVyLiAgVGhpcyBtb2R1bGUgc2V0cyB1cCB0aGUKLSAqIGRlcXVhbnRpemF0aW9uIG11bHRpcGxpZXIgdGFibGUgbmVlZGVkIGJ5IHRoZSBJRENUIHJvdXRpbmUuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKLSAgI3VuZGVmIEFORFJPSURfQVJNVjZfSURDVAotICAjaWZkZWYgX19hcm1fXwotICAgICNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgotICAgICNpZiBfX0FSTV9BUkNIX18gPj0gNgotICAgICAgI2RlZmluZSBBTkRST0lEX0FSTVY2X0lEQ1QKLSAgICAjZWxzZQotICAgICAgI3dhcm5pbmcgIkFORFJPSURfQVJNVjZfSURDVCBpcyBkaXNhYmxlZCIKLSAgICAjZW5kaWYKLSAgI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEFORFJPSURfQVJNVjZfSURDVAotCi0vKiBJbnRlbnRpb25hbGx5IGRlY2xhcmUgdGhlIHByb3RvdHlwZSB3aXRoIGFyZ3VtZW50cyBvZiBwcmltaXRpdmUgdHlwZXMgaW5zdGVhZAotICogb2YgdHlwZS1kZWZpbmVkIG9uZXMuIFRoaXMgd2lsbCBhdCBsZWFzdCBnZW5lcmF0ZSBzb21lIHdhcm5pbmdzIGlmIGptb3JlY2ZnLmgKLSAqIGlzIGNoYW5nZWQgYW5kIGJlY29tZXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGFzc2VtYmx5IGNvZGUuCi0gKi8KLWV4dGVybiB2b2lkIGFybXY2X2lkY3Qoc2hvcnQgKmNvZWZzLCBpbnQgKnF1YW5zLCB1bnNpZ25lZCBjaGFyICoqcm93cywgaW50IGNvbCk7Ci0KLXZvaWQganBlZ19pZGN0X2FybXY2IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSUZBU1RfTVVMVF9UWVBFICpkY3RfdGFibGUgPSAoSUZBU1RfTVVMVF9UWVBFICopY29tcHB0ci0+ZGN0X3RhYmxlOwotICBhcm12Nl9pZGN0KGNvZWZfYmxvY2ssIGRjdF90YWJsZSwgb3V0cHV0X2J1Ziwgb3V0cHV0X2NvbCk7Ci19Ci0KLSNlbmRpZgotCi0vKgotICogVGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIChqZGlucHV0LmMpIHNhdmVzIGF3YXkgdGhlIGFwcHJvcHJpYXRlCi0gKiBxdWFudGl6YXRpb24gdGFibGUgZm9yIGVhY2ggY29tcG9uZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbgotICogaW52b2x2aW5nIHRoYXQgY29tcG9uZW50LiAgKFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNvcnJlY3RseQotICogZGVjb2RlIGZpbGVzIHRoYXQgcmV1c2UgUS10YWJsZSBzbG90cy4pCi0gKiBXaGVuIHdlIGFyZSByZWFkeSB0byBtYWtlIGFuIG91dHB1dCBwYXNzLCB0aGUgc2F2ZWQgUS10YWJsZSBpcyBjb252ZXJ0ZWQKLSAqIHRvIGEgbXVsdGlwbGllciB0YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBieSB0aGUgSURDVCByb3V0aW5lLgotICogVGhlIG11bHRpcGxpZXIgdGFibGUgY29udGVudHMgYXJlIElEQ1QtbWV0aG9kLWRlcGVuZGVudC4gIFRvIHN1cHBvcnQKLSAqIGFwcGxpY2F0aW9uIGNoYW5nZXMgaW4gSURDVCBtZXRob2QgYmV0d2VlbiBzY2Fucywgd2UgY2FuIHJlbWFrZSB0aGUKLSAqIG11bHRpcGxpZXIgdGFibGVzIGlmIG5lY2Vzc2FyeS4KLSAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBmaXJzdCBvdXRwdXQgcGFzcyBtYXkgb2NjdXIgYmVmb3JlIGFueSBkYXRhCi0gKiBoYXMgYmVlbiBzZWVuIGZvciBzb21lIGNvbXBvbmVudHMsIGFuZCB0aHVzIGJlZm9yZSB0aGVpciBRLXRhYmxlcyBoYXZlCi0gKiBiZWVuIHNhdmVkIGF3YXkuICBUbyBoYW5kbGUgdGhpcyBjYXNlLCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcHJlc2V0Ci0gKiB0byB6ZXJvZXM7IHRoZSByZXN1bHQgb2YgdGhlIElEQ1Qgd2lsbCBiZSBhIG5ldXRyYWwgZ3JheSBsZXZlbC4KLSAqLwotCi0KLS8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIElEQ1QgbWV0aG9kIGNvZGUgdGhhdCBlYWNoIG11bHRpcGxpZXIgdGFibGUKLSAgICogaXMgY3VycmVudGx5IHNldCB1cCBmb3IsIG9yIC0xIGlmIGl0J3Mgbm90IHlldCBzZXQgdXAuCi0gICAqIFRoZSBhY3R1YWwgbXVsdGlwbGllciB0YWJsZXMgYXJlIHBvaW50ZWQgdG8gYnkgZGN0X3RhYmxlIGluIHRoZQotICAgKiBwZXItY29tcG9uZW50IGNvbXBfaW5mbyBzdHJ1Y3R1cmVzLgotICAgKi8KLSAgaW50IGN1cl9tZXRob2RbTUFYX0NPTVBPTkVOVFNdOwotfSBteV9pZGN0X2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfaWRjdF9jb250cm9sbGVyICogbXlfaWRjdF9wdHI7Ci0KLQotLyogQWxsb2NhdGVkIG11bHRpcGxpZXIgdGFibGVzOiBiaWcgZW5vdWdoIGZvciBhbnkgc3VwcG9ydGVkIHZhcmlhbnQgKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gIElTTE9XX01VTFRfVFlQRSBpc2xvd19hcnJheVtEQ1RTSVpFMl07Ci0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICBJRkFTVF9NVUxUX1RZUEUgaWZhc3RfYXJyYXlbRENUU0laRTJdOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICBGTE9BVF9NVUxUX1RZUEUgZmxvYXRfYXJyYXlbRENUU0laRTJdOwotI2VuZGlmCi19IG11bHRpcGxpZXJfdGFibGU7Ci0KLQotLyogVGhlIGN1cnJlbnQgc2NhbGVkLUlEQ1Qgcm91dGluZXMgcmVxdWlyZSBJU0xPVy1zdHlsZSBtdWx0aXBsaWVyIHRhYmxlcywKLSAqIHNvIGJlIHN1cmUgdG8gY29tcGlsZSB0aGF0IGNvZGUgaWYgZWl0aGVyIElTTE9XIG9yIFNDQUxJTkcgaXMgcmVxdWVzdGVkLgotICovCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUwotI2Vsc2UKLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0jZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciBhbiBvdXRwdXQgcGFzcy4KLSAqIEhlcmUgd2Ugc2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudCBhbmQgYnVpbGQKLSAqIGEgbWF0Y2hpbmcgbXVsdGlwbGllciB0YWJsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lkY3RfcHRyIGlkY3QgPSAobXlfaWRjdF9wdHIpIGNpbmZvLT5pZGN0OwotICBpbnQgY2ksIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludCBtZXRob2QgPSAwOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIG1ldGhvZF9wdHIgPSBOVUxMOwotICBKUVVBTlRfVEJMICogcXRibDsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIFNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCi0gICAgc3dpdGNoIChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIHsKLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0gICAgY2FzZSAxOgotICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xeDE7Ci0gICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzJ4MjsKLSAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OwotICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIERDVFNJWkU6Ci0gICAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7Ci0jaWZkZWYgQU5EUk9JRF9BUk1WNl9JRENUCi0gICAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICBjYXNlIEpEQ1RfSUZBU1Q6Ci0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9hcm12NjsKLQltZXRob2QgPSBKRENUX0lGQVNUOwotCWJyZWFrOwotI2Vsc2UgLyogQU5EUk9JRF9BUk1WNl9JRENUICovCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICAgICAgY2FzZSBKRENUX0lTTE9XOgotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaXNsb3c7Ci0JbWV0aG9kID0gSkRDVF9JU0xPVzsKLQlicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgICAgIGNhc2UgSkRDVF9JRkFTVDoKLSNpZmRlZiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNCi0gICAgICAgIC8qIFVzZSBWZU51bSBpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX2lkY3RfaXNsb3cgZXZlbiBpZiBmYXN0IERDVCBvcHRpb24gaXMgc2VsZWN0ZWQgKi8KLQltZXRob2RfcHRyID0ganBlZ19pZGN0X2lzbG93OwotCW1ldGhvZCA9IEpEQ1RfSVNMT1c7Ci0jZWxzZQotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaWZhc3Q7Ci0JbWV0aG9kID0gSkRDVF9JRkFTVDsKLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0JYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZiAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gICAgICBjYXNlIEpEQ1RfRkxPQVQ6Ci0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9mbG9hdDsKLQltZXRob2QgPSBKRENUX0ZMT0FUOwotCWJyZWFrOwotI2VuZGlmCi0gICAgICBkZWZhdWx0OgotCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfRENUU0laRSwgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZGN0LT5wdWIuaW52ZXJzZV9EQ1RbY2ldID0gbWV0aG9kX3B0cjsKLSAgICAvKiBDcmVhdGUgbXVsdGlwbGllciB0YWJsZSBmcm9tIHF1YW50IHRhYmxlLgotICAgICAqIEhvd2V2ZXIsIHdlIGNhbiBza2lwIHRoaXMgaWYgdGhlIGNvbXBvbmVudCBpcyB1bmludGVyZXN0aW5nCi0gICAgICogb3IgaWYgd2UgYWxyZWFkeSBidWlsdCB0aGUgdGFibGUuICBBbHNvLCBpZiBubyBxdWFudCB0YWJsZQotICAgICAqIGhhcyB5ZXQgYmVlbiBzYXZlZCBmb3IgdGhlIGNvbXBvbmVudCwgd2UgbGVhdmUgdGhlCi0gICAgICogbXVsdGlwbGllciB0YWJsZSBhbGwtemVybzsgd2UnbGwgYmUgcmVhZGluZyB6ZXJvZXMgZnJvbSB0aGUKLSAgICAgKiBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgYnVmZmVyIGFueXdheS4KLSAgICAgKi8KLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkIHx8IGlkY3QtPmN1cl9tZXRob2RbY2ldID09IG1ldGhvZCkKLSAgICAgIGNvbnRpbnVlOwotICAgIHF0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKLSAgICBpZiAocXRibCA9PSBOVUxMKQkJLyogaGFwcGVucyBpZiBubyBkYXRhIHlldCBmb3IgY29tcG9uZW50ICovCi0gICAgICBjb250aW51ZTsKLSAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IG1ldGhvZDsKLSAgICBzd2l0Y2ggKG1ldGhvZCkgewotI2lmZGVmIFBST1ZJREVfSVNMT1dfVEFCTEVTCi0gICAgY2FzZSBKRENUX0lTTE9XOgotICAgICAgewotCS8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cywgYnV0IGFyZSBzdG9yZWQgYXMgaW50cyB0byBlbnN1cmUgYWNjZXNzIGVmZmljaWVuY3kuCi0JICovCi0JSVNMT1dfTVVMVF9UWVBFICogaXNtdGJsID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0JZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQkgIGlzbXRibFtpXSA9IChJU0xPV19NVUxUX1RZUEUpIHF0YmwtPnF1YW50dmFsW2ldOwotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9JRkFTVDoKLSAgICAgIHsKLQkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQotCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCi0JICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNwotCSAqIEZvciBpbnRlZ2VyIG9wZXJhdGlvbiwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMgdG8gYmUgc2NhbGVkIGJ5Ci0JICogSUZBU1RfU0NBTEVfQklUUy4KLQkgKi8KLQlJRkFTVF9NVUxUX1RZUEUgKiBpZm10YmwgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSNpZmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKLQkvKiBQcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE1IGJpdHMuICovCi0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNjYWxlc1tEQ1RTSVpFMl0gPSB7Ci0JICAzMjc2OCwgNDU0NTEsIDQyODEzLCAzODUzMSwgMzI3NjgsIDI1NzQ2LCAxNzczNCwgIDkwNDEsCi0JICA0NTQ1MSwgNjMwNDIsIDU5Mzg0LCA1MzQ0NCwgNDU0NTEsIDM1NzEwLCAyNDU5OCwgMTI1NDAsCi0JICA0MjgxMywgNTkzODQsIDU1OTM4LCA1MDM0MywgNDI4MTMsIDMzNjM4LCAyMzE3MCwgMTE4MTIsCi0JICAzODUzMSwgNTM0NDQsIDUwMzQzLCA0NTMwOCwgMzg1MzEsIDMwMjc0LCAyMDg1MywgMTA2MzEsCi0JICAzMjc2OCwgNDU0NTEsIDQyODEzLCAzODUzMSwgMzI3NjgsIDI1NzQ2LCAxNzczNCwgIDkwNDEsCi0JICAyNTc0NiwgMzU3MTAsIDMzNjM4LCAzMDI3NCwgMjU3NDYsIDIwMjI4LCAxMzkzMywgIDcxMDMsCi0JICAxNzczNCwgMjQ1OTgsIDIzMTcwLCAyMDg1MywgMTc3MzQsIDEzOTMzLCAgOTU5OCwgIDQ4OTMsCi0JICAgOTA0MSwgMTI1NDAsIDExODEyLCAxMDYzMSwgIDkwNDEsICA3MTAzLCAgNDg5MywgIDI0OTQsCi0JfTsKLQkvKiBJbnZlcnNlIG1hcCBvZiBbNywgNSwgMSwgMywgMCwgMiwgNCwgNl0uICovCi0Jc3RhdGljIGNvbnN0IGNoYXIgb3JkZXJzW0RDVFNJWkVdID0gezQsIDIsIDUsIDMsIDYsIDEsIDcsIDB9OwotCS8qIFJlb3JkZXIgdGhlIGNvbHVtbnMgYWZ0ZXIgdHJhbnNwb3NpbmcuICovCi0JZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyArK2kpIHsKLQkgIGludCBqID0gKChpICYgNykgPDwgMykgKyBvcmRlcnNbaSA+PiAzXTsKLQkgIGlmbXRibFtqXSA9IChxdGJsLT5xdWFudHZhbFtpXSAqIHNjYWxlc1tpXSArIDIpID4+IDI7Ci0JfQotI2Vsc2UgLyogQU5EUk9JRF9BUk1WNl9JRENUICovCi0KLSNkZWZpbmUgQ09OU1RfQklUUyAxNAotCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0gewotCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCi0JICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCi0JICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCi0JICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCi0JICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCi0JICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCi0JICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCi0JICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCi0JICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKLQl9OwotCVNISUZUX1RFTVBTCi0KLQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCSAgaWZtdGJsW2ldID0gKElGQVNUX01VTFRfVFlQRSkKLQkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCi0JCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCi0JCSAgICBDT05TVF9CSVRTLUlGQVNUX1NDQUxFX0JJVFMpOwotCX0KLSNlbmRpZiAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9GTE9BVDoKLSAgICAgIHsKLQkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQotCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCi0JICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNwotCSAqLwotCUZMT0FUX01VTFRfVFlQRSAqIGZtdGJsID0gKEZMT0FUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0JaW50IHJvdywgY29sOwotCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7Ci0JICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCi0JICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKLQl9OwotCi0JaSA9IDA7Ci0JZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgewotCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgewotCSAgICBmbXRibFtpXSA9IChGTE9BVF9NVUxUX1RZUEUpCi0JICAgICAgKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKLQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0pOwotCSAgICBpKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgSURDVCBtYW5hZ2VyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaW52ZXJzZV9kY3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lkY3RfcHRyIGlkY3Q7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBpZGN0ID0gKG15X2lkY3RfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2lkY3RfY29udHJvbGxlcikpOwotICBjaW5mby0+aWRjdCA9IChzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqKSBpZGN0OwotICBpZGN0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3M7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gYSBtdWx0aXBsaWVyIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudCAqLwotICAgIGNvbXBwdHItPmRjdF90YWJsZSA9Ci0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKLSAgICBNRU1aRVJPKGNvbXBwdHItPmRjdF90YWJsZSwgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKLSAgICAvKiBNYXJrIG11bHRpcGxpZXIgdGFibGUgbm90IHlldCBzZXQgdXAgZm9yIGFueSBtZXRob2QgKi8KLSAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IC0xOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZGh1ZmYuYyBiL2xpYmpwZWd0d3JwL2pkaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzVkNGZkLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkaHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLS8qCi0gKiBqZGh1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcy4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgotICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCi0gKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKLSAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50Ci0gKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZHBodWZmLmMgKi8KLQotTE9DQUwoYm9vbGVhbikgcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKTsKLQotCi0vKgotICogRXhwYW5kZWQgZW50cm9weSBkZWNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBkZWNvZGluZy4KLSAqCi0gKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCi0gKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLwotfSBzYXZhYmxlX3N0YXRlOwotCi0vKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCi0gKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKLSAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KLSAqLwotCi0jaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQotI2Vsc2UKLSNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0Ci0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKLQkoKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCi0jZW5kaWYKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgbG9hZGVkIGludG8gbG9jYWwgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGVhY2ggTUNVLgotICAgKiBJbiBjYXNlIG9mIHN1c3BlbnNpb24sIHdlIGV4aXQgV0lUSE9VVCB1cGRhdGluZyB0aGVtLgotICAgKi8KLSAgYml0cmVhZF9wZXJtX3N0YXRlIGJpdHN0YXRlOwkvKiBCaXQgYnVmZmVyIGF0IHN0YXJ0IG9mIE1DVSAqLwotICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogT3RoZXIgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KLSAgZF9kZXJpdmVkX3RibCAqIGRjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLSAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLQotICAvKiBQcmVjYWxjdWxhdGVkIGluZm8gc2V0IHVwIGJ5IHN0YXJ0X3Bhc3MgZm9yIHVzZSBpbiBkZWNvZGVfbWN1OiAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzIHRvIGJlIHVzZWQgZm9yIGVhY2ggYmxvY2sgd2l0aGluIGFuIE1DVSAqLwotICBkX2Rlcml2ZWRfdGJsICogZGNfY3VyX3RibHNbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIGRfZGVyaXZlZF90YmwgKiBhY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgLyogV2hldGhlciB3ZSBjYXJlIGFib3V0IHRoZSBEQyBhbmQgQUMgY29lZmZpY2llbnQgdmFsdWVzIGZvciBlYWNoIGJsb2NrICovCi0gIGJvb2xlYW4gZGNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBib29sZWFuIGFjX25lZWRlZFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKLX0gaHVmZl9lbnRyb3B5X2RlY29kZXI7Ci0KLXR5cGVkZWYgaHVmZl9lbnRyb3B5X2RlY29kZXIgKiBodWZmX2VudHJvcHlfcHRyOwotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgYmxrbiwgZGN0YmwsIGFjdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbCBhcmUgT0sgZm9yIHNlcXVlbnRpYWwgSlBFRy4KLSAgICogVGhpcyBvdWdodCB0byBiZSBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCB3ZSBtYWtlIGl0IGEgd2FybmluZyBiZWNhdXNlCi0gICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCi0gICAqLwotICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPlNlICE9IERDVFNJWkUyLTEgfHwKLSAgICAgIGNpbmZvLT5BaCAhPSAwIHx8IGNpbmZvLT5BbCAhPSAwKQotICAgIFdBUk5NUyhjaW5mbywgSldSTl9OT1RfU0VRVUVOVElBTCk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KLSAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCi0JCQkgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKLSAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAotCQkJICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7Ci0gICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgfQotCi0gIC8qIFByZWNhbGN1bGF0ZSBkZWNvZGluZyBpbmZvIGZvciBlYWNoIGJsb2NrIGluIGFuIE1DVSBvZiB0aGlzIHNjYW4gKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIFByZWNhbGN1bGF0ZSB3aGljaCB0YWJsZSB0byB1c2UgZm9yIGVhY2ggYmxvY2sgKi8KLSAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOwotICAgIGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub107Ci0gICAgLyogRGVjaWRlIHdoZXRoZXIgd2UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0gICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBUUlVFOwotICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgQUNzIGlmIHByb2R1Y2luZyBhIDEvOHRoLXNpemUgaW1hZ2UgKi8KLSAgICAgIGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPiAxKTsKLSAgICB9IGVsc2UgewotICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gRkFMU0U7Ci0gICAgfQotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KLSAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLX0KLQotCi0vKgotICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KLSAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgotICoKLSAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamRwaHVmZi5jLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19tYWtlX2RfZGVyaXZlZF90YmwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAotCQkJIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpCi17Ci0gIEpIVUZGX1RCTCAqaHRibDsKLSAgZF9kZXJpdmVkX3RibCAqZHRibDsKLSAgaW50IHAsIGksIGwsIHNpLCBudW1zeW1ib2xzOwotICBpbnQgbG9va2JpdHMsIGN0cjsKLSAgY2hhciBodWZmc2l6ZVsyNTddOwotICB1bnNpZ25lZCBpbnQgaHVmZmNvZGVbMjU3XTsKLSAgdW5zaWduZWQgaW50IGNvZGU7Ci0KLSAgLyogTm90ZSB0aGF0IGh1ZmZzaXplW10gYW5kIGh1ZmZjb2RlW10gYXJlIGZpbGxlZCBpbiBjb2RlLWxlbmd0aCBvcmRlciwKLSAgICogcGFyYWxsZWxpbmcgdGhlIG9yZGVyIG9mIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaW4gaHRibC0+aHVmZnZhbFtdLgotICAgKi8KLQotICAvKiBGaW5kIHRoZSBpbnB1dCBIdWZmbWFuIHRhYmxlICovCi0gIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX0hVRkZfVEJMUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7Ci0gIGh0YmwgPQotICAgIGlzREMgPyBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0Ymxub10gOiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0Ymxub107Ci0gIGlmIChodGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOwotCi0gIC8qIEFsbG9jYXRlIGEgd29ya3NwYWNlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLiAqLwotICBpZiAoKnBkdGJsID09IE5VTEwpCi0gICAgKnBkdGJsID0gKGRfZGVyaXZlZF90YmwgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YoZF9kZXJpdmVkX3RibCkpOwotICBkdGJsID0gKnBkdGJsOwotICBkdGJsLT5wdWIgPSBodGJsOwkJLyogZmlsbCBpbiBiYWNrIGxpbmsgKi8KLSAgCi0gIC8qIEZpZ3VyZSBDLjE6IG1ha2UgdGFibGUgb2YgSHVmZm1hbiBjb2RlIGxlbmd0aCBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBwID0gMDsKLSAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7Ci0gICAgaSA9IChpbnQpIGh0YmwtPmJpdHNbbF07Ci0gICAgaWYgKGkgPCAwIHx8IHAgKyBpID4gMjU2KQkvKiBwcm90ZWN0IGFnYWluc3QgdGFibGUgb3ZlcnJ1biAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgd2hpbGUgKGktLSkKLSAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKLSAgfQotICBodWZmc2l6ZVtwXSA9IDA7Ci0gIG51bXN5bWJvbHMgPSBwOwotICAKLSAgLyogRmlndXJlIEMuMjogZ2VuZXJhdGUgdGhlIGNvZGVzIHRoZW1zZWx2ZXMgKi8KLSAgLyogV2UgYWxzbyB2YWxpZGF0ZSB0aGF0IHRoZSBjb3VudHMgcmVwcmVzZW50IGEgbGVnYWwgSHVmZm1hbiBjb2RlIHRyZWUuICovCi0gIAotICBjb2RlID0gMDsKLSAgc2kgPSBodWZmc2l6ZVswXTsKLSAgcCA9IDA7Ci0gIHdoaWxlIChodWZmc2l6ZVtwXSkgewotICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IHNpKSB7Ci0gICAgICBodWZmY29kZVtwKytdID0gY29kZTsKLSAgICAgIGNvZGUrKzsKLSAgICB9Ci0gICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKLSAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCi0gICAgICovCi0gICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBzaSkpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICBjb2RlIDw8PSAxOwotICAgIHNpKys7Ci0gIH0KLQotICAvKiBGaWd1cmUgRi4xNTogZ2VuZXJhdGUgZGVjb2RpbmcgdGFibGVzIGZvciBiaXQtc2VxdWVudGlhbCBkZWNvZGluZyAqLwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKLSAgICBpZiAoaHRibC0+Yml0c1tsXSkgewotICAgICAgLyogdmFsb2Zmc2V0W2xdID0gaHVmZnZhbFtdIGluZGV4IG9mIDFzdCBzeW1ib2wgb2YgY29kZSBsZW5ndGggbCwKLSAgICAgICAqIG1pbnVzIHRoZSBtaW5pbXVtIGNvZGUgb2YgbGVuZ3RoIGwKLSAgICAgICAqLwotICAgICAgZHRibC0+dmFsb2Zmc2V0W2xdID0gKElOVDMyKSBwIC0gKElOVDMyKSBodWZmY29kZVtwXTsKLSAgICAgIHAgKz0gaHRibC0+Yml0c1tsXTsKLSAgICAgIGR0YmwtPm1heGNvZGVbbF0gPSBodWZmY29kZVtwLTFdOyAvKiBtYXhpbXVtIGNvZGUgb2YgbGVuZ3RoIGwgKi8KLSAgICB9IGVsc2UgewotICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IC0xOwkvKiAtMSBpZiBubyBjb2RlcyBvZiB0aGlzIGxlbmd0aCAqLwotICAgIH0KLSAgfQotICBkdGJsLT5tYXhjb2RlWzE3XSA9IDB4RkZGRkZMOyAvKiBlbnN1cmVzIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcyAqLwotCi0gIC8qIENvbXB1dGUgbG9va2FoZWFkIHRhYmxlcyB0byBzcGVlZCB1cCBkZWNvZGluZy4KLSAgICogRmlyc3Qgd2Ugc2V0IGFsbCB0aGUgdGFibGUgZW50cmllcyB0byAwLCBpbmRpY2F0aW5nICJ0b28gbG9uZyI7Ci0gICAqIHRoZW4gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhbmQKLSAgICogZmlsbCBpbiBhbGwgdGhlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIGJpdCBzZXF1ZW5jZXMgc3RhcnRpbmcKLSAgICogd2l0aCB0aGF0IGNvZGUuCi0gICAqLwotCi0gIE1FTVpFUk8oZHRibC0+bG9va19uYml0cywgU0laRU9GKGR0YmwtPmxvb2tfbmJpdHMpKTsKLQotICBwID0gMDsKLSAgZm9yIChsID0gMTsgbCA8PSBIVUZGX0xPT0tBSEVBRDsgbCsrKSB7Ci0gICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyssIHArKykgewotICAgICAgLyogbCA9IGN1cnJlbnQgY29kZSdzIGxlbmd0aCwgcCA9IGl0cyBpbmRleCBpbiBodWZmY29kZVtdICYgaHVmZnZhbFtdLiAqLwotICAgICAgLyogR2VuZXJhdGUgbGVmdC1qdXN0aWZpZWQgY29kZSBmb2xsb3dlZCBieSBhbGwgcG9zc2libGUgYml0IHNlcXVlbmNlcyAqLwotICAgICAgbG9va2JpdHMgPSBodWZmY29kZVtwXSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7Ci0gICAgICBmb3IgKGN0ciA9IDEgPDwgKEhVRkZfTE9PS0FIRUFELWwpOyBjdHIgPiAwOyBjdHItLSkgewotCWR0YmwtPmxvb2tfbmJpdHNbbG9va2JpdHNdID0gbDsKLQlkdGJsLT5sb29rX3N5bVtsb29rYml0c10gPSBodGJsLT5odWZmdmFsW3BdOwotCWxvb2tiaXRzKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGUgc3ltYm9scyBhcyBiZWluZyByZWFzb25hYmxlLgotICAgKiBGb3IgQUMgdGFibGVzLCB3ZSBtYWtlIG5vIGNoZWNrLCBidXQgYWNjZXB0IGFsbCBieXRlIHZhbHVlcyAwLi4yNTUuCi0gICAqIEZvciBEQyB0YWJsZXMsIHdlIHJlcXVpcmUgdGhlIHN5bWJvbHMgdG8gYmUgaW4gcmFuZ2UgMC4uMTUuCi0gICAqIChUaWdodGVyIGJvdW5kcyBjb3VsZCBiZSBhcHBsaWVkIGRlcGVuZGluZyBvbiB0aGUgZGF0YSBkZXB0aCBhbmQgbW9kZSwKLSAgICogYnV0IHRoaXMgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgc2FmZSBkZWNvZGluZy4pCi0gICAqLwotICBpZiAoaXNEQykgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1zeW1ib2xzOyBpKyspIHsKLSAgICAgIGludCBzeW0gPSBodGJsLT5odWZmdmFsW2ldOwotICAgICAgaWYgKHN5bSA8IDAgfHwgc3ltID4gMTUpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIE91dC1vZi1saW5lIGNvZGUgZm9yIGJpdCBmZXRjaGluZyAoc2hhcmVkIHdpdGggamRwaHVmZi5jKS4KLSAqIFNlZSBqZGh1ZmYuaCBmb3IgaW5mbyBhYm91dCB1c2FnZS4KLSAqIE5vdGU6IGN1cnJlbnQgdmFsdWVzIG9mIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgcGFzc2VkIGFzIHBhcmFtZXRlcnMsCi0gKiBidXQgYXJlIHJldHVybmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgc3RhdGUgc3RydWN0LgotICoKLSAqIE9uIG1vc3QgbWFjaGluZXMgTUlOX0dFVF9CSVRTIHNob3VsZCBiZSAyNSB0byBhbGxvdyB0aGUgZnVsbCAzMi1iaXQgd2lkdGgKLSAqIG9mIGdldF9idWZmZXIgdG8gYmUgdXNlZC4gIChPbiBtYWNoaW5lcyB3aXRoIHdpZGVyIHdvcmRzLCBhbiBldmVuIGxhcmdlcgotICogYnVmZmVyIGNvdWxkIGJlIHVzZWQuKSAgSG93ZXZlciwgb24gc29tZSBtYWNoaW5lcyAzMi1iaXQgc2hpZnRzIGFyZQotICogcXVpdGUgc2xvdyBhbmQgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHBsYWNlcyBzaGlmdGVkLgotICogKFRoaXMgaXMgdHJ1ZSB3aXRoIG1vc3QgUEMgY29tcGlsZXJzLCBmb3IgaW5zdGFuY2UuKSAgSW4gdGhpcyBjYXNlIGl0IG1heQotICogYmUgYSB3aW4gdG8gc2V0IE1JTl9HRVRfQklUUyB0byB0aGUgbWluaW11bSB2YWx1ZSBvZiAxNS4gIFRoaXMgcmVkdWNlcyB0aGUKLSAqIGF2ZXJhZ2Ugc2hpZnQgZGlzdGFuY2UgYXQgdGhlIGNvc3Qgb2YgbW9yZSBjYWxscyB0byBqcGVnX2ZpbGxfYml0X2J1ZmZlci4KLSAqLwotCi0jaWZkZWYgU0xPV19TSElGVF8zMgotI2RlZmluZSBNSU5fR0VUX0JJVFMgIDE1CS8qIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlICovCi0jZWxzZQotI2RlZmluZSBNSU5fR0VUX0JJVFMgIChCSVRfQlVGX1NJWkUtNykKLSNlbmRpZgotCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19maWxsX2JpdF9idWZmZXIgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAotCQkgICAgICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKLQkJICAgICAgaW50IG5iaXRzKQotLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCi17Ci0gIC8qIENvcHkgaGVhdmlseSB1c2VkIHN0YXRlIGZpZWxkcyBpbnRvIGxvY2FscyAoaG9wZWZ1bGx5IHJlZ2lzdGVycykgKi8KLSAgcmVnaXN0ZXIgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gc3RhdGUtPm5leHRfaW5wdXRfYnl0ZTsKLSAgcmVnaXN0ZXIgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IHN0YXRlLT5ieXRlc19pbl9idWZmZXI7Ci0gIGpfZGVjb21wcmVzc19wdHIgY2luZm8gPSBzdGF0ZS0+Y2luZm87Ci0KLSAgLyogQXR0ZW1wdCB0byBsb2FkIGF0IGxlYXN0IE1JTl9HRVRfQklUUyBiaXRzIGludG8gZ2V0X2J1ZmZlci4gKi8KLSAgLyogKEl0IGlzIGFzc3VtZWQgdGhhdCBubyByZXF1ZXN0IHdpbGwgYmUgZm9yIG1vcmUgdGhhbiB0aGF0IG1hbnkgYml0cy4pICovCi0gIC8qIFdlIGZhaWwgdG8gZG8gc28gb25seSBpZiB3ZSBoaXQgYSBtYXJrZXIgb3IgYXJlIGZvcmNlZCB0byBzdXNwZW5kLiAqLwotCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CS8qIGNhbm5vdCBhZHZhbmNlIHBhc3QgYSBtYXJrZXIgKi8KLSAgICB3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7Ci0gICAgICByZWdpc3RlciBpbnQgYzsKLQotICAgICAgLyogQXR0ZW1wdCB0byByZWFkIGEgYnl0ZSAqLwotICAgICAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7Ci0JaWYgKCEgKCpjaW5mby0+c3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkKLQkgIHJldHVybiBGQUxTRTsKLQluZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7Ci0JYnl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOwotICAgICAgfQotICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07Ci0gICAgICBjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7Ci0KLSAgICAgIC8qIElmIGl0J3MgMHhGRiwgY2hlY2sgYW5kIGRpc2NhcmQgc3R1ZmZlZCB6ZXJvIGJ5dGUgKi8KLSAgICAgIGlmIChjID09IDB4RkYpIHsKLQkvKiBMb29wIGhlcmUgdG8gZGlzY2FyZCBhbnkgcGFkZGluZyBGRidzIG9uIHRlcm1pbmF0aW5nIG1hcmtlciwKLQkgKiBzbyB0aGF0IHdlIGNhbiBzYXZlIGEgdmFsaWQgdW5yZWFkX21hcmtlciB2YWx1ZS4gIE5PVEU6IHdlIHdpbGwKLQkgKiBhY2NlcHQgbXVsdGlwbGUgRkYncyBmb2xsb3dlZCBieSBhIDAgYXMgbWVhbmluZyBhIHNpbmdsZSBGRiBkYXRhCi0JICogYnl0ZS4gIFRoaXMgZGF0YSBwYXR0ZXJuIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLgotCSAqLwotCWRvIHsKLQkgIGlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgewotCSAgICBpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQotCSAgICAgIHJldHVybiBGQUxTRTsKLQkgICAgbmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlOwotCSAgICBieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7Ci0JICB9Ci0JICBieXRlc19pbl9idWZmZXItLTsKLQkgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKLQl9IHdoaWxlIChjID09IDB4RkYpOwotCi0JaWYgKGMgPT0gMCkgewotCSAgLyogRm91bmQgRkYvMDAsIHdoaWNoIHJlcHJlc2VudHMgYW4gRkYgZGF0YSBieXRlICovCi0JICBjID0gMHhGRjsKLQl9IGVsc2UgewotCSAgLyogT29wcywgaXQncyBhY3R1YWxseSBhIG1hcmtlciBpbmRpY2F0aW5nIGVuZCBvZiBjb21wcmVzc2VkIGRhdGEuCi0JICAgKiBTYXZlIHRoZSBtYXJrZXIgY29kZSBmb3IgbGF0ZXIgdXNlLgotCSAgICogRmluZSBwb2ludDogaXQgbWlnaHQgYXBwZWFyIHRoYXQgd2Ugc2hvdWxkIHNhdmUgdGhlIG1hcmtlciBpbnRvCi0JICAgKiBiaXRyZWFkIHdvcmtpbmcgc3RhdGUsIG5vdCBzdHJhaWdodCBpbnRvIHBlcm1hbmVudCBzdGF0ZS4gIEJ1dAotCSAgICogb25jZSB3ZSBoYXZlIGhpdCBhIG1hcmtlciwgd2UgY2Fubm90IG5lZWQgdG8gc3VzcGVuZCB3aXRoaW4gdGhlCi0JICAgKiBjdXJyZW50IE1DVSwgYmVjYXVzZSB3ZSB3aWxsIHJlYWQgbm8gbW9yZSBieXRlcyBmcm9tIHRoZSBkYXRhCi0JICAgKiBzb3VyY2UuICBTbyBpdCBpcyBPSyB0byB1cGRhdGUgcGVybWFuZW50IHN0YXRlIHJpZ2h0IGF3YXkuCi0JICAgKi8KLQkgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKLQkgIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBzb21lIGZha2UgemVybyBiaXRzLiAqLwotCSAgZ290byBub19tb3JlX2J5dGVzOwotCX0KLSAgICAgIH0KLQotICAgICAgLyogT0ssIGxvYWQgYyBpbnRvIGdldF9idWZmZXIgKi8KLSAgICAgIGdldF9idWZmZXIgPSAoZ2V0X2J1ZmZlciA8PCA4KSB8IGM7Ci0gICAgICBiaXRzX2xlZnQgKz0gODsKLSAgICB9IC8qIGVuZCB3aGlsZSAqLwotICB9IGVsc2UgewotICBub19tb3JlX2J5dGVzOgotICAgIC8qIFdlIGdldCBoZXJlIGlmIHdlJ3ZlIHJlYWQgdGhlIG1hcmtlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGNvbXByZXNzZWQKLSAgICAgKiBkYXRhIHNlZ21lbnQuICBUaGVyZSBzaG91bGQgYmUgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciByZWdpc3RlcgotICAgICAqIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3Q7IGlmIHNvLCBubyBwcm9ibGVtLgotICAgICAqLwotICAgIGlmIChuYml0cyA+IGJpdHNfbGVmdCkgewotICAgICAgLyogVWgtb2guICBSZXBvcnQgY29ycnVwdGVkIGRhdGEgdG8gdXNlciBhbmQgc3R1ZmYgemVyb2VzIGludG8KLSAgICAgICAqIHRoZSBkYXRhIHN0cmVhbSwgc28gdGhhdCB3ZSBjYW4gcHJvZHVjZSBzb21lIGtpbmQgb2YgaW1hZ2UuCi0gICAgICAgKiBXZSB1c2UgYSBub252b2xhdGlsZSBmbGFnIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHdhcm5pbmcgbWVzc2FnZQotICAgICAgICogYXBwZWFycyBwZXIgZGF0YSBzZWdtZW50LgotICAgICAgICovCi0gICAgICBpZiAoISBjaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEpIHsKLQlXQVJOTVMoY2luZm8sIEpXUk5fSElUX01BUktFUik7Ci0JY2luZm8tPmVudHJvcHktPmluc3VmZmljaWVudF9kYXRhID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIC8qIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHplcm8gYml0cyAqLwotICAgICAgZ2V0X2J1ZmZlciA8PD0gTUlOX0dFVF9CSVRTIC0gYml0c19sZWZ0OwotICAgICAgYml0c19sZWZ0ID0gTUlOX0dFVF9CSVRTOwotICAgIH0KLSAgfQotCi0gIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCi0gIHN0YXRlLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7Ci0gIHN0YXRlLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0gIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKLSAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogT3V0LW9mLWxpbmUgY29kZSBmb3IgSHVmZm1hbiBjb2RlIGRlY29kaW5nLgotICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgotICovCi0KLUdMT0JBTChpbnQpCi1qcGVnX2h1ZmZfZGVjb2RlIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKLQkJICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKLQkJICBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKQotewotICByZWdpc3RlciBpbnQgbCA9IG1pbl9iaXRzOwotICByZWdpc3RlciBJTlQzMiBjb2RlOwotCi0gIC8qIEhVRkZfREVDT0RFIGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGNvZGUgaXMgYXQgbGVhc3QgbWluX2JpdHMgKi8KLSAgLyogYml0cyBsb25nLCBzbyBmZXRjaCB0aGF0IG1hbnkgYml0cyBpbiBvbmUgc3dvb3AuICovCi0KLSAgQ0hFQ0tfQklUX0JVRkZFUigqc3RhdGUsIGwsIHJldHVybiAtMSk7Ci0gIGNvZGUgPSBHRVRfQklUUyhsKTsKLQotICAvKiBDb2xsZWN0IHRoZSByZXN0IG9mIHRoZSBIdWZmbWFuIGNvZGUgb25lIGJpdCBhdCBhIHRpbWUuICovCi0gIC8qIFRoaXMgaXMgcGVyIEZpZ3VyZSBGLjE2IGluIHRoZSBKUEVHIHNwZWMuICovCi0KLSAgd2hpbGUgKGNvZGUgPiBodGJsLT5tYXhjb2RlW2xdKSB7Ci0gICAgY29kZSA8PD0gMTsKLSAgICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgMSwgcmV0dXJuIC0xKTsKLSAgICBjb2RlIHw9IEdFVF9CSVRTKDEpOwotICAgIGwrKzsKLSAgfQotCi0gIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCi0gIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKLSAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKLQotICAvKiBXaXRoIGdhcmJhZ2UgaW5wdXQgd2UgbWF5IHJlYWNoIHRoZSBzZW50aW5lbCB2YWx1ZSBsID0gMTcuICovCi0KLSAgaWYgKGwgPiAxNikgewotICAgIFdBUk5NUyhzdGF0ZS0+Y2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7Ci0gICAgcmV0dXJuIDA7CQkJLyogZmFrZSBhIHplcm8gYXMgdGhlIHNhZmVzdCByZXN1bHQgKi8KLSAgfQotCi0gIHJldHVybiBodGJsLT5wdWItPmh1ZmZ2YWxbIChpbnQpIChjb2RlICsgaHRibC0+dmFsb2Zmc2V0W2xdKSBdOwotfQotCi0KLS8qCi0gKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgotICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCi0gKi8KLQotI2lmZGVmIEFWT0lEX1RBQkxFUwotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKLQotI2Vsc2UKLQotI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQotCi1zdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLwotICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAotICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OwotCi1zdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCi0gIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKLSAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAotICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCi0gICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OwotCi0jZW5kaWYgLyogQVZPSURfVEFCTEVTICovCi0KLQotLyoKLSAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgotICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLXByb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgY2k7Ci0KLSAgLyogVGhyb3cgYXdheSBhbnkgdW51c2VkIGJpdHMgcmVtYWluaW5nIGluIGJpdCBidWZmZXI7ICovCi0gIC8qIGluY2x1ZGUgYW55IGZ1bGwgYnl0ZXMgaW4gbmV4dF9tYXJrZXIncyBjb3VudCBvZiBkaXNjYXJkZWQgYnl0ZXMgKi8KLSAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCAvIDg7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0KLSAgLyogQWR2YW5jZSBwYXN0IHRoZSBSU1RuIG1hcmtlciAqLwotICBpZiAoISAoKmNpbmZvLT5tYXJrZXItPnJlYWRfcmVzdGFydF9tYXJrZXIpIChjaW5mbykpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotCi0gIC8qIFJlc2V0IHJlc3RhcnQgY291bnRlciAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotCi0gIC8qIFJlc2V0IG91dC1vZi1kYXRhIGZsYWcsIHVubGVzcyByZWFkX3Jlc3RhcnRfbWFya2VyIGxlZnQgdXMgc21hY2sgdXAKLSAgICogYWdhaW5zdCBhIG1hcmtlci4gIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGVuZCB1cCB0cmVhdGluZyB0aGUgbmV4dCBkYXRhCi0gICAqIHNlZ21lbnQgYXMgZW1wdHksIGFuZCB3ZSBjYW4gYXZvaWQgcHJvZHVjaW5nIGJvZ3VzIG91dHB1dCBwaXhlbHMgYnkKLSAgICogbGVhdmluZyB0aGUgZmxhZyBzZXQuCi0gICAqLwotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkKLSAgICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZW9jZGUgcG9zaXRpb24gYW5kIHRoZSBEQyBjb2VmZmljaWVudHMKLSAqIGZvciBlYWNoIGNvbXBvbmVudCBpbnRvIGJpdHN0cmVhbV9vZmZzZXQgYW5kIGRjX2luZm9bXSwgcmVzcGVjdGl2ZWx5LgotICovCi1NRVRIT0RERUYodm9pZCkKLWdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgc2hvcnQgaW50ICpkY19pbmZvID0gb2Zmc2V0LT5wcmV2X2RjOwotICBpbnQgaTsKLSAganBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oY2luZm8sIG9mZnNldCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7Ci0gICAgZGNfaW5mb1tpXSA9IGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2ldOwotICB9Ci19Ci0KLS8qCi0gKiBTYXZlIHRoZSBjdXJyZW50IEh1ZmZtYW4gZGVjb2RlciBwb3NpdGlvbiBhbmQgdGhlIGJpdCBidWZmZXIKLSAqIGludG8gYml0c3RyZWFtX29mZnNldCBhbmQgZ2V0X2J1ZmZlciwgcmVzcGVjdGl2ZWx5LgotICovCi1HTE9CQUwodm9pZCkKLWpwZWdfZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgZGF0YSBzZWdtZW50Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybjsKLSAgfQotCi0gIC8vIFNhdmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0KLSAgb2Zmc2V0LT5yZXN0YXJ0c190b19nbyA9ICh1bnNpZ25lZCBzaG9ydCkgZW50cm9weS0+cmVzdGFydHNfdG9fZ287Ci0gIG9mZnNldC0+bmV4dF9yZXN0YXJ0X251bSA9IGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW07Ci0KLSAgb2Zmc2V0LT5iaXRzdHJlYW1fb2Zmc2V0ID0KLSAgICAgIChqZ2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbykgPDwgTE9HX1RXT19CSVRfQlVGX1NJWkUpCi0gICAgICArIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdDsKLQotICBvZmZzZXQtPmdldF9idWZmZXIgPSBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyOwotfQotCi0vKgotICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgdG8gZGVjb2RlIHRoZSBpbWFnZQotICogc3RhcnRpbmcgZnJvbSB0aGUgYml0c3RyZWFtIHBvc2l0aW9uIHJlY29yZGVkIGluIG9mZnNldC4KLSAqLwotTUVUSE9EREVGKHZvaWQpCi1jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHNob3J0IGludCAqZGNfaW5mbyA9IG9mZnNldC5wcmV2X2RjOwotICBpbnQgaTsKLSAganBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGNpbmZvLCBvZmZzZXQpOwotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgewotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2ldID0gZGNfaW5mb1tpXTsKLSAgfQotfQotCi0vKgotICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgcmVhZGVyIHBvc2l0aW9uIGFuZCBiaXQgYnVmZmVyLgotICovCi1HTE9CQUwodm9pZCkKLWpwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotCi0gIC8vIFJlc3RvcmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0KLSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IG9mZnNldC5yZXN0YXJ0c190b19nbzsKLSAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IG9mZnNldC5uZXh0X3Jlc3RhcnRfbnVtOwotCi0gIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fb2Zmc2V0ID0gb2Zmc2V0LmJpdHN0cmVhbV9vZmZzZXQ7Ci0gIGludCBibGtuLCBpOwotCi0gIHVuc2lnbmVkIGludCBieXRlX29mZnNldCA9IGJpdHN0cmVhbV9vZmZzZXQgPj4gTE9HX1RXT19CSVRfQlVGX1NJWkU7Ci0gIHVuc2lnbmVkIGludCBiaXRfaW5fYml0X2J1ZmZlciA9Ci0gICAgICBiaXRzdHJlYW1fb2Zmc2V0ICYgKCgxIDw8IExPR19UV09fQklUX0JVRl9TSVpFKSAtIDEpOwotCi0gIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uX2JpdChjaW5mbywgYnl0ZV9vZmZzZXQsCi0gICAgICAgICAgYml0X2luX2JpdF9idWZmZXIsIG9mZnNldC5nZXRfYnVmZmVyKTsKLX0KLQotLyoKLSAqIERlY29kZSBhbmQgcmV0dXJuIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgotICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKLSAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgotICoKLSAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKLSAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBIQVMgQkVFTiBaRVJPRUQgQlkgVEhFIENBTExFUi4KLSAqIChXaG9sZXNhbGUgemVyb2luZyBpcyB1c3VhbGx5IGEgbGl0dGxlIGZhc3RlciB0aGFuIHJldGFpbC4uLikKLSAqCi0gKiBSZXR1cm5zIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCi0gKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0Ci0gKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKLSAqIHRoaXMgbW9kdWxlLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuKQotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZGVjb2RlX21jdSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgYmxrbjsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBzYXZhYmxlX3N0YXRlIHN0YXRlOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgotICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KLSAgICovCi0gIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgewotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7Ci0KLSAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgICAgSkJMT0NLUk9XIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgICBkX2Rlcml2ZWRfdGJsICogZGN0YmwgPSBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXTsKLSAgICAgIGRfZGVyaXZlZF90YmwgKiBhY3RibCA9IGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dOwotICAgICAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0KLSAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLwotCi0gICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLwotICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGRjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7Ci0gICAgICBpZiAocykgewotCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JciA9IEdFVF9CSVRTKHMpOwotCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgewotCS8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLwotCWludCBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLQlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKLQlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOwotCS8qIE91dHB1dCB0aGUgREMgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdID0gMCkgKi8KLQkoKmJsb2NrKVswXSA9IChKQ09FRikgczsKLSAgICAgIH0KLQotICAgICAgaWYgKGVudHJvcHktPmFjX25lZWRlZFtibGtuXSkgewotCi0JLyogU2VjdGlvbiBGLjIuMi4yOiBkZWNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyAqLwotCS8qIFNpbmNlIHplcm9lcyBhcmUgc2tpcHBlZCwgb3V0cHV0IGFyZWEgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZWhhbmQgKi8KLQlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7Ci0gICAgICAKLQkgIHIgPSBzID4+IDQ7Ci0JICBzICY9IDE1OwotICAgICAgCi0JICBpZiAocykgewotCSAgICBrICs9IHI7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICAgIHIgPSBHRVRfQklUUyhzKTsKLQkgICAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotCSAgICAvKiBPdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyLgotCSAgICAgKiBOb3RlOiB0aGUgZXh0cmEgZW50cmllcyBpbiBqcGVnX25hdHVyYWxfb3JkZXJbXSB3aWxsIHNhdmUgdXMKLQkgICAgICogaWYgayA+PSBEQ1RTSVpFMiwgd2hpY2ggY291bGQgaGFwcGVuIGlmIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZC4KLQkgICAgICovCi0JICAgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIHM7Ci0JICB9IGVsc2UgewotCSAgICBpZiAociAhPSAxNSkKLQkgICAgICBicmVhazsKLQkgICAgayArPSAxNTsKLQkgIH0KLQl9Ci0KLSAgICAgIH0gZWxzZSB7Ci0KLQkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCi0JLyogSW4gdGhpcyBwYXRoIHdlIGp1c3QgZGlzY2FyZCB0aGUgdmFsdWVzICovCi0JZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLQkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOwotICAgICAgCi0JICByID0gcyA+PiA0OwotCSAgcyAmPSAxNTsKLSAgICAgIAotCSAgaWYgKHMpIHsKLQkgICAgayArPSByOwotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCSAgICBEUk9QX0JJVFMocyk7Ci0JICB9IGVsc2UgewotCSAgICBpZiAociAhPSAxNSkKLQkgICAgICBicmVhazsKLQkgICAgayArPSAxNTsKLQkgIH0KLQl9Ci0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOwotICB9Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKgotICogRGVjb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgotICogVGhlIHByb3Bvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsY3VsYXRlIHRoZQotICogZGF0YSBsZW5ndGggb2Ygb25lIE1DVSBpbiBIdWZmbWFuLWNvZGVkIGZvcm1hdC4KLSAqIFRoZXJlZm9yZSwgYWxsIGNvZWZmaWNpZW50cyBhcmUgZGlzY2FyZGVkLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGJsa247Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7Ci0KLSAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOwotCi0gICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLwotCi0gICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICAgIGRfZGVyaXZlZF90YmwgKiBkY3RibCA9IGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dOwotICAgICAgZF9kZXJpdmVkX3RibCAqIGFjdGJsID0gZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl07Ci0gICAgICByZWdpc3RlciBpbnQgcywgaywgcjsKLQotICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLSAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKLSAgICAgIGlmIChzKSB7Ci0JQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQlyID0gR0VUX0JJVFMocyk7Ci0JcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotICAgICAgfQotCi0gICAgICAvKiBkaXNjYXJkIGFsbCBjb2VmZmljaWVudHMgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0pIHsKLQkvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KLQlpbnQgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0JcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07Ci0Jc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKLSAgICAgIH0KLSAgICAgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7Ci0gICAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOwotCi0gICAgICAgIHIgPSBzID4+IDQ7Ci0gICAgICAgIHMgJj0gMTU7Ci0KLSAgICAgICAgaWYgKHMpIHsKLSAgICAgICAgICBrICs9IHI7Ci0gICAgICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLSAgICAgICAgICBEUk9QX0JJVFMocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHIgIT0gMTUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBrICs9IDE1OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2h1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgaTsKLQotICBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKLSAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7Ci0gIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmX2RlY29kZXI7Ci0gIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdTsKLSAgZW50cm9weS0+cHViLmRlY29kZV9tY3VfZGlzY2FyZF9jb2VmID0gZGVjb2RlX21jdV9kaXNjYXJkX2NvZWY7Ci0gIGVudHJvcHktPnB1Yi5jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyID0gY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcjsKLSAgZW50cm9weS0+cHViLmdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbiA9Ci0gICAgICAgIGdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbjsKLSAgZW50cm9weS0+cHViLmluZGV4ID0gTlVMTDsKLQotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSAgfQotfQotCi0vKgotICogQ2FsbCBhZnRlciBqcGVnX3JlYWRfaGVhZGVyCi0gKi8KLUdMT0JBTCh2b2lkKQotanBlZ19jcmVhdGVfaHVmZm1hbl9pbmRleChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKLXsKLSAgaW50IGksIHM7Ci0gIGluZGV4LT5zY2FuX2NvdW50ID0gMTsKLSAgaW5kZXgtPnRvdGFsX2lNQ1Vfcm93cyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7Ci0gIGluZGV4LT5zY2FuID0gKGh1ZmZtYW5fc2Nhbl9oZWFkZXIqKW1hbGxvYyhpbmRleC0+c2Nhbl9jb3VudAotICAgICAgICAgICogc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpKTsKLSAgaW5kZXgtPnNjYW5bMF0ub2Zmc2V0ID0gKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKiltYWxsb2MoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cwotICAgICAgICAgICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKSk7Ci0gIGluZGV4LT5zY2FuWzBdLnByZXZfTUNVX29mZnNldC5iaXRzdHJlYW1fb2Zmc2V0ID0gMDsKLSAgaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSA9IERFRkFVTFRfTUNVX1NBTVBMRV9TSVpFOwotCi0gIGluZGV4LT5tZW1fdXNlZCA9IHNpemVvZihodWZmbWFuX3NjYW5faGVhZGVyKQotICAgICAgKyBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Rlc3Ryb3lfaHVmZm1hbl9pbmRleChodWZmbWFuX2luZGV4ICppbmRleCkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgewotICAgICAgICBmb3IoaiA9IDA7IGogPCBpbmRleC0+dG90YWxfaU1DVV9yb3dzOyBqKyspIHsKLSAgICAgICAgICAgIGZyZWUoaW5kZXgtPnNjYW5baV0ub2Zmc2V0W2pdKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKGluZGV4LT5zY2FuW2ldLm9mZnNldCk7Ci0gICAgfQotICAgIGZyZWUoaW5kZXgtPnNjYW4pOwotfQotCi0vKgotICogU2V0IHRoZSByZWFkZXIgYnl0ZSBwb3NpdGlvbiB0byBvZmZzZXQKLSAqLwotR0xPQkFMKHZvaWQpCi1qc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgb2Zmc2V0KQotewotICBpZiAoY2luZm8tPnNyYy0+c2Vla19pbnB1dF9kYXRhKSB7Ci0gICAgY2luZm8tPnNyYy0+c2Vla19pbnB1dF9kYXRhKGNpbmZvLCBvZmZzZXQpOwotICB9IGVsc2UgewotICAgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmN1cnJlbnRfb2Zmc2V0IC0gb2Zmc2V0OwotICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPnN0YXJ0X2lucHV0X2J5dGUgKyBvZmZzZXQ7Ci0gIH0KLX0KLQotLyoKLSAqIFNldCB0aGUgcmVhZGVyIGJ5dGUgcG9zaXRpb24gdG8gb2Zmc2V0IGFuZCBiaXQgcG9zaXRpb24gdG8gYml0X2xlZnQKLSAqIHdpdGggYml0IGJ1ZmZlciBzZXQgdG8gYnVmLgotICovCi1HTE9CQUwodm9pZCkKLWpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uX2JpdChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBpbnQgYnl0ZV9vZmZzZXQsIGludCBiaXRfbGVmdCwgSU5UMzIgYnVmKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gYml0X2xlZnQ7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIgPSBidWY7Ci0KLSAganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8sIGJ5dGVfb2Zmc2V0KTsKLX0KLQotLyoKLSAqIEdldCB0aGUgY3VycmVudCByZWFkZXIgYnl0ZSBwb3NpdGlvbi4KLSAqLwotR0xPQkFMKGludCkKLWpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHJldHVybiBjaW5mby0+c3JjLT5jdXJyZW50X29mZnNldCAtIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkaHVmZi5oIGIvbGlianBlZ3R3cnAvamRodWZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjBhMTMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRodWZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIGpkaHVmZi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMKLSAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGRlY29kZXIgKGpkaHVmZi5jKSBhbmQgdGhlCi0gKiBwcm9ncmVzc2l2ZSBkZWNvZGVyIChqZHBodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KLSAqLwotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19tYWtlX2RfZGVyaXZlZF90YmwJak1rRERlcml2ZWQKLSNkZWZpbmUganBlZ19maWxsX2JpdF9idWZmZXIJakZpbEJpdEJ1ZgotI2RlZmluZSBqcGVnX2h1ZmZfZGVjb2RlCWpIdWZEZWNvZGUKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KLQotI2RlZmluZSBIVUZGX0xPT0tBSEVBRAk4CS8qICMgb2YgYml0cyBvZiBsb29rYWhlYWQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBCYXNpYyB0YWJsZXM6IChlbGVtZW50IFswXSBvZiBlYWNoIGFycmF5IGlzIHVudXNlZCkgKi8KLSAgSU5UMzIgbWF4Y29kZVsxOF07CQkvKiBsYXJnZXN0IGNvZGUgb2YgbGVuZ3RoIGsgKC0xIGlmIG5vbmUpICovCi0gIC8qIChtYXhjb2RlWzE3XSBpcyBhIHNlbnRpbmVsIHRvIGVuc3VyZSBqcGVnX2h1ZmZfZGVjb2RlIHRlcm1pbmF0ZXMpICovCi0gIElOVDMyIHZhbG9mZnNldFsxN107CQkvKiBodWZmdmFsW10gb2Zmc2V0IGZvciBjb2RlcyBvZiBsZW5ndGggayAqLwotICAvKiB2YWxvZmZzZXRba10gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBrLCBsZXNzCi0gICAqIHRoZSBzbWFsbGVzdCBjb2RlIG9mIGxlbmd0aCBrOyBzbyBnaXZlbiBhIGNvZGUgb2YgbGVuZ3RoIGssIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHN5bWJvbCBpcyBodWZmdmFsW2NvZGUgKyB2YWxvZmZzZXRba11dCi0gICAqLwotCi0gIC8qIExpbmsgdG8gcHVibGljIEh1ZmZtYW4gdGFibGUgKG5lZWRlZCBvbmx5IGluIGpwZWdfaHVmZl9kZWNvZGUpICovCi0gIEpIVUZGX1RCTCAqcHViOwotCi0gIC8qIExvb2thaGVhZCB0YWJsZXM6IGluZGV4ZWQgYnkgdGhlIG5leHQgSFVGRl9MT09LQUhFQUQgYml0cyBvZgotICAgKiB0aGUgaW5wdXQgZGF0YSBzdHJlYW0uICBJZiB0aGUgbmV4dCBIdWZmbWFuIGNvZGUgaXMgbm8gbW9yZQotICAgKiB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZywgd2UgY2FuIG9idGFpbiBpdHMgbGVuZ3RoIGFuZAotICAgKiB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgZGlyZWN0bHkgZnJvbSB0aGVzZSB0YWJsZXMuCi0gICAqLwotICBpbnQgbG9va19uYml0c1sxPDxIVUZGX0xPT0tBSEVBRF07IC8qICMgYml0cywgb3IgMCBpZiB0b28gbG9uZyAqLwotICBVSU5UOCBsb29rX3N5bVsxPDxIVUZGX0xPT0tBSEVBRF07IC8qIHN5bWJvbCwgb3IgdW51c2VkICovCi19IGRfZGVyaXZlZF90Ymw7Ci0KLS8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLwotRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkgICAgIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKLQotCi0vKgotICogRmV0Y2hpbmcgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpcyBhIHRpbWUtY3JpdGljYWwgb3BlcmF0aW9uCi0gKiBmb3IgdGhlIEh1ZmZtYW4gZGVjb2RlcnMuICBXZSBpbXBsZW1lbnQgaXQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIGlubGluZQotICogbWFjcm9zIGFuZCBvdXQtb2YtbGluZSBzdWJyb3V0aW5lcy4gIE5vdGUgdGhhdCBOICh0aGUgbnVtYmVyIG9mIGJpdHMKLSAqIGRlbWFuZGVkIGF0IG9uZSB0aW1lKSBuZXZlciBleGNlZWRzIDE1IGZvciBKUEVHIHVzZS4KLSAqCi0gKiBXZSByZWFkIHNvdXJjZSBieXRlcyBpbnRvIGdldF9idWZmZXIgYW5kIGRvbGUgb3V0IGJpdHMgYXMgbmVlZGVkLgotICogSWYgZ2V0X2J1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIGVub3VnaCBiaXRzLCB0aGV5IGFyZSBmZXRjaGVkIGluLWxpbmUKLSAqIGJ5IHRoZSBtYWNyb3MgQ0hFQ0tfQklUX0JVRkZFUiBhbmQgR0VUX0JJVFMuICBXaGVuIHRoZXJlIGFyZW4ndCBlbm91Z2gKLSAqIGJpdHMsIGpwZWdfZmlsbF9iaXRfYnVmZmVyIGlzIGNhbGxlZDsgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbGwgZ2V0X2J1ZmZlcgotICogYXMgZnVsbCBhcyBwb3NzaWJsZSAobm90IGp1c3QgdG8gdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZDsgdGhpcwotICogcHJlZmV0Y2hpbmcgcmVkdWNlcyB0aGUgb3ZlcmhlYWQgY29zdCBvZiBjYWxsaW5nIGpwZWdfZmlsbF9iaXRfYnVmZmVyKS4KLSAqIE5vdGUgdGhhdCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBtYXkgcmV0dXJuIEZBTFNFIHRvIGluZGljYXRlIHN1c3BlbnNpb24uCi0gKiBPbiBUUlVFIHJldHVybiwganBlZ19maWxsX2JpdF9idWZmZXIgZ3VhcmFudGVlcyB0aGF0IGdldF9idWZmZXIgY29udGFpbnMKLSAqIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJpdHMgLS0tIGR1bW15IHplcm9lcyBhcmUgaW5zZXJ0ZWQgaWYKLSAqIG5lY2Vzc2FyeS4KLSAqLwotCi10eXBlZGVmIElOVDMyIGJpdF9idWZfdHlwZTsJLyogdHlwZSBvZiBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KLSNkZWZpbmUgQklUX0JVRl9TSVpFICAzMgkvKiBzaXplIG9mIGJ1ZmZlciBpbiBiaXRzICovCi0jZGVmaW5lIExPR19UV09fQklUX0JVRl9TSVpFICA1CS8qIGxvZ18yKEJJVF9CVUZfU0laRSkgKi8KLQotLyogSWYgbG9uZyBpcyA+IDMyIGJpdHMgb24geW91ciBtYWNoaW5lLCBhbmQgc2hpZnRpbmcvbWFza2luZyBsb25ncyBpcwotICogcmVhc29uYWJseSBmYXN0LCBtYWtpbmcgYml0X2J1Zl90eXBlIGJlIGxvbmcgYW5kIHNldHRpbmcgQklUX0JVRl9TSVpFCi0gKiBhcHByb3ByaWF0ZWx5IHNob3VsZCBiZSBhIHdpbi4gIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgZGVmaW5lIHRoZSBzaXplCi0gKiB3aXRoIHNvbWV0aGluZyBsaWtlICAjZGVmaW5lIEJJVF9CVUZfU0laRSAoc2l6ZW9mKGJpdF9idWZfdHlwZSkqOCkKLSAqIGJlY2F1c2Ugbm90IGFsbCBtYWNoaW5lcyBtZWFzdXJlIHNpemVvZiBpbiA4LWJpdCBieXRlcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBCaXRyZWFkaW5nIHN0YXRlIHNhdmVkIGFjcm9zcyBNQ1VzICovCi0gIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOwkvKiBjdXJyZW50IGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLwotICBpbnQgYml0c19sZWZ0OwkJLyogIyBvZiB1bnVzZWQgYml0cyBpbiBpdCAqLwotfSBiaXRyZWFkX3Blcm1fc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgd29ya2luZyBzdGF0ZSB3aXRoaW4gYW4gTUNVICovCi0gIC8qIEN1cnJlbnQgZGF0YSBzb3VyY2UgbG9jYXRpb24gKi8KLSAgLyogV2UgbmVlZCBhIGNvcHksIHJhdGhlciB0aGFuIG11bmdpbmcgdGhlIG9yaWdpbmFsLCBpbiBjYXNlIG9mIHN1c3BlbnNpb24gKi8KLSAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIHNvdXJjZSAqLwotICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBzb3VyY2UgYnVmZmVyICovCi0gIC8qIEJpdCBpbnB1dCBidWZmZXIgLS0tIG5vdGUgdGhlc2UgdmFsdWVzIGFyZSBrZXB0IGluIHJlZ2lzdGVyIHZhcmlhYmxlcywKLSAgICogbm90IGluIHRoaXMgc3RydWN0LCBpbnNpZGUgdGhlIGlubmVyIGxvb3BzLgotICAgKi8KLSAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCi0gIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCi0gIC8qIFBvaW50ZXIgbmVlZGVkIGJ5IGpwZWdfZmlsbF9iaXRfYnVmZmVyLiAqLwotICBqX2RlY29tcHJlc3NfcHRyIGNpbmZvOwkvKiBiYWNrIGxpbmsgdG8gZGVjb21wcmVzcyBtYXN0ZXIgcmVjb3JkICovCi19IGJpdHJlYWRfd29ya2luZ19zdGF0ZTsKLQotLyogTWFjcm9zIHRvIGRlY2xhcmUgYW5kIGxvYWQvc2F2ZSBiaXRyZWFkIGxvY2FsIHZhcmlhYmxlcy4gKi8KLSNkZWZpbmUgQklUUkVBRF9TVEFURV9WQVJTICBcCi0JcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7ICBcCi0JcmVnaXN0ZXIgaW50IGJpdHNfbGVmdDsgIFwKLQliaXRyZWFkX3dvcmtpbmdfc3RhdGUgYnJfc3RhdGUKLQotI2RlZmluZSBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm9wLHBlcm1zdGF0ZSkgIFwKLQlicl9zdGF0ZS5jaW5mbyA9IGNpbmZvcDsgXAotCWJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGU7IFwKLQlicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBjaW5mb3AtPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOyBcCi0JZ2V0X2J1ZmZlciA9IHBlcm1zdGF0ZS5nZXRfYnVmZmVyOyBcCi0JYml0c19sZWZ0ID0gcGVybXN0YXRlLmJpdHNfbGVmdDsKLQotI2RlZmluZSBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm9wLHBlcm1zdGF0ZSkgIFwKLQljaW5mb3AtPnNyYy0+bmV4dF9pbnB1dF9ieXRlID0gYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlOyBcCi0JY2luZm9wLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlcjsgXAotCXBlcm1zdGF0ZS5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsgXAotCXBlcm1zdGF0ZS5iaXRzX2xlZnQgPSBiaXRzX2xlZnQKLQotLyoKLSAqIFRoZXNlIG1hY3JvcyBwcm92aWRlIHRoZSBpbi1saW5lIHBvcnRpb24gb2YgYml0IGZldGNoaW5nLgotICogVXNlIENIRUNLX0JJVF9CVUZGRVIgdG8gZW5zdXJlIHRoZXJlIGFyZSBOIGJpdHMgaW4gZ2V0X2J1ZmZlcgotICogYmVmb3JlIHVzaW5nIEdFVF9CSVRTLCBQRUVLX0JJVFMsIG9yIERST1BfQklUUy4KLSAqIFRoZSB2YXJpYWJsZXMgZ2V0X2J1ZmZlciBhbmQgYml0c19sZWZ0IGFyZSBhc3N1bWVkIHRvIGJlIGxvY2FscywKLSAqIGJ1dCB0aGUgc3RhdGUgc3RydWN0IG1pZ2h0IG5vdCBiZSAoanBlZ19odWZmX2RlY29kZSBuZWVkcyB0aGlzKS4KLSAqCUNIRUNLX0JJVF9CVUZGRVIoc3RhdGUsbixhY3Rpb24pOwotICoJCUVuc3VyZSB0aGVyZSBhcmUgTiBiaXRzIGluIGdldF9idWZmZXI7IGlmIHN1c3BlbmQsIHRha2UgYWN0aW9uLgotICogICAgICB2YWwgPSBHRVRfQklUUyhuKTsKLSAqCQlGZXRjaCBuZXh0IE4gYml0cy4KLSAqICAgICAgdmFsID0gUEVFS19CSVRTKG4pOwotICoJCUZldGNoIG5leHQgTiBiaXRzIHdpdGhvdXQgcmVtb3ZpbmcgdGhlbSBmcm9tIHRoZSBidWZmZXIuCi0gKglEUk9QX0JJVFMobik7Ci0gKgkJRGlzY2FyZCBuZXh0IE4gYml0cy4KLSAqIFRoZSB2YWx1ZSBOIHNob3VsZCBiZSBhIHNpbXBsZSB2YXJpYWJsZSwgbm90IGFuIGV4cHJlc3Npb24sIGJlY2F1c2UgaXQKLSAqIGlzIGV2YWx1YXRlZCBtdWx0aXBsZSB0aW1lcy4KLSAqLwotCi0jZGVmaW5lIENIRUNLX0JJVF9CVUZGRVIoc3RhdGUsbmJpdHMsYWN0aW9uKSBcCi0JeyBpZiAoYml0c19sZWZ0IDwgKG5iaXRzKSkgeyAgXAotCSAgICBpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmKHN0YXRlKSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxuYml0cykpICBcCi0JICAgICAgeyBhY3Rpb247IH0gIFwKLQkgICAgZ2V0X2J1ZmZlciA9IChzdGF0ZSkuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gKHN0YXRlKS5iaXRzX2xlZnQ7IH0gfQotCi0jZGVmaW5lIEdFVF9CSVRTKG5iaXRzKSBcCi0JKCgoaW50KSAoZ2V0X2J1ZmZlciA+PiAoYml0c19sZWZ0IC09IChuYml0cykpKSkgJiAoKDE8PChuYml0cykpLTEpKQotCi0jZGVmaW5lIFBFRUtfQklUUyhuYml0cykgXAotCSgoKGludCkgKGdldF9idWZmZXIgPj4gKGJpdHNfbGVmdCAtICAobmJpdHMpKSkpICYgKCgxPDwobmJpdHMpKS0xKSkKLQotI2RlZmluZSBEUk9QX0JJVFMobmJpdHMpIFwKLQkoYml0c19sZWZ0IC09IChuYml0cykpCi0KLS8qIExvYWQgdXAgdGhlIGJpdCBidWZmZXIgdG8gYSBkZXB0aCBvZiBhdCBsZWFzdCBuYml0cyAqLwotRVhURVJOKGJvb2xlYW4pIGpwZWdfZmlsbF9iaXRfYnVmZmVyCi0JSlBQKChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsCi0JICAgICByZWdpc3RlciBpbnQgYml0c19sZWZ0LCBpbnQgbmJpdHMpKTsKLQotCi0vKgotICogQ29kZSBmb3IgZXh0cmFjdGluZyBuZXh0IEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZyb20gaW5wdXQgYml0IHN0cmVhbS4KLSAqIEFnYWluLCB0aGlzIGlzIHRpbWUtY3JpdGljYWwgYW5kIHdlIG1ha2UgdGhlIG1haW4gcGF0aHMgYmUgbWFjcm9zLgotICoKLSAqIFdlIHVzZSBhIGxvb2thaGVhZCB0YWJsZSB0byBwcm9jZXNzIGNvZGVzIG9mIHVwIHRvIEhVRkZfTE9PS0FIRUFEIGJpdHMKLSAqIHdpdGhvdXQgbG9vcGluZy4gIFVzdWFsbHksIG1vcmUgdGhhbiA5NSUgb2YgdGhlIEh1ZmZtYW4gY29kZXMgd2lsbCBiZSA4Ci0gKiBvciBmZXdlciBiaXRzIGxvbmcuICBUaGUgZmV3IG92ZXJsZW5ndGggY29kZXMgYXJlIGhhbmRsZWQgd2l0aCBhIGxvb3AsCi0gKiB3aGljaCBuZWVkIG5vdCBiZSBpbmxpbmUgY29kZS4KLSAqCi0gKiBOb3RlcyBhYm91dCB0aGUgSFVGRl9ERUNPREUgbWFjcm86Ci0gKiAxLiBOZWFyIHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VnbWVudCwgd2UgbWF5IGZhaWwgdG8gZ2V0IGVub3VnaCBiaXRzCi0gKiAgICBmb3IgYSBsb29rYWhlYWQuICBJbiB0aGF0IGNhc2UsIHdlIGRvIGl0IHRoZSBoYXJkIHdheS4KLSAqIDIuIElmIHRoZSBsb29rYWhlYWQgdGFibGUgY29udGFpbnMgbm8gZW50cnksIHRoZSBuZXh0IGNvZGUgbXVzdCBiZQotICogICAgbW9yZSB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZy4KLSAqIDMuIGpwZWdfaHVmZl9kZWNvZGUgcmV0dXJucyAtMSBpZiBmb3JjZWQgdG8gc3VzcGVuZC4KLSAqLwotCi0jZGVmaW5lIEhVRkZfREVDT0RFKHJlc3VsdCxzdGF0ZSxodGJsLGZhaWxhY3Rpb24sc2xvd2xhYmVsKSBcCi17IHJlZ2lzdGVyIGludCBuYiwgbG9vazsgXAotICBpZiAoYml0c19sZWZ0IDwgSFVGRl9MT09LQUhFQUQpIHsgXAotICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCZzdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCwgMCkpIHtmYWlsYWN0aW9uO30gXAotICAgIGdldF9idWZmZXIgPSBzdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBzdGF0ZS5iaXRzX2xlZnQ7IFwKLSAgICBpZiAoYml0c19sZWZ0IDwgSFVGRl9MT09LQUhFQUQpIHsgXAotICAgICAgbmIgPSAxOyBnb3RvIHNsb3dsYWJlbDsgXAotICAgIH0gXAotICB9IFwKLSAgbG9vayA9IFBFRUtfQklUUyhIVUZGX0xPT0tBSEVBRCk7IFwKLSAgaWYgKChuYiA9IGh0YmwtPmxvb2tfbmJpdHNbbG9va10pICE9IDApIHsgXAotICAgIERST1BfQklUUyhuYik7IFwKLSAgICByZXN1bHQgPSBodGJsLT5sb29rX3N5bVtsb29rXTsgXAotICB9IGVsc2UgeyBcCi0gICAgbmIgPSBIVUZGX0xPT0tBSEVBRCsxOyBcCi1zbG93bGFiZWw6IFwKLSAgICBpZiAoKHJlc3VsdD1qcGVnX2h1ZmZfZGVjb2RlKCZzdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxodGJsLG5iKSkgPCAwKSBcCi0JeyBmYWlsYWN0aW9uOyB9IFwKLSAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCi0gIH0gXAotfQotCi0vKiBPdXQtb2YtbGluZSBjYXNlIGZvciBIdWZmbWFuIGNvZGUgZmV0Y2hpbmcgKi8KLUVYVEVSTihpbnQpIGpwZWdfaHVmZl9kZWNvZGUKLQlKUFAoKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLCByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwKLQkgICAgIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpKTsKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkaW5wdXQuYyBiL2xpYmpwZWd0d3JwL2pkaW5wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2MWMxYS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZGlucHV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoKLSAqIGpkaW5wdXQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBjb250cm9sbGluZyB0aGUgZGVjb21wcmVzc29yJ3MgaW5wdXQKLSAqIHByb2Nlc3NpbmcgKG1hcmtlciByZWFkaW5nIGFuZCBjb2VmZmljaWVudCBkZWNvZGluZykuICBUaGUgYWN0dWFsIGlucHV0Ci0gKiByZWFkaW5nIGlzIGRvbmUgaW4gamRtYXJrZXIuYywgamRodWZmLmMsIGFuZCBqZHBodWZmLmMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGJvb2xlYW4gaW5oZWFkZXJzOwkJLyogVFJVRSB1bnRpbCBmaXJzdCBTT1MgaXMgcmVhY2hlZCAqLwotfSBteV9pbnB1dF9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X2lucHV0X2NvbnRyb2xsZXIgKiBteV9pbnB1dGN0bF9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihpbnQpIGNvbnN1bWVfbWFya2VycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLU1FVEhPRERFRihpbnQpIGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXggSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikpOwotCi0KLS8qCi0gKiBSb3V0aW5lcyB0byBjYWxjdWxhdGUgdmFyaW91cyBxdWFudGl0aWVzIHJlbGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlLgotICovCi0KLUxPQ0FMKHZvaWQpCi1pbml0aWFsX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQ2FsbGVkIG9uY2UsIHdoZW4gZmlyc3QgU09TIG1hcmtlciBpcyByZWFjaGVkICovCi17Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gSSBjYW4gaGFuZGxlICovCi0gIGlmICgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04gfHwKLSAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIEpQRUdfTUFYX0RJTUVOU0lPTik7Ci0KLSAgLyogRm9yIG5vdywgcHJlY2lzaW9uIG11c3QgbWF0Y2ggY29tcGlsZWQtaW4gdmFsdWUuLi4gKi8KLSAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSBCSVRTX0lOX0pTQU1QTEUpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BSRUNJU0lPTiwgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKLQotICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBjb21wb25lbnRzIHdvbid0IGV4Y2VlZCBpbnRlcm5hbCBhcnJheSBzaXplcyAqLwotICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICBNQVhfQ09NUE9ORU5UUyk7Ci0KLSAgLyogQ29tcHV0ZSBtYXhpbXVtIHNhbXBsaW5nIGZhY3RvcnM7IGNoZWNrIGZhY3RvciB2YWxpZGl0eSAqLwotICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSAxOwotICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSAxOwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SIHx8Ci0JY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT52X3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1NBTVBMSU5HKTsKLSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yLAotCQkJCSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOwotICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gIH0KLQotICAvKiBXZSBpbml0aWFsaXplIERDVF9zY2FsZWRfc2l6ZSBhbmQgbWluX0RDVF9zY2FsZWRfc2l6ZSB0byBEQ1RTSVpFLgotICAgKiBJbiB0aGUgZnVsbCBkZWNvbXByZXNzb3IsIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGpkbWFzdGVyLmM7Ci0gICAqIGJ1dCBpbiB0aGUgdHJhbnNjb2RlciwgamRtYXN0ZXIuYyBpcyBub3QgdXNlZCwgc28gd2UgbXVzdCBkbyBpdCBoZXJlLgotICAgKi8KLSAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotCi0gIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKLSAgICAvKiBTaXplIGluIERDVCBibG9ja3MgKi8KLSAgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgLyogZG93bnNhbXBsZWRfd2lkdGggYW5kIGRvd25zYW1wbGVkX2hlaWdodCB3aWxsIGFsc28gYmUgb3ZlcnJpZGRlbiBieQotICAgICAqIGpkbWFzdGVyLmMgaWYgd2UgYXJlIGRvaW5nIGZ1bGwgZGVjb21wcmVzc2lvbi4gIFRoZSB0cmFuc2NvZGVyIGxpYnJhcnkKLSAgICAgKiBkb2Vzbid0IHVzZSB0aGVzZSB2YWx1ZXMsIGJ1dCB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtaWdodC4KLSAgICAgKi8KLSAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KLSAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKLSAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgIC8qIE1hcmsgY29tcG9uZW50IG5lZWRlZCwgdW50aWwgY29sb3IgY29udmVyc2lvbiBzYXlzIG90aGVyd2lzZSAqLwotICAgIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgPSBUUlVFOwotICAgIC8qIE1hcmsgbm8gcXVhbnRpemF0aW9uIHRhYmxlIHlldCBzYXZlZCBmb3IgY29tcG9uZW50ICovCi0gICAgY29tcHB0ci0+cXVhbnRfdGFibGUgPSBOVUxMOwotICB9Ci0KLSAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvd3MuICovCi0gIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKLSAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAotCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLQotICAvKiBEZWNpZGUgd2hldGhlciBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIHNjYW5zICovCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8IGNpbmZvLT5udW1fY29tcG9uZW50cyB8fCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKLSAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyA9IFRSVUU7Ci0gIGVsc2UKLSAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOwotICBjaW5mby0+b3JpZ2luYWxfaW1hZ2Vfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci19Ci0KLUxPQ0FMKHZvaWQpCi1wZXJfc2Nhbl9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBKUEVHIHNjYW4gKi8KLS8qIGNpbmZvLT5jb21wc19pbl9zY2FuIGFuZCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tdIHdlcmUgc2V0IGZyb20gU09TIG1hcmtlciAqLwotewotICBpbnQgY2ksIG1jdWJsa3MsIHRtcDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA9PSAxKSB7Ci0gICAgCi0gICAgLyogTm9uaW50ZXJsZWF2ZWQgKHNpbmdsZS1jb21wb25lbnQpIHNjYW4gKi8KLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF07Ci0gICAgCi0gICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KLSAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLSAgICAKLSAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYWx3YXlzIG9uZSBibG9jayBwZXIgTUNVICovCi0gICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKLSAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKLSAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKLSAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKLSAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAotICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgotICAgICAqLwotICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKLSAgICAKLSAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCi0gICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOwotICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7Ci0gICAgCi0gIH0gZWxzZSB7Ci0gICAgCi0gICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLwotICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAotCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7Ci0gICAgCi0gICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KLSAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Ci0gICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Ci0gICAgCi0gICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOwotICAgIAotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLwotICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7Ci0gICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgICAgLyogRmlndXJlIG51bWJlciBvZiBub24tZHVtbXkgYmxvY2tzIGluIGxhc3QgTUNVIGNvbHVtbiAmIHJvdyAqLwotICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV93aWR0aCk7Ci0gICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKLSAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOwotI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKLSAgICAgIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKLSAgICAgICAgdG1wID0gKGludCkgKGpkaXZfcm91bmRfdXAoY2luZm8tPmltYWdlX3dpZHRoLCA4KQotICAgICAgICAgICAgICAgICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKLSAgICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0gICAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7Ci0gICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7Ci0gICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7Ci0gICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCi0gICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKLSAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBEX01BWF9CTE9DS1NfSU5fTUNVKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKLSAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7Ci0JY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19kZWNvbXByZXNzX3Blcl9zY2FuX3NldHVwKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotfQotCi0KLQotLyoKLSAqIFNhdmUgYXdheSBhIGNvcHkgb2YgdGhlIFEtdGFibGUgcmVmZXJlbmNlZCBieSBlYWNoIGNvbXBvbmVudCBwcmVzZW50Ci0gKiBpbiB0aGUgY3VycmVudCBzY2FuLCB1bmxlc3MgYWxyZWFkeSBzYXZlZCBkdXJpbmcgYSBwcmlvciBzY2FuLgotICoKLSAqIEluIGEgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGUsIHRoZSBlbmNvZGVyIGNvdWxkIGFzc2lnbiBkaWZmZXJlbnQgY29tcG9uZW50cwotICogdGhlIHNhbWUgUS10YWJsZSBzbG90IG51bWJlciwgYnV0IGNoYW5nZSB0YWJsZSBkZWZpbml0aW9ucyBiZXR3ZWVuIHNjYW5zCi0gKiBzbyB0aGF0IGVhY2ggY29tcG9uZW50IHVzZXMgYSBkaWZmZXJlbnQgUS10YWJsZS4gIChUaGUgSUpHIGVuY29kZXIgaXMgbm90Ci0gKiBjdXJyZW50bHkgY2FwYWJsZSBvZiBkb2luZyB0aGlzLCBidXQgb3RoZXIgZW5jb2RlcnMgbWlnaHQuKSAgU2luY2Ugd2Ugd2FudAotICogdG8gYmUgYWJsZSB0byBkZXF1YW50aXplIGFsbCB0aGUgY29tcG9uZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGlzCi0gKiBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc2F2ZSBhd2F5IHRoZSB0YWJsZSBhY3R1YWxseSB1c2VkIGZvciBlYWNoIGNvbXBvbmVudC4KLSAqIFdlIGRvIHRoaXMgYnkgY29weWluZyB0aGUgdGFibGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGNvbnRhaW5pbmcKLSAqIHRoZSBjb21wb25lbnQuCi0gKiBUaGUgSlBFRyBzcGVjIHByb2hpYml0cyB0aGUgZW5jb2RlciBmcm9tIGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiBhIFEtdGFibGUKLSAqIHNsb3QgYmV0d2VlbiBzY2FucyBvZiBhIGNvbXBvbmVudCB1c2luZyB0aGF0IHNsb3QuICBJZiB0aGUgZW5jb2RlciBkb2VzIHNvCi0gKiBhbnl3YXksIHRoaXMgZGVjb2RlciB3aWxsIHNpbXBseSB1c2UgdGhlIFEtdGFibGUgdmFsdWVzIHRoYXQgd2VyZSBjdXJyZW50Ci0gKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHNjYW4gZm9yIHRoZSBjb21wb25lbnQuCi0gKgotICogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBsb29rcyBvbmx5IGF0IHRoZSBzYXZlZCBxdWFudCB0YWJsZXMsCi0gKiBub3QgYXQgdGhlIGN1cnJlbnQgUS10YWJsZSBzbG90cy4KLSAqLwotCi1MT0NBTCh2b2lkKQotbGF0Y2hfcXVhbnRfdGFibGVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgY2ksIHF0YmxubzsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlFVQU5UX1RCTCAqIHF0Ymw7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIE5vIHdvcmsgaWYgd2UgYWxyZWFkeSBzYXZlZCBRLXRhYmxlIGZvciB0aGlzIGNvbXBvbmVudCAqLwotICAgIGlmIChjb21wcHRyLT5xdWFudF90YWJsZSAhPSBOVUxMKQotICAgICAgY29udGludWU7Ci0gICAgLyogTWFrZSBzdXJlIHNwZWNpZmllZCBxdWFudGl6YXRpb24gdGFibGUgaXMgcHJlc2VudCAqLwotICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKLSAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKLQljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7Ci0gICAgLyogT0ssIHNhdmUgYXdheSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlICovCi0gICAgcXRibCA9IChKUVVBTlRfVEJMICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKEpRVUFOVF9UQkwpKTsKLSAgICBNRU1DT1BZKHF0YmwsIGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dLCBTSVpFT0YoSlFVQU5UX1RCTCkpOwotICAgIGNvbXBwdHItPnF1YW50X3RhYmxlID0gcXRibDsKLSAgfQotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBpbnB1dCBtb2R1bGVzIHRvIHJlYWQgYSBzY2FuIG9mIGNvbXByZXNzZWQgZGF0YS4KLSAqIFRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgaXMgZG9uZSBieSBqZG1hc3Rlci5jIGFmdGVyIGluaXRpYWxpemluZwotICogdGhlIGVudGlyZSBkZWNvbXByZXNzb3IgKGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MpLgotICogU3Vic2VxdWVudCBjYWxscyBjb21lIGZyb20gY29uc3VtZV9tYXJrZXJzLCBiZWxvdy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKLSAgbGF0Y2hfcXVhbnRfdGFibGVzKGNpbmZvKTsKLSAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgKCpjaW5mby0+Y29lZi0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YTsKLSAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgICBjaW5mby0+Y29lZi0+Y29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXg7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhZnRlciBpbnB1dHRpbmcgYSBjb21wcmVzc2VkLWRhdGEgc2Nhbi4KLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFmdGVyIGl0J3MgcmVhZCBhbGwKLSAqIHRoZSBleHBlY3RlZCBkYXRhIG9mIHRoZSBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLSAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgICBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4OwotfQotCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikKLXsKLSAgICByZXR1cm4gY29uc3VtZV9tYXJrZXJzKGNpbmZvKTsKLX0KLS8qCi0gKiBSZWFkIEpQRUcgbWFya2VycyBiZWZvcmUsIGJldHdlZW4sIG9yIGFmdGVyIGNvbXByZXNzZWQtZGF0YSBzY2Fucy4KLSAqIENoYW5nZSBzdGF0ZSBhcyBuZWNlc3Nhcnkgd2hlbiBhIG5ldyBzY2FuIGlzIHJlYWNoZWQuCi0gKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCi0gKgotICogVGhlIGNvbnN1bWVfaW5wdXQgbWV0aG9kIHBvaW50ZXIgcG9pbnRzIGVpdGhlciBoZXJlIG9yIHRvIHRoZQotICogY29lZmZpY2llbnQgY29udHJvbGxlcidzIGNvbnN1bWVfZGF0YSByb3V0aW5lLCBkZXBlbmRpbmcgb24gd2hldGhlcgotICogd2UgYXJlIHJlYWRpbmcgYSBjb21wcmVzc2VkIGRhdGEgc2VnbWVudCBvciBpbnRlci1zZWdtZW50IG1hcmtlcnMuCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWNvbnN1bWVfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikgY2luZm8tPmlucHV0Y3RsOwotICBpbnQgdmFsOwotCi0gIGlmIChpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkKSAvKiBBZnRlciBoaXR0aW5nIEVPSSwgcmVhZCBubyBmdXJ0aGVyICovCi0gICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0k7Ci0KLSAgdmFsID0gKCpjaW5mby0+bWFya2VyLT5yZWFkX21hcmtlcnMpIChjaW5mbyk7Ci0KLSAgc3dpdGNoICh2YWwpIHsKLSAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgkvKiBGb3VuZCBTT1MgKi8KLSAgICBpZiAoaW5wdXRjdGwtPmluaGVhZGVycykgewkvKiAxc3QgU09TICovCi0gICAgICBpbml0aWFsX3NldHVwKGNpbmZvKTsKLSAgICAgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBGQUxTRTsKLSAgICAgIC8qIE5vdGU6IHN0YXJ0X2lucHV0X3Bhc3MgbXVzdCBiZSBjYWxsZWQgYnkgamRtYXN0ZXIuYwotICAgICAgICogYmVmb3JlIGFueSBtb3JlIGlucHV0IGNhbiBiZSBjb25zdW1lZC4gIGpkYXBpbWluLmMgaXMKLSAgICAgICAqIHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgdGhpcyBzZXF1ZW5jaW5nLgotICAgICAgICovCi0gICAgfSBlbHNlIHsJCQkvKiAybmQgb3IgbGF0ZXIgU09TIG1hcmtlciAqLwotICAgICAgaWYgKCEgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9FT0lfRVhQRUNURUQpOyAvKiBPb3BzLCBJIHdhc24ndCBleHBlY3RpbmcgdGhpcyEgKi8KLSAgICAgIHN0YXJ0X2lucHV0X3Bhc3MoY2luZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgkvKiBGb3VuZCBFT0kgKi8KLSAgICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gVFJVRTsKLSAgICBpZiAoaW5wdXRjdGwtPmluaGVhZGVycykgewkvKiBUYWJsZXMtb25seSBkYXRhc3RyZWFtLCBhcHBhcmVudGx5ICovCi0gICAgICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPRikKLQlFUlJFWElUKGNpbmZvLCBKRVJSX1NPRl9OT19TT1MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY29lZiBjdGxyJ3MgZGVjb21wcmVzc19kYXRhIHJvdXRpbmUKLSAgICAgICAqIGlmIHVzZXIgc2V0IG91dHB1dF9zY2FuX251bWJlciBsYXJnZXIgdGhhbiBudW1iZXIgb2Ygc2NhbnMuCi0gICAgICAgKi8KLSAgICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID4gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKQotCWNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEpQRUdfU1VTUEVOREVEOgotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHZhbDsKLX0KLQotCi0vKgotICogUmVzZXQgc3RhdGUgdG8gYmVnaW4gYSBmcmVzaCBkYXRhc3RyZWFtLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmVzZXRfaW5wdXRfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikgY2luZm8tPmlucHV0Y3RsOwotCi0gIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLSAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQotICAgICAgICBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4OwotICBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOyAvKiAidW5rbm93biIgd291bGQgYmUgYmV0dGVyICovCi0gIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBGQUxTRTsKLSAgaW5wdXRjdGwtPmluaGVhZGVycyA9IFRSVUU7Ci0gIC8qIFJlc2V0IG90aGVyIG1vZHVsZXMgKi8KLSAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICgqY2luZm8tPm1hcmtlci0+cmVzZXRfbWFya2VyX3JlYWRlcikgKGNpbmZvKTsKLSAgLyogUmVzZXQgcHJvZ3Jlc3Npb24gc3RhdGUgLS0gd291bGQgYmUgY2xlYW5lciBpZiBlbnRyb3B5IGRlY29kZXIgZGlkIHRoaXMgKi8KLSAgY2luZm8tPmNvZWZfYml0cyA9IE5VTEw7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGlucHV0IGNvbnRyb2xsZXIgbW9kdWxlLgotICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlLCB3aGVuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBpcyBjcmVhdGVkLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaW5wdXRfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsOwotCi0gIC8qIENyZWF0ZSBzdWJvYmplY3QgaW4gcGVybWFuZW50IHBvb2wgKi8KLSAgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCVNJWkVPRihteV9pbnB1dF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5pbnB1dGN0bCA9IChzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyICopIGlucHV0Y3RsOwotICAvKiBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycyAqLwotICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7Ci0gIGlucHV0Y3RsLT5wdWIucmVzZXRfaW5wdXRfY29udHJvbGxlciA9IHJlc2V0X2lucHV0X2NvbnRyb2xsZXI7Ci0gIGlucHV0Y3RsLT5wdWIuc3RhcnRfaW5wdXRfcGFzcyA9IHN0YXJ0X2lucHV0X3Bhc3M7Ci0gIGlucHV0Y3RsLT5wdWIuZmluaXNoX2lucHV0X3Bhc3MgPSBmaW5pc2hfaW5wdXRfcGFzczsKLQotICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfbWFya2VycyA9IGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXg7Ci0gIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4ID0KLSAgICAgICAgY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleDsKLSAgLyogSW5pdGlhbGl6ZSBzdGF0ZTogY2FuJ3QgdXNlIHJlc2V0X2lucHV0X2NvbnRyb2xsZXIgc2luY2Ugd2UgZG9uJ3QKLSAgICogd2FudCB0byB0cnkgdG8gcmVzZXQgb3RoZXIgbW9kdWxlcyB5ZXQuCi0gICAqLwotICBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOyAvKiAidW5rbm93biIgd291bGQgYmUgYmV0dGVyICovCi0gIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBGQUxTRTsKLSAgaW5wdXRjdGwtPmluaGVhZGVycyA9IFRSVUU7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZG1haW5jdC5jIGIvbGlianBlZ3R3cnAvamRtYWluY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3MjE3ZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZG1haW5jdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLS8qCi0gKiBqZG1haW5jdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCi0gKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBKUEVHIGRlY29tcHJlc3NvciBwcm9wZXIgYW5kIHRoZQotICogcG9zdC1wcm9jZXNzb3I7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGJ5cGFzc2VkIGluIHJhdy1kYXRhIG1vZGUsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbgotICogc3VwcGxpZXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG1haW4gYnVmZmVyIGluIHRoYXQgY2FzZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIEluIHRoZSBjdXJyZW50IHN5c3RlbSBkZXNpZ24sIHRoZSBtYWluIGJ1ZmZlciBuZWVkIG5ldmVyIGJlIGEgZnVsbC1pbWFnZQotICogYnVmZmVyOyBhbnkgZnVsbC1oZWlnaHQgYnVmZmVycyB3aWxsIGJlIGZvdW5kIGluc2lkZSB0aGUgY29lZmZpY2llbnQgb3IKLSAqIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXJzLiAgTm9uZXRoZWxlc3MsIHRoZSBtYWluIGNvbnRyb2xsZXIgaXMgbm90Ci0gKiB0cml2aWFsLiAgSXRzIHJlc3BvbnNpYmlsaXR5IGlzIHRvIHByb3ZpZGUgY29udGV4dCByb3dzIGZvciB1cHNhbXBsaW5nLwotICogcmVzY2FsaW5nLCBhbmQgZG9pbmcgdGhpcyBpbiBhbiBlZmZpY2llbnQgZmFzaGlvbiBpcyBhIGJpdCB0cmlja3kuCi0gKgotICogUG9zdHByb2Nlc3NvciBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKLSAqIGlzIGRlZmluZWQgdG8gYmUgKHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplKQotICogc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICAoV2UgcmVxdWlyZSBEQ1Rfc2NhbGVkX3NpemUgdmFsdWVzIHRvIGJlCi0gKiBjaG9zZW4gc3VjaCB0aGF0IHRoZXNlIG51bWJlcnMgYXJlIGludGVnZXJzLiAgSW4gcHJhY3RpY2UgRENUX3NjYWxlZF9zaXplCi0gKiB2YWx1ZXMgd2lsbCBsaWtlbHkgYmUgcG93ZXJzIG9mIHR3bywgc28gd2UgYWN0dWFsbHkgaGF2ZSB0aGUgc3Ryb25nZXIKLSAqIGNvbmRpdGlvbiB0aGF0IERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgYW4gaW50ZWdlci4pCi0gKiBVcHNhbXBsaW5nIHdpbGwgdHlwaWNhbGx5IHByb2R1Y2UgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBmcm9tIGVhY2gKLSAqIHJvdyBncm91cCAodGltZXMgYW55IGFkZGl0aW9uYWwgc2NhbGUgZmFjdG9yIHRoYXQgdGhlIHVwc2FtcGxlciBpcwotICogYXBwbHlpbmcpLgotICoKLSAqIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHdpbGwgZGVsaXZlciBkYXRhIHRvIHVzIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWU7Ci0gKiBlYWNoIGlNQ1Ugcm93IGNvbnRhaW5zIHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgc2FtcGxlIHJvd3MsIG9yCi0gKiBleGFjdGx5IG1pbl9EQ1Rfc2NhbGVkX3NpemUgcm93IGdyb3Vwcy4gIChUaGlzIGFtb3VudCBvZiBkYXRhIGNvcnJlc3BvbmRzCi0gKiB0byBvbmUgcm93IG9mIE1DVXMgd2hlbiB0aGUgaW1hZ2UgaXMgZnVsbHkgaW50ZXJsZWF2ZWQuKSAgTm90ZSB0aGF0IHRoZQotICogbnVtYmVyIG9mIHNhbXBsZSByb3dzIHZhcmllcyBhY3Jvc3MgY29tcG9uZW50cywgYnV0IHRoZSBudW1iZXIgb2Ygcm93Ci0gKiBncm91cHMgZG9lcyBub3QuICBTb21lIGdhcmJhZ2Ugc2FtcGxlIHJvd3MgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBsYXN0IGlNQ1UKLSAqIHJvdyBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KLSAqCi0gKiBEZXBlbmRpbmcgb24gdGhlIHZlcnRpY2FsIHNjYWxpbmcgYWxnb3JpdGhtIHVzZWQsIHRoZSB1cHNhbXBsZXIgbWF5IG5lZWQKLSAqIGFjY2VzcyB0byB0aGUgc2FtcGxlIHJvdyhzKSBhYm92ZSBhbmQgYmVsb3cgaXRzIGN1cnJlbnQgaW5wdXQgcm93IGdyb3VwLgotICogVGhlIHVwc2FtcGxlciBpcyByZXF1aXJlZCB0byBzZXQgbmVlZF9jb250ZXh0X3Jvd3MgVFJVRSBhdCBnbG9iYWwgc2VsZWN0aW9uCi0gKiB0aW1lIGlmIHNvLiAgV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBGQUxTRSwgdGhpcyBjb250cm9sbGVyIGNhbiBzaW1wbHkKLSAqIG9idGFpbiBvbmUgaU1DVSByb3cgYXQgYSB0aW1lIGZyb20gdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgYW5kIGRvbGUgaXQKLSAqIG91dCBhcyByb3cgZ3JvdXBzIHRvIHRoZSBwb3N0cHJvY2Vzc29yLgotICoKLSAqIFdoZW4gbmVlZF9jb250ZXh0X3Jvd3MgaXMgVFJVRSwgdGhpcyBjb250cm9sbGVyIGd1YXJhbnRlZXMgdGhhdCB0aGUgYnVmZmVyCi0gKiBwYXNzZWQgdG8gcG9zdHByb2Nlc3NpbmcgY29udGFpbnMgYXQgbGVhc3Qgb25lIHJvdyBncm91cCdzIHdvcnRoIG9mIHNhbXBsZXMKLSAqIGFib3ZlIGFuZCBiZWxvdyB0aGUgcm93IGdyb3VwKHMpIGJlaW5nIHByb2Nlc3NlZC4gIE5vdGUgdGhhdCB0aGUgY29udGV4dAotICogcm93cyAiYWJvdmUiIHRoZSBmaXJzdCBwYXNzZWQgcm93IGdyb3VwIGFwcGVhciBhdCBuZWdhdGl2ZSByb3cgb2Zmc2V0cyBpbgotICogdGhlIHBhc3NlZCBidWZmZXIuICBBdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGltYWdlLCB0aGUgcmVxdWlyZWQKLSAqIGNvbnRleHQgcm93cyBhcmUgbWFudWZhY3R1cmVkIGJ5IGR1cGxpY2F0aW5nIHRoZSBmaXJzdCBvciBsYXN0IHJlYWwgc2FtcGxlCi0gKiByb3c7IHRoaXMgYXZvaWRzIGhhdmluZyBzcGVjaWFsIGNhc2VzIGluIHRoZSB1cHNhbXBsaW5nIGlubmVyIGxvb3BzLgotICoKLSAqIFRoZSBhbW91bnQgb2YgY29udGV4dCBpcyBmaXhlZCBhdCBvbmUgcm93IGdyb3VwIGp1c3QgYmVjYXVzZSB0aGF0J3MgYQotICogY29udmVuaWVudCBudW1iZXIgZm9yIHRoaXMgY29udHJvbGxlciB0byB3b3JrIHdpdGguICBUaGUgZXhpc3RpbmcKLSAqIHVwc2FtcGxlcnMgcmVhbGx5IG9ubHkgbmVlZCBvbmUgc2FtcGxlIHJvdyBvZiBjb250ZXh0LiAgQW4gdXBzYW1wbGVyCi0gKiBzdXBwb3J0aW5nIGFyYml0cmFyeSBvdXRwdXQgcmVzY2FsaW5nIG1pZ2h0IHdpc2ggZm9yIG1vcmUgdGhhbiBvbmUgcm93Ci0gKiBncm91cCBvZiBjb250ZXh0IHdoZW4gc2hyaW5raW5nIHRoZSBpbWFnZTsgdG91Z2gsIHdlIGRvbid0IGhhbmRsZSB0aGF0LgotICogKFRoaXMgaXMganVzdGlmaWVkIGJ5IHRoZSBhc3N1bXB0aW9uIHRoYXQgZG93bnNpemluZyB3aWxsIGJlIGhhbmRsZWQgbW9zdGx5Ci0gKiBieSBhZGp1c3RpbmcgdGhlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMsIHNvIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWN0b3IgYXQKLSAqIHRoZSB1cHNhbXBsZSBzdGVwIG5lZWRuJ3QgYmUgbXVjaCBsZXNzIHRoYW4gb25lLikKLSAqCi0gKiBUbyBwcm92aWRlIHRoZSBkZXNpcmVkIGNvbnRleHQsIHdlIGhhdmUgdG8gcmV0YWluIHRoZSBsYXN0IHR3byByb3cgZ3JvdXBzCi0gKiBvZiBvbmUgaU1DVSByb3cgd2hpbGUgcmVhZGluZyBpbiB0aGUgbmV4dCBpTUNVIHJvdy4gIChUaGUgbGFzdCByb3cgZ3JvdXAKLSAqIGNhbid0IGJlIHByb2Nlc3NlZCB1bnRpbCB3ZSBoYXZlIGFub3RoZXIgcm93IGdyb3VwIGZvciBpdHMgYmVsb3ctY29udGV4dCwKLSAqIGFuZCBzbyB3ZSBoYXZlIHRvIHNhdmUgdGhlIG5leHQtdG8tbGFzdCBncm91cCB0b28gZm9yIGl0cyBhYm92ZS1jb250ZXh0LikKLSAqIFdlIGNvdWxkIGRvIHRoaXMgbW9zdCBzaW1wbHkgYnkgY29weWluZyBkYXRhIGFyb3VuZCBpbiBvdXIgYnVmZmVyLCBidXQKLSAqIHRoYXQnZCBiZSB2ZXJ5IHNsb3cuICBXZSBjYW4gYXZvaWQgY29weWluZyBhbnkgZGF0YSBieSBjcmVhdGluZyBhIHJhdGhlcgotICogc3RyYW5nZSBwb2ludGVyIHN0cnVjdHVyZS4gIEhlcmUncyBob3cgaXQgd29ya3MuICBXZSBhbGxvY2F0ZSBhIHdvcmtzcGFjZQotICogY29uc2lzdGluZyBvZiBNKzIgcm93IGdyb3VwcyAod2hlcmUgTSA9IG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgdGhlIG51bWJlcgotICogb2Ygcm93IGdyb3VwcyBwZXIgaU1DVSByb3cpLiAgV2UgY3JlYXRlIHR3byBzZXRzIG9mIHJlZHVuZGFudCBwb2ludGVycyB0bwotICogdGhlIHdvcmtzcGFjZS4gIExhYmVsaW5nIHRoZSBwaHlzaWNhbCByb3cgZ3JvdXBzIDAgdG8gTSsxLCB0aGUgc3ludGhlc2l6ZWQKLSAqIHBvaW50ZXIgbGlzdHMgbG9vayBsaWtlIHRoaXM6Ci0gKiAgICAgICAgICAgICAgICAgICBNKzEgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMQotICogbWFzdGVyIHBvaW50ZXIgLS0+IDAgICAgICAgICBtYXN0ZXIgcG9pbnRlciAtLT4gMAotICogICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotICogICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KLSAqICAgICAgICAgICAgICAgICAgIE0tMyAgICAgICAgICAgICAgICAgICAgICAgICAgTS0zCi0gKiAgICAgICAgICAgICAgICAgICBNLTIgICAgICAgICAgICAgICAgICAgICAgICAgICBNCi0gKiAgICAgICAgICAgICAgICAgICBNLTEgICAgICAgICAgICAgICAgICAgICAgICAgIE0rMQotICogICAgICAgICAgICAgICAgICAgIE0gICAgICAgICAgICAgICAgICAgICAgICAgICBNLTIKLSAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCi0gKiAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0gKiBXZSByZWFkIGFsdGVybmF0ZSBpTUNVIHJvd3MgdXNpbmcgZWFjaCBtYXN0ZXIgcG9pbnRlcjsgdGh1cyB0aGUgbGFzdCB0d28KLSAqIHJvdyBncm91cHMgb2YgdGhlIHByZXZpb3VzIGlNQ1Ugcm93IHJlbWFpbiB1bi1vdmVyd3JpdHRlbiBpbiB0aGUgd29ya3NwYWNlLgotICogVGhlIHBvaW50ZXIgbGlzdHMgYXJlIHNldCB1cCBzbyB0aGF0IHRoZSByZXF1aXJlZCBjb250ZXh0IHJvd3MgYXBwZWFyIHRvCi0gKiBiZSBhZGphY2VudCB0byB0aGUgcHJvcGVyIHBsYWNlcyB3aGVuIHdlIHBhc3MgdGhlIHBvaW50ZXIgbGlzdHMgdG8gdGhlCi0gKiB1cHNhbXBsZXIuCi0gKgotICogVGhlIGFib3ZlIHBpY3R1cmVzIGRlc2NyaWJlIHRoZSBub3JtYWwgc3RhdGUgb2YgdGhlIHBvaW50ZXIgbGlzdHMuCi0gKiBBdCB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIGRpZGRsZSB0aGUgcG9pbnRlciBsaXN0cyB0byBkdXBsaWNhdGUKLSAqIHRoZSBmaXJzdCBvciBsYXN0IHNhbXBsZSByb3cgYXMgbmVjZXNzYXJ5ICh0aGlzIGlzIGNoZWFwZXIgdGhhbiBjb3B5aW5nCi0gKiBzYW1wbGUgcm93cyBhcm91bmQpLgotICoKLSAqIFRoaXMgc2NoZW1lIGJyZWFrcyBkb3duIGlmIE0gPCAyLCBpZSwgbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgSW4gdGhhdAotICogc2l0dWF0aW9uIGVhY2ggaU1DVSByb3cgcHJvdmlkZXMgb25seSBvbmUgcm93IGdyb3VwIHNvIHRoZSBidWZmZXJpbmcgbG9naWMKLSAqIG11c3QgYmUgZGlmZmVyZW50IChlZywgd2UgbXVzdCByZWFkIHR3byBpTUNVIHJvd3MgYmVmb3JlIHdlIGNhbiBlbWl0IHRoZQotICogZmlyc3Qgcm93IGdyb3VwKS4gIEZvciBub3csIHdlIHNpbXBseSBkbyBub3Qgc3VwcG9ydCBwcm92aWRpbmcgY29udGV4dAotICogcm93cyB3aGVuIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgMS4gIFRoYXQgY29tYmluYXRpb24gc2VlbXMgdW5saWtlbHkgdG8KLSAqIGJlIHdvcnRoIHByb3ZpZGluZyAtLS0gaWYgc29tZW9uZSB3YW50cyBhIDEvOHRoLXNpemUgcHJldmlldywgdGhleSBwcm9iYWJseQotICogd2FudCBpdCBxdWljayBhbmQgZGlydHksIHNvIGEgY29udGV4dC1mcmVlIHVwc2FtcGxlciBpcyBzdWZmaWNpZW50LgotICovCi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIGFsbG9jYXRlZCB3b3Jrc3BhY2UgKE0gb3IgTSsyIHJvdyBncm91cHMpLiAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcltNQVhfQ09NUE9ORU5UU107Ci0KLSAgYm9vbGVhbiBidWZmZXJfZnVsbDsJCS8qIEhhdmUgd2UgZ290dGVuIGFuIGlNQ1Ugcm93IGZyb20gZGVjb2Rlcj8gKi8KLSAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIG91dHB1dCB0byBwb3N0cHJvY2Vzc29yICovCi0KLSAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGluIHRoZSBjb250ZXh0IGNhc2UuICovCi0KLSAgLyogVGhlc2UgYXJlIHRoZSBtYXN0ZXIgcG9pbnRlcnMgdG8gdGhlIGZ1bm55LW9yZGVyIHBvaW50ZXIgbGlzdHMuICovCi0gIEpTQU1QSU1BR0UgeGJ1ZmZlclsyXTsJLyogcG9pbnRlcnMgdG8gd2VpcmQgcG9pbnRlciBsaXN0cyAqLwotCi0gIGludCB3aGljaHB0cjsJCQkvKiBpbmRpY2F0ZXMgd2hpY2ggcG9pbnRlciBzZXQgaXMgbm93IGluIHVzZSAqLwotICBpbnQgY29udGV4dF9zdGF0ZTsJCS8qIHByb2Nlc3NfZGF0YSBzdGF0ZSBtYWNoaW5lIHN0YXR1cyAqLwotICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsJLyogcm93IGdyb3VwcyBhdmFpbGFibGUgdG8gcG9zdHByb2Nlc3NvciAqLwotICBKRElNRU5TSU9OIGlNQ1Vfcm93X2N0cjsJLyogY291bnRzIGlNQ1Ugcm93cyB0byBkZXRlY3QgaW1hZ2UgdG9wL2JvdCAqLwotfSBteV9tYWluX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7Ci0KLS8qIGNvbnRleHRfc3RhdGUgdmFsdWVzOiAqLwotI2RlZmluZSBDVFhfUFJFUEFSRV9GT1JfSU1DVQkwCS8qIG5lZWQgdG8gcHJlcGFyZSBmb3IgTUNVIHJvdyAqLwotI2RlZmluZSBDVFhfUFJPQ0VTU19JTUNVCTEJLyogZmVlZGluZyBpTUNVIHRvIHBvc3Rwcm9jZXNzb3IgKi8KLSNkZWZpbmUgQ1RYX1BPU1RQT05FRF9ST1cJMgkvKiBmZWVkaW5nIHBvc3Rwb25lZCByb3cgZ3JvdXAgKi8KLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbgotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAotCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jcmFua19wb3N0Ci0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotI2VuZGlmCi0KLQotTE9DQUwodm9pZCkKLWFsbG9jX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzLgotICogVGhpcyBpcyBkb25lIG9ubHkgb25jZSwgbm90IG9uY2UgcGVyIHBhc3MuCi0gKi8KLXsKLSAgbXlfbWFpbl9wdHIgbWFpbl9wdHIgPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBpbnQgY2ksIHJncm91cDsKLSAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlNBTVBBUlJBWSB4YnVmOwotCi0gIC8qIEdldCB0b3AtbGV2ZWwgc3BhY2UgZm9yIGNvbXBvbmVudCBhcnJheSBwb2ludGVycy4KLSAgICogV2UgYWxsb2MgYm90aCBhcnJheXMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KLSAgICovCi0gIG1haW5fcHRyLT54YnVmZmVyWzBdID0gKEpTQU1QSU1BR0UpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMgKiAyICogU0laRU9GKEpTQU1QQVJSQVkpKTsKLSAgbWFpbl9wdHItPnhidWZmZXJbMV0gPSBtYWluX3B0ci0+eGJ1ZmZlclswXSArIGNpbmZvLT5udW1fY29tcG9uZW50czsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwotICAgIC8qIEdldCBzcGFjZSBmb3IgcG9pbnRlciBsaXN0cyAtLS0gTSs0IHJvdyBncm91cHMgaW4gZWFjaCBsaXN0LgotICAgICAqIFdlIGFsbG9jIGJvdGggcG9pbnRlciBsaXN0cyB3aXRoIG9uZSBjYWxsIHRvIHNhdmUgYSBmZXcgY3ljbGVzLgotICAgICAqLwotICAgIHhidWYgPSAoSlNBTVBBUlJBWSkKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAyICogKHJncm91cCAqIChNICsgNCkpICogU0laRU9GKEpTQU1QUk9XKSk7Ci0gICAgeGJ1ZiArPSByZ3JvdXA7CQkvKiB3YW50IG9uZSByb3cgZ3JvdXAgYXQgbmVnYXRpdmUgb2Zmc2V0cyAqLwotICAgIG1haW5fcHRyLT54YnVmZmVyWzBdW2NpXSA9IHhidWY7Ci0gICAgeGJ1ZiArPSByZ3JvdXAgKiAoTSArIDQpOwotICAgIG1haW5fcHRyLT54YnVmZmVyWzFdW2NpXSA9IHhidWY7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotbWFrZV9mdW5ueV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIENyZWF0ZSB0aGUgZnVubnkgcG9pbnRlciBsaXN0cyBkaXNjdXNzZWQgaW4gdGhlIGNvbW1lbnRzIGFib3ZlLgotICogVGhlIGFjdHVhbCB3b3Jrc3BhY2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKGluIG1haW4tPmJ1ZmZlciksCi0gKiBhbmQgdGhlIHNwYWNlIGZvciB0aGUgcG9pbnRlciBsaXN0cyBpcyBhbGxvY2F0ZWQgdG9vLgotICogVGhpcyByb3V0aW5lIGp1c3QgZmlsbHMgaW4gdGhlIGN1cmlvdXNseSBvcmRlcmVkIGxpc3RzLgotICogVGhpcyB3aWxsIGJlIHJlcGVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLgotICovCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCBpLCByZ3JvdXA7Ci0gIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgYnVmLCB4YnVmMCwgeGJ1ZjE7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KLSAgICB4YnVmMCA9IG1haW5fcHRyLT54YnVmZmVyWzBdW2NpXTsKLSAgICB4YnVmMSA9IG1haW5fcHRyLT54YnVmZmVyWzFdW2NpXTsKLSAgICAvKiBGaXJzdCBjb3B5IHRoZSB3b3Jrc3BhY2UgcG9pbnRlcnMgYXMtaXMgKi8KLSAgICBidWYgPSBtYWluX3B0ci0+YnVmZmVyW2NpXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogKE0gKyAyKTsgaSsrKSB7Ci0gICAgICB4YnVmMFtpXSA9IHhidWYxW2ldID0gYnVmW2ldOwotICAgIH0KLSAgICAvKiBJbiB0aGUgc2Vjb25kIGxpc3QsIHB1dCB0aGUgbGFzdCBmb3VyIHJvdyBncm91cHMgaW4gc3dhcHBlZCBvcmRlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKLSAgICAgIHhidWYxW3Jncm91cCooTS0yKSArIGldID0gYnVmW3Jncm91cCpNICsgaV07Ci0gICAgICB4YnVmMVtyZ3JvdXAqTSArIGldID0gYnVmW3Jncm91cCooTS0yKSArIGldOwotICAgIH0KLSAgICAvKiBUaGUgd3JhcGFyb3VuZCBwb2ludGVycyBhdCB0b3AgYW5kIGJvdHRvbSB3aWxsIGJlIGZpbGxlZCBsYXRlcgotICAgICAqIChzZWUgc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMsIGJlbG93KS4gIEluaXRpYWxseSB3ZSB3YW50IHRoZSAiYWJvdmUiCi0gICAgICogcG9pbnRlcnMgdG8gZHVwbGljYXRlIHRoZSBmaXJzdCBhY3R1YWwgZGF0YSBsaW5lLiAgVGhpcyBvbmx5IG5lZWRzCi0gICAgICogdG8gaGFwcGVuIGluIHhidWZmZXJbMF0uCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7Ci0gICAgICB4YnVmMFtpIC0gcmdyb3VwXSA9IHhidWYwWzBdOwotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1zZXRfd3JhcGFyb3VuZF9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNldCB1cCB0aGUgIndyYXBhcm91bmQiIHBvaW50ZXJzIGF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBwb2ludGVyIGxpc3RzLgotICogVGhpcyBjaGFuZ2VzIHRoZSBwb2ludGVyIGxpc3Qgc3RhdGUgZnJvbSB0b3Atb2YtaW1hZ2UgdG8gdGhlIG5vcm1hbCBzdGF0ZS4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaSwgaSwgcmdyb3VwOwotICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKU0FNUEFSUkFZIHhidWYwLCB4YnVmMTsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwotICAgIHhidWYwID0gbWFpbl9wdHItPnhidWZmZXJbMF1bY2ldOwotICAgIHhidWYxID0gbWFpbl9wdHItPnhidWZmZXJbMV1bY2ldOwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXA7IGkrKykgewotICAgICAgeGJ1ZjBbaSAtIHJncm91cF0gPSB4YnVmMFtyZ3JvdXAqKE0rMSkgKyBpXTsKLSAgICAgIHhidWYxW2kgLSByZ3JvdXBdID0geGJ1ZjFbcmdyb3VwKihNKzEpICsgaV07Ci0gICAgICB4YnVmMFtyZ3JvdXAqKE0rMikgKyBpXSA9IHhidWYwW2ldOwotICAgICAgeGJ1ZjFbcmdyb3VwKihNKzIpICsgaV0gPSB4YnVmMVtpXTsKLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotc2V0X2JvdHRvbV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIENoYW5nZSB0aGUgcG9pbnRlciBsaXN0cyB0byBkdXBsaWNhdGUgdGhlIGxhc3Qgc2FtcGxlIHJvdyBhdCB0aGUgYm90dG9tCi0gKiBvZiB0aGUgaW1hZ2UuICB3aGljaHB0ciBpbmRpY2F0ZXMgd2hpY2ggeGJ1ZmZlciBob2xkcyB0aGUgZmluYWwgaU1DVSByb3cuCi0gKiBBbHNvIHNldHMgcm93Z3JvdXBzX2F2YWlsIHRvIGluZGljYXRlIG51bWJlciBvZiBub25kdW1teSByb3cgZ3JvdXBzIGluIHJvdy4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaSwgaSwgcmdyb3VwLCBpTUNVaGVpZ2h0LCByb3dzX2xlZnQ7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgeGJ1ZjsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIENvdW50IHNhbXBsZSByb3dzIGluIG9uZSBpTUNVIHJvdyBhbmQgaW4gb25lIHJvdyBncm91cCAqLwotICAgIGlNQ1VoZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgIHJncm91cCA9IGlNQ1VoZWlnaHQgLyBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgICAvKiBDb3VudCBub25kdW1teSBzYW1wbGUgcm93cyByZW1haW5pbmcgZm9yIHRoaXMgY29tcG9uZW50ICovCi0gICAgcm93c19sZWZ0ID0gKGludCkgKGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCAlIChKRElNRU5TSU9OKSBpTUNVaGVpZ2h0KTsKLSAgICBpZiAocm93c19sZWZ0ID09IDApIHJvd3NfbGVmdCA9IGlNQ1VoZWlnaHQ7Ci0gICAgLyogQ291bnQgbm9uZHVtbXkgcm93IGdyb3Vwcy4gIFNob3VsZCBnZXQgc2FtZSBhbnN3ZXIgZm9yIGVhY2ggY29tcG9uZW50LAotICAgICAqIHNvIHdlIG5lZWQgb25seSBkbyBpdCBvbmNlLgotICAgICAqLwotICAgIGlmIChjaSA9PSAwKSB7Ci0gICAgICBtYWluX3B0ci0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pICgocm93c19sZWZ0LTEpIC8gcmdyb3VwICsgMSk7Ci0gICAgfQotICAgIC8qIER1cGxpY2F0ZSB0aGUgbGFzdCByZWFsIHNhbXBsZSByb3cgcmdyb3VwKjIgdGltZXM7IHRoaXMgcGFkcyBvdXQgdGhlCi0gICAgICogbGFzdCBwYXJ0aWFsIHJvd2dyb3VwIGFuZCBlbnN1cmVzIGF0IGxlYXN0IG9uZSBmdWxsIHJvd2dyb3VwIG9mIGNvbnRleHQuCi0gICAgICovCi0gICAgeGJ1ZiA9IG1haW5fcHRyLT54YnVmZmVyW21haW5fcHRyLT53aGljaHB0cl1bY2ldOwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKLSAgICAgIHhidWZbcm93c19sZWZ0ICsgaV0gPSB4YnVmW3Jvd3NfbGVmdC0xXTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0KLSAgc3dpdGNoIChwYXNzX21vZGUpIHsKLSAgY2FzZSBKQlVGX1BBU1NfVEhSVToKLSAgICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgewotICAgICAgbWFpbl9wdHItPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluOwotICAgICAgbWFrZV9mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIENyZWF0ZSB0aGUgeGJ1ZmZlcltdIGxpc3RzICovCi0gICAgICBtYWluX3B0ci0+d2hpY2hwdHIgPSAwOwkvKiBSZWFkIGZpcnN0IGlNQ1Ugcm93IGludG8geGJ1ZmZlclswXSAqLwotICAgICAgbWFpbl9wdHItPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJFUEFSRV9GT1JfSU1DVTsKLSAgICAgIG1haW5fcHRyLT5pTUNVX3Jvd19jdHIgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBTaW1wbGUgY2FzZSB3aXRoIG5vIGNvbnRleHQgbmVlZGVkICovCi0gICAgICBtYWluX3B0ci0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKLSAgICB9Ci0gICAgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CS8qIE1hcmsgYnVmZmVyIGVtcHR5ICovCi0gICAgbWFpbl9wdHItPnJvd2dyb3VwX2N0ciA9IDA7Ci0gICAgYnJlYWs7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICAgIC8qIEZvciBsYXN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiwganVzdCBjcmFuayB0aGUgcG9zdHByb2Nlc3NvciAqLwotICAgIG1haW5fcHRyLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3Q7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIGhhbmRsZXMgdGhlIHNpbXBsZSBjYXNlIHdoZXJlIG5vIGNvbnRleHQgaXMgcmVxdWlyZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW5fcHRyID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgSkRJTUVOU0lPTiByb3dncm91cHNfYXZhaWw7Ci0KLSAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KLSAgaWYgKCEgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsKSB7Ci0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sIG1haW5fcHRyLT5idWZmZXIpKQotICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCi0gICAgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsID0gVFJVRTsJLyogT0ssIHdlIGhhdmUgYW4gaU1DVSByb3cgdG8gd29yayB3aXRoICovCi0gIH0KLQotICAvKiBUaGVyZSBhcmUgYWx3YXlzIG1pbl9EQ1Rfc2NhbGVkX3NpemUgcm93IGdyb3VwcyBpbiBhbiBpTUNVIHJvdy4gKi8KLSAgcm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAvKiBOb3RlOiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgbWF5IHBhc3MgZXh0cmEgZ2FyYmFnZSByb3cgZ3JvdXBzCi0gICAqIHRvIHRoZSBwb3N0cHJvY2Vzc29yLiAgVGhlIHBvc3Rwcm9jZXNzb3IgaGFzIHRvIGNoZWNrIGZvciBib3R0b20KLSAgICogb2YgaW1hZ2UgYW55d2F5IChhdCByb3cgcmVzb2x1dGlvbiksIHNvIG5vIHBvaW50IGluIHVzIGRvaW5nIGl0IHRvby4KLSAgICovCi0KLSAgLyogRmVlZCB0aGUgcG9zdHByb2Nlc3NvciAqLwotICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluX3B0ci0+YnVmZmVyLAotCQkJCSAgICAgJm1haW5fcHRyLT5yb3dncm91cF9jdHIsIHJvd2dyb3Vwc19hdmFpbCwKLQkJCQkgICAgIG91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7Ci0KLSAgLyogSGFzIHBvc3Rwcm9jZXNzb3IgY29uc3VtZWQgYWxsIHRoZSBkYXRhIHlldD8gSWYgc28sIG1hcmsgYnVmZmVyIGVtcHR5ICovCi0gIGlmIChtYWluX3B0ci0+cm93Z3JvdXBfY3RyID49IHJvd2dyb3Vwc19hdmFpbCkgewotICAgIG1haW5fcHRyLT5idWZmZXJfZnVsbCA9IEZBTFNFOwotICAgIG1haW5fcHRyLT5yb3dncm91cF9jdHIgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvbnRleHQgcm93cyBtdXN0IGJlIHByb3ZpZGVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICBteV9tYWluX3B0ciBtYWluX3B0ciA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0KLSAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KLSAgaWYgKCEgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsKSB7Ci0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sCi0JCQkJCSAgIG1haW5fcHRyLT54YnVmZmVyW21haW5fcHRyLT53aGljaHB0cl0pKQotICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCi0gICAgbWFpbl9wdHItPmJ1ZmZlcl9mdWxsID0gVFJVRTsJLyogT0ssIHdlIGhhdmUgYW4gaU1DVSByb3cgdG8gd29yayB3aXRoICovCi0gICAgbWFpbl9wdHItPmlNQ1Vfcm93X2N0cisrOwkvKiBjb3VudCByb3dzIHJlY2VpdmVkICovCi0gIH0KLQotICAvKiBQb3N0cHJvY2Vzc29yIHR5cGljYWxseSB3aWxsIG5vdCBzd2FsbG93IGFsbCB0aGUgaW5wdXQgZGF0YSBpdCBpcyBoYW5kZWQKLSAgICogaW4gb25lIGNhbGwgKGR1ZSB0byBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0KS4gIE11c3QgYmUgcHJlcGFyZWQKLSAgICogdG8gZXhpdCBhbmQgcmVzdGFydC4gIFRoaXMgc3dpdGNoIGxldHMgdXMga2VlcCB0cmFjayBvZiBob3cgZmFyIHdlIGdvdC4KLSAgICogTm90ZSB0aGF0IGVhY2ggY2FzZSBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0IG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KLSAgICovCi0gIHN3aXRjaCAobWFpbl9wdHItPmNvbnRleHRfc3RhdGUpIHsKLSAgY2FzZSBDVFhfUE9TVFBPTkVEX1JPVzoKLSAgICAvKiBDYWxsIHBvc3Rwcm9jZXNzb3IgdXNpbmcgcHJldmlvdXNseSBzZXQgcG9pbnRlcnMgZm9yIHBvc3Rwb25lZCByb3cgKi8KLSAgICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluX3B0ci0+eGJ1ZmZlclttYWluX3B0ci0+d2hpY2hwdHJdLAotCQkJJm1haW5fcHRyLT5yb3dncm91cF9jdHIsIG1haW5fcHRyLT5yb3dncm91cHNfYXZhaWwsCi0JCQlvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOwotICAgIGlmIChtYWluX3B0ci0+cm93Z3JvdXBfY3RyIDwgbWFpbl9wdHItPnJvd2dyb3Vwc19hdmFpbCkKLSAgICAgIHJldHVybjsJCQkvKiBOZWVkIHRvIHN1c3BlbmQgKi8KLSAgICBtYWluX3B0ci0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOwotICAgIGlmICgqb3V0X3Jvd19jdHIgPj0gb3V0X3Jvd3NfYXZhaWwpCi0gICAgICByZXR1cm47CQkJLyogUG9zdHByb2Nlc3NvciBleGFjdGx5IGZpbGxlZCBvdXRwdXQgYnVmICovCi0gICAgLypGQUxMVEhST1VHSCovCi0gIGNhc2UgQ1RYX1BSRVBBUkVfRk9SX0lNQ1U6Ci0gICAgLyogUHJlcGFyZSB0byBwcm9jZXNzIGZpcnN0IE0tMSByb3cgZ3JvdXBzIG9mIHRoaXMgaU1DVSByb3cgKi8KLSAgICBtYWluX3B0ci0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBtYWluX3B0ci0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSAtIDEpOwotICAgIC8qIENoZWNrIGZvciBib3R0b20gb2YgaW1hZ2U6IGlmIHNvLCB0d2VhayBwb2ludGVycyB0byAiZHVwbGljYXRlIgotICAgICAqIHRoZSBsYXN0IHNhbXBsZSByb3csIGFuZCBhZGp1c3Qgcm93Z3JvdXBzX2F2YWlsIHRvIGlnbm9yZSBwYWRkaW5nIHJvd3MuCi0gICAgICovCi0gICAgaWYgKG1haW5fcHRyLT5pTUNVX3Jvd19jdHIgPT0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKLSAgICAgIHNldF9ib3R0b21fcG9pbnRlcnMoY2luZm8pOwotICAgIG1haW5fcHRyLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BST0NFU1NfSU1DVTsKLSAgICAvKkZBTExUSFJPVUdIKi8KLSAgY2FzZSBDVFhfUFJPQ0VTU19JTUNVOgotICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyAqLwotICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW5fcHRyLT54YnVmZmVyW21haW5fcHRyLT53aGljaHB0cl0sCi0JCQkmbWFpbl9wdHItPnJvd2dyb3VwX2N0ciwgbWFpbl9wdHItPnJvd2dyb3Vwc19hdmFpbCwKLQkJCW91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7Ci0gICAgaWYgKG1haW5fcHRyLT5yb3dncm91cF9jdHIgPCBtYWluX3B0ci0+cm93Z3JvdXBzX2F2YWlsKQotICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLwotICAgIC8qIEFmdGVyIHRoZSBmaXJzdCBpTUNVLCBjaGFuZ2Ugd3JhcGFyb3VuZCBwb2ludGVycyB0byBub3JtYWwgc3RhdGUgKi8KLSAgICBpZiAobWFpbl9wdHItPmlNQ1Vfcm93X2N0ciA9PSAxKQotICAgICAgc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMoY2luZm8pOwotICAgIC8qIFByZXBhcmUgdG8gbG9hZCBuZXcgaU1DVSByb3cgdXNpbmcgb3RoZXIgeGJ1ZmZlciBsaXN0ICovCi0gICAgbWFpbl9wdHItPndoaWNocHRyIF49IDE7CS8qIDA9PjEgb3IgMT0+MCAqLwotICAgIG1haW5fcHRyLT5idWZmZXJfZnVsbCA9IEZBTFNFOwotICAgIC8qIFN0aWxsIG5lZWQgdG8gcHJvY2VzcyBsYXN0IHJvdyBncm91cCBvZiB0aGlzIGlNQ1Ugcm93LCAqLwotICAgIC8qIHdoaWNoIGlzIHNhdmVkIGF0IGluZGV4IE0rMSBvZiB0aGUgb3RoZXIgeGJ1ZmZlciAqLwotICAgIG1haW5fcHRyLT5yb3dncm91cF9jdHIgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMSk7Ci0gICAgbWFpbl9wdHItPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyKTsKLSAgICBtYWluX3B0ci0+Y29udGV4dF9zdGF0ZSA9IENUWF9QT1NUUE9ORURfUk9XOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogRmluYWwgcGFzcyBvZiB0d28tcGFzcyBxdWFudGl6YXRpb246IGp1c3QgY2FsbCB0aGUgcG9zdHByb2Nlc3Nvci4KLSAqIFNvdXJjZSBkYXRhIHdpbGwgYmUgdGhlIHBvc3Rwcm9jZXNzb3IgY29udHJvbGxlcidzIGludGVybmFsIGJ1ZmZlci4KLSAqLwotCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0KLU1FVEhPRERFRih2b2lkKQotcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBJTUFHRSkgTlVMTCwKLQkJCQkgICAgIChKRElNRU5TSU9OICopIE5VTEwsIChKRElNRU5TSU9OKSAwLAotCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLX0KLQotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kX21haW5fY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9tYWluX3B0ciBtYWluX3B0cjsKLSAgaW50IGNpLCByZ3JvdXAsIG5ncm91cHM7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgbWFpbl9wdHIgPSAobXlfbWFpbl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyICopIG1haW5fcHRyOwotICBtYWluX3B0ci0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47Ci0KLSAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSB3b3Jrc3BhY2UuCi0gICAqIG5ncm91cHMgaXMgdGhlIG51bWJlciBvZiByb3cgZ3JvdXBzIHdlIG5lZWQuCi0gICAqLwotICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgewotICAgIGlmIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA8IDIpIC8qIHVuc3VwcG9ydGVkLCBzZWUgY29tbWVudHMgYWJvdmUgKi8KLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9USU1QTCk7Ci0gICAgYWxsb2NfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBBbGxvYyBzcGFjZSBmb3IgeGJ1ZmZlcltdIGxpc3RzICovCi0gICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMjsKLSAgfSBlbHNlIHsKLSAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIH0KLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwotICAgIG1haW5fcHRyLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSwKLQkJCSAoSkRJTUVOU0lPTikgKHJncm91cCAqIG5ncm91cHMpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRtYXJrZXIuYyBiL2xpYmpwZWd0d3JwL2pkbWFya2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzI5NDAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRtYXJrZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOTcgKzAsMCBAQAotLyoKLSAqIGpkbWFya2VyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBkZWNvZGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCi0gKiBNb3N0IG9mIHRoZSBjb21wbGV4aXR5IGFyaXNlcyBmcm9tIG91ciBkZXNpcmUgdG8gc3VwcG9ydCBpbnB1dAotICogc3VzcGVuc2lvbjogaWYgbm90IGFsbCBvZiB0aGUgZGF0YSBmb3IgYSBtYXJrZXIgaXMgYXZhaWxhYmxlLAotICogd2UgbXVzdCBleGl0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLiAgT24gcmVzdW1wdGlvbiwgd2UgcmVwcm9jZXNzCi0gKiB0aGUgbWFya2VyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi10eXBlZGVmIGVudW0gewkJCS8qIEpQRUcgbWFya2VyIGNvZGVzICovCi0gIE1fU09GMCAgPSAweGMwLAotICBNX1NPRjEgID0gMHhjMSwKLSAgTV9TT0YyICA9IDB4YzIsCi0gIE1fU09GMyAgPSAweGMzLAotICAKLSAgTV9TT0Y1ICA9IDB4YzUsCi0gIE1fU09GNiAgPSAweGM2LAotICBNX1NPRjcgID0gMHhjNywKLSAgCi0gIE1fSlBHICAgPSAweGM4LAotICBNX1NPRjkgID0gMHhjOSwKLSAgTV9TT0YxMCA9IDB4Y2EsCi0gIE1fU09GMTEgPSAweGNiLAotICAKLSAgTV9TT0YxMyA9IDB4Y2QsCi0gIE1fU09GMTQgPSAweGNlLAotICBNX1NPRjE1ID0gMHhjZiwKLSAgCi0gIE1fREhUICAgPSAweGM0LAotICAKLSAgTV9EQUMgICA9IDB4Y2MsCi0gIAotICBNX1JTVDAgID0gMHhkMCwKLSAgTV9SU1QxICA9IDB4ZDEsCi0gIE1fUlNUMiAgPSAweGQyLAotICBNX1JTVDMgID0gMHhkMywKLSAgTV9SU1Q0ICA9IDB4ZDQsCi0gIE1fUlNUNSAgPSAweGQ1LAotICBNX1JTVDYgID0gMHhkNiwKLSAgTV9SU1Q3ICA9IDB4ZDcsCi0gIAotICBNX1NPSSAgID0gMHhkOCwKLSAgTV9FT0kgICA9IDB4ZDksCi0gIE1fU09TICAgPSAweGRhLAotICBNX0RRVCAgID0gMHhkYiwKLSAgTV9ETkwgICA9IDB4ZGMsCi0gIE1fRFJJICAgPSAweGRkLAotICBNX0RIUCAgID0gMHhkZSwKLSAgTV9FWFAgICA9IDB4ZGYsCi0gIAotICBNX0FQUDAgID0gMHhlMCwKLSAgTV9BUFAxICA9IDB4ZTEsCi0gIE1fQVBQMiAgPSAweGUyLAotICBNX0FQUDMgID0gMHhlMywKLSAgTV9BUFA0ICA9IDB4ZTQsCi0gIE1fQVBQNSAgPSAweGU1LAotICBNX0FQUDYgID0gMHhlNiwKLSAgTV9BUFA3ICA9IDB4ZTcsCi0gIE1fQVBQOCAgPSAweGU4LAotICBNX0FQUDkgID0gMHhlOSwKLSAgTV9BUFAxMCA9IDB4ZWEsCi0gIE1fQVBQMTEgPSAweGViLAotICBNX0FQUDEyID0gMHhlYywKLSAgTV9BUFAxMyA9IDB4ZWQsCi0gIE1fQVBQMTQgPSAweGVlLAotICBNX0FQUDE1ID0gMHhlZiwKLSAgCi0gIE1fSlBHMCAgPSAweGYwLAotICBNX0pQRzEzID0gMHhmZCwKLSAgTV9DT00gICA9IDB4ZmUsCi0gIAotICBNX1RFTSAgID0gMHgwMSwKLSAgCi0gIE1fRVJST1IgPSAweDEwMAotfSBKUEVHX01BUktFUjsKLQotCi0vKiBQcml2YXRlIHN0YXRlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBBcHBsaWNhdGlvbi1vdmVycmlkYWJsZSBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzICovCi0gIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc19DT007Ci0gIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc19BUFBuWzE2XTsKLQotICAvKiBMaW1pdCBvbiBtYXJrZXIgZGF0YSBsZW5ndGggdG8gc2F2ZSBmb3IgZWFjaCBtYXJrZXIgdHlwZSAqLwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0X0NPTTsKLSAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdF9BUFBuWzE2XTsKLQotICAvKiBTdGF0dXMgb2YgQ09NL0FQUG4gbWFya2VyIHNhdmluZyAqLwotICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgY3VyX21hcmtlcjsJLyogTlVMTCBpZiBub3QgcHJvY2Vzc2luZyBhIG1hcmtlciAqLwotICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsJCS8qIGRhdGEgYnl0ZXMgcmVhZCBzbyBmYXIgaW4gbWFya2VyICovCi0gIC8qIE5vdGU6IGN1cl9tYXJrZXIgaXMgbm90IGxpbmtlZCBpbnRvIG1hcmtlcl9saXN0IHVudGlsIGl0J3MgYWxsIHJlYWQuICovCi19IG15X21hcmtlcl9yZWFkZXI7Ci0KLXR5cGVkZWYgbXlfbWFya2VyX3JlYWRlciAqIG15X21hcmtlcl9wdHI7Ci0KLQotLyoKLSAqIE1hY3JvcyBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUuCi0gKgotICogQXQgYWxsIHRpbWVzLCBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGUgYW5kIC0+Ynl0ZXNfaW5fYnVmZmVyIHJlZmxlY3QKLSAqIHRoZSBjdXJyZW50IHJlc3RhcnQgcG9pbnQ7IHdlIHVwZGF0ZSB0aGVtIG9ubHkgd2hlbiB3ZSBoYXZlIHJlYWNoZWQgYQotICogc3VpdGFibGUgcGxhY2UgdG8gcmVzdGFydCBpZiBhIHN1c3BlbnNpb24gb2NjdXJzLgotICovCi0KLS8qIERlY2xhcmUgYW5kIGluaXRpYWxpemUgbG9jYWwgY29waWVzIG9mIGlucHV0IHBvaW50ZXIvY291bnQgKi8KLSNkZWZpbmUgSU5QVVRfVkFSUyhjaW5mbykgIFwKLQlzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogZGF0YXNyYyA9IChjaW5mbyktPnNyYzsgIFwKLQljb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGU7ICBcCi0Jc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlcgotCi0vKiBVbmxvYWQgdGhlIGxvY2FsIGNvcGllcyAtLS0gZG8gdGhpcyBvbmx5IGF0IGEgcmVzdGFydCBib3VuZGFyeSAqLwotI2RlZmluZSBJTlBVVF9TWU5DKGNpbmZvKSAgXAotCSggZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlID0gbmV4dF9pbnB1dF9ieXRlLCAgXAotCSAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyICkKLQotLyogUmVsb2FkIHRoZSBsb2NhbCBjb3BpZXMgLS0tIHVzZWQgb25seSBpbiBNQUtFX0JZVEVfQVZBSUwgKi8KLSNkZWZpbmUgSU5QVVRfUkVMT0FEKGNpbmZvKSAgXAotCSggbmV4dF9pbnB1dF9ieXRlID0gZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlLCAgXAotCSAgYnl0ZXNfaW5fYnVmZmVyID0gZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyICkKLQotLyogSW50ZXJuYWwgbWFjcm8gZm9yIElOUFVUX0JZVEUgYW5kIElOUFVUXzJCWVRFUzogbWFrZSBhIGJ5dGUgYXZhaWxhYmxlLgotICogTm90ZSB3ZSBkbyAqbm90KiBkbyBJTlBVVF9TWU5DIGJlZm9yZSBjYWxsaW5nIGZpbGxfaW5wdXRfYnVmZmVyLAotICogYnV0IHdlIG11c3QgcmVsb2FkIHRoZSBsb2NhbCBjb3BpZXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGwuCi0gKi8KLSNkZWZpbmUgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbikgIFwKLQlpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsgIFwKLQkgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpICBcCi0JICAgIHsgYWN0aW9uOyB9ICBcCi0JICBJTlBVVF9SRUxPQUQoY2luZm8pOyAgXAotCX0KLQotLyogUmVhZCBhIGJ5dGUgaW50byB2YXJpYWJsZSBWLgotICogSWYgbXVzdCBzdXNwZW5kLCB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uICh0eXBpY2FsbHkgInJldHVybiBGQUxTRSIpLgotICovCi0jZGVmaW5lIElOUFVUX0JZVEUoY2luZm8sVixhY3Rpb24pICBcCi0JTUFLRVNUTVQoIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCi0JCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKLQkJICBWID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7ICkKLQotLyogQXMgYWJvdmUsIGJ1dCByZWFkIHR3byBieXRlcyBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4KLSAqIFYgc2hvdWxkIGJlIGRlY2xhcmVkIHVuc2lnbmVkIGludCBvciBwZXJoYXBzIElOVDMyLgotICovCi0jZGVmaW5lIElOUFVUXzJCWVRFUyhjaW5mbyxWLGFjdGlvbikgIFwKLQlNQUtFU1RNVCggTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKLQkJICBieXRlc19pbl9idWZmZXItLTsgXAotCQkgIFYgPSAoKHVuc2lnbmVkIGludCkgR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKykpIDw8IDg7IFwKLQkJICBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAotCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCi0JCSAgViArPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsgKQotCi0KLS8qCi0gKiBSb3V0aW5lcyB0byBwcm9jZXNzIEpQRUcgbWFya2Vycy4KLSAqCi0gKiBFbnRyeSBjb25kaXRpb246IEpQRUcgbWFya2VyIGl0c2VsZiBoYXMgYmVlbiByZWFkIGFuZCBpdHMgY29kZSBzYXZlZAotICogICBpbiBjaW5mby0+dW5yZWFkX21hcmtlcjsgaW5wdXQgcmVzdGFydCBwb2ludCBpcyBqdXN0IGFmdGVyIHRoZSBtYXJrZXIuCi0gKgotICogRXhpdDogaWYgcmV0dXJuIFRSVUUsIGhhdmUgcmVhZCBhbmQgcHJvY2Vzc2VkIGFueSBwYXJhbWV0ZXJzLCBhbmQgaGF2ZQotICogICB1cGRhdGVkIHRoZSByZXN0YXJ0IHBvaW50IHRvIHBvaW50IGFmdGVyIHRoZSBwYXJhbWV0ZXJzLgotICogICBJZiByZXR1cm4gRkFMU0UsIHdhcyBmb3JjZWQgdG8gc3VzcGVuZCBiZWZvcmUgcmVhY2hpbmcgZW5kIG9mCi0gKiAgIG1hcmtlciBwYXJhbWV0ZXJzOyByZXN0YXJ0IHBvaW50IGhhcyBub3QgYmVlbiBtb3ZlZC4gIFNhbWUgcm91dGluZQotICogICB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBhcHBsaWNhdGlvbiBzdXBwbGllcyBtb3JlIGlucHV0IGRhdGEuCi0gKgotICogVGhpcyBhcHByb2FjaCB0byBzdXNwZW5zaW9uIGFzc3VtZXMgdGhhdCBhbGwgb2YgYSBtYXJrZXIncyBwYXJhbWV0ZXJzCi0gKiBjYW4gZml0IGludG8gYSBzaW5nbGUgaW5wdXQgYnVmZmVybG9hZC4gIFRoaXMgc2hvdWxkIGhvbGQgZm9yICJub3JtYWwiCi0gKiBtYXJrZXJzLiAgU29tZSBDT00vQVBQbiBtYXJrZXJzIG1pZ2h0IGhhdmUgbGFyZ2UgcGFyYW1ldGVyIHNlZ21lbnRzCi0gKiB0aGF0IG1pZ2h0IG5vdCBmaXQuICBJZiB3ZSBhcmUgc2ltcGx5IGRyb3BwaW5nIHN1Y2ggYSBtYXJrZXIsIHdlIHVzZQotICogc2tpcF9pbnB1dF9kYXRhIHRvIGdldCBwYXN0IGl0LCBhbmQgdGhlcmVieSBwdXQgdGhlIHByb2JsZW0gb24gdGhlCi0gKiBzb3VyY2UgbWFuYWdlcidzIHNob3VsZGVycy4gIElmIHdlIGFyZSBzYXZpbmcgdGhlIG1hcmtlcidzIGNvbnRlbnRzCi0gKiBpbnRvIG1lbW9yeSwgd2UgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNvbnZlbnRpb246IHdoZW4gZm9yY2VkIHRvCi0gKiBzdXNwZW5kLCB0aGUgbWFya2VyIHByb2Nlc3NvciB1cGRhdGVzIHRoZSByZXN0YXJ0IHBvaW50IHRvIHRoZSBlbmQgb2YKLSAqIHdoYXQgaXQncyBjb25zdW1lZCAoaWUsIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcikgYmVmb3JlIHJldHVybmluZyBGQUxTRS4KLSAqIE9uIHJlc3VtcHRpb24sIGNpbmZvLT51bnJlYWRfbWFya2VyIHN0aWxsIGNvbnRhaW5zIHRoZSBtYXJrZXIgY29kZSwKLSAqIGJ1dCB0aGUgZGF0YSBzb3VyY2Ugd2lsbCBwb2ludCB0byB0aGUgbmV4dCBjaHVuayBvZiBtYXJrZXIgZGF0YS4KLSAqIFRoZSBtYXJrZXIgcHJvY2Vzc29yIG11c3QgcmV0YWluIGludGVybmFsIHN0YXRlIHRvIGRlYWwgd2l0aCB0aGlzLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gYXZvaWQgZHVwbGljYXRlIHRyYWNlIG1lc3NhZ2VzIGlmIGEKLSAqIHN1c3BlbnNpb24gb2NjdXJzIHdpdGhpbiBtYXJrZXIgcGFyYW1ldGVycy4gIE90aGVyIHNpZGUgZWZmZWN0cwotICogcmVxdWlyZSBtb3JlIGNhcmUuCi0gKi8KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X3NvaSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYW4gU09JIG1hcmtlciAqLwotewotICBpbnQgaTsKLSAgCi0gIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfU09JKTsKLQotICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPSSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPSV9EVVBMSUNBVEUpOwotCi0gIC8qIFJlc2V0IGFsbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGRlZmluZWQgdG8gYmUgcmVzZXQgYnkgU09JICovCi0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKLSAgICBjaW5mby0+YXJpdGhfZGNfTFtpXSA9IDA7Ci0gICAgY2luZm8tPmFyaXRoX2RjX1VbaV0gPSAxOwotICAgIGNpbmZvLT5hcml0aF9hY19LW2ldID0gNTsKLSAgfQotICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IDA7Ci0KLSAgLyogU2V0IGluaXRpYWwgYXNzdW1wdGlvbnMgZm9yIGNvbG9yc3BhY2UgZXRjICovCi0KLSAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKLSAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsgLyogQXNzdW1lIG5vbi1DQ0lSIHNhbXBsaW5nPz8/ICovCi0KLSAgY2luZm8tPnNhd19KRklGX21hcmtlciA9IEZBTFNFOwotICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogc2V0IGRlZmF1bHQgSkZJRiBBUFAwIHZhbHVlcyAqLwotICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gMTsKLSAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IDA7Ci0gIGNpbmZvLT5YX2RlbnNpdHkgPSAxOwotICBjaW5mby0+WV9kZW5zaXR5ID0gMTsKLSAgY2luZm8tPnNhd19BZG9iZV9tYXJrZXIgPSBGQUxTRTsKLSAgY2luZm8tPkFkb2JlX3RyYW5zZm9ybSA9IDA7Ci0KLSAgY2luZm8tPm1hcmtlci0+c2F3X1NPSSA9IFRSVUU7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9zb2YgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJvZywgYm9vbGVhbiBpc19hcml0aCkKLS8qIFByb2Nlc3MgYSBTT0ZuIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIGludCBjLCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gaXNfcHJvZzsKLSAgY2luZm8tPmFyaXRoX2NvZGUgPSBpc19hcml0aDsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLQotICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24sIHJldHVybiBGQUxTRSk7Ci0gIElOUFVUXzJCWVRFUyhjaW5mbywgY2luZm8tPmltYWdlX2hlaWdodCwgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBjaW5mby0+aW1hZ2Vfd2lkdGgsIHJldHVybiBGQUxTRSk7Ci0gIElOUFVUX0JZVEUoY2luZm8sIGNpbmZvLT5udW1fY29tcG9uZW50cywgcmV0dXJuIEZBTFNFKTsKLQotICBsZW5ndGggLT0gODsKLQotICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT0YsIGNpbmZvLT51bnJlYWRfbWFya2VyLAotCSAgIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCwgKGludCkgY2luZm8tPmltYWdlX2hlaWdodCwKLQkgICBjaW5mby0+bnVtX2NvbXBvbmVudHMpOwotCi0gIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09GKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09GX0RVUExJQ0FURSk7Ci0KLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBmaWxlcyBpbiB3aGljaCB0aGUgaW1hZ2UgaGVpZ2h0IGlzIGluaXRpYWxseSBzcGVjaWZpZWQgKi8KLSAgLyogYXMgMCBhbmQgaXMgbGF0ZXIgcmVkZWZpbmVkIGJ5IEROTC4gIEFzIGxvbmcgYXMgd2UgaGF2ZSB0byBjaGVjayB0aGF0LCAgKi8KLSAgLyogbWlnaHQgYXMgd2VsbCBoYXZlIGEgZ2VuZXJhbCBzYW5pdHkgY2hlY2suICovCi0gIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKLSAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOwotCi0gIGlmIChsZW5ndGggIT0gKGNpbmZvLT5udW1fY29tcG9uZW50cyAqIDMpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkJLyogZG8gb25seSBvbmNlLCBldmVuIGlmIHN1c3BlbmQgKi8KLSAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKLQkJCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkgY2luZm8tPm51bV9jb21wb25lbnRzICogU0laRU9GKGpwZWdfY29tcG9uZW50X2luZm8pKTsKLSAgCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7Ci0gICAgSU5QVVRfQllURShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkLCByZXR1cm4gRkFMU0UpOwotICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IChjID4+IDQpICYgMTU7Ci0gICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9IChjICAgICApICYgMTU7Ci0gICAgSU5QVVRfQllURShjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vLCByZXR1cm4gRkFMU0UpOwotCi0gICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09GX0NPTVBPTkVOVCwKLQkgICAgIGNvbXBwdHItPmNvbXBvbmVudF9pZCwgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKLQkgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIGNvbXBwdHItPnF1YW50X3RibF9ubyk7Ci0gIH0KLQotICBjaW5mby0+bWFya2VyLT5zYXdfU09GID0gVFJVRTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9zb3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgU09TIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIGludCBpLCBjaSwgbiwgYywgY2M7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBpZiAoISBjaW5mby0+bWFya2VyLT5zYXdfU09GKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09TX05PX1NPRik7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0KLSAgSU5QVVRfQllURShjaW5mbywgbiwgcmV0dXJuIEZBTFNFKTsgLyogTnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KLQotICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19TT1MsIG4pOwotCi0gIGlmIChsZW5ndGggIT0gKG4gKiAyICsgNikgfHwgbiA8IDEgfHwgbiA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBuOwotCi0gIC8qIENvbGxlY3QgdGhlIGNvbXBvbmVudC1zcGVjIHBhcmFtZXRlcnMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgY2MsIHJldHVybiBGQUxTRSk7Ci0gICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgICAKLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGlmIChjYyA9PSBjb21wcHRyLT5jb21wb25lbnRfaWQpCi0JZ290byBpZF9mb3VuZDsKLSAgICB9Ci0KLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfQ09NUE9ORU5UX0lELCBjYyk7Ci0KLSAgaWRfZm91bmQ6Ci0KLSAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXSA9IGNvbXBwdHI7Ci0gICAgY29tcHB0ci0+ZGNfdGJsX25vID0gKGMgPj4gNCkgJiAxNTsKLSAgICBjb21wcHRyLT5hY190Ymxfbm8gPSAoYyAgICAgKSAmIDE1OwotICAgIAotICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1NPU19DT01QT05FTlQsIGNjLAotCSAgICAgY29tcHB0ci0+ZGNfdGJsX25vLCBjb21wcHRyLT5hY190Ymxfbm8pOwotICB9Ci0KLSAgLyogQ29sbGVjdCB0aGUgYWRkaXRpb25hbCBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbC4gKi8KLSAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgY2luZm8tPlNzID0gYzsKLSAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgY2luZm8tPlNlID0gYzsKLSAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgY2luZm8tPkFoID0gKGMgPj4gNCkgJiAxNTsKLSAgY2luZm8tPkFsID0gKGMgICAgICkgJiAxNTsKLQotICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT1NfUEFSQU1TLCBjaW5mby0+U3MsIGNpbmZvLT5TZSwKLQkgICBjaW5mby0+QWgsIGNpbmZvLT5BbCk7Ci0KLSAgLyogUHJlcGFyZSB0byBzY2FuIGRhdGEgJiByZXN0YXJ0IG1hcmtlcnMgKi8KLSAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IDA7Ci0KLSAgLyogQ291bnQgYW5vdGhlciBTT1MgbWFya2VyICovCi0gIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcisrOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0jaWZkZWYgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVECi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfZGFjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhIERBQyBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBpbnQgaW5kZXgsIHZhbDsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotICAKLSAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBpbmRleCwgcmV0dXJuIEZBTFNFKTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCB2YWwsIHJldHVybiBGQUxTRSk7Ci0KLSAgICBsZW5ndGggLT0gMjsKLQotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RBQywgaW5kZXgsIHZhbCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49ICgyKk5VTV9BUklUSF9UQkxTKSkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19JTkRFWCwgaW5kZXgpOwotCi0gICAgaWYgKGluZGV4ID49IE5VTV9BUklUSF9UQkxTKSB7IC8qIGRlZmluZSBBQyB0YWJsZSAqLwotICAgICAgY2luZm8tPmFyaXRoX2FjX0tbaW5kZXgtTlVNX0FSSVRIX1RCTFNdID0gKFVJTlQ4KSB2YWw7Ci0gICAgfSBlbHNlIHsJCQkvKiBkZWZpbmUgREMgdGFibGUgKi8KLSAgICAgIGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA9IChVSU5UOCkgKHZhbCAmIDB4MEYpOwotICAgICAgY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdID0gKFVJTlQ4KSAodmFsID4+IDQpOwotICAgICAgaWYgKGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA+IGNpbmZvLT5hcml0aF9kY19VW2luZGV4XSkKLQlFUlJFWElUMShjaW5mbywgSkVSUl9EQUNfVkFMVUUsIHZhbCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0jZWxzZSAvKiAhIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLwotCi0jZGVmaW5lIGdldF9kYWMoY2luZm8pICBza2lwX3ZhcmlhYmxlKGNpbmZvKQotCi0jZW5kaWYgLyogRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCi0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9kaHQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgREhUIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIFVJTlQ4IGJpdHNbMTddOwotICBVSU5UOCBodWZmdmFsWzI1Nl07Ci0gIGludCBpLCBpbmRleCwgY291bnQ7Ci0gIEpIVUZGX1RCTCAqKmh0YmxwdHI7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gMjsKLSAgCi0gIHdoaWxlIChsZW5ndGggPiAxNikgewotICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOwotCi0gICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfREhULCBpbmRleCk7Ci0gICAgICAKLSAgICBiaXRzWzBdID0gMDsKLSAgICBjb3VudCA9IDA7Ci0gICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKSB7Ci0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBiaXRzW2ldLCByZXR1cm4gRkFMU0UpOwotICAgICAgY291bnQgKz0gYml0c1tpXTsKLSAgICB9Ci0KLSAgICBsZW5ndGggLT0gMSArIDE2OwotCi0gICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCi0JICAgICBiaXRzWzFdLCBiaXRzWzJdLCBiaXRzWzNdLCBiaXRzWzRdLAotCSAgICAgYml0c1s1XSwgYml0c1s2XSwgYml0c1s3XSwgYml0c1s4XSk7Ci0gICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCi0JICAgICBiaXRzWzldLCBiaXRzWzEwXSwgYml0c1sxMV0sIGJpdHNbMTJdLAotCSAgICAgYml0c1sxM10sIGJpdHNbMTRdLCBiaXRzWzE1XSwgYml0c1sxNl0pOwotCi0gICAgLyogSGVyZSB3ZSBqdXN0IGRvIG1pbmltYWwgdmFsaWRhdGlvbiBvZiB0aGUgY291bnRzIHRvIGF2b2lkIHdhbGtpbmcKLSAgICAgKiBvZmYgdGhlIGVuZCBvZiBvdXIgdGFibGUgc3BhY2UuICBqZGh1ZmYuYyB3aWxsIGNoZWNrIG1vcmUgY2FyZWZ1bGx5LgotICAgICAqLwotICAgIGlmIChjb3VudCA+IDI1NiB8fCAoKElOVDMyKSBjb3VudCkgPiBsZW5ndGgpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgSU5QVVRfQllURShjaW5mbywgaHVmZnZhbFtpXSwgcmV0dXJuIEZBTFNFKTsKLQotICAgIGxlbmd0aCAtPSBjb3VudDsKLQotICAgIGlmIChpbmRleCAmIDB4MTApIHsJCS8qIEFDIHRhYmxlIGRlZmluaXRpb24gKi8KLSAgICAgIGluZGV4IC09IDB4MTA7Ci0gICAgICBodGJscHRyID0gJmNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKLSAgICB9IGVsc2UgewkJCS8qIERDIHRhYmxlIGRlZmluaXRpb24gKi8KLSAgICAgIGh0YmxwdHIgPSAmY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICAgIH0KLQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTlVNX0hVRkZfVEJMUykKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RIVF9JTkRFWCwgaW5kZXgpOwotCi0gICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0gICAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIAotICAgIE1FTUNPUFkoKCpodGJscHRyKS0+Yml0cywgYml0cywgU0laRU9GKCgqaHRibHB0ciktPmJpdHMpKTsKLSAgICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIGh1ZmZ2YWwsIFNJWkVPRigoKmh0YmxwdHIpLT5odWZmdmFsKSk7Ci0gIH0KLQotICBpZiAobGVuZ3RoICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9kcXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgRFFUIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIGludCBuLCBpLCBwcmVjOwotICB1bnNpZ25lZCBpbnQgdG1wOwotICBKUVVBTlRfVEJMICpxdWFudF9wdHI7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gMjsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIElOUFVUX0JZVEUoY2luZm8sIG4sIHJldHVybiBGQUxTRSk7Ci0gICAgcHJlYyA9IG4gPj4gNDsKLSAgICBuICY9IDB4MEY7Ci0KLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19EUVQsIG4sIHByZWMpOwotCi0gICAgaWYgKG4gPj0gTlVNX1FVQU5UX1RCTFMpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIG4pOwotICAgICAgCi0gICAgaWYgKGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXSA9PSBOVUxMKQotICAgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW25dID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgcXVhbnRfcHRyID0gY2luZm8tPnF1YW50X3RibF9wdHJzW25dOwotCi0gICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICAgIGlmIChwcmVjKQotCUlOUFVUXzJCWVRFUyhjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOwotICAgICAgZWxzZQotCUlOUFVUX0JZVEUoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKLSAgICAgIC8qIFdlIGNvbnZlcnQgdGhlIHppZ3phZy1vcmRlciB0YWJsZSB0byBuYXR1cmFsIGFycmF5IG9yZGVyLiAqLwotICAgICAgcXVhbnRfcHRyLT5xdWFudHZhbFtqcGVnX25hdHVyYWxfb3JkZXJbaV1dID0gKFVJTlQxNikgdG1wOwotICAgIH0KLQotICAgIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA+PSAyKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkgKz0gOCkgewotCVRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX1FVQU5UVkFMUywKLQkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaV0sICAgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzFdLAotCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzJdLCBxdWFudF9wdHItPnF1YW50dmFsW2krM10sCi0JCSBxdWFudF9wdHItPnF1YW50dmFsW2krNF0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs1XSwKLQkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs2XSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzddKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBsZW5ndGggLT0gRENUU0laRTIrMTsKLSAgICBpZiAocHJlYykgbGVuZ3RoIC09IERDVFNJWkUyOwotICB9Ci0KLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfZHJpIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhIERSSSBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgdG1wOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgCi0gIGlmIChsZW5ndGggIT0gNCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOwotCi0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0RSSSwgdG1wKTsKLQotICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IHRtcDsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFJvdXRpbmVzIGZvciBwcm9jZXNzaW5nIEFQUG4gYW5kIENPTSBtYXJrZXJzLgotICogVGhlc2UgYXJlIGVpdGhlciBzYXZlZCBpbiBtZW1vcnkgb3IgZGlzY2FyZGVkLCBwZXIgYXBwbGljYXRpb24gcmVxdWVzdC4KLSAqIEFQUDAgYW5kIEFQUDE0IGFyZSBzcGVjaWFsbHkgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBhcmUKLSAqIEpGSUYgYW5kIEFkb2JlIG1hcmtlcnMsIHJlc3BlY3RpdmVseS4KLSAqLwotCi0jZGVmaW5lIEFQUDBfREFUQV9MRU4JMTQJLyogTGVuZ3RoIG9mIGludGVyZXN0aW5nIGRhdGEgaW4gQVBQMCAqLwotI2RlZmluZSBBUFAxNF9EQVRBX0xFTgkxMgkvKiBMZW5ndGggb2YgaW50ZXJlc3RpbmcgZGF0YSBpbiBBUFAxNCAqLwotI2RlZmluZSBBUFBOX0RBVEFfTEVOCTE0CS8qIE11c3QgYmUgdGhlIGxhcmdlc3Qgb2YgdGhlIGFib3ZlISEgKi8KLQotCi1MT0NBTCh2b2lkKQotZXhhbWluZV9hcHAwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKT0NURVQgRkFSICogZGF0YSwKLQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbiwgSU5UMzIgcmVtYWluaW5nKQotLyogRXhhbWluZSBmaXJzdCBmZXcgYnl0ZXMgZnJvbSBhbiBBUFAwLgotICogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXMgYSBKRklGIG1hcmtlci4KLSAqIGRhdGFsZW4gaXMgIyBvZiBieXRlcyBhdCBkYXRhW10sIHJlbWFpbmluZyBpcyBsZW5ndGggb2YgcmVzdCBvZiBtYXJrZXIgZGF0YS4KLSAqLwotewotICBJTlQzMiB0b3RhbGxlbiA9IChJTlQzMikgZGF0YWxlbiArIHJlbWFpbmluZzsKLQotICBpZiAoZGF0YWxlbiA+PSBBUFAwX0RBVEFfTEVOICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0QSAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDYgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDQ5ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg0NiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDApIHsKLSAgICAvKiBGb3VuZCBKRklGIEFQUDAgbWFya2VyOiBzYXZlIGluZm8gKi8KLSAgICBjaW5mby0+c2F3X0pGSUZfbWFya2VyID0gVFJVRTsKLSAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gR0VUSk9DVEVUKGRhdGFbNV0pOwotICAgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBHRVRKT0NURVQoZGF0YVs2XSk7Ci0gICAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IEdFVEpPQ1RFVChkYXRhWzddKTsKLSAgICBjaW5mby0+WF9kZW5zaXR5ID0gKEdFVEpPQ1RFVChkYXRhWzhdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzldKTsKLSAgICBjaW5mby0+WV9kZW5zaXR5ID0gKEdFVEpPQ1RFVChkYXRhWzEwXSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVsxMV0pOwotICAgIC8qIENoZWNrIHZlcnNpb24uCi0gICAgICogTWFqb3IgdmVyc2lvbiBtdXN0IGJlIDEsIGFueXRoaW5nIGVsc2Ugc2lnbmFscyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLgotICAgICAqIChXZSB1c2VkIHRvIHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IsIGJ1dCBub3cgaXQncyBhIG5vbmZhdGFsIHdhcm5pbmcsCi0gICAgICogYmVjYXVzZSBzb21lIGJvem8gYXQgSGlqYWFrIGNvdWxkbid0IHJlYWQgdGhlIHNwZWMuKQotICAgICAqIE1pbm9yIHZlcnNpb24gc2hvdWxkIGJlIDAuLjIsIGJ1dCBwcm9jZXNzIGFueXdheSBpZiBuZXdlci4KLSAgICAgKi8KLSAgICBpZiAoY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiAhPSAxKQotICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9KRklGX01BSk9SLAotCSAgICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24pOwotICAgIC8qIEdlbmVyYXRlIHRyYWNlIG1lc3NhZ2VzICovCi0gICAgVFJBQ0VNUzUoY2luZm8sIDEsIEpUUkNfSkZJRiwKLQkgICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24sCi0JICAgICBjaW5mby0+WF9kZW5zaXR5LCBjaW5mby0+WV9kZW5zaXR5LCBjaW5mby0+ZGVuc2l0eV91bml0KTsKLSAgICAvKiBWYWxpZGF0ZSB0aHVtYm5haWwgZGltZW5zaW9ucyBhbmQgaXNzdWUgYXBwcm9wcmlhdGUgbWVzc2FnZXMgKi8KLSAgICBpZiAoR0VUSk9DVEVUKGRhdGFbMTJdKSB8IEdFVEpPQ1RFVChkYXRhWzEzXSkpCi0gICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19KRklGX1RIVU1CTkFJTCwKLQkgICAgICAgR0VUSk9DVEVUKGRhdGFbMTJdKSwgR0VUSk9DVEVUKGRhdGFbMTNdKSk7Ci0gICAgdG90YWxsZW4gLT0gQVBQMF9EQVRBX0xFTjsKLSAgICBpZiAodG90YWxsZW4gIT0KLQkoKElOVDMyKUdFVEpPQ1RFVChkYXRhWzEyXSkgKiAoSU5UMzIpR0VUSk9DVEVUKGRhdGFbMTNdKSAqIChJTlQzMikgMykpCi0gICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19KRklGX0JBRFRIVU1CTkFJTFNJWkUsIChpbnQpIHRvdGFsbGVuKTsKLSAgfSBlbHNlIGlmIChkYXRhbGVuID49IDYgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDRBICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg0NiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NTggJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDU4ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMCkgewotICAgIC8qIEZvdW5kIEpGSUYgIkpGWFgiIGV4dGVuc2lvbiBBUFAwIG1hcmtlciAqLwotICAgIC8qIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGVzZSwKLSAgICAgKiBidXQgd2UgdHJ5IHRvIHByb2R1Y2UgYSBoZWxwZnVsIHRyYWNlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgc3dpdGNoIChHRVRKT0NURVQoZGF0YVs1XSkpIHsKLSAgICBjYXNlIDB4MTA6Ci0gICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9KUEVHLCAoaW50KSB0b3RhbGxlbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MTE6Ci0gICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9QQUxFVFRFLCAoaW50KSB0b3RhbGxlbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MTM6Ci0gICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9SR0IsIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19KRklGX0VYVEVOU0lPTiwKLQkgICAgICAgR0VUSk9DVEVUKGRhdGFbNV0pLCAoaW50KSB0b3RhbGxlbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogU3RhcnQgb2YgQVBQMCBkb2VzIG5vdCBtYXRjaCAiSkZJRiIgb3IgIkpGWFgiLCBvciB0b28gc2hvcnQgKi8KLSAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19BUFAwLCAoaW50KSB0b3RhbGxlbik7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZXhhbWluZV9hcHAxNCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUIEZBUiAqIGRhdGEsCi0JICAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuLCBJTlQzMiByZW1haW5pbmcpCi0vKiBFeGFtaW5lIGZpcnN0IGZldyBieXRlcyBmcm9tIGFuIEFQUDE0LgotICogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXMgYW4gQWRvYmUgbWFya2VyLgotICogZGF0YWxlbiBpcyAjIG9mIGJ5dGVzIGF0IGRhdGFbXSwgcmVtYWluaW5nIGlzIGxlbmd0aCBvZiByZXN0IG9mIG1hcmtlciBkYXRhLgotICovCi17Ci0gIHVuc2lnbmVkIGludCB2ZXJzaW9uLCBmbGFnczAsIGZsYWdzMSwgdHJhbnNmb3JtOwotCi0gIGlmIChkYXRhbGVuID49IEFQUDE0X0RBVEFfTEVOICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0MSAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NjQgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDZGICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg2MiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDB4NjUpIHsKLSAgICAvKiBGb3VuZCBBZG9iZSBBUFAxNCBtYXJrZXIgKi8KLSAgICB2ZXJzaW9uID0gKEdFVEpPQ1RFVChkYXRhWzVdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzZdKTsKLSAgICBmbGFnczAgPSAoR0VUSk9DVEVUKGRhdGFbN10pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbOF0pOwotICAgIGZsYWdzMSA9IChHRVRKT0NURVQoZGF0YVs5XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVsxMF0pOwotICAgIHRyYW5zZm9ybSA9IEdFVEpPQ1RFVChkYXRhWzExXSk7Ci0gICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfQURPQkUsIHZlcnNpb24sIGZsYWdzMCwgZmxhZ3MxLCB0cmFuc2Zvcm0pOwotICAgIGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyID0gVFJVRTsKLSAgICBjaW5mby0+QWRvYmVfdHJhbnNmb3JtID0gKFVJTlQ4KSB0cmFuc2Zvcm07Ci0gIH0gZWxzZSB7Ci0gICAgLyogU3RhcnQgb2YgQVBQMTQgZG9lcyBub3QgbWF0Y2ggIkFkb2JlIiwgb3IgdG9vIHNob3J0ICovCi0gICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfQVBQMTQsIChpbnQpIChkYXRhbGVuICsgcmVtYWluaW5nKSk7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYoYm9vbGVhbikKLWdldF9pbnRlcmVzdGluZ19hcHBuIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhbiBBUFAwIG9yIEFQUDE0IG1hcmtlciB3aXRob3V0IHNhdmluZyBpdCAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIEpPQ1RFVCBiW0FQUE5fREFUQV9MRU5dOwotICB1bnNpZ25lZCBpbnQgaSwgbnVtdG9yZWFkOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IDI7Ci0KLSAgLyogZ2V0IHRoZSBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoZSBtYXJrZXIgZGF0YSAqLwotICBpZiAobGVuZ3RoID49IEFQUE5fREFUQV9MRU4pCi0gICAgbnVtdG9yZWFkID0gQVBQTl9EQVRBX0xFTjsKLSAgZWxzZSBpZiAobGVuZ3RoID4gMCkKLSAgICBudW10b3JlYWQgPSAodW5zaWduZWQgaW50KSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBudW10b3JlYWQgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtdG9yZWFkOyBpKyspCi0gICAgSU5QVVRfQllURShjaW5mbywgYltpXSwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IG51bXRvcmVhZDsKLQotICAvKiBwcm9jZXNzIGl0ICovCi0gIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKLSAgY2FzZSBNX0FQUDA6Ci0gICAgZXhhbWluZV9hcHAwKGNpbmZvLCAoSk9DVEVUIEZBUiAqKSBiLCBudW10b3JlYWQsIGxlbmd0aCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgTV9BUFAxNDoKLSAgICBleGFtaW5lX2FwcDE0KGNpbmZvLCAoSk9DVEVUIEZBUiAqKSBiLCBudW10b3JlYWQsIGxlbmd0aCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgLyogY2FuJ3QgZ2V0IGhlcmUgdW5sZXNzIGpwZWdfc2F2ZV9tYXJrZXJzIGNob29zZXMgd3JvbmcgcHJvY2Vzc29yICovCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIHNraXAgYW55IHJlbWFpbmluZyBkYXRhIC0tIGNvdWxkIGJlIGxvdHMgKi8KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIGlmIChsZW5ndGggPiAwKQotICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECi0KLU1FVEhPRERFRihib29sZWFuKQotc2F2ZV9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBTYXZlIGFuIEFQUG4gb3IgQ09NIG1hcmtlciBpbnRvIHRoZSBtYXJrZXIgbGlzdCAqLwotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgY3VyX21hcmtlciA9IG1hcmtlci0+Y3VyX21hcmtlcjsKLSAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQsIGRhdGFfbGVuZ3RoOwotICBKT0NURVQgRkFSICogZGF0YTsKLSAgSU5UMzIgbGVuZ3RoID0gMDsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgaWYgKGN1cl9tYXJrZXIgPT0gTlVMTCkgewotICAgIC8qIGJlZ2luIHJlYWRpbmcgYSBtYXJrZXIgKi8KLSAgICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgICBsZW5ndGggLT0gMjsKLSAgICBpZiAobGVuZ3RoID49IDApIHsJCS8qIHdhdGNoIG91dCBmb3IgYm9ndXMgbGVuZ3RoIHdvcmQgKi8KLSAgICAgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2Ugd2FudCB0byBzYXZlICovCi0gICAgICB1bnNpZ25lZCBpbnQgbGltaXQ7Ci0gICAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gKGludCkgTV9DT00pCi0JbGltaXQgPSBtYXJrZXItPmxlbmd0aF9saW1pdF9DT007Ci0gICAgICBlbHNlCi0JbGltaXQgPSBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW2NpbmZvLT51bnJlYWRfbWFya2VyIC0gKGludCkgTV9BUFAwXTsKLSAgICAgIGlmICgodW5zaWduZWQgaW50KSBsZW5ndGggPCBsaW1pdCkKLQlsaW1pdCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKLSAgICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBtYXJrZXIgaXRlbSAqLwotICAgICAgY3VyX21hcmtlciA9IChqcGVnX3NhdmVkX21hcmtlcl9wdHIpCi0JKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgU0laRU9GKHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QpICsgbGltaXQpOwotICAgICAgY3VyX21hcmtlci0+bmV4dCA9IE5VTEw7Ci0gICAgICBjdXJfbWFya2VyLT5tYXJrZXIgPSAoVUlOVDgpIGNpbmZvLT51bnJlYWRfbWFya2VyOwotICAgICAgY3VyX21hcmtlci0+b3JpZ2luYWxfbGVuZ3RoID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOwotICAgICAgY3VyX21hcmtlci0+ZGF0YV9sZW5ndGggPSBsaW1pdDsKLSAgICAgIC8qIGRhdGEgYXJlYSBpcyBqdXN0IGJleW9uZCB0aGUganBlZ19tYXJrZXJfc3RydWN0ICovCi0gICAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YSA9IChKT0NURVQgRkFSICopIChjdXJfbWFya2VyICsgMSk7Ci0gICAgICBtYXJrZXItPmN1cl9tYXJrZXIgPSBjdXJfbWFya2VyOwotICAgICAgbWFya2VyLT5ieXRlc19yZWFkID0gMDsKLSAgICAgIGJ5dGVzX3JlYWQgPSAwOwotICAgICAgZGF0YV9sZW5ndGggPSBsaW1pdDsKLSAgICB9IGVsc2UgewotICAgICAgLyogZGVhbCB3aXRoIGJvZ3VzIGxlbmd0aCB3b3JkICovCi0gICAgICBieXRlc19yZWFkID0gZGF0YV9sZW5ndGggPSAwOwotICAgICAgZGF0YSA9IE5VTEw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIHJlc3VtZSByZWFkaW5nIGEgbWFya2VyICovCi0gICAgYnl0ZXNfcmVhZCA9IG1hcmtlci0+Ynl0ZXNfcmVhZDsKLSAgICBkYXRhX2xlbmd0aCA9IGN1cl9tYXJrZXItPmRhdGFfbGVuZ3RoOwotICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhICsgYnl0ZXNfcmVhZDsKLSAgfQotCi0gIHdoaWxlIChieXRlc19yZWFkIDwgZGF0YV9sZW5ndGgpIHsKLSAgICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIG1vdmUgdGhlIHJlc3RhcnQgcG9pbnQgdG8gaGVyZSAqLwotICAgIG1hcmtlci0+Ynl0ZXNfcmVhZCA9IGJ5dGVzX3JlYWQ7Ci0gICAgLyogSWYgdGhlcmUncyBub3QgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gYnVmZmVyLCBzdXNwZW5kICovCi0gICAgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLCByZXR1cm4gRkFMU0UpOwotICAgIC8qIENvcHkgYnl0ZXMgd2l0aCByZWFzb25hYmxlIHJhcGlkaXR5ICovCi0gICAgd2hpbGUgKGJ5dGVzX3JlYWQgPCBkYXRhX2xlbmd0aCAmJiBieXRlc19pbl9idWZmZXIgPiAwKSB7Ci0gICAgICAqZGF0YSsrID0gKm5leHRfaW5wdXRfYnl0ZSsrOwotICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07Ci0gICAgICBieXRlc19yZWFkKys7Ci0gICAgfQotICB9Ci0KLSAgLyogRG9uZSByZWFkaW5nIHdoYXQgd2Ugd2FudCB0byByZWFkICovCi0gIGlmIChjdXJfbWFya2VyICE9IE5VTEwpIHsJLyogd2lsbCBiZSBOVUxMIGlmIGJvZ3VzIGxlbmd0aCB3b3JkICovCi0gICAgLyogQWRkIG5ldyBtYXJrZXIgdG8gZW5kIG9mIGxpc3QgKi8KLSAgICBpZiAoY2luZm8tPm1hcmtlcl9saXN0ID09IE5VTEwpIHsKLSAgICAgIGNpbmZvLT5tYXJrZXJfbGlzdCA9IGN1cl9tYXJrZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBwcmV2ID0gY2luZm8tPm1hcmtlcl9saXN0OwotICAgICAgd2hpbGUgKHByZXYtPm5leHQgIT0gTlVMTCkKLQlwcmV2ID0gcHJldi0+bmV4dDsKLSAgICAgIHByZXYtPm5leHQgPSBjdXJfbWFya2VyOwotICAgIH0KLSAgICAvKiBSZXNldCBwb2ludGVyICYgY2FsYyByZW1haW5pbmcgZGF0YSBsZW5ndGggKi8KLSAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YTsKLSAgICBsZW5ndGggPSBjdXJfbWFya2VyLT5vcmlnaW5hbF9sZW5ndGggLSBkYXRhX2xlbmd0aDsKLSAgfQotICAvKiBSZXNldCB0byBpbml0aWFsIHN0YXRlIGZvciBuZXh0IG1hcmtlciAqLwotICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOwotCi0gIC8qIFByb2Nlc3MgdGhlIG1hcmtlciBpZiBpbnRlcmVzdGluZzsgZWxzZSBqdXN0IG1ha2UgYSBnZW5lcmljIHRyYWNlIG1zZyAqLwotICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7Ci0gIGNhc2UgTV9BUFAwOgotICAgIGV4YW1pbmVfYXBwMChjaW5mbywgZGF0YSwgZGF0YV9sZW5ndGgsIGxlbmd0aCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgTV9BUFAxNDoKLSAgICBleGFtaW5lX2FwcDE0KGNpbmZvLCBkYXRhLCBkYXRhX2xlbmd0aCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19NSVNDX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIsCi0JICAgICAoaW50KSAoZGF0YV9sZW5ndGggKyBsZW5ndGgpKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIHNraXAgYW55IHJlbWFpbmluZyBkYXRhIC0tIGNvdWxkIGJlIGxvdHMgKi8KLSAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBkbyBiZWZvcmUgc2tpcF9pbnB1dF9kYXRhICovCi0gIGlmIChsZW5ndGggPiAwKQotICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLwotCi0KLU1FVEhPRERFRihib29sZWFuKQotc2tpcF92YXJpYWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gMjsKLSAgCi0gIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX01JU0NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlciwgKGludCkgbGVuZ3RoKTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIGRvIGJlZm9yZSBza2lwX2lucHV0X2RhdGEgKi8KLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEZpbmQgdGhlIG5leHQgSlBFRyBtYXJrZXIsIHNhdmUgaXQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIGhhZCB0byBzdXNwZW5kIGJlZm9yZSByZWFjaGluZyBhIG1hcmtlcjsKLSAqIGluIHRoYXQgY2FzZSBjaW5mby0+dW5yZWFkX21hcmtlciBpcyB1bmNoYW5nZWQuCi0gKgotICogTm90ZSB0aGF0IHRoZSByZXN1bHQgbWlnaHQgbm90IGJlIGEgdmFsaWQgbWFya2VyIGNvZGUsCi0gKiBidXQgaXQgd2lsbCBuZXZlciBiZSAwIG9yIEZGLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1uZXh0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGM7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIGZvciAoOzspIHsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIC8qIFNraXAgYW55IG5vbi1GRiBieXRlcy4KLSAgICAgKiBUaGlzIG1heSBsb29rIGEgYml0IGluZWZmaWNpZW50LCBidXQgaXQgd2lsbCBub3Qgb2NjdXIgaW4gYSB2YWxpZCBmaWxlLgotICAgICAqIFdlIHN5bmMgYWZ0ZXIgZWFjaCBkaXNjYXJkZWQgYnl0ZSBzbyB0aGF0IGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZQotICAgICAqIGNhbiBkaXNjYXJkIHRoZSBieXRlIGZyb20gaXRzIGJ1ZmZlci4KLSAgICAgKi8KLSAgICB3aGlsZSAoYyAhPSAweEZGKSB7Ci0gICAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMrKzsKLSAgICAgIElOUFVUX1NZTkMoY2luZm8pOwotICAgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgICB9Ci0gICAgLyogVGhpcyBsb29wIHN3YWxsb3dzIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMgYXJlIGxlZ2FsIGFzCi0gICAgICogcGFkIGJ5dGVzLCBzbyBkb24ndCBjb3VudCB0aGVtIGluIGRpc2NhcmRlZF9ieXRlcy4gIFdlIGFzc3VtZSB0aGVyZQotICAgICAqIHdpbGwgbm90IGJlIHNvIG1hbnkgY29uc2VjdXRpdmUgRkYgYnl0ZXMgYXMgdG8gb3ZlcmZsb3cgYSBzdXNwZW5kaW5nCi0gICAgICogZGF0YSBzb3VyY2UncyBpbnB1dCBidWZmZXIuCi0gICAgICovCi0gICAgZG8gewotICAgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgICB9IHdoaWxlIChjID09IDB4RkYpOwotICAgIGlmIChjICE9IDApCi0gICAgICBicmVhazsJCQkvKiBmb3VuZCBhIHZhbGlkIG1hcmtlciwgZXhpdCBsb29wICovCi0gICAgLyogUmVhY2ggaGVyZSBpZiB3ZSBmb3VuZCBhIHN0dWZmZWQtemVybyBkYXRhIHNlcXVlbmNlIChGRi8wMCkuCi0gICAgICogRGlzY2FyZCBpdCBhbmQgbG9vcCBiYWNrIHRvIHRyeSBhZ2Fpbi4KLSAgICAgKi8KLSAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gMjsKLSAgICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgfQotCi0gIGlmIChjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgIT0gMCkgewotICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fRVhUUkFORU9VU19EQVRBLCBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMsIGMpOwotICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyA9IDA7Ci0gIH0KLQotICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGM7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1maXJzdF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBMaWtlIG5leHRfbWFya2VyLCBidXQgdXNlZCB0byBvYnRhaW4gdGhlIGluaXRpYWwgU09JIG1hcmtlci4gKi8KLS8qIEZvciB0aGlzIG1hcmtlciwgd2UgZG8gbm90IGFsbG93IHByZWNlZGluZyBnYXJiYWdlIG9yIGZpbGw7IG90aGVyd2lzZSwKLSAqIHdlIG1pZ2h0IHdlbGwgc2NhbiBhbiBlbnRpcmUgaW5wdXQgZmlsZSBiZWZvcmUgcmVhbGl6aW5nIGl0IGFpbid0IEpQRUcuCi0gKiBJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBwcm9jZXNzIG5vbi1KRklGIGZpbGVzLCBpdCBtdXN0IHNlZWsgdG8gdGhlCi0gKiBTT0kgYmVmb3JlIGNhbGxpbmcgdGhlIEpQRUcgbGlicmFyeS4KLSAqLwotewotICBpbnQgYywgYzI7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gIElOUFVUX0JZVEUoY2luZm8sIGMyLCByZXR1cm4gRkFMU0UpOwotICBpZiAoYyAhPSAweEZGIHx8IGMyICE9IChpbnQpIE1fU09JKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX05PX1NPSSwgYywgYzIpOwotCi0gIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzI7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBSZWFkIG1hcmtlcnMgdW50aWwgU09TIG9yIEVPSS4KLSAqCi0gKiBSZXR1cm5zIHNhbWUgY29kZXMgYXMgYXJlIGRlZmluZWQgZm9yIGpwZWdfY29uc3VtZV9pbnB1dDoKLSAqIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1yZWFkX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIE91dGVyIGxvb3AgcmVwZWF0cyBvbmNlIGZvciBlYWNoIG1hcmtlci4gKi8KLSAgZm9yICg7OykgewotICAgIC8qIENvbGxlY3QgdGhlIG1hcmtlciBwcm9wZXIsIHVubGVzcyB3ZSBhbHJlYWR5IGRpZC4gKi8KLSAgICAvKiBOQjogZmlyc3RfbWFya2VyKCkgZW5mb3JjZXMgdGhlIHJlcXVpcmVtZW50IHRoYXQgU09JIGFwcGVhciBmaXJzdC4gKi8KLSAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgewotICAgICAgaWYgKCEgY2luZm8tPm1hcmtlci0+c2F3X1NPSSkgewotCWlmICghIGZpcnN0X21hcmtlcihjaW5mbykpCi0JICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICB9IGVsc2UgewotCWlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKLQkgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXN0IG1hcmtlciBhZnRlciBTT0YuCi0gICAgICovCi0gICAgaWYgKGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9PSAtMSkKLSAgICAgIGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9Ci0gICAgICAgICAgamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8pIC0gMjsKLQotICAgIC8qIEF0IHRoaXMgcG9pbnQgY2luZm8tPnVucmVhZF9tYXJrZXIgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlIGFuZCB0aGUKLSAgICAgKiBpbnB1dCBwb2ludCBpcyBqdXN0IHBhc3QgdGhlIG1hcmtlciBwcm9wZXIsIGJ1dCBiZWZvcmUgYW55IHBhcmFtZXRlcnMuCi0gICAgICogQSBzdXNwZW5zaW9uIHdpbGwgY2F1c2UgdXMgdG8gcmV0dXJuIHdpdGggdGhpcyBzdGF0ZSBzdGlsbCB0cnVlLgotICAgICAqLwotICAgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKLSAgICBjYXNlIE1fU09JOgotICAgICAgaWYgKCEgZ2V0X3NvaShjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCi0gICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgRkFMU0UpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uID0gLTE7Ci0gICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBUUlVFLCBGQUxTRSkpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09GOToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KLSAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIEZBTFNFLCBUUlVFKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBUUlVFLCBUUlVFKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEN1cnJlbnRseSB1bnN1cHBvcnRlZCBTT0ZuIHR5cGVzICovCi0gICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX0pQRzoJCQkvKiBSZXNlcnZlZCBmb3IgSlBFRyBleHRlbnNpb25zICovCi0gICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfU09GX1VOU1VQUE9SVEVELCBjaW5mby0+dW5yZWFkX21hcmtlcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT1M6Ci0gICAgICBpZiAoISBnZXRfc29zKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CS8qIHByb2Nlc3NlZCB0aGUgbWFya2VyICovCi0gICAgICByZXR1cm4gSlBFR19SRUFDSEVEX1NPUzsKLSAgICAKLSAgICBjYXNlIE1fRU9JOgotICAgICAgVFJBQ0VNUyhjaW5mbywgMSwgSlRSQ19FT0kpOwotICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkvKiBwcm9jZXNzZWQgdGhlIG1hcmtlciAqLwotICAgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0k7Ci0gICAgICAKLSAgICBjYXNlIE1fREFDOgotICAgICAgaWYgKCEgZ2V0X2RhYyhjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE1fREhUOgotICAgICAgaWYgKCEgZ2V0X2RodChjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE1fRFFUOgotICAgICAgaWYgKCEgZ2V0X2RxdChjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE1fRFJJOgotICAgICAgaWYgKCEgZ2V0X2RyaShjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE1fQVBQMDoKLSAgICBjYXNlIE1fQVBQMToKLSAgICBjYXNlIE1fQVBQMjoKLSAgICBjYXNlIE1fQVBQMzoKLSAgICBjYXNlIE1fQVBQNDoKLSAgICBjYXNlIE1fQVBQNToKLSAgICBjYXNlIE1fQVBQNjoKLSAgICBjYXNlIE1fQVBQNzoKLSAgICBjYXNlIE1fQVBQODoKLSAgICBjYXNlIE1fQVBQOToKLSAgICBjYXNlIE1fQVBQMTA6Ci0gICAgY2FzZSBNX0FQUDExOgotICAgIGNhc2UgTV9BUFAxMjoKLSAgICBjYXNlIE1fQVBQMTM6Ci0gICAgY2FzZSBNX0FQUDE0OgotICAgIGNhc2UgTV9BUFAxNToKLSAgICAgIGlmICghICgqKChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyKS0+cHJvY2Vzc19BUFBuWwotCQljaW5mby0+dW5yZWFkX21hcmtlciAtIChpbnQpIE1fQVBQMF0pIChjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE1fQ09NOgotICAgICAgaWYgKCEgKCooKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXIpLT5wcm9jZXNzX0NPTSkgKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9SU1QwOgkJLyogdGhlc2UgYXJlIGFsbCBwYXJhbWV0ZXJsZXNzICovCi0gICAgY2FzZSBNX1JTVDE6Ci0gICAgY2FzZSBNX1JTVDI6Ci0gICAgY2FzZSBNX1JTVDM6Ci0gICAgY2FzZSBNX1JTVDQ6Ci0gICAgY2FzZSBNX1JTVDU6Ci0gICAgY2FzZSBNX1JTVDY6Ci0gICAgY2FzZSBNX1JTVDc6Ci0gICAgY2FzZSBNX1RFTToKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1BBUk1MRVNTX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE5MOgkJCS8qIElnbm9yZSBETkwgLi4uIHBlcmhhcHMgdGhlIHdyb25nIHRoaW5nICovCi0gICAgICBpZiAoISBza2lwX3ZhcmlhYmxlKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6CQkJLyogbXVzdCBiZSBESFAsIEVYUCwgSlBHbiwgb3IgUkVTbiAqLwotICAgICAgLyogRm9yIG5vdywgd2UgdHJlYXQgdGhlIHJlc2VydmVkIG1hcmtlcnMgYXMgZmF0YWwgZXJyb3JzIHNpbmNlIHRoZXkgYXJlCi0gICAgICAgKiBsaWtlbHkgdG8gYmUgdXNlZCB0byBzaWduYWwgaW5jb21wYXRpYmxlIEpQRUcgUGFydCAzIGV4dGVuc2lvbnMuCi0gICAgICAgKiBPbmNlIHRoZSBKUEVHIDMgdmVyc2lvbi1udW1iZXIgbWFya2VyIGlzIHdlbGwgZGVmaW5lZCwgdGhpcyBjb2RlCi0gICAgICAgKiBvdWdodCB0byBjaGFuZ2UhCi0gICAgICAgKi8KLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBtYXJrZXIsIHNvIHJlc2V0IHN0YXRlIHZhcmlhYmxlICovCi0gICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwotICB9IC8qIGVuZCBsb29wICovCi19Ci0KLQotLyoKLSAqIFJlYWQgYSByZXN0YXJ0IG1hcmtlciwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYXBwZWFyIG5leHQgaW4gdGhlIGRhdGFzdHJlYW07Ci0gKiBpZiB0aGUgbWFya2VyIGlzIG5vdCB0aGVyZSwgdGFrZSBhcHByb3ByaWF0ZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuCi0gKgotICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGVudHJvcHkgZGVjb2RlciBhZnRlciBpdCBoYXMgcmVhZCBhbiBhcHByb3ByaWF0ZQotICogbnVtYmVyIG9mIE1DVXMuICBjaW5mby0+dW5yZWFkX21hcmtlciBtYXkgYmUgbm9uemVybyBpZiB0aGUgZW50cm9weSBkZWNvZGVyCi0gKiBoYXMgYWxyZWFkeSByZWFkIGEgbWFya2VyIGZyb20gdGhlIGRhdGEgc291cmNlLiAgVW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKLSAqIGNpbmZvLT51bnJlYWRfbWFya2VyIHdpbGwgYmUgcmVzZXQgdG8gMCBiZWZvcmUgcmV0dXJuaW5nOyBpZiBub3QgcmVzZXQsCi0gKiBpdCBob2xkcyBhIG1hcmtlciB3aGljaCB0aGUgZGVjb2RlciB3aWxsIGJlIHVuYWJsZSB0byByZWFkIHBhc3QuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1yZWFkX3Jlc3RhcnRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBPYnRhaW4gYSBtYXJrZXIgdW5sZXNzIHdlIGFscmVhZHkgZGlkLiAqLwotICAvKiBOb3RlIHRoYXQgbmV4dF9tYXJrZXIgd2lsbCBjb21wbGFpbiBpZiBpdCBza2lwcyBhbnkgZGF0YS4gKi8KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKLSAgICBpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0KLSAgICAgICgoaW50KSBNX1JTVDAgKyBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKSkgewotICAgIC8qIE5vcm1hbCBjYXNlIC0tLSBzd2FsbG93IHRoZSBtYXJrZXIgYW5kIGxldCBlbnRyb3B5IGRlY29kZXIgY29udGludWUgKi8KLSAgICBUUkFDRU1TMShjaW5mbywgMywgSlRSQ19SU1QsIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pOwotICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKLSAgfSBlbHNlIHsKLSAgICAvKiBVaC1vaCwgdGhlIHJlc3RhcnQgbWFya2VycyBoYXZlIGJlZW4gbWVzc2VkIHVwLiAqLwotICAgIC8qIExldCB0aGUgZGF0YSBzb3VyY2UgbWFuYWdlciBkZXRlcm1pbmUgaG93IHRvIHJlc3luYy4gKi8KLSAgICBpZiAoISAoKmNpbmZvLT5zcmMtPnJlc3luY190b19yZXN0YXJ0KSAoY2luZm8sCi0JCQkJCSAgICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIFVwZGF0ZSBuZXh0LXJlc3RhcnQgc3RhdGUgKi8KLSAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IChjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtICsgMSkgJiA3OwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZGF0YSBzb3VyY2UgbWFuYWdlcnMKLSAqIHRvIHVzZSBpZiB0aGV5IGRvbid0IGhhdmUgYW55IGJldHRlciBhcHByb2FjaC4gIFNvbWUgZGF0YSBzb3VyY2UgbWFuYWdlcnMKLSAqIG1heSBiZSBhYmxlIHRvIGJhY2sgdXAsIG9yIG1heSBoYXZlIGFkZGl0aW9uYWwga25vd2xlZGdlIGFib3V0IHRoZSBkYXRhCi0gKiB3aGljaCBwZXJtaXRzIGEgbW9yZSBpbnRlbGxpZ2VudCByZWNvdmVyeSBzdHJhdGVneTsgc3VjaCBtYW5hZ2VycyB3b3VsZAotICogcHJlc3VtYWJseSBzdXBwbHkgdGhlaXIgb3duIHJlc3luYyBtZXRob2QuCi0gKgotICogcmVhZF9yZXN0YXJ0X21hcmtlciBjYWxscyByZXN5bmNfdG9fcmVzdGFydCBpZiBpdCBmaW5kcyBhIG1hcmtlciBvdGhlciB0aGFuCi0gKiB0aGUgcmVzdGFydCBtYXJrZXIgaXQgd2FzIGV4cGVjdGluZy4gIChUaGlzIGNvZGUgaXMgKm5vdCogdXNlZCB1bmxlc3MKLSAqIGEgbm9uemVybyByZXN0YXJ0IGludGVydmFsIGhhcyBiZWVuIGRlY2xhcmVkLikgIGNpbmZvLT51bnJlYWRfbWFya2VyIGlzCi0gKiB0aGUgbWFya2VyIGNvZGUgYWN0dWFsbHkgZm91bmQgKG1pZ2h0IGJlIGFueXRoaW5nLCBleGNlcHQgMCBvciBGRikuCi0gKiBUaGUgZGVzaXJlZCByZXN0YXJ0IG1hcmtlciBudW1iZXIgKDAuLjcpIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KLSAqIFRoaXMgcm91dGluZSBpcyBzdXBwb3NlZCB0byBhcHBseSB3aGF0ZXZlciBlcnJvciByZWNvdmVyeSBzdHJhdGVneSBzZWVtcwotICogYXBwcm9wcmlhdGUgaW4gb3JkZXIgdG8gcG9zaXRpb24gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgbmV4dCBkYXRhIHNlZ21lbnQuCi0gKiBOb3RlIHRoYXQgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMgdHJlYXRlZCBhcyBhIG1hcmtlciBhcHBlYXJpbmcgYmVmb3JlCi0gKiB0aGUgY3VycmVudCBkYXRhLXNvdXJjZSBpbnB1dCBwb2ludDsgdXN1YWxseSBpdCBzaG91bGQgYmUgcmVzZXQgdG8gemVybwotICogYmVmb3JlIHJldHVybmluZy4KLSAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN1YnN0YW50aWFsbHkgY29uc3RyYWluZWQgYnkgd2FudGluZyB0byB0cmVhdCB0aGUKLSAqIGlucHV0IGFzIGEgZGF0YSBzdHJlYW07IHRoaXMgbWVhbnMgd2UgY2FuJ3QgYmFjayB1cC4gIFRoZXJlZm9yZSwgd2UgaGF2ZQotICogb25seSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgdG8gd29yayB3aXRoOgotICogICAxLiBTaW1wbHkgZGlzY2FyZCB0aGUgbWFya2VyIGFuZCBsZXQgdGhlIGVudHJvcHkgZGVjb2RlciByZXN1bWUgYXQgbmV4dAotICogICAgICBieXRlIG9mIGZpbGUuCi0gKiAgIDIuIFJlYWQgZm9yd2FyZCB1bnRpbCB3ZSBmaW5kIGFub3RoZXIgbWFya2VyLCBkaXNjYXJkaW5nIGludGVydmVuaW5nCi0gKiAgICAgIGRhdGEuICAoSW4gdGhlb3J5IHdlIGNvdWxkIGxvb2sgYWhlYWQgd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlcmxvYWQsCi0gKiAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGRpc2NhcmQgZGF0YSBpZiB3ZSBkb24ndCBmaW5kIHRoZSBkZXNpcmVkIG1hcmtlci4KLSAqICAgICAgVGhpcyBpZGVhIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlLCBpbiBwYXJ0IGJlY2F1c2UgaXQgbWFrZXMgYmVoYXZpb3IKLSAqICAgICAgZGVwZW5kZW50IG9uIGJ1ZmZlciBzaXplIGFuZCBjaGFuY2UgYnVmZmVyLWJvdW5kYXJ5IHBvc2l0aW9ucy4pCi0gKiAgIDMuIExlYXZlIHRoZSBtYXJrZXIgdW5yZWFkIChieSBmYWlsaW5nIHRvIHplcm8gY2luZm8tPnVucmVhZF9tYXJrZXIpLgotICogICAgICBUaGlzIHdpbGwgY2F1c2UgdGhlIGVudHJvcHkgZGVjb2RlciB0byBwcm9jZXNzIGFuIGVtcHR5IGRhdGEgc2VnbWVudCwKLSAqICAgICAgaW5zZXJ0aW5nIGR1bW15IHplcm9lcywgYW5kIHRoZW4gd2Ugd2lsbCByZXByb2Nlc3MgdGhlIG1hcmtlci4KLSAqCi0gKiAjMiBpcyBhcHByb3ByaWF0ZSBpZiB3ZSB0aGluayB0aGUgZGVzaXJlZCBtYXJrZXIgbGllcyBhaGVhZCwgd2hpbGUgIzMgaXMKLSAqIGFwcHJvcHJpYXRlIGlmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSBmdXR1cmUgcmVzdGFydCBtYXJrZXIgKGluZGljYXRpbmcKLSAqIHRoYXQgd2UgaGF2ZSBtaXNzZWQgdGhlIGRlc2lyZWQgcmVzdGFydCBtYXJrZXIsIHByb2JhYmx5IGJlY2F1c2UgaXQgZ290Ci0gKiBjb3JydXB0ZWQpLgotICogV2UgYXBwbHkgIzIgb3IgIzMgaWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIHJlc3RhcnQgbWFya2VyIG5vIG1vcmUgdGhhbgotICogdHdvIGNvdW50cyBiZWhpbmQgb3IgYWhlYWQgb2YgdGhlIGV4cGVjdGVkIG9uZS4gIFdlIGFsc28gYXBwbHkgIzIgaWYgdGhlCi0gKiBmb3VuZCBtYXJrZXIgaXMgbm90IGEgbGVnYWwgSlBFRyBtYXJrZXIgY29kZSAoaXQncyBjZXJ0YWlubHkgYm9ndXMgZGF0YSkuCi0gKiBJZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgcmVzdGFydCBtYXJrZXIgbW9yZSB0aGFuIDIgY291bnRzIGF3YXksIHdlIGRvICMxCi0gKiAodG9vIG11Y2ggcmlzayB0aGF0IHRoZSBtYXJrZXIgaXMgZXJyb25lb3VzOyB3aXRoIGx1Y2sgd2Ugd2lsbCBiZSBhYmxlIHRvCi0gKiByZXN5bmMgYXQgc29tZSBmdXR1cmUgcG9pbnQpLgotICogRm9yIGFueSB2YWxpZCBub24tcmVzdGFydCBKUEVHIG1hcmtlciwgd2UgYXBwbHkgIzMuICBUaGlzIGtlZXBzIHVzIGZyb20KLSAqIG92ZXJydW5uaW5nIHRoZSBlbmQgb2YgYSBzY2FuLiAgQW4gaW1wbGVtZW50YXRpb24gbGltaXRlZCB0byBzaW5nbGUtc2NhbgotICogZmlsZXMgbWlnaHQgZmluZCBpdCBiZXR0ZXIgdG8gYXBwbHkgIzIgZm9yIG1hcmtlcnMgb3RoZXIgdGhhbiBFT0ksIHNpbmNlCi0gKiBhbnkgb3RoZXIgbWFya2VyIHdvdWxkIGhhdmUgdG8gYmUgYm9ndXMgZGF0YSBpbiB0aGF0IGNhc2UuCi0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX3Jlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkKLXsKLSAgaW50IG1hcmtlciA9IGNpbmZvLT51bnJlYWRfbWFya2VyOwotICBpbnQgYWN0aW9uID0gMTsKLSAgCi0gIC8qIEFsd2F5cyBwdXQgdXAgYSB3YXJuaW5nLiAqLwotICBXQVJOTVMyKGNpbmZvLCBKV1JOX01VU1RfUkVTWU5DLCBtYXJrZXIsIGRlc2lyZWQpOwotICAKLSAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIHJlcGVhdGVkIGRlY2lzaW9uIGFmdGVyIHNjYW5uaW5nIGZvcndhcmQuICovCi0gIGZvciAoOzspIHsKLSAgICBpZiAobWFya2VyIDwgKGludCkgTV9TT0YwKQotICAgICAgYWN0aW9uID0gMjsJCS8qIGludmFsaWQgbWFya2VyICovCi0gICAgZWxzZSBpZiAobWFya2VyIDwgKGludCkgTV9SU1QwIHx8IG1hcmtlciA+IChpbnQpIE1fUlNUNykKLSAgICAgIGFjdGlvbiA9IDM7CQkvKiB2YWxpZCBub24tcmVzdGFydCBtYXJrZXIgKi8KLSAgICBlbHNlIHsKLSAgICAgIGlmIChtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZCsxKSAmIDcpKSB8fAotCSAgbWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQrMikgJiA3KSkpCi0JYWN0aW9uID0gMzsJCS8qIG9uZSBvZiB0aGUgbmV4dCB0d28gZXhwZWN0ZWQgcmVzdGFydHMgKi8KLSAgICAgIGVsc2UgaWYgKG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkLTEpICYgNykpIHx8Ci0JICAgICAgIG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkLTIpICYgNykpKQotCWFjdGlvbiA9IDI7CQkvKiBhIHByaW9yIHJlc3RhcnQsIHNvIGFkdmFuY2UgKi8KLSAgICAgIGVsc2UKLQlhY3Rpb24gPSAxOwkJLyogZGVzaXJlZCByZXN0YXJ0IG9yIHRvbyBmYXIgYXdheSAqLwotICAgIH0KLSAgICBUUkFDRU1TMihjaW5mbywgNCwgSlRSQ19SRUNPVkVSWV9BQ1RJT04sIG1hcmtlciwgYWN0aW9uKTsKLSAgICBzd2l0Y2ggKGFjdGlvbikgewotICAgIGNhc2UgMToKLSAgICAgIC8qIERpc2NhcmQgbWFya2VyIGFuZCBsZXQgZW50cm9weSBkZWNvZGVyIHJlc3VtZSBwcm9jZXNzaW5nLiAqLwotICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSAyOgotICAgICAgLyogU2NhbiB0byB0aGUgbmV4dCBtYXJrZXIsIGFuZCByZXBlYXQgdGhlIGRlY2lzaW9uIGxvb3AuICovCi0gICAgICBpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICAgICAgbWFya2VyID0gY2luZm8tPnVucmVhZF9tYXJrZXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAvKiBSZXR1cm4gd2l0aG91dCBhZHZhbmNpbmcgcGFzdCB0aGlzIG1hcmtlci4gKi8KLSAgICAgIC8qIEVudHJvcHkgZGVjb2RlciB3aWxsIGJlIGZvcmNlZCB0byBwcm9jZXNzIGFuIGVtcHR5IHNlZ21lbnQuICovCi0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gIH0gLyogZW5kIGxvb3AgKi8KLX0KLQotLyoKLSAqIEdldCB0aGUgcG9zaXRpb24gZm9yIGFsbCBTT1MgbWFya2VycyBpbiB0aGUgaW1hZ2UuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1nZXRfc29zX21hcmtlcl9wb3NpdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKLXsKLSAgdW5zaWduZWQgY2hhciAqaGVhZDsKLSAgaW50IGNvdW50ID0gMDsKLSAgaW50IHJldGNvZGUgPSBKUEVHX1JFQUNIRURfU09TOwotCi0gIHdoaWxlIChjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgPiAwKSB7Ci0gICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykgewotICAgICAganBlZ19jb25maWd1cmVfaHVmZm1hbl9pbmRleF9zY2FuKGNpbmZvLCBpbmRleCwgY291bnQrKywKLSAgICAgICAgICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uKTsKLSAgICAgIC8vIFNraXBzIHNjYW4gY29udGVudCB0byB0aGUgbmV4dCBub24tUlNUIEpQRUcgbWFya2VyLgotICAgICAgd2hpbGUobmV4dF9tYXJrZXIoY2luZm8pICYmCi0gICAgICAgICAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID49IE1fUlNUMCAmJiBjaW5mby0+dW5yZWFkX21hcmtlciA8PSBNX1JTVDcpCi0gICAgICAgICAgOwotICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uID0KLSAgICAgICAgamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8pIC0gMjsKLSAgICAgIHJldGNvZGUgPSByZWFkX21hcmtlcnMoY2luZm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoKLSAqIFJlc2V0IG1hcmtlciBwcm9jZXNzaW5nIHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlc2V0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0KLSAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7CQkvKiB1bnRpbCBhbGxvY2F0ZWQgYnkgZ2V0X3NvZiAqLwotICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOwkJLyogbm8gU09TIHNlZW4geWV0ICovCi0gIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJCS8qIG5vIHBlbmRpbmcgbWFya2VyICovCi0gIG1hcmtlci0+cHViLnNhd19TT0kgPSBGQUxTRTsJCS8qIHNldCBpbnRlcm5hbCBzdGF0ZSB0b28gKi8KLSAgbWFya2VyLT5wdWIuc2F3X1NPRiA9IEZBTFNFOwotICBtYXJrZXItPnB1Yi5kaXNjYXJkZWRfYnl0ZXMgPSAwOwotICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgcmVhZGVyIG1vZHVsZS4KLSAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyOwotICBpbnQgaTsKLQotICAvKiBDcmVhdGUgc3Vib2JqZWN0IGluIHBlcm1hbmVudCBwb29sICovCi0gIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCVNJWkVPRihteV9tYXJrZXJfcmVhZGVyKSk7Ci0gIGNpbmZvLT5tYXJrZXIgPSAoc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqKSBtYXJrZXI7Ci0gIC8qIEluaXRpYWxpemUgcHVibGljIG1ldGhvZCBwb2ludGVycyAqLwotICBtYXJrZXItPnB1Yi5yZXNldF9tYXJrZXJfcmVhZGVyID0gcmVzZXRfbWFya2VyX3JlYWRlcjsKLSAgbWFya2VyLT5wdWIucmVhZF9tYXJrZXJzID0gcmVhZF9tYXJrZXJzOwotICBtYXJrZXItPnB1Yi5yZWFkX3Jlc3RhcnRfbWFya2VyID0gcmVhZF9yZXN0YXJ0X21hcmtlcjsKLSAgbWFya2VyLT5wdWIuZ2V0X3Nvc19tYXJrZXJfcG9zaXRpb24gPSBnZXRfc29zX21hcmtlcl9wb3NpdGlvbjsKLSAgLyogSW5pdGlhbGl6ZSBDT00vQVBQbiBwcm9jZXNzaW5nLgotICAgKiBCeSBkZWZhdWx0LCB3ZSBleGFtaW5lIGFuZCB0aGVuIGRpc2NhcmQgQVBQMCBhbmQgQVBQMTQsCi0gICAqIGJ1dCBzaW1wbHkgZGlzY2FyZCBDT00gYW5kIGFsbCBvdGhlciBBUFBuLgotICAgKi8KLSAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHNraXBfdmFyaWFibGU7Ci0gIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgbWFya2VyLT5wcm9jZXNzX0FQUG5baV0gPSBza2lwX3ZhcmlhYmxlOwotICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5baV0gPSAwOwotICB9Ci0gIG1hcmtlci0+cHJvY2Vzc19BUFBuWzBdID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47Ci0gIG1hcmtlci0+cHJvY2Vzc19BUFBuWzE0XSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOwotICAvKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSAqLwotICByZXNldF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKLX0KLQotCi0vKgotICogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4KLSAqLwotCi0jaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2F2ZV9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCi0JCSAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0gIGxvbmcgbWF4bGVuZ3RoOwotICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NvcjsKLQotICAvKiBMZW5ndGggbGltaXQgbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiB3aGF0IHdlIGNhbiBhbGxvY2F0ZQotICAgKiAoc2hvdWxkIG9ubHkgYmUgYSBjb25jZXJuIGluIGEgMTYtYml0IGVudmlyb25tZW50KS4KLSAgICovCi0gIG1heGxlbmd0aCA9IGNpbmZvLT5tZW0tPm1heF9hbGxvY19jaHVuayAtIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KTsKLSAgaWYgKCgobG9uZykgbGVuZ3RoX2xpbWl0KSA+IG1heGxlbmd0aCkKLSAgICBsZW5ndGhfbGltaXQgPSAodW5zaWduZWQgaW50KSBtYXhsZW5ndGg7Ci0KLSAgLyogQ2hvb3NlIHByb2Nlc3NvciByb3V0aW5lIHRvIHVzZS4KLSAgICogQVBQMC9BUFAxNCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgotICAgKi8KLSAgaWYgKGxlbmd0aF9saW1pdCkgewotICAgIHByb2Nlc3NvciA9IHNhdmVfbWFya2VyOwotICAgIC8qIElmIHNhdmluZyBBUFAwL0FQUDE0LCBzYXZlIGF0IGxlYXN0IGVub3VnaCBmb3Igb3VyIGludGVybmFsIHVzZS4gKi8KLSAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwICYmIGxlbmd0aF9saW1pdCA8IEFQUDBfREFUQV9MRU4pCi0gICAgICBsZW5ndGhfbGltaXQgPSBBUFAwX0RBVEFfTEVOOwotICAgIGVsc2UgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQgJiYgbGVuZ3RoX2xpbWl0IDwgQVBQMTRfREFUQV9MRU4pCi0gICAgICBsZW5ndGhfbGltaXQgPSBBUFAxNF9EQVRBX0xFTjsKLSAgfSBlbHNlIHsKLSAgICBwcm9jZXNzb3IgPSBza2lwX3ZhcmlhYmxlOwotICAgIC8qIElmIGRpc2NhcmRpbmcgQVBQMC9BUFAxNCwgdXNlIG91ciByZWd1bGFyIG9uLXRoZS1mbHkgcHJvY2Vzc29yLiAqLwotICAgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDAgfHwgbWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAxNCkKLSAgICAgIHByb2Nlc3NvciA9IGdldF9pbnRlcmVzdGluZ19hcHBuOwotICB9Ci0KLSAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQ09NKSB7Ci0gICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHByb2Nlc3NvcjsKLSAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSBsZW5ndGhfbGltaXQ7Ci0gIH0gZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpIHsKLSAgICBtYXJrZXItPnByb2Nlc3NfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBwcm9jZXNzb3I7Ci0gICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBsZW5ndGhfbGltaXQ7Ci0gIH0gZWxzZQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Ci19Ci0KLSNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAotCQkJICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotCi0gIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkKLSAgICBtYXJrZXItPnByb2Nlc3NfQ09NID0gcm91dGluZTsKLSAgZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpCi0gICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcm91dGluZTsKLSAgZWxzZQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZG1hc3Rlci5jIGIvbGlianBlZ3R3cnAvamRtYXN0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkYTc1OC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZG1hc3Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qCi0gKiBqZG1hc3Rlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQKLSAqIGFuZCB3aXRoIGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayB0byBiZSBkb25lIGluIGVhY2gKLSAqIHBhc3MuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLwotCi0gIGJvb2xlYW4gdXNpbmdfbWVyZ2VkX3Vwc2FtcGxlOyAvKiBUUlVFIGlmIHVzaW5nIG1lcmdlZCB1cHNhbXBsZS9jY29udmVydCAqLwotCi0gIC8qIFNhdmVkIHJlZmVyZW5jZXMgdG8gaW5pdGlhbGl6ZWQgcXVhbnRpemVyIG1vZHVsZXMsCi0gICAqIGluIGNhc2Ugd2UgbmVlZCB0byBzd2l0Y2ggbW9kZXMuCi0gICAqLwotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBxdWFudGl6ZXJfMXBhc3M7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8ycGFzczsKLX0gbXlfZGVjb21wX21hc3RlcjsKLQotdHlwZWRlZiBteV9kZWNvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKLQotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgbWVyZ2VkIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc2hvdWxkIGJlIHVzZWQuCi0gKiBDUlVDSUFMOiB0aGlzIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMgb2YgamRtZXJnZS5jIQotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi11c2VfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECi0gIC8qIE1lcmdpbmcgaXMgdGhlIGVxdWl2YWxlbnQgb2YgcGxhaW4gYm94LWZpbHRlciB1cHNhbXBsaW5nICovCi0gIGlmIChjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyB8fCBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBBTkRST0lEX1JHQgotICAvKiBqZG1lcmdlLmMgb25seSBzdXBwb3J0cyBZQ0M9PlJHQjU2NSBhbmQgWUNDPT5SR0IgY29sb3IgY29udmVyc2lvbiAqLwotICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gSkNTX1lDYkNyIHx8IAotICAgICAgY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMgfHwKLSAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSAzIHx8Ci0gICAgICAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCXzU2NSAmJiAKLSAgICAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikpIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSNlbHNlCi0gIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCIGNvbG9yIGNvbnZlcnNpb24gKi8KLSAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAotICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCIHx8Ci0gICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKLSAgICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLQotICAvKiBhbmQgaXQgb25seSBoYW5kbGVzIDJoMXYgb3IgMmgydiBzYW1wbGluZyByYXRpb3MgKi8KLSAgaWYgKGNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciAhPSAyIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA+ICAyIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgIT0gMSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yICE9IDEpCi0gICAgcmV0dXJuIEZBTFNFOwotICAvKiBmdXJ0aGVybW9yZSwgaXQgZG9lc24ndCB3b3JrIGlmIHdlJ3ZlIHNjYWxlZCB0aGUgSURDVHMgZGlmZmVyZW50bHkgKi8KLSAgaWYgKGNpbmZvLT5jb21wX2luZm9bMF0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1syXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpCi0gICAgcmV0dXJuIEZBTFNFOwotICAvKiA/Pz8gYWxzbyBuZWVkIHRvIHRlc3QgZm9yIHVwc2FtcGxlLXRpbWUgcmVzY2FsaW5nLCB3aGVuICYgaWYgc3VwcG9ydGVkICovCi0gIHJldHVybiBUUlVFOwkJCS8qIGJ5IGdvbGx5LCBpdCdsbCB3b3JrLi4uICovCi0jZWxzZQotICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLX0KLQotCi0vKgotICogQ29tcHV0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgcmVsYXRlZCB2YWx1ZXMuCi0gKiBOT1RFOiB0aGlzIGlzIGV4cG9ydGVkIGZvciBwb3NzaWJsZSB1c2UgYnkgYXBwbGljYXRpb24uCi0gKiBIZW5jZSBpdCBtdXN0bid0IGRvIGFueXRoaW5nIHRoYXQgY2FuJ3QgYmUgZG9uZSB0d2ljZS4KLSAqIEFsc28gbm90ZSB0aGF0IGl0IG1heSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBtYXN0ZXIgbW9kdWxlIGlzIGluaXRpYWxpemVkIQotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLwotewotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotI2VuZGlmCi0KLSAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KLSNpZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCi0gIC8vIFRpbGUgYmFzZWQgZGVjb2RpbmcgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzLgotICBpZiAoIWNpbmZvLT50aWxlX2RlY29kZSkKLSNlbmRpZgotICAgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SRUFEWSkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0KLSAgLyogQ29tcHV0ZSBhY3R1YWwgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYW5kIERDVCBzY2FsaW5nIGNob2ljZXMuICovCi0gIGlmIChjaW5mby0+c2NhbGVfbnVtICogOCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKLSAgICAvKiBQcm92aWRlIDEvOCBzY2FsaW5nICovCi0gICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA4TCk7Ci0gICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDhMKTsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDE7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDQgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7Ci0gICAgLyogUHJvdmlkZSAxLzQgc2NhbGluZyAqLwotICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgNEwpOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCA0TCk7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAyOwotICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiAyIDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgewotICAgIC8qIFByb3ZpZGUgMS8yIHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDJMKTsKLSAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgMkwpOwotICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gNDsKLSAgfSBlbHNlIHsKLSAgICAvKiBQcm92aWRlIDEvMSBzY2FsaW5nICovCi0gICAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLSAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotICB9Ci0gIC8qIEluIHNlbGVjdGluZyB0aGUgYWN0dWFsIERDVCBzY2FsaW5nIGZvciBlYWNoIGNvbXBvbmVudCwgd2UgdHJ5IHRvCi0gICAqIHNjYWxlIHVwIHRoZSBjaHJvbWEgY29tcG9uZW50cyB2aWEgSURDVCBzY2FsaW5nIHJhdGhlciB0aGFuIHVwc2FtcGxpbmcuCi0gICAqIFRoaXMgc2F2ZXMgdGltZSBpZiB0aGUgdXBzYW1wbGVyIGdldHMgdG8gdXNlIDE6MSBzY2FsaW5nLgotICAgKiBOb3RlIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHN1cHBvcnRlZCBEQ1Qgc2NhbGluZ3MgYXJlIHBvd2VycyBvZiAyLgotICAgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpbnQgc3NpemUgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgICB3aGlsZSAoc3NpemUgPCBEQ1RTSVpFICYmCi0JICAgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIgPD0KLQkgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpICYmCi0JICAgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIgPD0KLQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpKSB7Ci0gICAgICBzc2l6ZSA9IHNzaXplICogMjsKLSAgICB9Ci0gICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gc3NpemU7Ci0gIH0KLQotICAvKiBSZWNvbXB1dGUgZG93bnNhbXBsZWQgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzOwotICAgKiBhcHBsaWNhdGlvbiBuZWVkcyB0byBrbm93IHRoZXNlIGlmIHVzaW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLgotICAgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBTaXplIGluIHNhbXBsZXMsIGFmdGVyIElEQ1Qgc2NhbGluZyAqLwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKgotCQkgICAgKGxvbmcpIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqCi0JCSAgICAobG9uZykgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gIH0KLQotI2Vsc2UgLyogIUlEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KLQotICAvKiBIYXJkd2lyZSBpdCB0byAibm8gc2NhbGluZyIgKi8KLSAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLSAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAvKiBqZGlucHV0LmMgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQgRENUX3NjYWxlZF9zaXplIHRvIERDVFNJWkUsCi0gICAqIGFuZCBoYXMgY29tcHV0ZWQgdW5zY2FsZWQgZG93bnNhbXBsZWRfd2lkdGggYW5kIGRvd25zYW1wbGVkX2hlaWdodC4KLSAgICovCi0KLSNlbmRpZiAvKiBJRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCi0KLSAgLyogUmVwb3J0IG51bWJlciBvZiBjb21wb25lbnRzIGluIHNlbGVjdGVkIGNvbG9yc3BhY2UuICovCi0gIC8qIFByb2JhYmx5IHRoaXMgc2hvdWxkIGJlIGluIHRoZSBjb2xvciBjb252ZXJzaW9uIG1vZHVsZS4uLiAqLwotICBzd2l0Y2ggKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDE7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1JHQjoKLSNpZiBSR0JfUElYRUxTSVpFICE9IDMKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOwotICAgIGJyZWFrOwotI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCi0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgY2FzZSBKQ1NfUkdCXzU2NToKLSNlbmRpZgotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAzOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19DTVlLOgotICBjYXNlIEpDU19ZQ0NLOgotI2lmZGVmIEFORFJPSURfUkdCCi0gIGNhc2UgSkNTX1JHQkFfODg4ODoKLSNlbmRpZgotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6CQkJLyogZWxzZSBtdXN0IGJlIHNhbWUgY29sb3JzcGFjZSBhcyBpbiBmaWxlICovCi0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIGJyZWFrOwotICB9Ci0gIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IChjaW5mby0+cXVhbnRpemVfY29sb3JzID8gMSA6Ci0JCQkgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOwotCi0gIC8qIFNlZSBpZiB1cHNhbXBsZXIgd2lsbCB3YW50IHRvIGVtaXQgbW9yZSB0aGFuIG9uZSByb3cgYXQgYSB0aW1lICovCi0gIGlmICh1c2VfbWVyZ2VkX3Vwc2FtcGxlKGNpbmZvKSkKLSAgICBjaW5mby0+cmVjX291dGJ1Zl9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gIGVsc2UKLSAgICBjaW5mby0+cmVjX291dGJ1Zl9oZWlnaHQgPSAxOwotfQotCi0KLS8qCi0gKiBTZXZlcmFsIGRlY29tcHJlc3Npb24gcHJvY2Vzc2VzIG5lZWQgdG8gcmFuZ2UtbGltaXQgdmFsdWVzIHRvIHRoZSByYW5nZQotICogMC4uTUFYSlNBTVBMRTsgdGhlIGlucHV0IHZhbHVlIG1heSBmYWxsIHNvbWV3aGF0IG91dHNpZGUgdGhpcyByYW5nZQotICogZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgcXVhbnRpemF0aW9uLCByb3VuZG9mZiBlcnJvciwgZXRjLiAgVGhlc2UKLSAqIHByb2Nlc3NlcyBhcmUgaW5uZXIgbG9vcHMgYW5kIG5lZWQgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIE9uIG1vc3QKLSAqIG1hY2hpbmVzLCBwYXJ0aWN1bGFybHkgQ1BVcyB3aXRoIHBpcGVsaW5lcyBvciBpbnN0cnVjdGlvbiBwcmVmZXRjaCwKLSAqIGEgKHN1YnNjcmlwdC1jaGVjay1sZXNzKSBDIHRhYmxlIGxvb2t1cAotICoJCXggPSBzYW1wbGVfcmFuZ2VfbGltaXRbeF07Ci0gKiBpcyBmYXN0ZXIgdGhhbiBleHBsaWNpdCB0ZXN0cwotICoJCWlmICh4IDwgMCkgIHggPSAwOwotICoJCWVsc2UgaWYgKHggPiBNQVhKU0FNUExFKSAgeCA9IE1BWEpTQU1QTEU7Ci0gKiBUaGVzZSBwcm9jZXNzZXMgYWxsIHVzZSBhIGNvbW1vbiB0YWJsZSBwcmVwYXJlZCBieSB0aGUgcm91dGluZSBiZWxvdy4KLSAqCi0gKiBGb3IgbW9zdCBzdGVwcyB3ZSBjYW4gbWF0aGVtYXRpY2FsbHkgZ3VhcmFudGVlIHRoYXQgdGhlIGluaXRpYWwgdmFsdWUKLSAqIG9mIHggaXMgd2l0aGluIE1BWEpTQU1QTEUrMSBvZiB0aGUgbGVnYWwgcmFuZ2UsIHNvIGEgdGFibGUgcnVubmluZyBmcm9tCi0gKiAtKE1BWEpTQU1QTEUrMSkgdG8gMipNQVhKU0FNUExFKzEgaXMgc3VmZmljaWVudC4gIEJ1dCBmb3IgdGhlIGluaXRpYWwKLSAqIGxpbWl0aW5nIHN0ZXAgKGp1c3QgYWZ0ZXIgdGhlIElEQ1QpLCBhIHdpbGRseSBvdXQtb2YtcmFuZ2UgdmFsdWUgaXMKLSAqIHBvc3NpYmxlIGlmIHRoZSBpbnB1dCBkYXRhIGlzIGNvcnJ1cHQuICBUbyBhdm9pZCBhbnkgY2hhbmNlIG9mIGluZGV4aW5nCi0gKiBvZmYgdGhlIGVuZCBvZiBtZW1vcnkgYW5kIGdldHRpbmcgYSBiYWQtcG9pbnRlciB0cmFwLCB3ZSBwZXJmb3JtIHRoZQotICogcG9zdC1JRENUIGxpbWl0aW5nIHRodXM6Ci0gKgkJeCA9IHJhbmdlX2xpbWl0W3ggJiBNQVNLXTsKLSAqIHdoZXJlIE1BU0sgaXMgMiBiaXRzIHdpZGVyIHRoYW4gbGVnYWwgc2FtcGxlIGRhdGEsIGllIDEwIGJpdHMgZm9yIDgtYml0Ci0gKiBzYW1wbGVzLiAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgdGhpcyBpcyBtb3JlIHRoYW4gZW5vdWdoIHJhbmdlIGFuZAotICogYSBjb3JyZWN0IG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZDsgd2l0aCBib2d1cyBpbnB1dCBkYXRhIHRoZSBtYXNrIHdpbGwKLSAqIGNhdXNlIHdyYXBhcm91bmQsIGFuZCB3ZSB3aWxsIHNhZmVseSBnZW5lcmF0ZSBhIGJvZ3VzLWJ1dC1pbi1yYW5nZSBvdXRwdXQuCi0gKiBGb3IgdGhlIHBvc3QtSURDVCBzdGVwLCB3ZSB3YW50IHRvIGNvbnZlcnQgdGhlIGRhdGEgZnJvbSBzaWduZWQgdG8gdW5zaWduZWQKLSAqIHJlcHJlc2VudGF0aW9uIGJ5IGFkZGluZyBDRU5URVJKU0FNUExFIGF0IHRoZSBzYW1lIHRpbWUgdGhhdCB3ZSBsaW1pdCBpdC4KLSAqIFNvIHRoZSBwb3N0LUlEQ1QgbGltaXRpbmcgdGFibGUgZW5kcyB1cCBsb29raW5nIGxpa2UgdGhpczoKLSAqICAgQ0VOVEVSSlNBTVBMRSxDRU5URVJKU0FNUExFKzEsLi4uLE1BWEpTQU1QTEUsCi0gKiAgIE1BWEpTQU1QTEUgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAotICogICAwICAgICAgICAgIChyZXBlYXQgMiooTUFYSlNBTVBMRSsxKS1DRU5URVJKU0FNUExFIHRpbWVzKSwKLSAqICAgMCwxLC4uLixDRU5URVJKU0FNUExFLTEKLSAqIE5lZ2F0aXZlIGlucHV0cyBzZWxlY3QgdmFsdWVzIGZyb20gdGhlIHVwcGVyIGhhbGYgb2YgdGhlIHRhYmxlIGFmdGVyCi0gKiBtYXNraW5nLgotICoKLSAqIFdlIGNhbiBzYXZlIHNvbWUgc3BhY2UgYnkgb3ZlcmxhcHBpbmcgdGhlIHN0YXJ0IG9mIHRoZSBwb3N0LUlEQ1QgdGFibGUKLSAqIHdpdGggdGhlIHNpbXBsZXIgcmFuZ2UgbGltaXRpbmcgdGFibGUuICBUaGUgcG9zdC1JRENUIHRhYmxlIGJlZ2lucyBhdAotICogc2FtcGxlX3JhbmdlX2xpbWl0ICsgQ0VOVEVSSlNBTVBMRS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHRhYmxlIGlzIGFsbG9jYXRlZCBpbiBuZWFyIGRhdGEgc3BhY2Ugb24gUENzOyBpdCdzIHNtYWxsCi0gKiBlbm91Z2ggYW5kIHVzZWQgb2Z0ZW4gZW5vdWdoIHRvIGp1c3RpZnkgdGhpcy4KLSAqLwotCi1MT0NBTCh2b2lkKQotcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBzYW1wbGVfcmFuZ2VfbGltaXQgdGFibGUgKi8KLXsKLSAgSlNBTVBMRSAqIHRhYmxlOwotICBpbnQgaTsKLQotICB0YWJsZSA9IChKU0FNUExFICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJKDUgKiAoTUFYSlNBTVBMRSsxKSArIENFTlRFUkpTQU1QTEUpICogU0laRU9GKEpTQU1QTEUpKTsKLSAgdGFibGUgKz0gKE1BWEpTQU1QTEUrMSk7CS8qIGFsbG93IG5lZ2F0aXZlIHN1YnNjcmlwdHMgb2Ygc2ltcGxlIHRhYmxlICovCi0gIGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQgPSB0YWJsZTsKLSAgLyogRmlyc3Qgc2VnbWVudCBvZiAic2ltcGxlIiB0YWJsZTogbGltaXRbeF0gPSAwIGZvciB4IDwgMCAqLwotICBNRU1aRVJPKHRhYmxlIC0gKE1BWEpTQU1QTEUrMSksIChNQVhKU0FNUExFKzEpICogU0laRU9GKEpTQU1QTEUpKTsKLSAgLyogTWFpbiBwYXJ0IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IHggKi8KLSAgZm9yIChpID0gMDsgaSA8PSBNQVhKU0FNUExFOyBpKyspCi0gICAgdGFibGVbaV0gPSAoSlNBTVBMRSkgaTsKLSAgdGFibGUgKz0gQ0VOVEVSSlNBTVBMRTsJLyogUG9pbnQgdG8gd2hlcmUgcG9zdC1JRENUIHRhYmxlIHN0YXJ0cyAqLwotICAvKiBFbmQgb2Ygc2ltcGxlIHRhYmxlLCByZXN0IG9mIGZpcnN0IGhhbGYgb2YgcG9zdC1JRENUIHRhYmxlICovCi0gIGZvciAoaSA9IENFTlRFUkpTQU1QTEU7IGkgPCAyKihNQVhKU0FNUExFKzEpOyBpKyspCi0gICAgdGFibGVbaV0gPSBNQVhKU0FNUExFOwotICAvKiBTZWNvbmQgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KLSAgTUVNWkVSTyh0YWJsZSArICgyICogKE1BWEpTQU1QTEUrMSkpLAotCSAgKDIgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpICogU0laRU9GKEpTQU1QTEUpKTsKLSAgTUVNQ09QWSh0YWJsZSArICg0ICogKE1BWEpTQU1QTEUrMSkgLSBDRU5URVJKU0FNUExFKSwKLQkgIGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQsIENFTlRFUkpTQU1QTEUgKiBTSVpFT0YoSlNBTVBMRSkpOwotfQotCi0KLS8qCi0gKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGRlY29tcHJlc3Npb24gbW9kdWxlcy4KLSAqIFRoaXMgaXMgZG9uZSBvbmNlIGF0IGpwZWdfc3RhcnRfZGVjb21wcmVzcyB0aW1lLiAgV2UgZGV0ZXJtaW5lCi0gKiB3aGljaCBtb2R1bGVzIHdpbGwgYmUgdXNlZCBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIGNhbGxzLgotICogV2UgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzb3IgaW5wdXQgc2lkZSB0byBiZWdpbiBjb25zdW1pbmcgZGF0YS4KLSAqCi0gKiBTaW5jZSBqcGVnX3JlYWRfaGVhZGVyIGhhcyBmaW5pc2hlZCwgd2Uga25vdyB3aGF0IGlzIGluIHRoZSBTT0YKLSAqIGFuZCAoZmlyc3QpIFNPUyBtYXJrZXJzLiAgV2UgYWxzbyBoYXZlIGFsbCB0aGUgYXBwbGljYXRpb24gcGFyYW1ldGVyCi0gKiBzZXR0aW5ncy4KLSAqLwotCi1MT0NBTCh2b2lkKQotbWFzdGVyX3NlbGVjdGlvbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLSAgYm9vbGVhbiB1c2VfY19idWZmZXI7Ci0gIGxvbmcgc2FtcGxlc3BlcnJvdzsKLSAgSkRJTUVOU0lPTiBqZF9zYW1wbGVzcGVycm93OwotCi0gIC8qIEluaXRpYWxpemUgZGltZW5zaW9ucyBhbmQgb3RoZXIgc3R1ZmYgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLSAgcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZShjaW5mbyk7Ci0KLSAgLyogV2lkdGggb2YgYW4gb3V0cHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLwotICBzYW1wbGVzcGVycm93ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGggKiAobG9uZykgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotICBqZF9zYW1wbGVzcGVycm93ID0gKEpESU1FTlNJT04pIHNhbXBsZXNwZXJyb3c7Ci0gIGlmICgobG9uZykgamRfc2FtcGxlc3BlcnJvdyAhPSBzYW1wbGVzcGVycm93KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOwotCi0gIC8qIEluaXRpYWxpemUgbXkgcHJpdmF0ZSBzdGF0ZSAqLwotICBtYXN0ZXItPnBhc3NfbnVtYmVyID0gMDsKLSAgbWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUgPSB1c2VfbWVyZ2VkX3Vwc2FtcGxlKGNpbmZvKTsKLQotICAvKiBDb2xvciBxdWFudGl6ZXIgc2VsZWN0aW9uICovCi0gIG1hc3Rlci0+cXVhbnRpemVyXzFwYXNzID0gTlVMTDsKLSAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBOVUxMOwotICAvKiBObyBtb2RlIGNoYW5nZXMgaWYgbm90IHVzaW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCi0gIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgfHwgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gRkFMU0U7Ci0gICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOwotICAgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKLSAgfQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgIGlmIChjaW5mby0+cmF3X2RhdGFfb3V0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKLSAgICAvKiAyLXBhc3MgcXVhbnRpemVyIG9ubHkgd29ya3MgaW4gMy1jb21wb25lbnQgY29sb3Igc3BhY2UuICovCi0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gVFJVRTsKLSAgICAgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKLSAgICAgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKLSAgICAgIGNpbmZvLT5jb2xvcm1hcCA9IE5VTEw7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+Y29sb3JtYXAgIT0gTlVMTCkgewotICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IFRSVUU7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUpIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gVFJVRTsKLSAgICB9Ci0KLSAgICBpZiAoY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCkgewotI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAotICAgICAgamluaXRfMXBhc3NfcXVhbnRpemVyKGNpbmZvKTsKLSAgICAgIG1hc3Rlci0+cXVhbnRpemVyXzFwYXNzID0gY2luZm8tPmNxdWFudGl6ZTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKiBXZSB1c2UgdGhlIDItcGFzcyBjb2RlIHRvIG1hcCB0byBleHRlcm5hbCBjb2xvcm1hcHMuICovCi0gICAgaWYgKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgfHwgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCkgewotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgICAgamluaXRfMnBhc3NfcXVhbnRpemVyKGNpbmZvKTsKLSAgICAgIG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzID0gY2luZm8tPmNxdWFudGl6ZTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgLyogSWYgYm90aCBxdWFudGl6ZXJzIGFyZSBpbml0aWFsaXplZCwgdGhlIDItcGFzcyBvbmUgaXMgbGVmdCBhY3RpdmU7Ci0gICAgICogdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHN0YXJ0aW5nIHdpdGggcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsIG1hcC4KLSAgICAgKi8KLSAgfQotCi0gIC8qIFBvc3QtcHJvY2Vzc2luZzogaW4gcGFydGljdWxhciwgY29sb3IgY29udmVyc2lvbiBmaXJzdCAqLwotICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KSB7Ci0gICAgaWYgKG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKSB7Ci0jaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKLSAgICAgIGppbml0X21lcmdlZF91cHNhbXBsZXIoY2luZm8pOyAvKiBkb2VzIGNvbG9yIGNvbnZlcnNpb24gdG9vICovCi0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIGppbml0X2NvbG9yX2RlY29udmVydGVyKGNpbmZvKTsKLSAgICAgIGppbml0X3Vwc2FtcGxlcihjaW5mbyk7Ci0gICAgfQotICAgIGppbml0X2RfcG9zdF9jb250cm9sbGVyKGNpbmZvLCBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50KTsKLSAgfQotICAvKiBJbnZlcnNlIERDVCAqLwotICBqaW5pdF9pbnZlcnNlX2RjdChjaW5mbyk7Ci0gIC8qIEVudHJvcHkgZGVjb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBqaW5pdF9waHVmZl9kZWNvZGVyKGNpbmZvKTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIHByaW5jaXBhbCBidWZmZXIgY29udHJvbGxlcnMuICovCi0gIHVzZV9jX2J1ZmZlciA9IGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zIHx8IGNpbmZvLT5idWZmZXJlZF9pbWFnZTsKLSAgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIHVzZV9jX2J1ZmZlcik7Ci0KLSAgaWYgKCEgY2luZm8tPnJhd19kYXRhX291dCkKLSAgICBqaW5pdF9kX21haW5fY29udHJvbGxlcihjaW5mbywgRkFMU0UgLyogbmV2ZXIgbmVlZCBmdWxsIGJ1ZmZlciBoZXJlICovKTsKLQotICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLwotICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBpbnB1dCBzaWRlIG9mIGRlY29tcHJlc3NvciB0byBjb25zdW1lIGZpcnN0IHNjYW4uICovCi0gICgqY2luZm8tPmlucHV0Y3RsLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOwotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIC8qIElmIGpwZWdfc3RhcnRfZGVjb21wcmVzcyB3aWxsIHJlYWQgdGhlIHdob2xlIGZpbGUsIGluaXRpYWxpemUKLSAgICogcHJvZ3Jlc3MgbW9uaXRvcmluZyBhcHByb3ByaWF0ZWx5LiAgVGhlIGlucHV0IHN0ZXAgaXMgY291bnRlZAotICAgKiBhcyBvbmUgcGFzcy4KLSAgICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJiAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJgotICAgICAgY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKLSAgICBpbnQgbnNjYW5zOwotICAgIC8qIEVzdGltYXRlIG51bWJlciBvZiBzY2FucyB0byBzZXQgcGFzc19saW1pdC4gKi8KLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSAgICAgIC8qIEFyYml0cmFyaWx5IGVzdGltYXRlIDIgaW50ZXJsZWF2ZWQgREMgc2NhbnMgKyAzIEFDIHNjYW5zL2NvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IDIgKyAzICogY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBGb3IgYSBub25wcm9ncmVzc2l2ZSBtdWx0aXNjYW4gZmlsZSwgZXN0aW1hdGUgMSBzY2FuIHBlciBjb21wb25lbnQuICovCi0gICAgICBuc2NhbnMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgfQotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gMEw7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBuc2NhbnM7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gMDsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMyA6IDIpOwotICAgIC8qIENvdW50IHRoZSBpbnB1dCBwYXNzIGFzIGRvbmUgKi8KLSAgICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Ci0gIH0KLSNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KLX0KLQotCi0vKgotICogUGVyLXBhc3Mgc2V0dXAuCi0gKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggb3V0cHV0IHBhc3MuICBXZSBkZXRlcm1pbmUgd2hpY2gKLSAqIG1vZHVsZXMgd2lsbCBiZSBhY3RpdmUgZHVyaW5nIHRoaXMgcGFzcyBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlCi0gKiBzdGFydF9wYXNzIGNhbGxzLiAgV2UgYWxzbyBzZXQgaXNfZHVtbXlfcGFzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMKLSAqIGlzIGEgInJlYWwiIG91dHB1dCBwYXNzIG9yIGEgZHVtbXkgcGFzcyBmb3IgY29sb3IgcXVhbnRpemF0aW9uLgotICogKEluIHRoZSBsYXR0ZXIgY2FzZSwgamRhcGlzdGQuYyB3aWxsIGNyYW5rIHRoZSBwYXNzIHRvIGNvbXBsZXRpb24uKQotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0KLSAgaWYgKG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MpIHsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLSAgICAvKiBGaW5hbCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KLSAgICBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gRkFMU0U7Ci0gICAgKCpjaW5mby0+Y3F1YW50aXplLT5zdGFydF9wYXNzKSAoY2luZm8sIEZBTFNFKTsKLSAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7Ci0gICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmNvbG9ybWFwID09IE5VTEwpIHsKLSAgICAgIC8qIFNlbGVjdCBuZXcgcXVhbnRpemF0aW9uIG1ldGhvZCAqLwotICAgICAgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSAmJiBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50KSB7Ci0JY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOwotCW1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBUUlVFOwotICAgICAgfSBlbHNlIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7Ci0JY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzFwYXNzOwotICAgICAgfSBlbHNlIHsKLQlFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgKCpjaW5mby0+aWRjdC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KSB7Ci0gICAgICBpZiAoISBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSkKLQkoKmNpbmZvLT5jY29udmVydC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgICAgICgqY2luZm8tPnVwc2FtcGxlLT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCi0JKCpjaW5mby0+Y3F1YW50aXplLT5zdGFydF9wYXNzKSAoY2luZm8sIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MpOwotICAgICAgKCpjaW5mby0+cG9zdC0+c3RhcnRfcGFzcykgKGNpbmZvLAotCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IEpCVUZfU0FWRV9BTkRfUEFTUyA6IEpCVUZfUEFTU19USFJVKSk7Ci0gICAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKLSAgICB9Ci0gIH0KLQotICAvKiBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcidzIHBhc3MgaW5mbyBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXI7Ci0gICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyICsKLQkJCQkgICAgKG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPyAyIDogMSk7Ci0gICAgLyogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgd2UgYXNzdW1lIG9uZSBtb3JlIG91dHB1dCBwYXNzIGlmIEVPSSBub3QKLSAgICAgKiB5ZXQgcmVhY2hlZCwgYnV0IG5vIG1vcmUgcGFzc2VzIGlmIEVPSSBoYXMgYmVlbiByZWFjaGVkLgotICAgICAqLwotICAgIGlmIChjaW5mby0+YnVmZmVyZWRfaW1hZ2UgJiYgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7Ci0gICAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyArPSAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA/IDIgOiAxKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IGVuZCBvZiBhbiBvdXRwdXQgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICAoKmNpbmZvLT5jcXVhbnRpemUtPmZpbmlzaF9wYXNzKSAoY2luZm8pOwotICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Ci19Ci0KLQotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotCi0vKgotICogU3dpdGNoIHRvIGEgbmV3IGV4dGVybmFsIGNvbG9ybWFwIGJldHdlZW4gb3V0cHV0IHBhc3Nlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfbmV3X2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIC8qIFByZXZlbnQgYXBwbGljYXRpb24gZnJvbSBjYWxsaW5nIG1lIGF0IHdyb25nIHRpbWVzICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzICYmIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgJiYKLSAgICAgIGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7Ci0gICAgLyogU2VsZWN0IDItcGFzcyBxdWFudGl6ZXIgZm9yIGV4dGVybmFsIGNvbG9ybWFwIHVzZSAqLwotICAgIGNpbmZvLT5jcXVhbnRpemUgPSBtYXN0ZXItPnF1YW50aXplcl8ycGFzczsKLSAgICAvKiBOb3RpZnkgcXVhbnRpemVyIG9mIGNvbG9ybWFwIGNoYW5nZSAqLwotICAgICgqY2luZm8tPmNxdWFudGl6ZS0+bmV3X2NvbG9yX21hcCkgKGNpbmZvKTsKLSAgICBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gRkFMU0U7IC8qIGp1c3QgaW4gY2FzZSAqLwotICB9IGVsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKLX0KLQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIG1hc3RlciBkZWNvbXByZXNzaW9uIGNvbnRyb2wgYW5kIHNlbGVjdCBhY3RpdmUgbW9kdWxlcy4KLSAqIFRoaXMgaXMgcGVyZm9ybWVkIGF0IHRoZSBzdGFydCBvZiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXI7Ci0KLSAgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKG15X2RlY29tcF9tYXN0ZXIpKTsKLSAgY2luZm8tPm1hc3RlciA9IChzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyICopIG1hc3RlcjsKLSAgbWFzdGVyLT5wdWIucHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MgPSBwcmVwYXJlX2Zvcl9vdXRwdXRfcGFzczsKLSAgbWFzdGVyLT5wdWIuZmluaXNoX291dHB1dF9wYXNzID0gZmluaXNoX291dHB1dF9wYXNzOwotCi0gIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKLQotICBtYXN0ZXJfc2VsZWN0aW9uKGNpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkbWVyZ2UuYyBiL2xpYmpwZWd0d3JwL2pkbWVyZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxZmJkMy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZG1lcmdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDIgKzAsMCBAQAotLyoKLSAqIGpkbWVyZ2UuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb21iaW5lcyBmdW5jdGlvbnMgZnJvbSBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmM7Ci0gKiByZWFkIHRob3NlIGZpbGVzIGZpcnN0IHRvIHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLgotICoKLSAqIFdoZW4gdGhlIGNocm9tYSBjb21wb25lbnRzIGFyZSB0byBiZSB1cHNhbXBsZWQgYnkgc2ltcGxlIHJlcGxpY2F0aW9uCi0gKiAoaWUsIGJveCBmaWx0ZXJpbmcpLCB3ZSBjYW4gc2F2ZSBzb21lIHdvcmsgaW4gY29sb3IgY29udmVyc2lvbiBieQotICogY2FsY3VsYXRpbmcgYWxsIHRoZSBvdXRwdXQgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gYSBwYWlyIG9mIGNocm9tYQotICogc2FtcGxlcyBhdCBvbmUgdGltZS4gIEluIHRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucwotICoJUiA9IFkgICAgICAgICAgICsgSzEgKiBDcgotICoJRyA9IFkgKyBLMiAqIENiICsgSzMgKiBDcgotICoJQiA9IFkgKyBLNCAqIENiCi0gKiBvbmx5IHRoZSBZIHRlcm0gdmFyaWVzIGFtb25nIHRoZSBncm91cCBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIKLSAqIG9mIGNocm9tYSBzYW1wbGVzLCBzbyB0aGUgcmVzdCBvZiB0aGUgdGVybXMgY2FuIGJlIGNhbGN1bGF0ZWQganVzdCBvbmNlLgotICogQXQgdHlwaWNhbCBzYW1wbGluZyByYXRpb3MsIHRoaXMgZWxpbWluYXRlcyBoYWxmIG9yIHRocmVlLXF1YXJ0ZXJzIG9mIHRoZQotICogbXVsdGlwbGljYXRpb25zIG5lZWRlZCBmb3IgY29sb3IgY29udmVyc2lvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY3VycmVudGx5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczoKLSAqCVlDYkNyID0+IFJHQiBjb2xvciBjb252ZXJzaW9uIG9ubHkuCi0gKglTYW1wbGluZyByYXRpb3Mgb2YgMmgxdiBvciAyaDJ2LgotICoJTm8gc2NhbGluZyBuZWVkZWQgYXQgdXBzYW1wbGUgdGltZS4KLSAqCUNvcm5lci1hbGlnbmVkIChub24tQ0NJUjYwMSkgc2FtcGxpbmcgYWxpZ25tZW50LgotICogT3RoZXIgc3BlY2lhbCBjYXNlcyBjb3VsZCBiZSBhZGRlZCwgYnV0IGluIG1vc3QgYXBwbGljYXRpb25zIHRoZXNlIGFyZQotICogdGhlIG9ubHkgY29tbW9uIGNhc2VzLiAgKEZvciB1bmNvbW1vbiBjYXNlcyB3ZSBmYWxsIGJhY2sgb24gdGhlIG1vcmUKLSAqIGdlbmVyYWwgY29kZSBpbiBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmMuKQotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECi0KLSNpZmRlZiBBTkRST0lEX1JHQgotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgotICogCi0gKiBXZSB1c2UgNHg0IG9yZGVyZWQgZGl0aGVyIGFycmF5IHBhY2tlZCBpbnRvIDMyIGJpdHMuIFRoaXMgYXJyYXkgaXMKLSAqIHN1ZmZpY2VudCBmb3IgZGl0aGVyaW5nIFJHQl84ODggdG8gUkdCXzU2NS4KLSAqLwotCi0jZGVmaW5lIERJVEhFUl9NQVNLICAgICAgICAgMHgzCi0jZGVmaW5lIERJVEhFUl9ST1RBVEUoeCkgICAgKCgoeCk8PDI0KSB8ICgoKHgpPj44KSYweDAwRkZGRkZGKSkKLXN0YXRpYyBjb25zdCBJTlQzMiBkaXRoZXJfbWF0cml4WzRdID0gewotICAweDAwMDgwMjBBLAotICAweDBDMDQwRTA2LAotICAweDAzMEIwMTA5LAotICAweDBGMDcwRDA1Ci19OwotCi0jZW5kaWYKLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvIGFjdHVhbCB1cHNhbXBsaW5nL2NvbnZlcnNpb24gb2Ygb25lIHJvdyBncm91cCAqLwotICBKTUVUSE9EKHZvaWQsIHVwbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0JCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpKTsKLQotICAvKiBQcml2YXRlIHN0YXRlIGZvciBZQ0MtPlJHQiBjb252ZXJzaW9uICovCi0gIGludCAqIENyX3JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIFIgY29udmVyc2lvbiAqLwotICBpbnQgKiBDYl9iX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBCIGNvbnZlcnNpb24gKi8KLSAgSU5UMzIgKiBDcl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBHIGNvbnZlcnNpb24gKi8KLSAgSU5UMzIgKiBDYl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBHIGNvbnZlcnNpb24gKi8KLQotICAvKiBGb3IgMjoxIHZlcnRpY2FsIHNhbXBsaW5nLCB3ZSBwcm9kdWNlIHR3byBvdXRwdXQgcm93cyBhdCBhIHRpbWUuCi0gICAqIFdlIG5lZWQgYSAic3BhcmUiIHJvdyBidWZmZXIgdG8gaG9sZCB0aGUgc2Vjb25kIG91dHB1dCByb3cgaWYgdGhlCi0gICAqIGFwcGxpY2F0aW9uIHByb3ZpZGVzIGp1c3QgYSBvbmUtcm93IGJ1ZmZlcjsgd2UgYWxzbyB1c2UgdGhlIHNwYXJlCi0gICAqIHRvIGRpc2NhcmQgdGhlIGR1bW15IGxhc3Qgcm93IGlmIHRoZSBpbWFnZSBoZWlnaHQgaXMgb2RkLgotICAgKi8KLSAgSlNBTVBST1cgc3BhcmVfcm93OwotICBib29sZWFuIHNwYXJlX2Z1bGw7CQkvKiBUIGlmIHNwYXJlIGJ1ZmZlciBpcyBvY2N1cGllZCAqLwotCi0gIEpESU1FTlNJT04gb3V0X3Jvd193aWR0aDsJLyogc2FtcGxlcyBwZXIgb3V0cHV0IHJvdyAqLwotICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBpbWFnZSAqLwotfSBteV91cHNhbXBsZXI7Ci0KLXR5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOwotCi0jZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLwotI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCi0jZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCi0KLQotLyoKLSAqIEluaXRpYWxpemUgdGFibGVzIGZvciBZQ0MtPlJHQiBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCi0gKiBUaGlzIGlzIHRha2VuIGRpcmVjdGx5IGZyb20gamRjb2xvci5jOyBzZWUgdGhhdCBmaWxlIGZvciBtb3JlIGluZm8uCi0gKi8KLQotTE9DQUwodm9pZCkKLWJ1aWxkX3ljY19yZ2JfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgaW50IGk7Ci0gIElOVDMyIHg7Ci0gIFNISUZUX1RFTVBTCi0KLSAgdXBzYW1wbGUtPkNyX3JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIHVwc2FtcGxlLT5DYl9iX3RhYiA9IChpbnQgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOwotICB1cHNhbXBsZS0+Q3JfZ190YWIgPSAoSU5UMzIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7Ci0gIHVwc2FtcGxlLT5DYl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKLQotICBmb3IgKGkgPSAwLCB4ID0gLUNFTlRFUkpTQU1QTEU7IGkgPD0gTUFYSlNBTVBMRTsgaSsrLCB4KyspIHsKLSAgICAvKiBpIGlzIHRoZSBhY3R1YWwgaW5wdXQgcGl4ZWwgdmFsdWUsIGluIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFICovCi0gICAgLyogVGhlIENiIG9yIENyIHZhbHVlIHdlIGFyZSB0aGlua2luZyBvZiBpcyB4ID0gaSAtIENFTlRFUkpTQU1QTEUgKi8KLSAgICAvKiBDcj0+UiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjQwMjAwICogeCAqLwotICAgIHVwc2FtcGxlLT5Dcl9yX3RhYltpXSA9IChpbnQpCi0JCSAgICBSSUdIVF9TSElGVChGSVgoMS40MDIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ2I9PkIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS43NzIwMCAqIHggKi8KLSAgICB1cHNhbXBsZS0+Q2JfYl90YWJbaV0gPSAoaW50KQotCQkgICAgUklHSFRfU0hJRlQoRklYKDEuNzcyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOwotICAgIC8qIENyPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC43MTQxNCAqIHggKi8KLSAgICB1cHNhbXBsZS0+Q3JfZ190YWJbaV0gPSAoLSBGSVgoMC43MTQxNCkpICogeDsKLSAgICAvKiBDYj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuMzQ0MTQgKiB4ICovCi0gICAgLyogV2UgYWxzbyBhZGQgaW4gT05FX0hBTEYgc28gdGhhdCBuZWVkIG5vdCBkbyBpdCBpbiBpbm5lciBsb29wICovCi0gICAgdXBzYW1wbGUtPkNiX2dfdGFiW2ldID0gKC0gRklYKDAuMzQ0MTQpKSAqIHggKyBPTkVfSEFMRjsKLSAgfQotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotCi0gIC8qIE1hcmsgdGhlIHNwYXJlIGJ1ZmZlciBlbXB0eSAqLwotICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOwotICAvKiBJbml0aWFsaXplIHRvdGFsLWhlaWdodCBjb3VudGVyIGZvciBkZXRlY3RpbmcgYm90dG9tIG9mIGltYWdlICovCi0gIHVwc2FtcGxlLT5yb3dzX3RvX2dvID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci19Ci0KLQotLyoKLSAqIENvbnRyb2wgcm91dGluZSB0byBkbyB1cHNhbXBsaW5nIChhbmQgY29sb3IgY29udmVyc2lvbikuCi0gKgotICogVGhlIGNvbnRyb2wgcm91dGluZSBqdXN0IGhhbmRsZXMgdGhlIHJvdyBidWZmZXJpbmcgY29uc2lkZXJhdGlvbnMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1tZXJnZWRfMnZfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotLyogMjoxIHZlcnRpY2FsIHNhbXBsaW5nIGNhc2U6IG1heSBuZWVkIGEgc3BhcmUgcm93LiAqLwotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIEpTQU1QUk9XIHdvcmtfcHRyc1syXTsKLSAgSkRJTUVOU0lPTiBudW1fcm93czsJCS8qIG51bWJlciBvZiByb3dzIHJldHVybmVkIHRvIGNhbGxlciAqLwotCi0gIGlmICh1cHNhbXBsZS0+c3BhcmVfZnVsbCkgewotICAgIC8qIElmIHdlIGhhdmUgYSBzcGFyZSByb3cgc2F2ZWQgZnJvbSBhIHByZXZpb3VzIGN5Y2xlLCBqdXN0IHJldHVybiBpdC4gKi8KLSAgICAgIEpESU1FTlNJT04gc2l6ZSA9IHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoOwotI2lmZGVmIEFORFJPSURfUkdCCi0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQl81NjUpCi0gICAgICBzaXplID0gY2luZm8tPm91dHB1dF93aWR0aCoyOwotI2VuZGlmCi0gICAgamNvcHlfc2FtcGxlX3Jvd3MoJiB1cHNhbXBsZS0+c3BhcmVfcm93LCAwLCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLCAwLAotCQkgICAgICAxLCBzaXplKTsKLQotICAgIG51bV9yb3dzID0gMTsKLSAgICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOwotICB9IGVsc2UgewotICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm4gdG8gY2FsbGVyLiAqLwotICAgIG51bV9yb3dzID0gMjsKLSAgICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KLSAgICBpZiAobnVtX3Jvd3MgPiB1cHNhbXBsZS0+cm93c190b19nbykKLSAgICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287Ci0gICAgLyogQW5kIG5vdCBtb3JlIHRoYW4gd2hhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQ6ICovCi0gICAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOwotICAgIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQotICAgICAgbnVtX3Jvd3MgPSBvdXRfcm93c19hdmFpbDsKLSAgICAvKiBDcmVhdGUgb3V0cHV0IHBvaW50ZXIgYXJyYXkgZm9yIHVwc2FtcGxlci4gKi8KLSAgICB3b3JrX3B0cnNbMF0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0cl07Ci0gICAgaWYgKG51bV9yb3dzID4gMSkgewotICAgICAgd29ya19wdHJzWzFdID0gb3V0cHV0X2J1Zlsqb3V0X3Jvd19jdHIgKyAxXTsKLSAgICB9IGVsc2UgewotICAgICAgd29ya19wdHJzWzFdID0gdXBzYW1wbGUtPnNwYXJlX3JvdzsKLSAgICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gVFJVRTsKLSAgICB9Ci0gICAgLyogTm93IGRvIHRoZSB1cHNhbXBsaW5nLiAqLwotICAgICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsIHdvcmtfcHRycyk7Ci0gIH0KLQotICAvKiBBZGp1c3QgY291bnRzICovCi0gICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7Ci0gIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCi0gIGlmICghIHVwc2FtcGxlLT5zcGFyZV9mdWxsKQotICAgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLW1lcmdlZF8xdl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi0vKiAxOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbXVjaCBlYXNpZXIsIG5ldmVyIG5lZWQgYSBzcGFyZSByb3cuICovCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLQotICAvKiBKdXN0IGRvIHRoZSB1cHNhbXBsaW5nLiAqLwotICAoKnVwc2FtcGxlLT51cG1ldGhvZCkgKGNpbmZvLCBpbnB1dF9idWYsICppbl9yb3dfZ3JvdXBfY3RyLAotCQkJIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIpOwotICAvKiBBZGp1c3QgY291bnRzICovCi0gICgqb3V0X3Jvd19jdHIpKys7Ci0gICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi0vKgotICogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHJvdXRpbmVzIHRvIGRvCi0gKiB0aGUgYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbi4gIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICoKLSAqIE5vdGU6IHNpbmNlIHdlIG1heSBiZSB3cml0aW5nIGRpcmVjdGx5IGludG8gYXBwbGljYXRpb24tc3VwcGxpZWQgYnVmZmVycywKLSAqIHdlIGhhdmUgdG8gYmUgaG9uZXN0IGFib3V0IHRoZSBvdXRwdXQgd2lkdGg7IHdlIGNhbid0IGFzc3VtZSB0aGUgYnVmZmVyCi0gKiBoYXMgYmVlbiByb3VuZGVkIHVwIHRvIGFuIGV2ZW4gd2lkdGguCi0gKi8KLQotCi0vKgotICogVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQotI2lmZGVmIEFORFJPSURfSlBFR19VU0VfVkVOVU0KLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLQotI2lmZGVmIEFORFJPSURfUkdCCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JBXzg4ODgpIHsKLSAgICB5eXZ1cDJhYmdyODg4OF92ZW51bSgoVUlOVDgqKSBpbnB0cjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gIHsKLSAgICB5eXZ1cDJiZ3I4ODhfdmVudW0oKFVJTlQ4KikgaW5wdHIwLAotICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyLAotICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfQotfQotI2Vsc2UKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICBKRElNRU5TSU9OIGNvbDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7Ci0gIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKLSAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7Ci0gIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOwotICBKRElNRU5TSU9OIHBpeGVsV2lkdGggPSBSR0JfUElYRUxTSVpFOwotICBTSElGVF9URU1QUwotCi0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgaWYgKChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gNCkgJiYKLSAgICAgIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JBXzg4ODgpKQotICAgICBwaXhlbFdpZHRoID0gNDsgIC8vIFJHQkEgcGl4ZWwgc2l6ZQotI2VuZGlmIC8qIEFORFJPSURfUkdCICovCi0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLSAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyICs9IHBpeGVsV2lkdGg7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyICs9IHBpeGVsV2lkdGg7Ci0gIH0KLSAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7Ci0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgIG91dHB0cltSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cltSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICB9Ci19Ci0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwotCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotTUVUSE9EREVGKHZvaWQpCi1oMnYxX21lcmdlZF91cHNhbXBsZV81NjUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0gICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKLSNpZiBkZWZpbmVkKEFORFJPSURfSlBFR19VU0VfVkVOVU0pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKLSAgSlNBTVBST1cgb3V0cHRyOwotCi0gIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07Ci0gIG91dHB0ciA9IG91dHB1dF9idWZbMF07Ci0KLSAgeXl2dXAycmdiNTY1X3ZlbnVtKChVSU5UOCopIGlucHRyMCwKLSAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMiwKLSAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMSwKLSAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0ciwKLSAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotfQotI2Vsc2UKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOwotICBKRElNRU5TSU9OIGNvbDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7Ci0gIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKLSAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7Ci0gIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOwotICB1bnNpZ25lZCBpbnQgciwgZywgYjsKLSAgSU5UMzIgcmdiOwotICBTSElGVF9URU1QUwotCi0gIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07Ci0gIG91dHB0ciA9IG91dHB1dF9idWZbMF07Ci0gIC8qIExvb3AgZm9yIGVhY2ggcGFpciBvZiBvdXRwdXQgcGl4ZWxzICovCi0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgLyogRmV0Y2ggMiBZIHZhbHVlcyBhbmQgZW1pdCAyIHBpeGVscyAqLwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOwotICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgIG91dHB0ciArPSA0OwotICB9Ci0gIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgewotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKLSAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICB9Ci19Ci0jZW5kaWYgLyogQU5EUk9JRF9KUEVHX1VTRV9WRU5VTSAqLwotCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1RCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLSAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIEpESU1FTlNJT04gY29sX2luZGV4ID0gMDsKLSAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107Ci0gIHVuc2lnbmVkIGludCByLCBnLCBiOwotICBJTlQzMiByZ2I7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLSAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07Ci0gICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07Ci0gICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKLSAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOwotICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyLCByZ2IpOwotICAgIG91dHB0ciArPSA0OwotICB9Ci0gIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgewotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKLSAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOwotICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKLSAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgKihJTlQxNiopb3V0cHRyID0gcmdiOwotICB9Ci19Ci0KLQotI2VuZGlmCi0KLS8qCi0gKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCi0jaWZkZWYgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjE7Ci0gIEpTQU1QUk9XIGlucHRyMDAsIGlucHRyMDEsIGlucHRyMSwgaW5wdHIyOwotICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07Ci0gIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07Ci0gIGlucHRyMSAgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiAgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07Ci0gIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdOwotICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXTsKLSNpZmRlZiBBTkRST0lEX1JHQgotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCQV84ODg4KSB7Ci0gICAgeXl2dXAyYWJncjg4ODhfdmVudW0oKFVJTlQ4KikgaW5wdHIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0cjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gICAgeXl2dXAyYWJncjg4ODhfdmVudW0oKFVJTlQ4KikgaW5wdHIwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gIHsKLSAgICB5eXZ1cDJiZ3I4ODhfdmVudW0oKFVJTlQ4KikgaW5wdHIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBpbnB0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIG91dHB0cjAsCi0gICAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotCi0gICAgeXl2dXAyYmdyODg4X3ZlbnVtKChVSU5UOCopIGlucHRyMDEsCi0gICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCopIGlucHRyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgqKSBvdXRwdHIxLAotICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgfQotfQotI2Vsc2UKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIEpESU1FTlNJT04gcGl4ZWxXaWR0aCA9IFJHQl9QSVhFTFNJWkU7Ci0gIFNISUZUX1RFTVBTCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotICBpZiAoKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSA0KSAmJgotICAgICAgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQkFfODg4OCkpCi0gICAgIHBpeGVsV2lkdGggPSA0OyAgLy8gUkdCQSBwaXhlbCBzaXplCi0jZW5kaWYgLyogQU5EUk9JRF9SR0IgKi8KLQotICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07Ci0gIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07Ci0gIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOwotICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKLSAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07Ci0gIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKLSAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCi0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8KLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7Ci0gICAgb3V0cHRyMFtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIwW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyMCArPSBwaXhlbFdpZHRoOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKLSAgICBvdXRwdHIwW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjBbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIwICs9IHBpeGVsV2lkdGg7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIG91dHB0cjFbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyMVtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIG91dHB0cjEgKz0gcGl4ZWxXaWR0aDsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7Ci0gICAgb3V0cHRyMVtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIxW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyMSArPSBwaXhlbFdpZHRoOwotICB9Ci0gIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCi0gIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgewotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKLSAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7Ci0gICAgY3JlZCA9IENycnRhYltjcl07Ci0gICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7Ci0gICAgY2JsdWUgPSBDYmJ0YWJbY2JdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7Ci0gICAgb3V0cHRyMFtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIwW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKLSAgICBvdXRwdHIxW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjFbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgfQotfQotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KLQotCi0jaWZkZWYgQU5EUk9JRF9SR0IKLQotTUVUSE9EREVGKHZvaWQpCi1oMnYyX21lcmdlZF91cHNhbXBsZV81NjUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0gICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKLSNpZiBkZWZpbmVkKEFORFJPSURfSlBFR19VU0VfVkVOVU0pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKLSAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKLSAgaW5wdHIxICA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgaW5wdHIyICA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07Ci0gIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOwotCi0gIHl5dnVwMnJnYjU2NV92ZW51bSgoVUlOVDgqKSBpbnB0cjAwLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyMCwKLSAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotCi0gIHl5dnVwMnJnYjU2NV92ZW51bSgoVUlOVDgqKSBpbnB0cjAxLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIyLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KikgaW5wdHIxLAotICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4Kikgb3V0cHRyMSwKLSAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotfQotI2Vsc2UKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIHVuc2lnbmVkIGludCByLCBnLCBiOwotICBJTlQzMiByZ2I7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOwotICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07Ci0gIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOwotICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKLSAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjAsIHJnYik7Ci0gICAgb3V0cHRyMCArPSA0OwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIxLCByZ2IpOwotICAgIG91dHB0cjEgKz0gNDsKLSAgfQotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOwotICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAqKElOVDE2KilvdXRwdHIwID0gcmdiOwotICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKLSAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICooSU5UMTYqKW91dHB0cjEgPSByZ2I7Ci0gIH0KLX0KLSNlbmRpZiAvKiBBTkRST0lEX0pQRUdfVVNFX1ZFTlVNICovCi0KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYyX21lcmdlZF91cHNhbXBsZV81NjVEIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAotICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7Ci0gIGludCBjYiwgY3I7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjE7Ci0gIEpTQU1QUk9XIGlucHRyMDAsIGlucHRyMDEsIGlucHRyMSwgaW5wdHIyOwotICBKRElNRU5TSU9OIGNvbDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7Ci0gIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKLSAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7Ci0gIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOwotICBKRElNRU5TSU9OIGNvbF9pbmRleCA9IDA7Ci0gIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOwotICBJTlQzMiBkMSA9IGRpdGhlcl9tYXRyaXhbKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUrMSkgJiBESVRIRVJfTUFTS107Ci0gIHVuc2lnbmVkIGludCByLCBnLCBiOwotICBJTlQzMiByZ2I7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOwotICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07Ci0gIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOwotICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgCi0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovICAgIAotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOwotICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKLSAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7Ci0gICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDEpXTsKLSAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQxKV07Ci0gICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQxKV07Ci0gICAgZDEgPSBESVRIRVJfUk9UQVRFKGQxKTsKLSAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOwotICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyMCwgcmdiKTsKLSAgICBvdXRwdHIwICs9IDQ7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOwotICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOwotICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7Ci0gICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKLSAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMSldOwotICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDEpXTsKLSAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDEpXTsKLSAgICBkMSA9IERJVEhFUl9ST1RBVEUoZDEpOwotICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7Ci0gICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIxLCByZ2IpOwotICAgIG91dHB0cjEgKz0gNDsKLSAgfQotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOwotICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07Ci0gICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOwotICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOwotICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICAqKElOVDE2KilvdXRwdHIwID0gcmdiOwotICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKLSAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQxKV07Ci0gICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQxKV07Ci0gICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDEpXTsKLSAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKLSAgICooSU5UMTYqKW91dHB0cjEgPSByZ2I7Ci0gIH0KLX0KLQotI2VuZGlmCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbi4KLSAqCi0gKiBOQjogdGhpcyBpcyBjYWxsZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGV0ZXJtaW5lZCBieSB1c2VfbWVyZ2VkX3Vwc2FtcGxlKCkKLSAqIGluIGpkbWFzdGVyLmMuICBUaGF0IHJvdXRpbmUgTVVTVCBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgY2FwYWJpbGl0aWVzCi0gKiBvZiB0aGlzIG1vZHVsZTsgbm8gc2FmZXR5IGNoZWNrcyBhcmUgbWFkZSBoZXJlLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfbWVyZ2VkX3Vwc2FtcGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlOwotCi0gIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKLSAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKLSAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tZXJnZWRfdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKLQotICB1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci0gIAotICBpZiAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID09IDIpIHsKLSAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzJ2X3Vwc2FtcGxlOwotICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlOwotI2lmZGVmIEFORFJPSURfUkdCCi0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQl81NjUpIHsKLSNpZiAhZGVmaW5lZChBTkRST0lEX0pQRUdfVVNFX1ZFTlVNKQotICAgICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpIHsKLSAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1RDsKLSAgICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIC8qIElmIFZlTnVtIHJvdXRpbmVzIGFyZSBlbmFibGVkLCB1c2UgaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1Ci0gICAgICAgICAqIGZ1bmN0aW9uIHJlZ2FyZGxlc3Mgb2YgZGl0aGVyIG1vZGUuICovCi0gICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NTsKLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBBbGxvY2F0ZSBhIHNwYXJlIHJvdyBidWZmZXIgKi8KLSAgICB1cHNhbXBsZS0+c3BhcmVfcm93ID0gKEpTQU1QUk9XKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJKHNpemVfdCkgKHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoICogU0laRU9GKEpTQU1QTEUpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IG1lcmdlZF8xdl91cHNhbXBsZTsKLSAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZTsKLSNpZmRlZiBBTkRST0lEX1JHQgotICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JfNTY1KSB7Ci0jaWZuZGVmIEFORFJPSURfSlBFR19VU0VfVkVOVU0KLSAgICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgIT0gSkRJVEhFUl9OT05FKSB7Ci0gICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NUQ7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICAvKiBJZiBWZU51bSByb3V0aW5lcyBhcmUgZW5hYmxlZCwgdXNlIGgydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NQotICAgICAgICAgKiBmdW5jdGlvbiByZWdhcmRsZXNzIG9mIGRpdGhlciBtb2RlLiAqLwotICAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZV81NjU7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0gICAgLyogTm8gc3BhcmUgcm93IG5lZWRlZCAqLwotICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSBOVUxMOwotICB9Ci0KLSNpZiAhZGVmaW5lZChBTkRST0lEX0pQRUdfVVNFX1ZFTlVNKQotICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotI2VuZGlmCi0jaWZkZWYgTkVFRFNfQVJNX0VSUkFUQV83NTQzMTlfNzU0MzIwCi0gIGFzbSB2b2xhdGlsZSAoICJ2bW92IHMwLHMwXG4iICk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZHBodWZmLmMgYi9saWJqcGVndHdycC9qZHBodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODU2ZTAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRwaHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcwICswLDAgQEAKLS8qCi0gKiBqZHBodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMgZm9yIHByb2dyZXNzaXZlIEpQRUcuCi0gKgotICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KLSAqIElmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYmFjawotICogdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUgdmFyaWFibGVzCi0gKiBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlIHBlcm1hbmVudAotICogc3RvcmFnZSBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamRodWZmLmMgKi8KLQotCi0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLQotLyoKLSAqIEV4cGFuZGVkIGVudHJvcHkgZGVjb2RlciBvYmplY3QgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZGVjb2RpbmcuCi0gKgotICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAotICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47CQkJLyogcmVtYWluaW5nIEVPQnMgaW4gRU9CUlVOICovCi0gIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07CS8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLX0gc2F2YWJsZV9zdGF0ZTsKLQotLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgotICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCi0gKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCi0gKi8KLQotI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCi0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKLSNlbHNlCi0jaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCi0JKChkZXN0KS5FT0JSVU4gPSAoc3JjKS5FT0JSVU4sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCi0jZW5kaWYKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgbG9hZGVkIGludG8gbG9jYWwgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGVhY2ggTUNVLgotICAgKiBJbiBjYXNlIG9mIHN1c3BlbnNpb24sIHdlIGV4aXQgV0lUSE9VVCB1cGRhdGluZyB0aGVtLgotICAgKi8KLSAgYml0cmVhZF9wZXJtX3N0YXRlIGJpdHN0YXRlOwkvKiBCaXQgYnVmZmVyIGF0IHN0YXJ0IG9mIE1DVSAqLwotICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogT3RoZXIgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KLSAgZF9kZXJpdmVkX3RibCAqIGRlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLQotICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90Ymw7IC8qIGFjdGl2ZSB0YWJsZSBkdXJpbmcgYW4gQUMgc2NhbiAqLwotfSBwaHVmZl9lbnRyb3B5X2RlY29kZXI7Ci0KLXR5cGVkZWYgcGh1ZmZfZW50cm9weV9kZWNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19maXJzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9EQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGJvb2xlYW4gaXNfRENfYmFuZCwgYmFkOwotICBpbnQgY2ksIGNvZWZpLCB0Ymw7Ci0gIGludCAqY29lZl9iaXRfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKLQotICAvKiBWYWxpZGF0ZSBzY2FuIHBhcmFtZXRlcnMgKi8KLSAgYmFkID0gRkFMU0U7Ci0gIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgaWYgKGNpbmZvLT5TZSAhPSAwKQotICAgICAgYmFkID0gVFJVRTsKLSAgfSBlbHNlIHsKLSAgICAvKiBuZWVkIG5vdCBjaGVjayBTcy9TZSA8IDAgc2luY2UgdGhleSBjYW1lIGZyb20gdW5zaWduZWQgYnl0ZXMgKi8KLSAgICBpZiAoY2luZm8tPlNzID4gY2luZm8tPlNlIHx8IGNpbmZvLT5TZSA+PSBEQ1RTSVpFMikKLSAgICAgIGJhZCA9IFRSVUU7Ci0gICAgLyogQUMgc2NhbnMgbWF5IGhhdmUgb25seSBvbmUgY29tcG9uZW50ICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuICE9IDEpCi0gICAgICBiYWQgPSBUUlVFOwotICB9Ci0gIGlmIChjaW5mby0+QWggIT0gMCkgewotICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW46IG11c3QgaGF2ZSBBbCA9IEFoLTEuICovCi0gICAgaWYgKGNpbmZvLT5BbCAhPSBjaW5mby0+QWgtMSkKLSAgICAgIGJhZCA9IFRSVUU7Ci0gIH0KLSAgaWYgKGNpbmZvLT5BbCA+IDEzKQkJLyogbmVlZCBub3QgY2hlY2sgZm9yIDwgMCAqLwotICAgIGJhZCA9IFRSVUU7Ci0gIC8qIEFyZ3VhYmx5IHRoZSBtYXhpbXVtIEFsIHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gMTMgZm9yIDgtYml0IHByZWNpc2lvbiwKLSAgICogYnV0IHRoZSBzcGVjIGRvZXNuJ3Qgc2F5IHNvLCBhbmQgd2UgdHJ5IHRvIGJlIGxpYmVyYWwgYWJvdXQgd2hhdCB3ZQotICAgKiBhY2NlcHQuICBOb3RlOiBsYXJnZSBBbCB2YWx1ZXMgY291bGQgcmVzdWx0IGluIG91dC1vZi1yYW5nZSBEQwotICAgKiBjb2VmZmljaWVudHMgZHVyaW5nIGVhcmx5IHNjYW5zLCBsZWFkaW5nIHRvIGJpemFycmUgZGlzcGxheXMgZHVlIHRvCi0gICAqIG92ZXJmbG93cyBpbiB0aGUgSURDVCBtYXRoLiAgQnV0IHdlIHdvbid0IGNyYXNoLgotICAgKi8KLSAgaWYgKGJhZCkKLSAgICBFUlJFWElUNChjaW5mbywgSkVSUl9CQURfUFJPR1JFU1NJT04sCi0JICAgICBjaW5mby0+U3MsIGNpbmZvLT5TZSwgY2luZm8tPkFoLCBjaW5mby0+QWwpOwotICAvKiBVcGRhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzLCBhbmQgdmVyaWZ5IHRoYXQgc2NhbiBvcmRlciBpcyBsZWdhbC4KLSAgICogTm90ZSB0aGF0IGludGVyLXNjYW4gaW5jb25zaXN0ZW5jaWVzIGFyZSB0cmVhdGVkIGFzIHdhcm5pbmdzCi0gICAqIG5vdCBmYXRhbCBlcnJvcnMgLi4uIG5vdCBjbGVhciBpZiB0aGlzIGlzIHJpZ2h0IHdheSB0byBiZWhhdmUuCi0gICAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGludCBjaW5kZXggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmNvbXBvbmVudF9pbmRleDsKLSAgICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbY2luZGV4XVswXTsKLSAgICBpZiAoIWlzX0RDX2JhbmQgJiYgY29lZl9iaXRfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCi0gICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIDApOwotICAgIGZvciAoY29lZmkgPSBjaW5mby0+U3M7IGNvZWZpIDw9IGNpbmZvLT5TZTsgY29lZmkrKykgewotICAgICAgaW50IGV4cGVjdGVkID0gKGNvZWZfYml0X3B0cltjb2VmaV0gPCAwKSA/IDAgOiBjb2VmX2JpdF9wdHJbY29lZmldOwotICAgICAgaWYgKGNpbmZvLT5BaCAhPSBleHBlY3RlZCkKLQlXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIGNvZWZpKTsKLSAgICAgIGNvZWZfYml0X3B0cltjb2VmaV0gPSBjaW5mby0+QWw7Ci0gICAgfQotICB9Ci0KLSAgLyogU2VsZWN0IE1DVSBkZWNvZGluZyByb3V0aW5lICovCi0gIGlmIChjaW5mby0+QWggPT0gMCkgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX2ZpcnN0OwotICAgIGVsc2UKLSAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19maXJzdDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19yZWZpbmU7Ci0gICAgZWxzZQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX3JlZmluZTsKLSAgfQotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBNYWtlIHN1cmUgcmVxdWVzdGVkIHRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIGNvbXB1dGUgZGVyaXZlZCB0YWJsZXMuCi0gICAgICogV2UgbWF5IGJ1aWxkIHNhbWUgZGVyaXZlZCB0YWJsZSBtb3JlIHRoYW4gb25jZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZS4KLSAgICAgKi8KLSAgICBpZiAoaXNfRENfYmFuZCkgewotICAgICAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7CS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KLQl0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0JanBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIHRibCwKLQkJCQkmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCB0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICAgIC8qIHJlbWVtYmVyIHRoZSBzaW5nbGUgYWN0aXZlIHRhYmxlICovCi0gICAgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdOwotICAgIH0KLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KLSAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBjb3VudGVyICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci19Ci0KLQotLyoKLSAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCi0gKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KLSAqLwotCi0jaWZkZWYgQVZPSURfVEFCTEVTCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQotCi0jZWxzZQotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCi0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCi0gIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KLSAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAotICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCi0gICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKLSAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07Ci0KLSNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KLQotCi0vKgotICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KLSAqLwotCi1MT0NBTChib29sZWFuKQotcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpOwotCi0gIC8qIFRocm93IGF3YXkgYW55IHVudXNlZCBiaXRzIHJlbWFpbmluZyBpbiBiaXQgYnVmZmVyOyAqLwotICAvKiBpbmNsdWRlIGFueSBmdWxsIGJ5dGVzIGluIG5leHRfbWFya2VyJ3MgY291bnQgb2YgZGlzY2FyZGVkIGJ5dGVzICovCi0gIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgLyA4OwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotCi0gIC8qIEFkdmFuY2UgcGFzdCB0aGUgUlNUbiBtYXJrZXIgKi8KLSAgaWYgKCEgKCpjaW5mby0+bWFya2VyLT5yZWFkX3Jlc3RhcnRfbWFya2VyKSAoY2luZm8pKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgLyogUmUtaW5pdCBFT0IgcnVuIGNvdW50LCB0b28gKi8KLSAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKLQotICAvKiBSZXNldCByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLQotICAvKiBSZXNldCBvdXQtb2YtZGF0YSBmbGFnLCB1bmxlc3MgcmVhZF9yZXN0YXJ0X21hcmtlciBsZWZ0IHVzIHNtYWNrIHVwCi0gICAqIGFnYWluc3QgYSBtYXJrZXIuICBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBlbmQgdXAgdHJlYXRpbmcgdGhlIG5leHQgZGF0YQotICAgKiBzZWdtZW50IGFzIGVtcHR5LCBhbmQgd2UgY2FuIGF2b2lkIHByb2R1Y2luZyBib2d1cyBvdXRwdXQgcGl4ZWxzIGJ5Ci0gICAqIGxlYXZpbmcgdGhlIGZsYWcgc2V0LgotICAgKi8KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApCi0gICAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEh1ZmZtYW4gTUNVIGRlY29kaW5nLgotICogRWFjaCBvZiB0aGVzZSByb3V0aW5lcyBkZWNvZGVzIGFuZCByZXR1cm5zIG9uZSBNQ1UncyB3b3J0aCBvZgotICogSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4gCi0gKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAotICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCi0gKgotICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQotICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIElTIElOSVRJQUxMWSBaRVJPRUQgQlkgVEhFIENBTExFUi4KLSAqCi0gKiBXZSByZXR1cm4gRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KLSAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKLSAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgotICogc3BlY3RyYWwgc2VsZWN0aW9uLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuCi0gKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBoYXMgdG8gYmUgbW9yZSBjYXJlZnVsLCBob3dldmVyLikKLSAqLwotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBEQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0RDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICByZWdpc3RlciBpbnQgcywgcjsKLSAgaW50IGJsa24sIGNpOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCi0gICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgotICAgKi8KLSAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7Ci0KLSAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOwotCi0gICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLwotCi0gICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKLQotICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLSAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7Ci0gICAgICBpZiAocykgewotCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JciA9IEdFVF9CSVRTKHMpOwotCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKLSAgICAgIH0KLQotICAgICAgLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCi0gICAgICBzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKLSAgICAgIHN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7Ci0gICAgICAvKiBTY2FsZSBhbmQgb3V0cHV0IHRoZSBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF09MCkgKi8KLSAgICAgICgqYmxvY2spWzBdID0gKEpDT0VGKSAocyA8PCBBbCk7Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBBQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0FDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIHJlZ2lzdGVyIGludCBzLCBrLCByOwotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KLSAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZS4KLSAgICAgKiBXZSBjYW4gYXZvaWQgbG9hZGluZy9zYXZpbmcgYml0cmVhZCBzdGF0ZSBpZiBpbiBhbiBFT0IgcnVuLgotICAgICAqLwotICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLQotICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCi0KLSAgICBpZiAoRU9CUlVOID4gMCkJCS8qIGlmIGl0J3MgYSBiYW5kIG9mIHplcm9lcy4uLiAqLwotICAgICAgRU9CUlVOLS07CQkJLyogLi4ucHJvY2VzcyBpdCBub3cgKHdlIGRvIG5vdGhpbmcpICovCi0gICAgZWxzZSB7Ci0gICAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLSAgICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotCi0gICAgICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKLQlyID0gcyA+PiA0OwotCXMgJj0gMTU7Ci0JaWYgKHMpIHsKLQkgIGsgKz0gcjsKLQkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICByID0gR0VUX0JJVFMocyk7Ci0JICBzID0gSFVGRl9FWFRFTkQociwgcyk7Ci0JICAvKiBTY2FsZSBhbmQgb3V0cHV0IGNvZWZmaWNpZW50IGluIG5hdHVyYWwgKGRlemlnemFnZ2VkKSBvcmRlciAqLwotCSAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgKHMgPDwgQWwpOwotCX0gZWxzZSB7Ci0JICBpZiAociA9PSAxNSkgewkvKiBaUkwgKi8KLQkgICAgayArPSAxNTsJCS8qIHNraXAgMTUgemVyb2VzIGluIGJhbmQgKi8KLQkgIH0gZWxzZSB7CQkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KLQkgICAgRU9CUlVOID0gMSA8PCByOwotCSAgICBpZiAocikgewkJLyogRU9CciwgciA+IDAgKi8KLQkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCByZXR1cm4gRkFMU0UpOwotCSAgICAgIHIgPSBHRVRfQklUUyhyKTsKLQkgICAgICBFT0JSVU4gKz0gcjsKLQkgICAgfQotCSAgICBFT0JSVU4tLTsJCS8qIHRoaXMgYmFuZCBpcyBwcm9jZXNzZWQgYXQgdGhpcyBtb21lbnQgKi8KLQkgICAgYnJlYWs7CQkvKiBmb3JjZSBlbmQtb2YtYmFuZCAqLwotCSAgfQotCX0KLSAgICAgIH0KLQotICAgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBkZWNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCi0gKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0RDX3JlZmluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgaW50IGJsa247Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBOb3Qgd29ydGggdGhlIGN5Y2xlcyB0byBjaGVjayBpbnN1ZmZpY2llbnRfZGF0YSBoZXJlLAotICAgKiBzaW5jZSB3ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGRhdGEgYW55d2F5IGlmIHdlIHJlYWQgemVyb2VzLgotICAgKi8KLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLQotICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotCi0gICAgLyogRW5jb2RlZCBkYXRhIGlzIHNpbXBseSB0aGUgbmV4dCBiaXQgb2YgdGhlIHR3bydzLWNvbXBsZW1lbnQgREMgdmFsdWUgKi8KLSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCByZXR1cm4gRkFMU0UpOwotICAgIGlmIChHRVRfQklUUygxKSkKLSAgICAgICgqYmxvY2spWzBdIHw9IHAxOwotICAgIC8qIE5vdGU6IHNpbmNlIHdlIHVzZSB8PSwgcmVwZWF0aW5nIHRoZSBhc3NpZ25tZW50IGxhdGVyIGlzIHNhZmUgKi8KLSAgfQotCi0gIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZGVjb2RlX21jdV9BQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgaW50IG0xID0gKC0xKSA8PCBjaW5mby0+QWw7CS8qIC0xIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgSkNPRUZQVFIgdGhpc2NvZWY7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAgaW50IG51bV9uZXduejsKLSAgaW50IG5ld256X3Bvc1tEQ1RTSVpFMl07Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwgZG9uJ3QgbW9kaWZ5IHRoZSBNQ1UuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLwotCi0gICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBibG9jayA9IE1DVV9kYXRhWzBdOwotICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotCi0gICAgLyogSWYgd2UgYXJlIGZvcmNlZCB0byBzdXNwZW5kLCB3ZSBtdXN0IHVuZG8gdGhlIGFzc2lnbm1lbnRzIHRvIGFueSBuZXdseQotICAgICAqIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoZSBibG9jaywgYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBnZXQgY29uZnVzZWQKLSAgICAgKiBuZXh0IHRpbWUgYWJvdXQgd2hpY2ggY29lZmZpY2llbnRzIHdlcmUgYWxyZWFkeSBub256ZXJvLgotICAgICAqIEJ1dCB3ZSBuZWVkIG5vdCB1bmRvIGFkZGl0aW9uIG9mIGJpdHMgdG8gYWxyZWFkeS1ub256ZXJvIGNvZWZmaWNpZW50czsKLSAgICAgKiBpbnN0ZWFkLCB3ZSBjYW4gdGVzdCB0aGUgY3VycmVudCBiaXQgdG8gc2VlIGlmIHdlIGFscmVhZHkgZGlkIGl0LgotICAgICAqLwotICAgIG51bV9uZXdueiA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIGNvZWZmaWNpZW50IGxvb3AgY291bnRlciB0byBzdGFydCBvZiBiYW5kICovCi0gICAgayA9IGNpbmZvLT5TczsKLQotICAgIGlmIChFT0JSVU4gPT0gMCkgewotICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgewotCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIGdvdG8gdW5kb2l0LCBsYWJlbDMpOwotCXIgPSBzID4+IDQ7Ci0JcyAmPSAxNTsKLQlpZiAocykgewotCSAgaWYgKHMgIT0gMSkJCS8qIHNpemUgb2YgbmV3IGNvZWYgc2hvdWxkIGFsd2F5cyBiZSAxICovCi0JICAgIFdBUk5NUyhjaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKLQkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKLQkgIGlmIChHRVRfQklUUygxKSkKLQkgICAgcyA9IHAxOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIHBvc2l0aXZlICovCi0JICBlbHNlCi0JICAgIHMgPSBtMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBuZWdhdGl2ZSAqLwotCX0gZWxzZSB7Ci0JICBpZiAociAhPSAxNSkgewotCSAgICBFT0JSVU4gPSAxIDw8IHI7CS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLwotCSAgICBpZiAocikgewotCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIGdvdG8gdW5kb2l0KTsKLQkgICAgICByID0gR0VUX0JJVFMocik7Ci0JICAgICAgRU9CUlVOICs9IHI7Ci0JICAgIH0KLQkgICAgYnJlYWs7CQkvKiByZXN0IG9mIGJsb2NrIGlzIGhhbmRsZWQgYnkgRU9CIGxvZ2ljICovCi0JICB9Ci0JICAvKiBub3RlIHMgPSAwIGZvciBwcm9jZXNzaW5nIFpSTCAqLwotCX0KLQkvKiBBZHZhbmNlIG92ZXIgYWxyZWFkeS1ub256ZXJvIGNvZWZzIGFuZCByIHN0aWxsLXplcm8gY29lZnMsCi0JICogYXBwZW5kaW5nIGNvcnJlY3Rpb24gYml0cyB0byB0aGUgbm9uemVyb2VzLiAgQSBjb3JyZWN0aW9uIGJpdCBpcyAxCi0JICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KLQkgKi8KLQlkbyB7Ci0JICB0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKLQkgIGlmICgqdGhpc2NvZWYgIT0gMCkgewotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7Ci0JICAgIGlmIChHRVRfQklUUygxKSkgewotCSAgICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IHNldCBpdCAqLwotCQlpZiAoKnRoaXNjb2VmID49IDApCi0JCSAgKnRoaXNjb2VmICs9IHAxOwotCQllbHNlCi0JCSAgKnRoaXNjb2VmICs9IG0xOwotCSAgICAgIH0KLQkgICAgfQotCSAgfSBlbHNlIHsKLQkgICAgaWYgKC0tciA8IDApCi0JICAgICAgYnJlYWs7CQkvKiByZWFjaGVkIHRhcmdldCB6ZXJvIGNvZWZmaWNpZW50ICovCi0JICB9Ci0JICBrKys7Ci0JfSB3aGlsZSAoayA8PSBTZSk7Ci0JaWYgKHMpIHsKLQkgIGludCBwb3MgPSBqcGVnX25hdHVyYWxfb3JkZXJba107Ci0JICAvKiBPdXRwdXQgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCAqLwotCSAgKCpibG9jaylbcG9zXSA9IChKQ09FRikgczsKLQkgIC8qIFJlbWVtYmVyIGl0cyBwb3NpdGlvbiBpbiBjYXNlIHdlIGhhdmUgdG8gc3VzcGVuZCAqLwotCSAgbmV3bnpfcG9zW251bV9uZXdueisrXSA9IHBvczsKLQl9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKEVPQlJVTiA+IDApIHsKLSAgICAgIC8qIFNjYW4gYW55IHJlbWFpbmluZyBjb2VmZmljaWVudCBwb3NpdGlvbnMgYWZ0ZXIgdGhlIGVuZC1vZi1iYW5kCi0gICAgICAgKiAodGhlIGxhc3QgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCwgaWYgYW55KS4gIEFwcGVuZCBhIGNvcnJlY3Rpb24KLSAgICAgICAqIGJpdCB0byBlYWNoIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudC4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQotICAgICAgICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KLSAgICAgICAqLwotICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgewotCXRoaXNjb2VmID0gKmJsb2NrICsganBlZ19uYXR1cmFsX29yZGVyW2tdOwotCWlmICgqdGhpc2NvZWYgIT0gMCkgewotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOwotCSAgaWYgKEdFVF9CSVRTKDEpKSB7Ci0JICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IGNoYW5nZWQgaXQgKi8KLQkgICAgICBpZiAoKnRoaXNjb2VmID49IDApCi0JCSp0aGlzY29lZiArPSBwMTsKLQkgICAgICBlbHNlCi0JCSp0aGlzY29lZiArPSBtMTsKLQkgICAgfQotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIC8qIENvdW50IG9uZSBibG9jayBjb21wbGV0ZWQgaW4gRU9CIHJ1biAqLwotICAgICAgRU9CUlVOLS07Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47IC8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci0KLXVuZG9pdDoKLSAgLyogUmUtemVybyBhbnkgb3V0cHV0IGNvZWZmaWNpZW50cyB0aGF0IHdlIG1hZGUgbmV3bHkgbm9uemVybyAqLwotICB3aGlsZSAobnVtX25ld256ID4gMCkKLSAgICAoKmJsb2NrKVtuZXduel9wb3NbLS1udW1fbmV3bnpdXSA9IDA7Ci0KLSAgcmV0dXJuIEZBTFNFOwotfQotCi0vKgotICogU2F2ZSB0aGUgY3VycmVudCBIdWZmbWFuIGRlY29kZXIgcG9zaXRpb24gYW5kIHRoZSBiaXQgYnVmZmVyCi0gKiBpbnRvIGJpdHN0cmVhbV9vZmZzZXQgYW5kIGdldF9idWZmZXIsIHJlc3BlY3RpdmVseS4KLSAqLwotR0xPQkFMKHZvaWQpCi1qcGVnX2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbl9wcm9ncmVzc2l2ZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgZGF0YSBzZWdtZW50Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybjsKLSAgfQotCi0gIC8vIFNhdmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0uCi0gIG9mZnNldC0+cmVzdGFydHNfdG9fZ28gPSAodW5zaWduZWQgc2hvcnQpIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvOwotICBvZmZzZXQtPm5leHRfcmVzdGFydF9udW0gPSBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtOwotCi0gIG9mZnNldC0+Yml0c3RyZWFtX29mZnNldCA9Ci0gICAgICAoamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8pIDw8IExPR19UV09fQklUX0JVRl9TSVpFKQotICAgICAgKyBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQ7Ci0KLSAgb2Zmc2V0LT5nZXRfYnVmZmVyID0gZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlcjsKLX0KLQotLyoKLSAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZW9jZGUgcG9zaXRpb24gYW5kIHRoZSBEQyBjb2VmZmljaWVudHMKLSAqIGZvciBlYWNoIGNvbXBvbmVudCBpbnRvIGJpdHN0cmVhbV9vZmZzZXQgYW5kIGRjX2luZm9bXSwgcmVzcGVjdGl2ZWx5LgotICovCi1NRVRIT0RERUYodm9pZCkKLWdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpCi17Ci0gIGludCBpOwotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAganBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb25fcHJvZ3Jlc3NpdmUoY2luZm8sIG9mZnNldCk7Ci0gIG9mZnNldC0+RU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOwotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykKLSAgICBvZmZzZXQtPnByZXZfZGNbaV0gPSBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtpXTsKLX0KLQotLyoKLSAqIENvbmZpZ3VyZSB0aGUgSHVmZm1hbiBkZWNvZGVyIHJlYWRlciBwb3NpdGlvbiBhbmQgYml0IGJ1ZmZlci4KLSAqLwotR0xPQkFMKHZvaWQpCi1qcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXJfcHJvZ3Jlc3NpdmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpCi17Ci0JcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgLy8gUmVzdG9yZSByZXN0YXJ0c190b19nbyBhbmQgbmV4dF9yZXN0YXJ0X251bQotICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gb2Zmc2V0LnJlc3RhcnRzX3RvX2dvOwotICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gb2Zmc2V0Lm5leHRfcmVzdGFydF9udW07Ci0KLSAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9vZmZzZXQgPSBvZmZzZXQuYml0c3RyZWFtX29mZnNldDsKLSAgaW50IGJsa24sIGk7Ci0KLSAgdW5zaWduZWQgaW50IGJ5dGVfb2Zmc2V0ID0gYml0c3RyZWFtX29mZnNldCA+PiBMT0dfVFdPX0JJVF9CVUZfU0laRTsKLSAgdW5zaWduZWQgaW50IGJpdF9pbl9iaXRfYnVmZmVyID0KLSAgICAgIGJpdHN0cmVhbV9vZmZzZXQgJiAoKDEgPDwgTE9HX1RXT19CSVRfQlVGX1NJWkUpIC0gMSk7Ci0KLSAganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb25fYml0KGNpbmZvLCBieXRlX29mZnNldCwKLSAgICAgICAgICBiaXRfaW5fYml0X2J1ZmZlciwgb2Zmc2V0LmdldF9idWZmZXIpOwotfQotCi0vKgotICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgdG8gZGVjb2RlIHRoZSBpbWFnZQotICogc3RhcnRpbmcgZnJvbSAoaU1DVV9yb3dfb2Zmc2V0LCBpTUNVX2NvbF9vZmZzZXQpLgotICovCi1NRVRIT0RERUYodm9pZCkKLWNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpCi17Ci0gIGludCBpOwotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAganBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyX3Byb2dyZXNzaXZlKGNpbmZvLCBvZmZzZXQpOwotICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBvZmZzZXQuRU9CUlVOOwotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykKLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtpXSA9IG9mZnNldC5wcmV2X2RjW2ldOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfY29uZmlndXJlX2h1ZmZtYW5faW5kZXhfc2NhbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IHNjYW5fbm8sIGludCBvZmZzZXQpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpZiAoc2Nhbl9ubyA+PSBpbmRleC0+c2Nhbl9jb3VudCkgewotICAgIGluZGV4LT5zY2FuID0gcmVhbGxvYyhpbmRleC0+c2NhbiwKLSAgICAgICAgICAgICAgICAgICAgKHNjYW5fbm8gKyAxKSAqIHNpemVvZihodWZmbWFuX3NjYW5faGVhZGVyKSk7Ci0gICAgaW5kZXgtPm1lbV91c2VkICs9IChzY2FuX25vIC0gaW5kZXgtPnNjYW5fY291bnQgKyAxKQotICAgICAgKiAoc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpICsgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cwotICAgICAgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSopKTsKLSAgICBpbmRleC0+c2Nhbl9jb3VudCA9IHNjYW5fbm8gKyAxOwotICB9Ci0gIGluZGV4LT5zY2FuW3NjYW5fbm9dLm9mZnNldCA9IChodWZmbWFuX29mZnNldF9kYXRhKiopbWFsbG9jKAotICAgICAgICAgIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSopKTsKLSAgaW5kZXgtPnNjYW5bc2Nhbl9ub10uYml0c3RyZWFtX29mZnNldCA9IG9mZnNldDsKLX0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcuCi0gKi8KLUdMT0JBTCh2b2lkKQotamluaXRfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKLSAgaW50ICpjb2VmX2JpdF9wdHI7Ci0gIGludCBjaSwgaTsKLQotICBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKHBodWZmX2VudHJvcHlfZGVjb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3BodWZmX2RlY29kZXI7Ci0gIGVudHJvcHktPnB1Yi5jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyID0gY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcjsKLSAgZW50cm9weS0+cHViLmdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbiA9Ci0gICAgICAgIGdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbjsKLQotICAvKiBNYXJrIGRlcml2ZWQgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotICB9Ci0KLSAgLyogQ3JlYXRlIHByb2dyZXNzaW9uIHN0YXR1cyB0YWJsZSAqLwotICBjaW5mby0+Y29lZl9iaXRzID0gKGludCAoKilbRENUU0laRTJdKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJY2luZm8tPm51bV9jb21wb25lbnRzKkRDVFNJWkUyKlNJWkVPRihpbnQpKTsKLSAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzWzBdWzBdOwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAotICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKQotICAgICAgKmNvZWZfYml0X3B0cisrID0gLTE7Ci19Ci0KLSNlbmRpZiAvKiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamRwb3N0Y3QuYyBiL2xpYmpwZWd0d3JwL2pkcG9zdGN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTU2M2QuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamRwb3N0Y3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogamRwb3N0Y3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCi0gKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgdXBzYW1wbGluZywgY29sb3IgY29udmVyc2lvbiwgYW5kIGNvbG9yCi0gKiBxdWFudGl6YXRpb24vcmVkdWN0aW9uIHN0ZXBzOyBzcGVjaWZpY2FsbHksIGl0IGNvbnRyb2xzIHRoZSBidWZmZXJpbmcKLSAqIGJldHdlZW4gdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBhbmQgY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbi4KLSAqCi0gKiBJZiBubyBjb2xvciBxdWFudGl6YXRpb24vcmVkdWN0aW9uIGlzIHJlcXVpcmVkLCB0aGVuIHRoaXMgbW9kdWxlIGhhcyBubwotICogd29yayB0byBkbywgYW5kIGl0IGp1c3QgaGFuZHMgb2ZmIHRvIHRoZSB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIGNvZGUuCi0gKiBBbiBpbnRlZ3JhdGVkIHVwc2FtcGxlL2NvbnZlcnQvcXVhbnRpemUgcHJvY2VzcyB3b3VsZCByZXBsYWNlIHRoaXMgbW9kdWxlCi0gKiBlbnRpcmVseS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBDb2xvciBxdWFudGl6YXRpb24gc291cmNlIGJ1ZmZlcjogdGhpcyBob2xkcyBvdXRwdXQgZGF0YSBmcm9tCi0gICAqIHRoZSB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIHN0ZXAgdG8gYmUgcGFzc2VkIHRvIHRoZSBxdWFudGl6ZXIuCi0gICAqIEZvciB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24sIHdlIG5lZWQgYSBmdWxsLWltYWdlIGJ1ZmZlcjsKLSAgICogZm9yIG9uZS1wYXNzIG9wZXJhdGlvbiwgYSBzdHJpcCBidWZmZXIgaXMgc3VmZmljaWVudC4KLSAgICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIHZpcnR1YWwgYXJyYXksIG9yIE5VTEwgaWYgb25lLXBhc3MgKi8KLSAgSlNBTVBBUlJBWSBidWZmZXI7CQkvKiBzdHJpcCBidWZmZXIsIG9yIGN1cnJlbnQgc3RyaXAgb2YgdmlydHVhbCAqLwotICBKRElNRU5TSU9OIHN0cmlwX2hlaWdodDsJLyogYnVmZmVyIHNpemUgaW4gcm93cyAqLwotICAvKiBmb3IgdHdvLXBhc3MgbW9kZSBvbmx5OiAqLwotICBKRElNRU5TSU9OIHN0YXJ0aW5nX3JvdzsJLyogcm93ICMgb2YgZmlyc3Qgcm93IGluIGN1cnJlbnQgc3RyaXAgKi8KLSAgSkRJTUVOU0lPTiBuZXh0X3JvdzsJCS8qIGluZGV4IG9mIG5leHQgcm93IHRvIGZpbGwvZW1wdHkgaW4gc3RyaXAgKi8KLX0gbXlfcG9zdF9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X3Bvc3RfY29udHJvbGxlciAqIG15X3Bvc3RfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzXzFwYXNzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc19wcmVwYXNzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18ycGFzcwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfZHBvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKLQotICBzd2l0Y2ggKHBhc3NfbW9kZSkgewotICBjYXNlIEpCVUZfUEFTU19USFJVOgotICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgICAvKiBTaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGggY29sb3IgcXVhbnRpemF0aW9uLiAqLwotICAgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzXzFwYXNzOwotICAgICAgLyogV2UgY291bGQgYmUgZG9pbmcgYnVmZmVyZWQtaW1hZ2Ugb3V0cHV0IGJlZm9yZSBzdGFydGluZyBhIDItcGFzcwotICAgICAgICogY29sb3IgcXVhbnRpemF0aW9uOyBpbiB0aGF0IGNhc2UsIGppbml0X2RfcG9zdF9jb250cm9sbGVyIGRpZCBub3QKLSAgICAgICAqIGFsbG9jYXRlIGEgc3RyaXAgYnVmZmVyLiAgVXNlIHRoZSB2aXJ0dWFsLWFycmF5IGJ1ZmZlciBhcyB3b3Jrc3BhY2UuCi0gICAgICAgKi8KLSAgICAgIGlmIChwb3N0LT5idWZmZXIgPT0gTlVMTCkgewotCXBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKLQkgICAoSkRJTUVOU0lPTikgMCwgcG9zdC0+c3RyaXBfaGVpZ2h0LCBUUlVFKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogRm9yIHNpbmdsZS1wYXNzIHByb2Nlc3Npbmcgd2l0aG91dCBjb2xvciBxdWFudGl6YXRpb24sCi0gICAgICAgKiBJIGhhdmUgbm8gd29yayB0byBkbzsganVzdCBjYWxsIHRoZSB1cHNhbXBsZXIgZGlyZWN0bHkuCi0gICAgICAgKi8KLSAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IGNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGU7Ci0gICAgfQotICAgIGJyZWFrOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKLSAgICAvKiBGaXJzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KLSAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfcHJlcGFzczsKLSAgICBicmVhazsKLSAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6Ci0gICAgLyogU2Vjb25kIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLwotICAgIGlmIChwb3N0LT53aG9sZV9pbWFnZSA9PSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18ycGFzczsKLSAgICBicmVhazsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcG9zdC0+c3RhcnRpbmdfcm93ID0gcG9zdC0+bmV4dF9yb3cgPSAwOwotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgb25lLXBhc3MgKHN0cmlwIGJ1ZmZlcikgY2FzZS4KLSAqIFRoaXMgaXMgdXNlZCBmb3IgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiBhcyB3ZWxsIGFzIG9uZS1wYXNzIHF1YW50aXphdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXBvc3RfcHJvY2Vzc18xcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OwotICBKRElNRU5TSU9OIG51bV9yb3dzLCBtYXhfcm93czsKLQotICAvKiBGaWxsIHRoZSBidWZmZXIsIGJ1dCBub3QgbW9yZSB0aGFuIHdoYXQgd2UgY2FuIGR1bXAgb3V0IGluIG9uZSBnby4gKi8KLSAgLyogTm90ZSB3ZSByZWx5IG9uIHRoZSB1cHNhbXBsZXIgdG8gZGV0ZWN0IGJvdHRvbSBvZiBpbWFnZS4gKi8KLSAgbWF4X3Jvd3MgPSBvdXRfcm93c19hdmFpbCAtICpvdXRfcm93X2N0cjsKLSAgaWYgKG1heF9yb3dzID4gcG9zdC0+c3RyaXBfaGVpZ2h0KQotICAgIG1heF9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0OwotICBudW1fcm93cyA9IDA7Ci0gICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAotCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCXBvc3QtPmJ1ZmZlciwgJm51bV9yb3dzLCBtYXhfcm93cyk7Ci0gIC8qIFF1YW50aXplIGFuZCBlbWl0IGRhdGEuICovCi0gICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywKLQkJcG9zdC0+YnVmZmVyLCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLCAoaW50KSBudW1fcm93cyk7Ci0gICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLX0KLQotCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgZmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcG9zdF9wcm9jZXNzX3ByZXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCSAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OwotICBKRElNRU5TSU9OIG9sZF9uZXh0X3JvdywgbnVtX3Jvd3M7Ci0KLSAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KLSAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKLSAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAotCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7Ci0gIH0KLQotICAvKiBVcHNhbXBsZSBzb21lIGRhdGEgKHVwIHRvIGEgc3RyaXAgaGVpZ2h0J3Mgd29ydGgpLiAqLwotICBvbGRfbmV4dF9yb3cgPSBwb3N0LT5uZXh0X3JvdzsKLSAgKCpjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlKSAoY2luZm8sCi0JCWlucHV0X2J1ZiwgaW5fcm93X2dyb3VwX2N0ciwgaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJcG9zdC0+YnVmZmVyLCAmcG9zdC0+bmV4dF9yb3csIHBvc3QtPnN0cmlwX2hlaWdodCk7Ci0KLSAgLyogQWxsb3cgcXVhbnRpemVyIHRvIHNjYW4gbmV3IGRhdGEuICBObyBkYXRhIGlzIGVtaXR0ZWQsICovCi0gIC8qIGJ1dCB3ZSBhZHZhbmNlIG91dF9yb3dfY3RyIHNvIG91dGVyIGxvb3AgY2FuIHRlbGwgd2hlbiB3ZSdyZSBkb25lLiAqLwotICBpZiAocG9zdC0+bmV4dF9yb3cgPiBvbGRfbmV4dF9yb3cpIHsKLSAgICBudW1fcm93cyA9IHBvc3QtPm5leHRfcm93IC0gb2xkX25leHRfcm93OwotICAgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywgcG9zdC0+YnVmZmVyICsgb2xkX25leHRfcm93LAotCQkJCQkgKEpTQU1QQVJSQVkpIE5VTEwsIChpbnQpIG51bV9yb3dzKTsKLSAgICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Ci0gIH0KLQotICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCi0gIGlmIChwb3N0LT5uZXh0X3JvdyA+PSBwb3N0LT5zdHJpcF9oZWlnaHQpIHsKLSAgICBwb3N0LT5zdGFydGluZ19yb3cgKz0gcG9zdC0+c3RyaXBfaGVpZ2h0OwotICAgIHBvc3QtPm5leHRfcm93ID0gMDsKLSAgfQotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2Vjb25kIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXBvc3RfcHJvY2Vzc18ycGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OwotICBKRElNRU5TSU9OIG51bV9yb3dzLCBtYXhfcm93czsKLQotICAvKiBSZXBvc2l0aW9uIHZpcnR1YWwgYnVmZmVyIGlmIGF0IHN0YXJ0IG9mIHN0cmlwLiAqLwotICBpZiAocG9zdC0+bmV4dF9yb3cgPT0gMCkgewotICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCi0JIHBvc3QtPnN0YXJ0aW5nX3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0LCBGQUxTRSk7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIHJvd3MgdG8gZW1pdC4gKi8KLSAgbnVtX3Jvd3MgPSBwb3N0LT5zdHJpcF9oZWlnaHQgLSBwb3N0LT5uZXh0X3JvdzsgLyogYXZhaWxhYmxlIGluIHN0cmlwICovCi0gIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7IC8qIGF2YWlsYWJsZSBpbiBvdXRwdXQgYXJlYSAqLwotICBpZiAobnVtX3Jvd3MgPiBtYXhfcm93cykKLSAgICBudW1fcm93cyA9IG1heF9yb3dzOwotICAvKiBXZSBoYXZlIHRvIGNoZWNrIGJvdHRvbSBvZiBpbWFnZSBoZXJlLCBjYW4ndCBkZXBlbmQgb24gdXBzYW1wbGVyLiAqLwotICBtYXhfcm93cyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gcG9zdC0+c3RhcnRpbmdfcm93OwotICBpZiAobnVtX3Jvd3MgPiBtYXhfcm93cykKLSAgICBudW1fcm93cyA9IG1heF9yb3dzOwotCi0gIC8qIFF1YW50aXplIGFuZCBlbWl0IGRhdGEuICovCi0gICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywKLQkJcG9zdC0+YnVmZmVyICsgcG9zdC0+bmV4dF9yb3csIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCi0JCShpbnQpIG51bV9yb3dzKTsKLSAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotCi0gIC8qIEFkdmFuY2UgaWYgd2UgZmlsbGVkIHRoZSBzdHJpcC4gKi8KLSAgcG9zdC0+bmV4dF9yb3cgKz0gbnVtX3Jvd3M7Ci0gIGlmIChwb3N0LT5uZXh0X3JvdyA+PSBwb3N0LT5zdHJpcF9oZWlnaHQpIHsKLSAgICBwb3N0LT5zdGFydGluZ19yb3cgKz0gcG9zdC0+c3RyaXBfaGVpZ2h0OwotICAgIHBvc3QtPm5leHRfcm93ID0gMDsKLSAgfQotfQotCi0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2RfcG9zdF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X3Bvc3RfcHRyIHBvc3Q7Ci0KLSAgcG9zdCA9IChteV9wb3N0X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9wb3N0X2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPnBvc3QgPSAoc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgKikgcG9zdDsKLSAgcG9zdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rwb3N0OwotICBwb3N0LT53aG9sZV9pbWFnZSA9IE5VTEw7CS8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCi0gIHBvc3QtPmJ1ZmZlciA9IE5VTEw7CQkvKiBmbGFnIGZvciBubyBzdHJpcCBidWZmZXIgKi8KLQotICAvKiBDcmVhdGUgdGhlIHF1YW50aXphdGlvbiBidWZmZXIsIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgIC8qIFRoZSBidWZmZXIgc3RyaXAgaGVpZ2h0IGlzIG1heF92X3NhbXBfZmFjdG9yLCB3aGljaCBpcyB0eXBpY2FsbHkKLSAgICAgKiBhbiBlZmZpY2llbnQgbnVtYmVyIG9mIHJvd3MgZm9yIHVwc2FtcGxpbmcgdG8gcmV0dXJuLgotICAgICAqIChJbiB0aGUgcHJlc2VuY2Ugb2Ygb3V0cHV0IHJlc2NhbGluZywgd2UgbWlnaHQgd2FudCB0byBiZSBzbWFydGVyPykKLSAgICAgKi8KLSAgICBwb3N0LT5zdHJpcF9oZWlnaHQgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICAgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0gICAgICAvKiBUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb246IG5lZWQgZnVsbC1pbWFnZSBzdG9yYWdlLiAqLwotICAgICAgLyogV2Ugcm91bmQgdXAgdGhlIG51bWJlciBvZiByb3dzIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHN0cmlwIGhlaWdodC4gKi8KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLSAgICAgIHBvc3QtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotCSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodCwKLQkJCQkobG9uZykgcG9zdC0+c3RyaXBfaGVpZ2h0KSwKLQkgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE9uZS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbjoganVzdCBtYWtlIGEgc3RyaXAgYnVmZmVyLiAqLwotICAgICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKLQkgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pkc2FtcGxlLmMgYi9saWJqcGVndHdycC9qZHNhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGZmZWZiLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pkc2FtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLyoKLSAqIGpkc2FtcGxlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB1cHNhbXBsaW5nIHJvdXRpbmVzLgotICoKLSAqIFVwc2FtcGxpbmcgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCi0gKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSkKLSAqIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVXBzYW1wbGluZyB3aWxsIG5vcm1hbGx5IHByb2R1Y2UKLSAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3MgZnJvbSBlYWNoIHJvdyBncm91cCAoYnV0IHRoaXMgY291bGQgdmFyeQotICogaWYgdGhlIHVwc2FtcGxlciBpcyBhcHBseWluZyBhIHNjYWxlIGZhY3RvciBvZiBpdHMgb3duKS4KLSAqCi0gKiBBbiBleGNlbGxlbnQgcmVmZXJlbmNlIGZvciBpbWFnZSByZXNhbXBsaW5nIGlzCi0gKiAgIERpZ2l0YWwgSW1hZ2UgV2FycGluZywgR2VvcmdlIFdvbGJlcmcsIDE5OTAuCi0gKiAgIFB1Yi4gYnkgSUVFRSBDb21wdXRlciBTb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLiBJU0JOIDAtODE4Ni04OTQ0LTcuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFBvaW50ZXIgdG8gcm91dGluZSB0byB1cHNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZTFfcHRyLAotCQkoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogQ29sb3IgY29udmVyc2lvbiBidWZmZXIuICBXaGVuIHVzaW5nIHNlcGFyYXRlIHVwc2FtcGxpbmcgYW5kIGNvbG9yCi0gICAqIGNvbnZlcnNpb24gc3RlcHMsIHRoaXMgYnVmZmVyIGhvbGRzIG9uZSB1cHNhbXBsZWQgcm93IGdyb3VwIHVudGlsIGl0Ci0gICAqIGhhcyBiZWVuIGNvbG9yIGNvbnZlcnRlZCBhbmQgb3V0cHV0LgotICAgKiBOb3RlOiB3ZSBkbyBub3QgYWxsb2NhdGUgYW55IHN0b3JhZ2UgZm9yIGNvbXBvbmVudChzKSB3aGljaCBhcmUgZnVsbC1zaXplLAotICAgKiBpZSBkbyBub3QgbmVlZCByZXNjYWxpbmcuICBUaGUgY29ycmVzcG9uZGluZyBlbnRyeSBvZiBjb2xvcl9idWZbXSBpcwotICAgKiBzaW1wbHkgc2V0IHRvIHBvaW50IHRvIHRoZSBpbnB1dCBkYXRhIGFycmF5LCB0aGVyZWJ5IGF2b2lkaW5nIGNvcHlpbmcuCi0gICAqLwotICBKU0FNUEFSUkFZIGNvbG9yX2J1ZltNQVhfQ09NUE9ORU5UU107Ci0KLSAgLyogUGVyLWNvbXBvbmVudCB1cHNhbXBsaW5nIG1ldGhvZCBwb2ludGVycyAqLwotICB1cHNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOwotCi0gIGludCBuZXh0X3Jvd19vdXQ7CQkvKiBjb3VudHMgcm93cyBlbWl0dGVkIGZyb20gY29sb3JfYnVmICovCi0gIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCi0KLSAgLyogSGVpZ2h0IG9mIGFuIGlucHV0IHJvdyBncm91cCBmb3IgZWFjaCBjb21wb25lbnQuICovCi0gIGludCByb3dncm91cF9oZWlnaHRbTUFYX0NPTVBPTkVOVFNdOwotCi0gIC8qIFRoZXNlIGFycmF5cyBzYXZlIHBpeGVsIGV4cGFuc2lvbiBmYWN0b3JzIHNvIHRoYXQgaW50X2V4cGFuZCBuZWVkIG5vdAotICAgKiByZWNvbXB1dGUgdGhlbSBlYWNoIHRpbWUuICBUaGV5IGFyZSB1bnVzZWQgZm9yIG90aGVyIHVwc2FtcGxpbmcgbWV0aG9kcy4KLSAgICovCi0gIFVJTlQ4IGhfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKLSAgVUlOVDggdl9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOwotfSBteV91cHNhbXBsZXI7Ci0KLXR5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0KLSAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KLSAgdXBzYW1wbGUtPm5leHRfcm93X291dCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLwotICB1cHNhbXBsZS0+cm93c190b19nbyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotfQotCi0KLS8qCi0gKiBDb250cm9sIHJvdXRpbmUgdG8gZG8gdXBzYW1wbGluZyAoYW5kIGNvbG9yIGNvbnZlcnNpb24pLgotICoKLSAqIEluIHRoaXMgdmVyc2lvbiB3ZSB1cHNhbXBsZSBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LgotICogV2UgdXBzYW1wbGUgb25lIHJvdyBncm91cCBpbnRvIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgdGhlbiBhcHBseQotICogY29sb3IgY29udmVyc2lvbiBhIHJvdyBhdCBhIHRpbWUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zZXBfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKRElNRU5TSU9OIG51bV9yb3dzOwotCi0gIC8qIEZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBpZiBpdCdzIGVtcHR5ICovCi0gIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgLyogSW52b2tlIHBlci1jb21wb25lbnQgdXBzYW1wbGUgbWV0aG9kLiAgTm90aWNlIHdlIHBhc3MgYSBQT0lOVEVSCi0gICAgICAgKiB0byBjb2xvcl9idWZbY2ldLCBzbyB0aGF0IGZ1bGxzaXplX3Vwc2FtcGxlIGNhbiBjaGFuZ2UgaXQuCi0gICAgICAgKi8KLSAgICAgICgqdXBzYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsCi0JaW5wdXRfYnVmW2NpXSArICgqaW5fcm93X2dyb3VwX2N0ciAqIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldKSwKLQl1cHNhbXBsZS0+Y29sb3JfYnVmICsgY2kpOwotICAgIH0KLSAgICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gMDsKLSAgfQotCi0gIC8qIENvbG9yLWNvbnZlcnQgYW5kIGVtaXQgcm93cyAqLwotCi0gIC8qIEhvdyBtYW55IHdlIGhhdmUgaW4gdGhlIGJ1ZmZlcjogKi8KLSAgbnVtX3Jvd3MgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAtIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQpOwotICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gIE5lZWQgdGhpcyB0ZXN0Ci0gICAqIGluIGNhc2UgdGhlIGltYWdlIGhlaWdodCBpcyBub3QgYSBtdWx0aXBsZSBvZiBtYXhfdl9zYW1wX2ZhY3RvcjoKLSAgICovCi0gIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKSAKLSAgICBudW1fcm93cyA9IHVwc2FtcGxlLT5yb3dzX3RvX2dvOwotICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KLSAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOwotICBpZiAobnVtX3Jvd3MgPiBvdXRfcm93c19hdmFpbCkKLSAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOwotCi0gICgqY2luZm8tPmNjb252ZXJ0LT5jb2xvcl9jb252ZXJ0KSAoY2luZm8sIHVwc2FtcGxlLT5jb2xvcl9idWYsCi0JCQkJICAgICAoSkRJTUVOU0lPTikgdXBzYW1wbGUtPm5leHRfcm93X291dCwKLQkJCQkgICAgIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCi0JCQkJICAgICAoaW50KSBudW1fcm93cyk7Ci0KLSAgLyogQWRqdXN0IGNvdW50cyAqLwotICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Ci0gIHVwc2FtcGxlLT5yb3dzX3RvX2dvIC09IG51bV9yb3dzOwotICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ICs9IG51bV9yb3dzOwotICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdGllZCwgZGVjbGFyZSB0aGlzIGlucHV0IHJvdyBncm91cCBjb25zdW1lZCAqLwotICBpZiAodXBzYW1wbGUtPm5leHRfcm93X291dCA+PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpCi0gICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOwotfQotCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgc2VwX3Vwc2FtcGxlIHRvIHVwc2FtcGxlIHBpeGVsIHZhbHVlcwotICogb2YgYSBzaW5nbGUgY29tcG9uZW50LiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCi0gKi8KLQotCi0vKgotICogRm9yIGZ1bGwtc2l6ZSBjb21wb25lbnRzLCB3ZSBqdXN0IG1ha2UgY29sb3JfYnVmW2NpXSBwb2ludCBhdCB0aGUKLSAqIGlucHV0IGJ1ZmZlciwgYW5kIHRodXMgYXZvaWQgY29weWluZyBhbnkgZGF0YS4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gKiBzYWZlIG9ubHkgYmVjYXVzZSBzZXBfdXBzYW1wbGUgZG9lc24ndCBkZWNsYXJlIHRoZSBpbnB1dCByb3cgZ3JvdXAKLSAqICJjb25zdW1lZCIgdW50aWwgd2UgYXJlIGRvbmUgY29sb3IgY29udmVydGluZyBhbmQgZW1pdHRpbmcgaXQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mdWxsc2l6ZV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgKm91dHB1dF9kYXRhX3B0ciA9IGlucHV0X2RhdGE7Ci19Ci0KLQotLyoKLSAqIFRoaXMgaXMgYSBuby1vcCB2ZXJzaW9uIHVzZWQgZm9yICJ1bmludGVyZXN0aW5nIiBjb21wb25lbnRzLgotICogVGhlc2UgY29tcG9uZW50cyB3aWxsIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNvbG9yIGNvbnZlcnNpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ub29wX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICAqb3V0cHV0X2RhdGFfcHRyID0gTlVMTDsJLyogc2FmZXR5IGNoZWNrICovCi19Ci0KLQotLyoKLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGFueSBpbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MuCi0gKiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0eXBpY2FsIEpQRUcgZmlsZXMsIHNvIGl0IG5lZWQgbm90IGJlIGZhc3QuCi0gKiBOb3IsIGZvciB0aGF0IG1hdHRlciwgaXMgaXQgcGFydGljdWxhcmx5IGFjY3VyYXRlOiB0aGUgYWxnb3JpdGhtIGlzCi0gKiBzaW1wbGUgcmVwbGljYXRpb24gb2YgdGhlIGlucHV0IHBpeGVsIG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci0gKiBwaXhlbHMuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlIHJlZmVycyB0byB0aGlzIGFzIGEKLSAqICJib3ggZmlsdGVyIi4gIEEgYm94IGZpbHRlciB0ZW5kcyB0byBpbnRyb2R1Y2UgdmlzaWJsZSBhcnRpZmFjdHMsCi0gKiBzbyBpZiB5b3UgYXJlIGFjdHVhbGx5IGdvaW5nIHRvIHVzZSAzOjEgb3IgNDoxIHNhbXBsaW5nIHJhdGlvcwotICogeW91IHdvdWxkIGJlIHdlbGwgYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWludF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7Ci0gIHJlZ2lzdGVyIGludCBoOwotICBKU0FNUFJPVyBvdXRlbmQ7Ci0gIGludCBoX2V4cGFuZCwgdl9leHBhbmQ7Ci0gIGludCBpbnJvdywgb3V0cm93OwotCi0gIGhfZXhwYW5kID0gdXBzYW1wbGUtPmhfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07Ci0gIHZfZXhwYW5kID0gdXBzYW1wbGUtPnZfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07Ci0KLSAgaW5yb3cgPSBvdXRyb3cgPSAwOwotICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgLyogR2VuZXJhdGUgb25lIG91dHB1dCByb3cgd2l0aCBwcm9wZXIgaG9yaXpvbnRhbCBleHBhbnNpb24gKi8KLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107Ci0gICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKLSAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7Ci0gICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSAgICAgIGZvciAoaCA9IGhfZXhwYW5kOyBoID4gMDsgaC0tKSB7Ci0JKm91dHB0cisrID0gaW52YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogR2VuZXJhdGUgYW55IGFkZGl0aW9uYWwgb3V0cHV0IHJvd3MgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9uZSAqLwotICAgIGlmICh2X2V4cGFuZCA+IDEpIHsKLSAgICAgIGpjb3B5X3NhbXBsZV9yb3dzKG91dHB1dF9kYXRhLCBvdXRyb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKLQkJCXZfZXhwYW5kLTEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICAgIH0KLSAgICBpbnJvdysrOwotICAgIG91dHJvdyArPSB2X2V4cGFuZDsKLSAgfQotfQotCi0KLS8qCi0gKiBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgotICogSXQncyBzdGlsbCBhIGJveCBmaWx0ZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOwotICBKU0FNUFJPVyBvdXRlbmQ7Ci0gIGludCBpbnJvdzsKLQotICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKLSAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKLSAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCi0gKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7Ci0gIEpTQU1QUk9XIG91dGVuZDsKLSAgaW50IGlucm93LCBvdXRyb3c7Ci0KLSAgaW5yb3cgPSBvdXRyb3cgPSAwOwotICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgewotICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOwotICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKLSAgICB9Ci0gICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAotCQkgICAgICAxLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgICBpbnJvdysrOwotICAgIG91dHJvdyArPSAyOwotICB9Ci19Ci0KLQotLyoKLSAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgotICoKLSAqIFRoZSB1cHNhbXBsaW5nIGFsZ29yaXRobSBpcyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHBpeGVsIGNlbnRlcnMsCi0gKiBhbHNvIGtub3duIGFzIGEgInRyaWFuZ2xlIGZpbHRlciIuICBUaGlzIGlzIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4KLSAqIHNwZWVkIGFuZCB2aXN1YWwgcXVhbGl0eS4gIFRoZSBjZW50ZXJzIG9mIHRoZSBvdXRwdXQgcGl4ZWxzIGFyZSAxLzQgYW5kIDMvNAotICogb2YgdGhlIHdheSBiZXR3ZWVuIGlucHV0IHBpeGVsIGNlbnRlcnMuCi0gKgotICogQSBub3RlIGFib3V0IHRoZSAiYmlhcyIgY2FsY3VsYXRpb25zOiB3aGVuIHJvdW5kaW5nIGZyYWN0aW9uYWwgdmFsdWVzIHRvCi0gKiBpbnRlZ2VyLCB3ZSBkbyBub3Qgd2FudCB0byBhbHdheXMgcm91bmQgMC41IHVwIHRvIHRoZSBuZXh0IGludGVnZXIuCi0gKiBJZiB3ZSBkaWQgdGhhdCwgd2UnZCBpbnRyb2R1Y2UgYSBub3RpY2VhYmxlIGJpYXMgdG93YXJkcyBsYXJnZXIgdmFsdWVzLgotICogSW5zdGVhZCwgdGhpcyBjb2RlIGlzIGFycmFuZ2VkIHNvIHRoYXQgMC41IHdpbGwgYmUgcm91bmRlZCB1cCBvciBkb3duIGF0Ci0gKiBhbHRlcm5hdGUgcGl4ZWwgbG9jYXRpb25zIChhIHNpbXBsZSBvcmRlcmVkIGRpdGhlciBwYXR0ZXJuKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjFfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGludCBpbnZhbHVlOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKLSAgaW50IGlucm93OwotCi0gIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgewotICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOwotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCi0gICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7Ci0KLSAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKLSAgICAgIC8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCAqLwotICAgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspICogMzsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKGlucHRyWy0yXSkgKyAxKSA+PiAyKTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKLSAgICB9Ci0KLSAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCi0gICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoaW5wdHJbLTFdKSArIDEpID4+IDIpOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOwotICB9Ci19Ci0KLQotLyoKLSAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotICogQWdhaW4gYSB0cmlhbmdsZSBmaWx0ZXI7IHNlZSBjb21tZW50cyBmb3IgaDJ2MSBjYXNlLCBhYm92ZS4KLSAqCi0gKiBJdCBpcyBPSyBmb3IgdXMgdG8gcmVmZXJlbmNlIHRoZSBhZGphY2VudCBpbnB1dCByb3dzIGJlY2F1c2Ugd2UgZGVtYW5kZWQKLSAqIGNvbnRleHQgZnJvbSB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciAoc2VlIGluaXRpYWxpemF0aW9uIGNvZGUpLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotICByZWdpc3RlciBpbnQgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKLSNlbHNlCi0gIHJlZ2lzdGVyIElOVDMyIHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7Ci0gIGludCBpbnJvdywgb3V0cm93LCB2OwotCi0gIGlucm93ID0gb3V0cm93ID0gMDsKLSAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgIGZvciAodiA9IDA7IHYgPCAyOyB2KyspIHsKLSAgICAgIC8qIGlucHRyMCBwb2ludHMgdG8gbmVhcmVzdCBpbnB1dCByb3csIGlucHRyMSBwb2ludHMgdG8gbmV4dCBuZWFyZXN0ICovCi0gICAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICAgIGlmICh2ID09IDApCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGFib3ZlICovCi0JaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdy0xXTsKLSAgICAgIGVsc2UJCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGJlbG93ICovCi0JaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKLSAgICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvdysrXTsKLQotICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KLSAgICAgIHRoaXNjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDgpID4+IDQpOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7Ci0gICAgICBsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07Ci0KLSAgICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotCS8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCBpbiBlYWNoICovCi0JLyogZGltZW5zaW9uLCB0aHVzIDkvMTYsIDMvMTYsIDMvMTYsIDEvMTYgb3ZlcmFsbCAqLwotCW5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOwotCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOwotCWxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKLSAgICAgIH0KLQotICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDcpID4+IDQpOwotICAgIH0KLSAgICBpbnJvdysrOwotICB9Ci19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciB1cHNhbXBsaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIGJvb2xlYW4gbmVlZF9idWZmZXIsIGRvX2ZhbmN5OwotICBpbnQgaF9pbl9ncm91cCwgdl9pbl9ncm91cCwgaF9vdXRfZ3JvdXAsIHZfb3V0X2dyb3VwOwotCi0gIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKLSAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKLSAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc191cHNhbXBsZTsKLSAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IHNlcF91cHNhbXBsZTsKLSAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOyAvKiB1bnRpbCB3ZSBmaW5kIG91dCBkaWZmZXJlbnRseSAqLwotCi0gIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykJLyogdGhpcyBpc24ndCBzdXBwb3J0ZWQgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7Ci0KLSAgLyogamRtYWluY3QuYyBkb2Vzbid0IHN1cHBvcnQgY29udGV4dCByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSA9IDEsCi0gICAqIHNvIGRvbid0IGFzayBmb3IgaXQuCi0gICAqLwotICBkb19mYW5jeSA9IGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nICYmIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID4gMTsKLQotICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgc2VsZWN0IHBlci1jb21wb25lbnQgbWV0aG9kcywKLSAgICogYW5kIGNyZWF0ZSBzdG9yYWdlIGFzIG5lZWRlZC4KLSAgICovCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQ29tcHV0ZSBzaXplIG9mIGFuICJpbnB1dCBncm91cCIgYWZ0ZXIgSURDVCBzY2FsaW5nLiAgVGhpcyBtYW55IHNhbXBsZXMKLSAgICAgKiBhcmUgdG8gYmUgY29udmVydGVkIHRvIG1heF9oX3NhbXBfZmFjdG9yICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWxzLgotICAgICAqLwotICAgIGhfaW5fZ3JvdXAgPSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgdl9pbl9ncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0JCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgICBoX291dF9ncm91cCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcjsKLSAgICB2X291dF9ncm91cCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICB1cHNhbXBsZS0+cm93Z3JvdXBfaGVpZ2h0W2NpXSA9IHZfaW5fZ3JvdXA7IC8qIHNhdmUgZm9yIHVzZSBsYXRlciAqLwotICAgIG5lZWRfYnVmZmVyID0gVFJVRTsKLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0gICAgICAvKiBEb24ndCBib3RoZXIgdG8gdXBzYW1wbGUgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCi0gICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBub29wX3Vwc2FtcGxlOwotICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKLSAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgJiYgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgewotICAgICAgLyogRnVsbHNpemUgY29tcG9uZW50cyBjYW4gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgYW55IHdvcmsuICovCi0gICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV91cHNhbXBsZTsKLSAgICAgIG5lZWRfYnVmZmVyID0gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgotCSAgICAgICB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7Ci0gICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDF2IHVwc2FtcGxpbmcgKi8KLSAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9mYW5jeV91cHNhbXBsZTsKLSAgICAgIGVsc2UKLQl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX3Vwc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKLQkgICAgICAgdl9pbl9ncm91cCAqIDIgPT0gdl9vdXRfZ3JvdXApIHsKLSAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMnYgdXBzYW1wbGluZyAqLwotICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikgewotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZmFuY3lfdXBzYW1wbGU7Ci0JdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7Ci0gICAgICB9IGVsc2UKLQl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Vwc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoKGhfb3V0X2dyb3VwICUgaF9pbl9ncm91cCkgPT0gMCAmJgotCSAgICAgICAodl9vdXRfZ3JvdXAgJSB2X2luX2dyb3VwKSA9PSAwKSB7Ci0gICAgICAvKiBHZW5lcmljIGludGVncmFsLWZhY3RvcnMgdXBzYW1wbGluZyBtZXRob2QgKi8KLSAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGludF91cHNhbXBsZTsKLSAgICAgIHVwc2FtcGxlLT5oX2V4cGFuZFtjaV0gPSAoVUlOVDgpIChoX291dF9ncm91cCAvIGhfaW5fZ3JvdXApOwotICAgICAgdXBzYW1wbGUtPnZfZXhwYW5kW2NpXSA9IChVSU5UOCkgKHZfb3V0X2dyb3VwIC8gdl9pbl9ncm91cCk7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKLSAgICBpZiAobmVlZF9idWZmZXIpIHsKLSAgICAgIHVwc2FtcGxlLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwKLQkJCQkobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZHRyYW5zLmMgYi9saWJqcGVndHdycC9qZHRyYW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNmUxNzAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamR0cmFucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKiBqZHRyYW5zLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBsaWJyYXJ5IHJvdXRpbmVzIGZvciB0cmFuc2NvZGluZyBkZWNvbXByZXNzaW9uLAotICogdGhhdCBpcywgcmVhZGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyBmcm9tIGFuIGlucHV0IEpQRUcgZmlsZS4KLSAqIFRoZSByb3V0aW5lcyBpbiBqZGFwaW1pbi5jIHdpbGwgYWxzbyBiZSBuZWVkZWQgYnkgYSB0cmFuc2NvZGVyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTE9DQUwodm9pZCkgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbiBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotCi0vKgotICogUmVhZCB0aGUgY29lZmZpY2llbnQgYXJyYXlzIGZyb20gYSBKUEVHIGZpbGUuCi0gKiBqcGVnX3JlYWRfaGVhZGVyIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCi0gKgotICogVGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGludG8gYSBzZXQgb2YgdmlydHVhbCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMsCi0gKiBvbmUgcGVyIGNvbXBvbmVudC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZgotICogdmlydHVhbC1hcnJheSBkZXNjcmlwdG9ycy4gIFRoZXNlIGNhbiBiZSBtYW5pcHVsYXRlZCBkaXJlY3RseSB2aWEgdGhlCi0gKiBKUEVHIG1lbW9yeSBtYW5hZ2VyLCBvciBoYW5kZWQgb2ZmIHRvIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCi0gKiBUbyByZWxlYXNlIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHZpcnR1YWwgYXJyYXlzLCBjYWxsCi0gKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgd2hlbiBkb25lIHdpdGggdGhlIGRhdGEuCi0gKgotICogQW4gYWx0ZXJuYXRpdmUgdXNhZ2UgaXMgdG8gc2ltcGx5IG9idGFpbiBhY2Nlc3MgdG8gdGhlIGNvZWZmaWNpZW50IGFycmF5cwotICogZHVyaW5nIGEgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbi4gIFRoaXMgaXMgYWxsb3dlZAotICogYWZ0ZXIgYW55IGpwZWdfZmluaXNoX291dHB1dCgpIGNhbGwuICBUaGUgYXJyYXlzIGNhbiBiZSBhY2Nlc3NlZCB1bnRpbAotICoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIGlzIGNhbGxlZC4gIChOb3RlIHRoYXQgYW55IGNhbGwgdG8gdGhlIGxpYnJhcnkKLSAqIG1heSByZXBvc2l0aW9uIHRoZSBhcnJheXMsIHNvIGRvbid0IHJlbHkgb24gYWNjZXNzX3ZpcnRfYmFycmF5KCkgcmVzdWx0cwotICogdG8gc3RheSB2YWxpZCBhY3Jvc3MgbGlicmFyeSBjYWxscy4pCi0gKgotICogUmV0dXJucyBOVUxMIGlmIHN1c3BlbmRlZC4gIFRoaXMgY2FzZSBuZWVkIGJlIGNoZWNrZWQgb25seSBpZgotICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCi0gKi8KLQotR0xPQkFMKGp2aXJ0X2JhcnJheV9wdHIgKikKLWpwZWdfcmVhZF9jb2VmZmljaWVudHMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgewotICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgYWN0aXZlIG1vZHVsZXMgKi8KLSAgICB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uKGNpbmZvKTsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JEQ09FRlM7Ci0gIH0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JEQ09FRlMpIHsKLSAgICAvKiBBYnNvcmIgd2hvbGUgZmlsZSBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLwotICAgIGZvciAoOzspIHsKLSAgICAgIGludCByZXRjb2RlOwotICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKQotICAgICAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIC8qIEFic29yYiBzb21lIG1vcmUgaW5wdXQgKi8KLSAgICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLSAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCi0gICAgICAgIGJyZWFrOwotICAgICAgLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKLQkgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7Ci0gICAgICAgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgewotCSAgLyogc3RhcnR1cCB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KLSAgICAgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIFNldCBzdGF0ZSBzbyB0aGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcgKi8KLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOwotICB9Ci0gIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCi0gICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKLSAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KLSAgICovCi0gIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgcmV0dXJuIGNpbmZvLT5jb2VmLT5jb2VmX2FycmF5czsKLSAgfQotICAvKiBPb3BzLCBpbXByb3BlciB1c2FnZSAqLwotICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICByZXR1cm4gTlVMTDsJCQkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0KLUxPQ0FMKGJvb2xlYW4pCi1qcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXhfcHJvZ3Jlc3NpdmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgpCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgewotICAgIHByaW50ZigiUHJvZ3Jlc3NpdmUgTW9kZVxuIik7Ci0gICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBhY3RpdmUgbW9kdWxlcyAqLwotICAgIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUkRDT0VGUzsKLSAgfQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkRDT0VGUykgewotICAgIHVuc2lnbmVkIGludCBtY3U7Ci0gICAgaW50IGk7Ci0gICAgY2luZm8tPm1hcmtlci0+Z2V0X3Nvc19tYXJrZXJfcG9zaXRpb24oY2luZm8sIGluZGV4KTsKLQotICAgIC8qIEFic29yYiB3aG9sZSBmaWxlIGludG8gdGhlIGNvZWYgYnVmZmVyICovCi0gICAgZm9yIChtY3UgPSAwOyBtY3UgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzOyBtY3UrKykgewotICAgICAgaW50IHJldGNvZGUgPSAwOwotICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKQotICAgICAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIC8qIEFic29yYiBzb21lIG1vcmUgaW5wdXQgKi8KLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotICAgICAgZm9yIChpID0gMDsgaSA8IGluZGV4LT5zY2FuX2NvdW50OyBpKyspIHsKLSAgICAgICAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICAgICAgICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbywgaW5kZXgtPnNjYW5baV0uYml0c3RyZWFtX29mZnNldCk7Ci0gICAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKLSAgICAgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIChjaW5mbywgaW5kZXgsIGkpOwotICAgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSBtY3U7Ci0gICAgICAgIGlmIChtY3UgIT0gMCkKLSAgICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKQotICAgICAgICAgICAgICAgIChjaW5mbywgaW5kZXgtPnNjYW5baV0ucHJldl9NQ1Vfb2Zmc2V0KTsKLSAgICAgICAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID0gaTsKLSAgICAgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIChjaW5mbywgaW5kZXgsIGkpOwotICAgICAgfQotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCi0gICAgICAgIGJyZWFrOwotICAgICAgLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKLQkgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7Ci0gICAgICAgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgewotCSAgLyogc3RhcnR1cCB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KLSAgICAgICAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKLSAgfQotICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBiZSBpbiBzdGF0ZSBEU1RBVEVfU1RPUFBJTkcgaWYgYmVpbmcgdXNlZAotICAgKiBzdGFuZGFsb25lLCBvciBpbiBzdGF0ZSBEU1RBVEVfQlVGSU1BR0UgaWYgYmVpbmcgaW52b2tlZCB0byBnZXQgYWNjZXNzCi0gICAqIHRvIHRoZSBjb2VmZmljaWVudHMgZHVyaW5nIGEgZnVsbCBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24uCi0gICAqLwotICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NUT1BQSU5HIHx8Ci0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIHJldHVybiBUUlVFOwotICB9Ci0gIC8qIE9vcHMsIGltcHJvcGVyIHVzYWdlICovCi0gIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBGQUxTRTsJCQkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0KLUxPQ0FMKGJvb2xlYW4pCi1qcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXhfYmFzZWxpbmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgpCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgewotICAgIHByaW50ZigiQmFzZWxpbmUgTW9kZVxuIik7Ci0gICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBhY3RpdmUgbW9kdWxlcyAqLwotICAgIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUkRDT0VGUzsKLSAgfQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkRDT0VGUykgewotICAgIC8qIEFic29yYiB3aG9sZSBmaWxlIGludG8gdGhlIGNvZWYgYnVmZmVyICovCi0gICAgZm9yICg7OykgewotICAgICAgaW50IHJldGNvZGU7Ci0gICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCi0gICAgICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLwotICAgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIChjaW5mbywgaW5kZXgsIDApOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCi0gICAgICAgIGJyZWFrOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19TQ0FOX0NPTVBMRVRFRCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEFkdmFuY2UgcHJvZ3Jlc3MgY291bnRlciBpZiBhcHByb3ByaWF0ZSAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCi0JICAocmV0Y29kZSA9PSBKUEVHX1JPV19DT01QTEVURUQgfHwgcmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSkgewotICAgICAgICBpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKLQkgIC8qIHN0YXJ0dXAgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCi0gICAgICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvKiBTZXQgc3RhdGUgc28gdGhhdCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nICovCi0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKLSAgfQotICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBiZSBpbiBzdGF0ZSBEU1RBVEVfU1RPUFBJTkcgaWYgYmVpbmcgdXNlZAotICAgKiBzdGFuZGFsb25lLCBvciBpbiBzdGF0ZSBEU1RBVEVfQlVGSU1BR0UgaWYgYmVpbmcgaW52b2tlZCB0byBnZXQgYWNjZXNzCi0gICAqIHRvIHRoZSBjb2VmZmljaWVudHMgZHVyaW5nIGEgZnVsbCBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24uCi0gICAqLwotICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NUT1BQSU5HIHx8Ci0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIHJldHVybiBUUlVFOwotICB9Ci0gIC8qIE9vcHMsIGltcHJvcGVyIHVzYWdlICovCi0gIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBGQUxTRTsJCQkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0KLUdMT0JBTChib29sZWFuKQotanBlZ19idWlsZF9odWZmbWFuX2luZGV4KGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KQotewotICAgIGNpbmZvLT50aWxlX2RlY29kZSA9IFRSVUU7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgICAgcmV0dXJuIGpwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9wcm9ncmVzc2l2ZShjaW5mbywgaW5kZXgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBqcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXhfYmFzZWxpbmUoY2luZm8sIGluZGV4KTsKLX0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzIGZvciB0cmFuc2NvZGluZy4KLSAqIFRoaXMgc3Vic3RpdHV0ZXMgZm9yIGpkbWFzdGVyLmMncyBpbml0aWFsaXphdGlvbiBvZiB0aGUgZnVsbCBkZWNvbXByZXNzb3IuCi0gKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBidWZmZXJlZC1pbWFnZSBvcGVyYXRpb24uICovCi0gIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IFRSVUU7Ci0KLSAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0gICAgICBqaW5pdF9odWZmX2RlY29kZXIoY2luZm8pOwotICAgIH0KLSAgfQotCi0gIC8qIEFsd2F5cyBnZXQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KLSAgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIFRSVUUpOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yaW5nLiAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBpbnQgbnNjYW5zOwotICAgIC8qIEVzdGltYXRlIG51bWJlciBvZiBzY2FucyB0byBzZXQgcGFzc19saW1pdC4gKi8KLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSAgICAgIC8qIEFyYml0cmFyaWx5IGVzdGltYXRlIDIgaW50ZXJsZWF2ZWQgREMgc2NhbnMgKyAzIEFDIHNjYW5zL2NvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IDIgKyAzICogY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKLSAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICB9IGVsc2UgewotICAgICAgbnNjYW5zID0gMTsKLSAgICB9Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamVycm9yLmMgYi9saWJqcGVndHdycC9qZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhN2JlOC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogamVycm9yLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgZXJyb3ItcmVwb3J0aW5nIGFuZCB0cmFjZS1tZXNzYWdlIHJvdXRpbmVzLgotICogVGhlc2UgYXJlIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyBhbmQgb3RoZXJzIHdoZXJlIHdyaXRpbmcgdG8KLSAqIHN0ZGVyciBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gcmVwbGFjZQotICogc29tZSBvciBhbGwgb2YgdGhlc2Ugcm91dGluZXMuCi0gKgotICogSWYgeW91IGRlZmluZSBVU0VfV0lORE9XU19NRVNTQUdFQk9YIGluIGpjb25maWcuaCBvciBpbiB0aGUgbWFrZWZpbGUsCi0gKiB5b3UgZ2V0IGEgV2luZG93cy1zcGVjaWZpYyBoYWNrIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMgaW4gYSBkaWFsb2cgYm94LgotICogSXQgYWluJ3QgbXVjaCwgYnV0IGl0IGJlYXRzIGRyb3BwaW5nIGVycm9yIG1lc3NhZ2VzIGludG8gdGhlIGJpdCBidWNrZXQsCi0gKiB3aGljaCBpcyB3aGF0IGhhcHBlbnMgdG8gb3V0cHV0IHRvIHN0ZGVyciB1bmRlciBtb3N0IFdpbmRvd3MgQyBjb21waWxlcnMuCi0gKgotICogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgYm90aCB0aGUgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZS4KLSAqLwotCi0vKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAianZlcnNpb24uaCIKLSNpbmNsdWRlICJqZXJyb3IuaCIKLQotI2lmZGVmIFVTRV9XSU5ET1dTX01FU1NBR0VCT1gKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQotI2VuZGlmCi0KLQotLyoKLSAqIENyZWF0ZSB0aGUgbWVzc2FnZSBzdHJpbmcgdGFibGUuCi0gKiBXZSBkbyB0aGlzIGZyb20gdGhlIG1hc3RlciBtZXNzYWdlIGxpc3QgaW4gamVycm9yLmggYnkgcmUtcmVhZGluZwotICogamVycm9yLmggd2l0aCBhIHN1aXRhYmxlIGRlZmluaXRpb24gZm9yIG1hY3JvIEpNRVNTQUdFLgotICogVGhlIG1lc3NhZ2UgdGFibGUgaXMgbWFkZSBhbiBleHRlcm5hbCBzeW1ib2wganVzdCBpbiBjYXNlIGFueSBhcHBsaWNhdGlvbnMKLSAqIHdhbnQgdG8gcmVmZXIgdG8gaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZQlqTXNnVGFibGUKLSNlbmRpZgotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAotCi1jb25zdCBjaGFyICogY29uc3QganBlZ19zdGRfbWVzc2FnZV90YWJsZVtdID0gewotI2luY2x1ZGUgImplcnJvci5oIgotICBOVUxMCi19OwotCi0KLS8qCi0gKiBFcnJvciBleGl0IGhhbmRsZXI6IG11c3Qgbm90IHJldHVybiB0byBjYWxsZXIuCi0gKgotICogQXBwbGljYXRpb25zIG1heSBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCB0byBnZXQgY29udHJvbCBiYWNrIGFmdGVyCi0gKiBhbiBlcnJvci4gIFR5cGljYWxseSBvbmUgd291bGQgbG9uZ2ptcCBzb21ld2hlcmUgaW5zdGVhZCBvZiBleGl0aW5nLgotICogVGhlIHNldGptcCBidWZmZXIgY2FuIGJlIG1hZGUgYSBwcml2YXRlIGZpZWxkIHdpdGhpbiBhbiBleHBhbmRlZCBlcnJvcgotICogaGFuZGxlciBvYmplY3QuICBOb3RlIHRoYXQgdGhlIGluZm8gbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UKLSAqIGlzIHN0b3JlZCBpbiB0aGUgZXJyb3Igb2JqZWN0LCBzbyB5b3UgY2FuIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG5vdyBvcgotICogbGF0ZXIsIGF0IHlvdXIgY29udmVuaWVuY2UuCi0gKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwICh3aXRoIGpwZWdfYWJvcnQKLSAqIG9yIGpwZWdfZGVzdHJveSkgYXQgc29tZSBwb2ludC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWVycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogQWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UgKi8KLSAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKLQotICAvKiBMZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllICovCi0gIGpwZWdfZGVzdHJveShjaW5mbyk7Ci0KLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLS8qCi0gKiBBY3R1YWwgb3V0cHV0IG9mIGFuIGVycm9yIG9yIHRyYWNlIG1lc3NhZ2UuCi0gKiBBcHBsaWNhdGlvbnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHNlbmQgSlBFRyBtZXNzYWdlcyBzb21ld2hlcmUKLSAqIG90aGVyIHRoYW4gc3RkZXJyLgotICoKLSAqIE9uIFdpbmRvd3MsIHByaW50aW5nIHRvIHN0ZGVyciBpcyBnZW5lcmFsbHkgY29tcGxldGVseSB1c2VsZXNzLAotICogc28gd2UgcHJvdmlkZSBvcHRpb25hbCBjb2RlIHRvIHByb2R1Y2UgYW4gZXJyb3ItZGlhbG9nIHBvcHVwLgotICogTW9zdCBXaW5kb3dzIGFwcGxpY2F0aW9ucyB3aWxsIHN0aWxsIHByZWZlciB0byBvdmVycmlkZSB0aGlzIHJvdXRpbmUsCi0gKiBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgZG8gc29tZXRoaW5nIGF0IGxlYXN0IG1hcmdpbmFsbHkgdXNlZnVsLgotICoKLSAqIE5PVEU6IHRvIHVzZSB0aGUgbGlicmFyeSBpbiBhbiBlbnZpcm9ubWVudCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKLSAqIEMgc3RkaW8gbGlicmFyeSwgeW91IG1heSBoYXZlIHRvIGRlbGV0ZSB0aGUgY2FsbCB0byBmcHJpbnRmKCkgZW50aXJlbHksCi0gKiBub3QganVzdCBub3QgdXNlIHRoaXMgcm91dGluZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW91dHB1dF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07Ci0KLSAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCi0gICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpIChjaW5mbywgYnVmZmVyKTsKLQotI2lmZGVmIFVTRV9XSU5ET1dTX01FU1NBR0VCT1gKLSAgLyogRGlzcGxheSBpdCBpbiBhIG1lc3NhZ2UgZGlhbG9nIGJveCAqLwotICBNZXNzYWdlQm94KEdldEFjdGl2ZVdpbmRvdygpLCBidWZmZXIsICJKUEVHIExpYnJhcnkgRXJyb3IiLAotCSAgICAgTUJfT0sgfCBNQl9JQ09ORVJST1IpOwotI2Vsc2UKLSAgLyogU2VuZCBpdCB0byBzdGRlcnIsIGFkZGluZyBhIG5ld2xpbmUgKi8KLSAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyKTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBEZWNpZGUgd2hldGhlciB0byBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlLgotICogbXNnX2xldmVsIGlzIG9uZSBvZjoKLSAqICAgLTE6IHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSB3YXJuaW5nLCBtYXkgd2FudCB0byBhYm9ydC4KLSAqICAgIDA6IGltcG9ydGFudCBhZHZpc29yeSBtZXNzYWdlcyAoYWx3YXlzIGRpc3BsYXkgdG8gdXNlcikuCi0gKiAgICAxOiBmaXJzdCBsZXZlbCBvZiB0cmFjaW5nIGRldGFpbC4KLSAqICAgIDIsMywuLi46IHN1Y2Nlc3NpdmVseSBtb3JlIGRldGFpbGVkIHRyYWNpbmcgbWVzc2FnZXMuCi0gKiBBbiBhcHBsaWNhdGlvbiBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBpdCB3YW50ZWQgdG8gYWJvcnQgb24gd2FybmluZ3MKLSAqIG9yIGNoYW5nZSB0aGUgcG9saWN5IGFib3V0IHdoaWNoIG1lc3NhZ2VzIHRvIGRpc3BsYXkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1lbWl0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkKLXsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLQotICBpZiAobXNnX2xldmVsIDwgMCkgewotICAgIC8qIEl0J3MgYSB3YXJuaW5nIG1lc3NhZ2UuICBTaW5jZSBjb3JydXB0IGZpbGVzIG1heSBnZW5lcmF0ZSBtYW55IHdhcm5pbmdzLAotICAgICAqIHRoZSBwb2xpY3kgaW1wbGVtZW50ZWQgaGVyZSBpcyB0byBzaG93IG9ubHkgdGhlIGZpcnN0IHdhcm5pbmcsCi0gICAgICogdW5sZXNzIHRyYWNlX2xldmVsID49IDMuCi0gICAgICovCi0gICAgaWYgKGVyci0+bnVtX3dhcm5pbmdzID09IDAgfHwgZXJyLT50cmFjZV9sZXZlbCA+PSAzKQotICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOwotICAgIC8qIEFsd2F5cyBjb3VudCB3YXJuaW5ncyBpbiBudW1fd2FybmluZ3MuICovCi0gICAgZXJyLT5udW1fd2FybmluZ3MrKzsKLSAgfSBlbHNlIHsKLSAgICAvKiBJdCdzIGEgdHJhY2UgbWVzc2FnZS4gIFNob3cgaXQgaWYgdHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsLiAqLwotICAgIGlmIChlcnItPnRyYWNlX2xldmVsID49IG1zZ19sZXZlbCkKLSAgICAgICgqZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKLSAgfQotfQotCi0KLS8qCi0gKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZS4KLSAqIFRoZSBtZXNzYWdlIGlzIHN0b3JlZCBpbnRvIGJ1ZmZlciwgd2hpY2ggc2hvdWxkIGJlIGF0IGxlYXN0IEpNU0dfTEVOR1RIX01BWAotICogY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBubyAnXG4nIGNoYXJhY3RlciBpcyBhZGRlZCB0byB0aGUgc3RyaW5nLgotICogRmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZvcm1hdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpCi17Ci0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7Ci0gIGludCBtc2dfY29kZSA9IGVyci0+bXNnX2NvZGU7Ci0gIGNvbnN0IGNoYXIgKiBtc2d0ZXh0ID0gTlVMTDsKLSAgY29uc3QgY2hhciAqIG1zZ3B0cjsKLSAgY2hhciBjaDsKLSAgYm9vbGVhbiBpc3N0cmluZzsKLQotICAvKiBMb29rIHVwIG1lc3NhZ2Ugc3RyaW5nIGluIHByb3BlciB0YWJsZSAqLwotICBpZiAobXNnX2NvZGUgPiAwICYmIG1zZ19jb2RlIDw9IGVyci0+bGFzdF9qcGVnX21lc3NhZ2UpIHsKLSAgICBtc2d0ZXh0ID0gZXJyLT5qcGVnX21lc3NhZ2VfdGFibGVbbXNnX2NvZGVdOwotICB9IGVsc2UgaWYgKGVyci0+YWRkb25fbWVzc2FnZV90YWJsZSAhPSBOVUxMICYmCi0JICAgICBtc2dfY29kZSA+PSBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgJiYKLQkgICAgIG1zZ19jb2RlIDw9IGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlKSB7Ci0gICAgbXNndGV4dCA9IGVyci0+YWRkb25fbWVzc2FnZV90YWJsZVttc2dfY29kZSAtIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZV07Ci0gIH0KLQotICAvKiBEZWZlbmQgYWdhaW5zdCBib2d1cyBtZXNzYWdlIG51bWJlciAqLwotICBpZiAobXNndGV4dCA9PSBOVUxMKSB7Ci0gICAgZXJyLT5tc2dfcGFybS5pWzBdID0gbXNnX2NvZGU7Ci0gICAgbXNndGV4dCA9IGVyci0+anBlZ19tZXNzYWdlX3RhYmxlWzBdOwotICB9Ci0KLSAgLyogQ2hlY2sgZm9yIHN0cmluZyBwYXJhbWV0ZXIsIGFzIGluZGljYXRlZCBieSAlcyBpbiB0aGUgbWVzc2FnZSB0ZXh0ICovCi0gIGlzc3RyaW5nID0gRkFMU0U7Ci0gIG1zZ3B0ciA9IG1zZ3RleHQ7Ci0gIHdoaWxlICgoY2ggPSAqbXNncHRyKyspICE9ICdcMCcpIHsKLSAgICBpZiAoY2ggPT0gJyUnKSB7Ci0gICAgICBpZiAoKm1zZ3B0ciA9PSAncycpIGlzc3RyaW5nID0gVFJVRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8qIEZvcm1hdCB0aGUgbWVzc2FnZSBpbnRvIHRoZSBwYXNzZWQgYnVmZmVyICovCi0gIGlmIChpc3N0cmluZykKLSAgICBzcHJpbnRmKGJ1ZmZlciwgbXNndGV4dCwgZXJyLT5tc2dfcGFybS5zKTsKLSAgZWxzZQotICAgIHNwcmludGYoYnVmZmVyLCBtc2d0ZXh0LAotCSAgICBlcnItPm1zZ19wYXJtLmlbMF0sIGVyci0+bXNnX3Bhcm0uaVsxXSwKLQkgICAgZXJyLT5tc2dfcGFybS5pWzJdLCBlcnItPm1zZ19wYXJtLmlbM10sCi0JICAgIGVyci0+bXNnX3Bhcm0uaVs0XSwgZXJyLT5tc2dfcGFybS5pWzVdLAotCSAgICBlcnItPm1zZ19wYXJtLmlbNl0sIGVyci0+bXNnX3Bhcm0uaVs3XSk7Ci19Ci0KLQotLyoKLSAqIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZS4KLSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwIHRvIHJlc2V0IHRyYWNlL2Vycm9yCi0gKiBwcm9jZXNzaW5nIHRvIGRlZmF1bHQgc3RhdGUsIHdpdGhvdXQgbG9zaW5nIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYwotICogbWV0aG9kIHBvaW50ZXJzLiAgQW4gYXBwbGljYXRpb24gbWlnaHQgcG9zc2libHkgd2FudCB0byBvdmVycmlkZQotICogdGhpcyBtZXRob2QgaWYgaXQgaGFzIGFkZGl0aW9uYWwgZXJyb3IgcHJvY2Vzc2luZyBzdGF0ZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlc2V0X2Vycm9yX21nciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBjaW5mby0+ZXJyLT5udW1fd2FybmluZ3MgPSAwOwotICAvKiB0cmFjZV9sZXZlbCBpcyBub3QgcmVzZXQgc2luY2UgaXQgaXMgYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgcGFyYW1ldGVyICovCi0gIGNpbmZvLT5lcnItPm1zZ19jb2RlID0gMDsJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KLX0KLQotCi0vKgotICogRmlsbCBpbiB0aGUgc3RhbmRhcmQgZXJyb3ItaGFuZGxpbmcgbWV0aG9kcyBpbiBhIGpwZWdfZXJyb3JfbWdyIG9iamVjdC4KLSAqIFR5cGljYWwgY2FsbCBpczoKLSAqCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAqCXN0cnVjdCBqcGVnX2Vycm9yX21nciBlcnI7Ci0gKgotICoJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmVycik7Ci0gKiBhZnRlciB3aGljaCB0aGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMuCi0gKi8KLQotR0xPQkFMKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKQotanBlZ19zdGRfZXJyb3IgKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikKLXsKLSAgZXJyLT5lcnJvcl9leGl0ID0gZXJyb3JfZXhpdDsKLSAgZXJyLT5lbWl0X21lc3NhZ2UgPSBlbWl0X21lc3NhZ2U7Ci0gIGVyci0+b3V0cHV0X21lc3NhZ2UgPSBvdXRwdXRfbWVzc2FnZTsKLSAgZXJyLT5mb3JtYXRfbWVzc2FnZSA9IGZvcm1hdF9tZXNzYWdlOwotICBlcnItPnJlc2V0X2Vycm9yX21nciA9IHJlc2V0X2Vycm9yX21ncjsKLQotICBlcnItPnRyYWNlX2xldmVsID0gMDsJCS8qIGRlZmF1bHQgPSBubyB0cmFjaW5nICovCi0gIGVyci0+bnVtX3dhcm5pbmdzID0gMDsJLyogbm8gd2FybmluZ3MgZW1pdHRlZCB5ZXQgKi8KLSAgZXJyLT5tc2dfY29kZSA9IDA7CQkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLwotCi0gIC8qIEluaXRpYWxpemUgbWVzc2FnZSB0YWJsZSBwb2ludGVycyAqLwotICBlcnItPmpwZWdfbWVzc2FnZV90YWJsZSA9IGpwZWdfc3RkX21lc3NhZ2VfdGFibGU7Ci0gIGVyci0+bGFzdF9qcGVnX21lc3NhZ2UgPSAoaW50KSBKTVNHX0xBU1RNU0dDT0RFIC0gMTsKLQotICBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgPSBOVUxMOwotICBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgPSAwOwkvKiBmb3Igc2FmZXR5ICovCi0gIGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlID0gMDsKLQotICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamVycm9yLmggYi9saWJqcGVndHdycC9qZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyZmZmZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKgotICogamVycm9yLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlcnJvciBhbmQgbWVzc2FnZSBjb2RlcyBmb3IgdGhlIEpQRUcgbGlicmFyeS4KLSAqIEVkaXQgdGhpcyBmaWxlIHRvIGFkZCBuZXcgY29kZXMsIG9yIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBzdHJpbmdzIHRvCi0gKiBzb21lIG90aGVyIGxhbmd1YWdlLgotICogQSBzZXQgb2YgZXJyb3ItcmVwb3J0aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCB0b28uICBTb21lIGFwcGxpY2F0aW9ucyB1c2luZwotICogdGhlIEpQRUcgbGlicmFyeSBtYXkgd2lzaCB0byBpbmNsdWRlIHRoaXMgZmlsZSB0byBnZXQgdGhlIGVycm9yIGNvZGVzCi0gKiBhbmQvb3IgdGhlIG1hY3Jvcy4KLSAqLwotCi0vKgotICogVG8gZGVmaW5lIHRoZSBlbnVtIGxpc3Qgb2YgbWVzc2FnZSBjb2RlcywgaW5jbHVkZSB0aGlzIGZpbGUgd2l0aG91dAotICogZGVmaW5pbmcgbWFjcm8gSk1FU1NBR0UuICBUbyBjcmVhdGUgYSBtZXNzYWdlIHN0cmluZyB0YWJsZSwgaW5jbHVkZSBpdAotICogYWdhaW4gd2l0aCBhIHN1aXRhYmxlIEpNRVNTQUdFIGRlZmluaXRpb24gKHNlZSBqZXJyb3IuYyBmb3IgYW4gZXhhbXBsZSkuCi0gKi8KLSNpZm5kZWYgSk1FU1NBR0UKLSNpZm5kZWYgSkVSUk9SX0gKLS8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgZGVmaW5lIHRoZSBlbnVtIGxpc3QgKi8KLSNkZWZpbmUgSk1BS0VfRU5VTV9MSVNUCi0jZWxzZQotLyogUmVwZWF0ZWQgaW5jbHVzaW9ucyBvZiB0aGlzIGZpbGUgYXJlIG5vLW9wcyB1bmxlc3MgSk1FU1NBR0UgaXMgZGVmaW5lZCAqLwotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykKLSNlbmRpZiAvKiBKRVJST1JfSCAqLwotI2VuZGlmIC8qIEpNRVNTQUdFICovCi0KLSNpZmRlZiBKTUFLRV9FTlVNX0xJU1QKLQotdHlwZWRlZiBlbnVtIHsKLQotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJY29kZSAsCi0KLSNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KLQotSk1FU1NBR0UoSk1TR19OT01FU1NBR0UsICJCb2d1cyBtZXNzYWdlIGNvZGUgJWQiKSAvKiBNdXN0IGJlIGZpcnN0IGVudHJ5ISAqLwotCi0vKiBGb3IgbWFpbnRlbmFuY2UgY29udmVuaWVuY2UsIGxpc3QgaXMgYWxwaGFiZXRpY2FsIGJ5IG1lc3NhZ2UgY29kZSBuYW1lICovCi1KTUVTU0FHRShKRVJSX0FSSVRIX05PVElNUEwsCi0JICJTb3JyeSwgdGhlcmUgYXJlIGxlZ2FsIHJlc3RyaWN0aW9ucyBvbiBhcml0aG1ldGljIGNvZGluZyIpCi1KTUVTU0FHRShKRVJSX0JBRF9BTElHTl9UWVBFLCAiQUxJR05fVFlQRSBpcyB3cm9uZywgcGxlYXNlIGZpeCIpCi1KTUVTU0FHRShKRVJSX0JBRF9BTExPQ19DSFVOSywgIk1BWF9BTExPQ19DSFVOSyBpcyB3cm9uZywgcGxlYXNlIGZpeCIpCi1KTUVTU0FHRShKRVJSX0JBRF9CVUZGRVJfTU9ERSwgIkJvZ3VzIGJ1ZmZlciBjb250cm9sIG1vZGUiKQotSk1FU1NBR0UoSkVSUl9CQURfQ09NUE9ORU5UX0lELCAiSW52YWxpZCBjb21wb25lbnQgSUQgJWQgaW4gU09TIikKLUpNRVNTQUdFKEpFUlJfQkFEX0RDVF9DT0VGLCAiRENUIGNvZWZmaWNpZW50IG91dCBvZiByYW5nZSIpCi1KTUVTU0FHRShKRVJSX0JBRF9EQ1RTSVpFLCAiSURDVCBvdXRwdXQgYmxvY2sgc2l6ZSAlZCBub3Qgc3VwcG9ydGVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX0hVRkZfVEFCTEUsICJCb2d1cyBIdWZmbWFuIHRhYmxlIGRlZmluaXRpb24iKQotSk1FU1NBR0UoSkVSUl9CQURfSU5fQ09MT1JTUEFDRSwgIkJvZ3VzIGlucHV0IGNvbG9yc3BhY2UiKQotSk1FU1NBR0UoSkVSUl9CQURfSl9DT0xPUlNQQUNFLCAiQm9ndXMgSlBFRyBjb2xvcnNwYWNlIikKLUpNRVNTQUdFKEpFUlJfQkFEX0xFTkdUSCwgIkJvZ3VzIG1hcmtlciBsZW5ndGgiKQotSk1FU1NBR0UoSkVSUl9CQURfTElCX1ZFUlNJT04sCi0JICJXcm9uZyBKUEVHIGxpYnJhcnkgdmVyc2lvbjogbGlicmFyeSBpcyAlZCwgY2FsbGVyIGV4cGVjdHMgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfTUNVX1NJWkUsICJTYW1wbGluZyBmYWN0b3JzIHRvbyBsYXJnZSBmb3IgaW50ZXJsZWF2ZWQgc2NhbiIpCi1KTUVTU0FHRShKRVJSX0JBRF9QT09MX0lELCAiSW52YWxpZCBtZW1vcnkgcG9vbCBjb2RlICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1BSRUNJU0lPTiwgIlVuc3VwcG9ydGVkIEpQRUcgZGF0YSBwcmVjaXNpb24gJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfUFJPR1JFU1NJT04sCi0JICJJbnZhbGlkIHByb2dyZXNzaXZlIHBhcmFtZXRlcnMgU3M9JWQgU2U9JWQgQWg9JWQgQWw9JWQiKQotSk1FU1NBR0UoSkVSUl9CQURfUFJPR19TQ1JJUFQsCi0JICJJbnZhbGlkIHByb2dyZXNzaXZlIHBhcmFtZXRlcnMgYXQgc2NhbiBzY3JpcHQgZW50cnkgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfU0FNUExJTkcsICJCb2d1cyBzYW1wbGluZyBmYWN0b3JzIikKLUpNRVNTQUdFKEpFUlJfQkFEX1NDQU5fU0NSSVBULCAiSW52YWxpZCBzY2FuIHNjcmlwdCBhdCBlbnRyeSAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9TVEFURSwgIkltcHJvcGVyIGNhbGwgdG8gSlBFRyBsaWJyYXJ5IGluIHN0YXRlICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1NUUlVDVF9TSVpFLAotCSAiSlBFRyBwYXJhbWV0ZXIgc3RydWN0IG1pc21hdGNoOiBsaWJyYXJ5IHRoaW5rcyBzaXplIGlzICV1LCBjYWxsZXIgZXhwZWN0cyAldSIpCi1KTUVTU0FHRShKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUywgIkJvZ3VzIHZpcnR1YWwgYXJyYXkgYWNjZXNzIikKLUpNRVNTQUdFKEpFUlJfQlVGRkVSX1NJWkUsICJCdWZmZXIgcGFzc2VkIHRvIEpQRUcgbGlicmFyeSBpcyB0b28gc21hbGwiKQotSk1FU1NBR0UoSkVSUl9DQU5UX1NVU1BFTkQsICJTdXNwZW5zaW9uIG5vdCBhbGxvd2VkIGhlcmUiKQotSk1FU1NBR0UoSkVSUl9DQ0lSNjAxX05PVElNUEwsICJDQ0lSNjAxIHNhbXBsaW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKQotSk1FU1NBR0UoSkVSUl9DT01QT05FTlRfQ09VTlQsICJUb28gbWFueSBjb2xvciBjb21wb25lbnRzOiAlZCwgbWF4ICVkIikKLUpNRVNTQUdFKEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMLCAiVW5zdXBwb3J0ZWQgY29sb3IgY29udmVyc2lvbiByZXF1ZXN0IikKLUpNRVNTQUdFKEpFUlJfREFDX0lOREVYLCAiQm9ndXMgREFDIGluZGV4ICVkIikKLUpNRVNTQUdFKEpFUlJfREFDX1ZBTFVFLCAiQm9ndXMgREFDIHZhbHVlIDB4JXgiKQotSk1FU1NBR0UoSkVSUl9ESFRfSU5ERVgsICJCb2d1cyBESFQgaW5kZXggJWQiKQotSk1FU1NBR0UoSkVSUl9EUVRfSU5ERVgsICJCb2d1cyBEUVQgaW5kZXggJWQiKQotSk1FU1NBR0UoSkVSUl9FTVBUWV9JTUFHRSwgIkVtcHR5IEpQRUcgaW1hZ2UgKEROTCBub3Qgc3VwcG9ydGVkKSIpCi1KTUVTU0FHRShKRVJSX0VNU19SRUFELCAiUmVhZCBmcm9tIEVNUyBmYWlsZWQiKQotSk1FU1NBR0UoSkVSUl9FTVNfV1JJVEUsICJXcml0ZSB0byBFTVMgZmFpbGVkIikKLUpNRVNTQUdFKEpFUlJfRU9JX0VYUEVDVEVELCAiRGlkbid0IGV4cGVjdCBtb3JlIHRoYW4gb25lIHNjYW4iKQotSk1FU1NBR0UoSkVSUl9GSUxFX1JFQUQsICJJbnB1dCBmaWxlIHJlYWQgZXJyb3IiKQotSk1FU1NBR0UoSkVSUl9GSUxFX1dSSVRFLCAiT3V0cHV0IGZpbGUgd3JpdGUgZXJyb3IgLS0tIG91dCBvZiBkaXNrIHNwYWNlPyIpCi1KTUVTU0FHRShKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMLCAiRnJhY3Rpb25hbCBzYW1wbGluZyBub3QgaW1wbGVtZW50ZWQgeWV0IikKLUpNRVNTQUdFKEpFUlJfSFVGRl9DTEVOX09WRVJGTE9XLCAiSHVmZm1hbiBjb2RlIHNpemUgdGFibGUgb3ZlcmZsb3ciKQotSk1FU1NBR0UoSkVSUl9IVUZGX01JU1NJTkdfQ09ERSwgIk1pc3NpbmcgSHVmZm1hbiBjb2RlIHRhYmxlIGVudHJ5IikKLUpNRVNTQUdFKEpFUlJfSU1BR0VfVE9PX0JJRywgIk1heGltdW0gc3VwcG9ydGVkIGltYWdlIGRpbWVuc2lvbiBpcyAldSBwaXhlbHMiKQotSk1FU1NBR0UoSkVSUl9JTlBVVF9FTVBUWSwgIkVtcHR5IGlucHV0IGZpbGUiKQotSk1FU1NBR0UoSkVSUl9JTlBVVF9FT0YsICJQcmVtYXR1cmUgZW5kIG9mIGlucHV0IGZpbGUiKQotSk1FU1NBR0UoSkVSUl9NSVNNQVRDSEVEX1FVQU5UX1RBQkxFLAotCSAiQ2Fubm90IHRyYW5zY29kZSBkdWUgdG8gbXVsdGlwbGUgdXNlIG9mIHF1YW50aXphdGlvbiB0YWJsZSAlZCIpCi1KTUVTU0FHRShKRVJSX01JU1NJTkdfREFUQSwgIlNjYW4gc2NyaXB0IGRvZXMgbm90IHRyYW5zbWl0IGFsbCBkYXRhIikKLUpNRVNTQUdFKEpFUlJfTU9ERV9DSEFOR0UsICJJbnZhbGlkIGNvbG9yIHF1YW50aXphdGlvbiBtb2RlIGNoYW5nZSIpCi1KTUVTU0FHRShKRVJSX05PVElNUEwsICJOb3QgaW1wbGVtZW50ZWQgeWV0IikKLUpNRVNTQUdFKEpFUlJfTk9UX0NPTVBJTEVELCAiUmVxdWVzdGVkIGZlYXR1cmUgd2FzIG9taXR0ZWQgYXQgY29tcGlsZSB0aW1lIikKLUpNRVNTQUdFKEpFUlJfTk9fQkFDS0lOR19TVE9SRSwgIkJhY2tpbmcgc3RvcmUgbm90IHN1cHBvcnRlZCIpCi1KTUVTU0FHRShKRVJSX05PX0hVRkZfVEFCTEUsICJIdWZmbWFuIHRhYmxlIDB4JTAyeCB3YXMgbm90IGRlZmluZWQiKQotSk1FU1NBR0UoSkVSUl9OT19JTUFHRSwgIkpQRUcgZGF0YXN0cmVhbSBjb250YWlucyBubyBpbWFnZSIpCi1KTUVTU0FHRShKRVJSX05PX1FVQU5UX1RBQkxFLCAiUXVhbnRpemF0aW9uIHRhYmxlIDB4JTAyeCB3YXMgbm90IGRlZmluZWQiKQotSk1FU1NBR0UoSkVSUl9OT19TT0ksICJOb3QgYSBKUEVHIGZpbGU6IHN0YXJ0cyB3aXRoIDB4JTAyeCAweCUwMngiKQotSk1FU1NBR0UoSkVSUl9PVVRfT0ZfTUVNT1JZLCAiSW5zdWZmaWNpZW50IG1lbW9yeSAoY2FzZSAlZCkiKQotSk1FU1NBR0UoSkVSUl9RVUFOVF9DT01QT05FTlRTLAotCSAiQ2Fubm90IHF1YW50aXplIG1vcmUgdGhhbiAlZCBjb2xvciBjb21wb25lbnRzIikKLUpNRVNTQUdFKEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgIkNhbm5vdCBxdWFudGl6ZSB0byBmZXdlciB0aGFuICVkIGNvbG9ycyIpCi1KTUVTU0FHRShKRVJSX1FVQU5UX01BTllfQ09MT1JTLCAiQ2Fubm90IHF1YW50aXplIHRvIG1vcmUgdGhhbiAlZCBjb2xvcnMiKQotSk1FU1NBR0UoSkVSUl9TT0ZfRFVQTElDQVRFLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiB0d28gU09GIG1hcmtlcnMiKQotSk1FU1NBR0UoSkVSUl9TT0ZfTk9fU09TLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiBtaXNzaW5nIFNPUyBtYXJrZXIiKQotSk1FU1NBR0UoSkVSUl9TT0ZfVU5TVVBQT1JURUQsICJVbnN1cHBvcnRlZCBKUEVHIHByb2Nlc3M6IFNPRiB0eXBlIDB4JTAyeCIpCi1KTUVTU0FHRShKRVJSX1NPSV9EVVBMSUNBVEUsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IHR3byBTT0kgbWFya2VycyIpCi1KTUVTU0FHRShKRVJSX1NPU19OT19TT0YsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IFNPUyBiZWZvcmUgU09GIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfQ1JFQVRFLCAiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSAlcyIpCi1KTUVTU0FHRShKRVJSX1RGSUxFX1JFQUQsICJSZWFkIGZhaWxlZCBvbiB0ZW1wb3JhcnkgZmlsZSIpCi1KTUVTU0FHRShKRVJSX1RGSUxFX1NFRUssICJTZWVrIGZhaWxlZCBvbiB0ZW1wb3JhcnkgZmlsZSIpCi1KTUVTU0FHRShKRVJSX1RGSUxFX1dSSVRFLAotCSAiV3JpdGUgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIC0tLSBvdXQgb2YgZGlzayBzcGFjZT8iKQotSk1FU1NBR0UoSkVSUl9UT09fTElUVExFX0RBVEEsICJBcHBsaWNhdGlvbiB0cmFuc2ZlcnJlZCB0b28gZmV3IHNjYW5saW5lcyIpCi1KTUVTU0FHRShKRVJSX1VOS05PV05fTUFSS0VSLCAiVW5zdXBwb3J0ZWQgbWFya2VyIHR5cGUgMHglMDJ4IikKLUpNRVNTQUdFKEpFUlJfVklSVFVBTF9CVUcsICJWaXJ0dWFsIGFycmF5IGNvbnRyb2xsZXIgbWVzc2VkIHVwIikKLUpNRVNTQUdFKEpFUlJfV0lEVEhfT1ZFUkZMT1csICJJbWFnZSB0b28gd2lkZSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiIpCi1KTUVTU0FHRShKRVJSX1hNU19SRUFELCAiUmVhZCBmcm9tIFhNUyBmYWlsZWQiKQotSk1FU1NBR0UoSkVSUl9YTVNfV1JJVEUsICJXcml0ZSB0byBYTVMgZmFpbGVkIikKLUpNRVNTQUdFKEpNU0dfQ09QWVJJR0hULCBKQ09QWVJJR0hUKQotSk1FU1NBR0UoSk1TR19WRVJTSU9OLCBKVkVSU0lPTikKLUpNRVNTQUdFKEpUUkNfMTZCSVRfVEFCTEVTLAotCSAiQ2F1dGlvbjogcXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgdG9vIGNvYXJzZSBmb3IgYmFzZWxpbmUgSlBFRyIpCi1KTUVTU0FHRShKVFJDX0FET0JFLAotCSAiQWRvYmUgQVBQMTQgbWFya2VyOiB2ZXJzaW9uICVkLCBmbGFncyAweCUwNHggMHglMDR4LCB0cmFuc2Zvcm0gJWQiKQotSk1FU1NBR0UoSlRSQ19BUFAwLCAiVW5rbm93biBBUFAwIG1hcmtlciAobm90IEpGSUYpLCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19BUFAxNCwgIlVua25vd24gQVBQMTQgbWFya2VyIChub3QgQWRvYmUpLCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19EQUMsICJEZWZpbmUgQXJpdGhtZXRpYyBUYWJsZSAweCUwMng6IDB4JTAyeCIpCi1KTUVTU0FHRShKVFJDX0RIVCwgIkRlZmluZSBIdWZmbWFuIFRhYmxlIDB4JTAyeCIpCi1KTUVTU0FHRShKVFJDX0RRVCwgIkRlZmluZSBRdWFudGl6YXRpb24gVGFibGUgJWQgIHByZWNpc2lvbiAlZCIpCi1KTUVTU0FHRShKVFJDX0RSSSwgIkRlZmluZSBSZXN0YXJ0IEludGVydmFsICV1IikKLUpNRVNTQUdFKEpUUkNfRU1TX0NMT1NFLCAiRnJlZWQgRU1TIGhhbmRsZSAldSIpCi1KTUVTU0FHRShKVFJDX0VNU19PUEVOLCAiT2J0YWluZWQgRU1TIGhhbmRsZSAldSIpCi1KTUVTU0FHRShKVFJDX0VPSSwgIkVuZCBPZiBJbWFnZSIpCi1KTUVTU0FHRShKVFJDX0hVRkZCSVRTLCAiICAgICAgICAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkIikKLUpNRVNTQUdFKEpUUkNfSkZJRiwgIkpGSUYgQVBQMCBtYXJrZXI6IHZlcnNpb24gJWQuJTAyZCwgZGVuc2l0eSAlZHglZCAgJWQiKQotSk1FU1NBR0UoSlRSQ19KRklGX0JBRFRIVU1CTkFJTFNJWkUsCi0JICJXYXJuaW5nOiB0aHVtYm5haWwgaW1hZ2Ugc2l6ZSBkb2VzIG5vdCBtYXRjaCBkYXRhIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX0pGSUZfRVhURU5TSU9OLAotCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiB0eXBlIDB4JTAyeCwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfSkZJRl9USFVNQk5BSUwsICIgICAgd2l0aCAlZCB4ICVkIHRodW1ibmFpbCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX01JU0NfTUFSS0VSLCAiTWlzY2VsbGFuZW91cyBtYXJrZXIgMHglMDJ4LCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19QQVJNTEVTU19NQVJLRVIsICJVbmV4cGVjdGVkIG1hcmtlciAweCUwMngiKQotSk1FU1NBR0UoSlRSQ19RVUFOVFZBTFMsICIgICAgICAgICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUiKQotSk1FU1NBR0UoSlRSQ19RVUFOVF8zX05DT0xPUlMsICJRdWFudGl6aW5nIHRvICVkID0gJWQqJWQqJWQgY29sb3JzIikKLUpNRVNTQUdFKEpUUkNfUVVBTlRfTkNPTE9SUywgIlF1YW50aXppbmcgdG8gJWQgY29sb3JzIikKLUpNRVNTQUdFKEpUUkNfUVVBTlRfU0VMRUNURUQsICJTZWxlY3RlZCAlZCBjb2xvcnMgZm9yIHF1YW50aXphdGlvbiIpCi1KTUVTU0FHRShKVFJDX1JFQ09WRVJZX0FDVElPTiwgIkF0IG1hcmtlciAweCUwMngsIHJlY292ZXJ5IGFjdGlvbiAlZCIpCi1KTUVTU0FHRShKVFJDX1JTVCwgIlJTVCVkIikKLUpNRVNTQUdFKEpUUkNfU01PT1RIX05PVElNUEwsCi0JICJTbW9vdGhpbmcgbm90IHN1cHBvcnRlZCB3aXRoIG5vbnN0YW5kYXJkIHNhbXBsaW5nIHJhdGlvcyIpCi1KTUVTU0FHRShKVFJDX1NPRiwgIlN0YXJ0IE9mIEZyYW1lIDB4JTAyeDogd2lkdGg9JXUsIGhlaWdodD0ldSwgY29tcG9uZW50cz0lZCIpCi1KTUVTU0FHRShKVFJDX1NPRl9DT01QT05FTlQsICIgICAgQ29tcG9uZW50ICVkOiAlZGh4JWR2IHE9JWQiKQotSk1FU1NBR0UoSlRSQ19TT0ksICJTdGFydCBvZiBJbWFnZSIpCi1KTUVTU0FHRShKVFJDX1NPUywgIlN0YXJ0IE9mIFNjYW46ICVkIGNvbXBvbmVudHMiKQotSk1FU1NBR0UoSlRSQ19TT1NfQ09NUE9ORU5ULCAiICAgIENvbXBvbmVudCAlZDogZGM9JWQgYWM9JWQiKQotSk1FU1NBR0UoSlRSQ19TT1NfUEFSQU1TLCAiICBTcz0lZCwgU2U9JWQsIEFoPSVkLCBBbD0lZCIpCi1KTUVTU0FHRShKVFJDX1RGSUxFX0NMT1NFLCAiQ2xvc2VkIHRlbXBvcmFyeSBmaWxlICVzIikKLUpNRVNTQUdFKEpUUkNfVEZJTEVfT1BFTiwgIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZSAlcyIpCi1KTUVTU0FHRShKVFJDX1RIVU1CX0pQRUcsCi0JICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IEpQRUctY29tcHJlc3NlZCB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX1RIVU1CX1BBTEVUVEUsCi0JICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHBhbGV0dGUgdGh1bWJuYWlsIGltYWdlLCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19USFVNQl9SR0IsCi0JICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IFJHQiB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX1VOS05PV05fSURTLAotCSAiVW5yZWNvZ25pemVkIGNvbXBvbmVudCBJRHMgJWQgJWQgJWQsIGFzc3VtaW5nIFlDYkNyIikKLUpNRVNTQUdFKEpUUkNfWE1TX0NMT1NFLCAiRnJlZWQgWE1TIGhhbmRsZSAldSIpCi1KTUVTU0FHRShKVFJDX1hNU19PUEVOLCAiT2J0YWluZWQgWE1TIGhhbmRsZSAldSIpCi1KTUVTU0FHRShKV1JOX0FET0JFX1hGT1JNLCAiVW5rbm93biBBZG9iZSBjb2xvciB0cmFuc2Zvcm0gY29kZSAlZCIpCi1KTUVTU0FHRShKV1JOX0JPR1VTX1BST0dSRVNTSU9OLAotCSAiSW5jb25zaXN0ZW50IHByb2dyZXNzaW9uIHNlcXVlbmNlIGZvciBjb21wb25lbnQgJWQgY29lZmZpY2llbnQgJWQiKQotSk1FU1NBR0UoSldSTl9FWFRSQU5FT1VTX0RBVEEsCi0JICJDb3JydXB0IEpQRUcgZGF0YTogJXUgZXh0cmFuZW91cyBieXRlcyBiZWZvcmUgbWFya2VyIDB4JTAyeCIpCi1KTUVTU0FHRShKV1JOX0hJVF9NQVJLRVIsICJDb3JydXB0IEpQRUcgZGF0YTogcHJlbWF0dXJlIGVuZCBvZiBkYXRhIHNlZ21lbnQiKQotSk1FU1NBR0UoSldSTl9IVUZGX0JBRF9DT0RFLCAiQ29ycnVwdCBKUEVHIGRhdGE6IGJhZCBIdWZmbWFuIGNvZGUiKQotSk1FU1NBR0UoSldSTl9KRklGX01BSk9SLCAiV2FybmluZzogdW5rbm93biBKRklGIHJldmlzaW9uIG51bWJlciAlZC4lMDJkIikKLUpNRVNTQUdFKEpXUk5fSlBFR19FT0YsICJQcmVtYXR1cmUgZW5kIG9mIEpQRUcgZmlsZSIpCi1KTUVTU0FHRShKV1JOX01VU1RfUkVTWU5DLAotCSAiQ29ycnVwdCBKUEVHIGRhdGE6IGZvdW5kIG1hcmtlciAweCUwMnggaW5zdGVhZCBvZiBSU1QlZCIpCi1KTUVTU0FHRShKV1JOX05PVF9TRVFVRU5USUFMLCAiSW52YWxpZCBTT1MgcGFyYW1ldGVycyBmb3Igc2VxdWVudGlhbCBKUEVHIikKLUpNRVNTQUdFKEpXUk5fVE9PX01VQ0hfREFUQSwgIkFwcGxpY2F0aW9uIHRyYW5zZmVycmVkIHRvbyBtYW55IHNjYW5saW5lcyIpCi0KLSNpZmRlZiBKTUFLRV9FTlVNX0xJU1QKLQotICBKTVNHX0xBU1RNU0dDT0RFCi19IEpfTUVTU0FHRV9DT0RFOwotCi0jdW5kZWYgSk1BS0VfRU5VTV9MSVNUCi0jZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCi0KLS8qIFphcCBKTUVTU0FHRSBtYWNybyBzbyB0aGF0IGZ1dHVyZSByZS1pbmNsdXNpb25zIGRvIG5vdGhpbmcgYnkgZGVmYXVsdCAqLwotI3VuZGVmIEpNRVNTQUdFCi0KLQotI2lmbmRlZiBKRVJST1JfSAotI2RlZmluZSBKRVJST1JfSAotCi0vKiBNYWNyb3MgdG8gc2ltcGxpZnkgdXNpbmcgdGhlIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlIHN0dWZmICovCi0vKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGVpdGhlciB0eXBlIG9mIGNpbmZvIHBvaW50ZXIgKi8KLQotLyogRmF0YWwgZXJyb3JzIChwcmludCBtZXNzYWdlIGFuZCBleGl0KSAqLwotI2RlZmluZSBFUlJFWElUKGNpbmZvLGNvZGUpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUMShjaW5mbyxjb2RlLHAxKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLSNkZWZpbmUgRVJSRVhJVDIoY2luZm8sY29kZSxwMSxwMikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVQzKGNpbmZvLGNvZGUscDEscDIscDMpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMl0gPSAocDMpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUNChjaW5mbyxjb2RlLHAxLHAyLHAzLHA0KSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzJdID0gKHAzKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzNdID0gKHA0KSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLSNkZWZpbmUgRVJSRVhJVFMoY2luZm8sY29kZSxzdHIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICBzdHJuY3B5KChjaW5mbyktPmVyci0+bXNnX3Bhcm0ucywgKHN0ciksIEpNU0dfU1RSX1BBUk1fTUFYKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLQotI2RlZmluZSBNQUtFU1RNVChzdHVmZikJCWRvIHsgc3R1ZmYgfSB3aGlsZSAoMCkKLQotLyogTm9uZmF0YWwgZXJyb3JzICh3ZSBjYW4ga2VlcCBnb2luZywgYnV0IHRoZSBkYXRhIGlzIHByb2JhYmx5IGNvcnJ1cHQpICovCi0jZGVmaW5lIFdBUk5NUyhjaW5mbyxjb2RlKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIC0xKSkKLSNkZWZpbmUgV0FSTk1TMShjaW5mbyxjb2RlLHAxKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIC0xKSkKLSNkZWZpbmUgV0FSTk1TMihjaW5mbyxjb2RlLHAxLHAyKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIC0xKSkKLQotLyogSW5mb3JtYXRpb25hbC9kZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KLSNkZWZpbmUgVFJBQ0VNUyhjaW5mbyxsdmwsY29kZSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCi0jZGVmaW5lIFRSQUNFTVMxKGNpbmZvLGx2bCxjb2RlLHAxKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKLSNkZWZpbmUgVFJBQ0VNUzIoY2luZm8sbHZsLGNvZGUscDEscDIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQotI2RlZmluZSBUUkFDRU1TMyhjaW5mbyxsdmwsY29kZSxwMSxwMixwMykgIFwKLSAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCi0JICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgXAotCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKLQkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCi0jZGVmaW5lIFRSQUNFTVM0KGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzLHA0KSAgXAotICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKLQkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBfbXBbM10gPSAocDQpOyBcCi0JICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAotCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKLSNkZWZpbmUgVFJBQ0VNUzUoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQscDUpICBcCi0gIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAotCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKLQkgICBfbXBbNF0gPSAocDUpOyBcCi0JICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAotCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKLSNkZWZpbmUgVFJBQ0VNUzgoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQscDUscDYscDcscDgpICBcCi0gIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAotCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKLQkgICBfbXBbNF0gPSAocDUpOyBfbXBbNV0gPSAocDYpOyBfbXBbNl0gPSAocDcpOyBfbXBbN10gPSAocDgpOyBcCi0JICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAotCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKLSNkZWZpbmUgVFJBQ0VNU1MoY2luZm8sbHZsLGNvZGUsc3RyKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgc3RybmNweSgoY2luZm8pLT5lcnItPm1zZ19wYXJtLnMsIChzdHIpLCBKTVNHX1NUUl9QQVJNX01BWCksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCi0KLSNlbmRpZiAvKiBKRVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamZkY3RmbHQuYyBiL2xpYmpwZWd0d3JwL2pmZGN0Zmx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDdhMDAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamZkY3RmbHQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogamZkY3RmbHQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIGVpdGhlciBvZiB0aGUgaW50ZWdlcgotICogRENUIGltcGxlbWVudGF0aW9ucy4gIEhvd2V2ZXIsIGl0IG1heSBub3QgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIG9uIGFsbAotICogbWFjaGluZXMgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbiByb3VuZG9mZiBiZWhhdmlvci4gIFNwZWVkIHdpbGwgZGVwZW5kCi0gKiBvbiB0aGUgaGFyZHdhcmUncyBmbG9hdGluZyBwb2ludCBjYXBhY2l0eS4KLSAqCi0gKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCi0gKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCi0gKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKLSAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCi0gKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKLSAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCi0gKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KLSAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcwotICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQotICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQotICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCi0gKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcwotICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KLSAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggYSBmaXhlZC1wb2ludAotICogaW1wbGVtZW50YXRpb24sIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAqIHNjYWxlZCBxdWFudGl6YXRpb24gdmFsdWVzLiAgSG93ZXZlciwgdGhhdCBwcm9ibGVtIGRvZXMgbm90IGFyaXNlIGlmCi0gKiB3ZSB1c2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKgotICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZkY3RfZmxvYXQgKEZBU1RfRkxPQVQgKiBkYXRhKQotewotICBGQVNUX0ZMT0FUIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gIEZBU1RfRkxPQVQgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7Ci0gIEZBU1RfRkxPQVQgejEsIHoyLCB6MywgejQsIHo1LCB6MTEsIHoxMzsKLSAgRkFTVF9GTE9BVCAqZGF0YXB0cjsKLSAgaW50IGN0cjsKLQotICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKLSAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107Ci0gICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOwotICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKLSAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07Ci0gICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOwotICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKLSAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCi0gICAgZGF0YXB0cls0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCi0gICAgejEgPSAodG1wMTIgKyB0bXAxMykgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KLSAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLwotICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9ICh0bXAxMCAtIHRtcDEyKSAqICgoRkFTVF9GTE9BVCkgMC4zODI2ODM0MzMpOyAvKiBjNiAqLwotICAgIHoyID0gKChGQVNUX0ZMT0FUKSAwLjU0MTE5NjEwMCkgKiB0bXAxMCArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gKChGQVNUX0ZMT0FUKSAxLjMwNjU2Mjk2NSkgKiB0bXAxMiArIHo1OyAvKiBjMitjNiAqLwotICAgIHozID0gdG1wMTEgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KLQotICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KLSAgICB6MTMgPSB0bXA3IC0gejM7Ci0KLSAgICBkYXRhcHRyWzVdID0gejEzICsgejI7CS8qIHBoYXNlIDYgKi8KLSAgICBkYXRhcHRyWzNdID0gejEzIC0gejI7Ci0gICAgZGF0YXB0clsxXSA9IHoxMSArIHo0OwotICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKLQotICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci0KLSAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOwotICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKLSAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07Ci0gICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOwotICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSowXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOwotICAgIAotICAgIHoxID0gKHRtcDEyICsgdG1wMTMpICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gdG1wMTMgKyB6MTsgLyogcGhhc2UgNSAqLwotICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IHRtcDEzIC0gejE7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OwotICAgIHRtcDEyID0gdG1wNiArIHRtcDc7Ci0KLSAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLwotICAgIHo1ID0gKHRtcDEwIC0gdG1wMTIpICogKChGQVNUX0ZMT0FUKSAwLjM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSAoKEZBU1RfRkxPQVQpIDAuNTQxMTk2MTAwKSAqIHRtcDEwICsgejU7IC8qIGMyLWM2ICovCi0gICAgejQgPSAoKEZBU1RfRkxPQVQpIDEuMzA2NTYyOTY1KSAqIHRtcDEyICsgejU7IC8qIGMyK2M2ICovCi0gICAgejMgPSB0bXAxMSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHoxMyArIHoyOyAvKiBwaGFzZSA2ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gejEzIC0gejI7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjddID0gejExIC0gejQ7Ci0KLSAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pmZGN0ZnN0LmMgYi9saWJqcGVndHdycC9qZmRjdGZzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IzNzhhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pmZGN0ZnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIGpmZGN0ZnN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgotICoKLSAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKLSAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKLSAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgotICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KLSAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAotICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKLSAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgotICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCi0gKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCi0gKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCi0gKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCi0gKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgotICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAotICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKLSAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcwotICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQotICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qIFNjYWxpbmcgZGVjaXNpb25zIGFyZSBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgaW4gdGhlIExMJk0gYWxnb3JpdGhtOwotICogc2VlIGpmZGN0aW50LmMgZm9yIG1vcmUgZGV0YWlscy4gIEhvd2V2ZXIsIHdlIGNob29zZSB0byBkZXNjYWxlCi0gKiAocmlnaHQgc2hpZnQpIG11bHRpcGxpY2F0aW9uIHByb2R1Y3RzIGFzIHNvb24gYXMgdGhleSBhcmUgZm9ybWVkLAotICogcmF0aGVyIHRoYW4gY2FycnlpbmcgYWRkaXRpb25hbCBmcmFjdGlvbmFsIGJpdHMgaW50byBzdWJzZXF1ZW50IGFkZGl0aW9ucy4KLSAqIFRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgc2xpZ2h0bHksIGJ1dCBpdCBsZXRzIHVzIHNhdmUgYSBmZXcgc2hpZnRzLgotICogTW9yZSBpbXBvcnRhbnRseSwgMTYtYml0IGFyaXRobWV0aWMgaXMgdGhlbiBhZGVxdWF0ZSAoZm9yIDgtYml0IHNhbXBsZXMpCi0gKiBldmVyeXdoZXJlIGV4Y2VwdCBpbiB0aGUgbXVsdGlwbGljYXRpb25zIHByb3BlcjsgdGhpcyBzYXZlcyBhIGdvb2QgZGVhbAotICogb2Ygd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgotICoKLSAqIEFnYWluIHRvIHNhdmUgYSBmZXcgc2hpZnRzLCB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYmV0d2VlbiBwYXNzIDEgYW5kCi0gKiBwYXNzIDIgYXJlIG5vdCB1cHNjYWxlZCwgYnV0IGFyZSByZXByZXNlbnRlZCBvbmx5IHRvIGludGVncmFsIHByZWNpc2lvbi4KLSAqCi0gKiBBIGZpbmFsIGNvbXByb21pc2UgaXMgdG8gcmVwcmVzZW50IHRoZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudHMgdG8gb25seQotICogOCBmcmFjdGlvbmFsIGJpdHMsIHJhdGhlciB0aGFuIDEzLiAgVGhpcyBzYXZlcyBzb21lIHNoaWZ0aW5nIHdvcmsgb24gc29tZQotICogbWFjaGluZXMsIGFuZCBtYXkgYWxzbyByZWR1Y2UgdGhlIGNvc3Qgb2YgbXVsdGlwbGljYXRpb24gKHNpbmNlIHRoZXJlCi0gKiBhcmUgZmV3ZXIgb25lLWJpdHMgaW4gdGhlIGNvbnN0YW50cykuCi0gKi8KLQotI2RlZmluZSBDT05TVF9CSVRTICA4Ci0KLQotLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCi0gKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KLSAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCi0gKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCi0gKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQotICovCi0KLSNpZiBDT05TVF9CSVRTID09IDgKLSNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICAoKElOVDMyKSAgIDk4KQkJLyogRklYKDAuMzgyNjgzNDMzKSAqLwotI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICAxMzkpCQkvKiBGSVgoMC41NDExOTYxMDApICovCi0jZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgKChJTlQzMikgIDE4MSkJCS8qIEZJWCgwLjcwNzEwNjc4MSkgKi8KLSNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICAoKElOVDMyKSAgMzM0KQkJLyogRklYKDEuMzA2NTYyOTY1KSAqLwotI2Vsc2UKLSNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICBGSVgoMC4zODI2ODM0MzMpCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQotI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgIEZJWCgwLjcwNzEwNjc4MSkKLSNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICBGSVgoMS4zMDY1NjI5NjUpCi0jZW5kaWYKLQotCi0vKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAotICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKLSAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KLSAqLwotCi0jaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORwotI3VuZGVmIERFU0NBTEUKLSNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQotI2VuZGlmCi0KLQotLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKLSAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KLSAqLwotCi0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQotCi0KLS8qCi0gKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZmRjdF9pZmFzdCAoRENURUxFTSAqIGRhdGEpCi17Ci0gIERDVEVMRU0gdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgRENURUxFTSB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKLSAgRENURUxFTSB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOwotICBEQ1RFTEVNICpkYXRhcHRyOwotICBpbnQgY3RyOwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLwotCi0gIGRhdGFwdHIgPSBkYXRhOwotICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7Ci0gICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOwotICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKLSAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07Ci0gICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOwotICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKLSAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07Ci0gICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOwotICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0clswXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KLSAgICBkYXRhcHRyWzRdID0gdG1wMTAgLSB0bXAxMTsKLSAgICAKLSAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCi0gICAgZGF0YXB0clsyXSA9IHRtcDEzICsgejE7CS8qIHBoYXNlIDUgKi8KLSAgICBkYXRhcHRyWzZdID0gdG1wMTMgLSB6MTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLwotICAgIHRtcDExID0gdG1wNSArIHRtcDY7Ci0gICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKLQotICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCi0gICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLwotICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KLSAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCi0gICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KLQotICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KLSAgICB6MTMgPSB0bXA3IC0gejM7Ci0KLSAgICBkYXRhcHRyWzVdID0gejEzICsgejI7CS8qIHBoYXNlIDYgKi8KLSAgICBkYXRhcHRyWzNdID0gejEzIC0gejI7Ci0gICAgZGF0YXB0clsxXSA9IHoxMSArIHo0OwotICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKLQotICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci0KLSAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOwotICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKLSAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07Ci0gICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOwotICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSowXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSB0bXAxMyArIHoxOyAvKiBwaGFzZSA1ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLwotICAgIHRtcDExID0gdG1wNSArIHRtcDY7Ci0gICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKLQotICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCi0gICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLwotICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KLSAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCi0gICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KLQotICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KLSAgICB6MTMgPSB0bXA3IC0gejM7Ci0KLSAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSB6MTMgKyB6MjsgLyogcGhhc2UgNiAqLwotICAgIGRhdGFwdHJbRENUU0laRSozXSA9IHoxMyAtIHoyOwotICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IHoxMSArIHo0OwotICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IHoxMSAtIHo0OwotCi0gICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBEQ1RfSUZBU1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qZmRjdGludC5jIGIvbGlianBlZ3R3cnAvamZkY3RpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3OGI2NC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qZmRjdGludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBqZmRjdGludC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgotICoKLSAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKLSAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKLSAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgotICogICBDLiBMb2VmZmxlciwgQS4gTGlndGVuYmVyZyBhbmQgRy4gTW9zY2h5dHosICJQcmFjdGljYWwgRmFzdCAxLUQgRENUCi0gKiAgIEFsZ29yaXRobXMgd2l0aCAxMSBNdWx0aXBsaWNhdGlvbnMiLCBQcm9jLiBJbnQnbC4gQ29uZi4gb24gQWNvdXN0aWNzLAotICogICBTcGVlY2gsIGFuZCBTaWduYWwgUHJvY2Vzc2luZyAxOTg5IChJQ0FTU1AgJzg5KSwgcHAuIDk4OC05OTEuCi0gKiBUaGUgcHJpbWFyeSBhbGdvcml0aG0gZGVzY3JpYmVkIHRoZXJlIHVzZXMgMTEgbXVsdGlwbGllcyBhbmQgMjkgYWRkcy4KLSAqIFdlIHVzZSB0aGVpciBhbHRlcm5hdGUgbWV0aG9kIHdpdGggMTIgbXVsdGlwbGllcyBhbmQgMzIgYWRkcy4KLSAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCBubyBkYXRhIHBhdGggY29udGFpbnMgbW9yZSB0aGFuIG9uZQotICogbXVsdGlwbGljYXRpb247IHRoaXMgYWxsb3dzIGEgdmVyeSBzaW1wbGUgYW5kIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uIGluCi0gKiBzY2FsZWQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYywgd2l0aCBhIG1pbmltYWwgbnVtYmVyIG9mIHNoaWZ0cy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKgotICogVGhlIHBvb3Agb24gdGhpcyBzY2FsaW5nIHN0dWZmIGlzIGFzIGZvbGxvd3M6Ci0gKgotICogRWFjaCAxLUQgRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQotICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCi0gKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQotICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgotICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIERDVCwKLSAqIGJlY2F1c2UgdGhlIHkwIGFuZCB5NCBvdXRwdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KLSAqIEluIHRoZSBJSkcgY29kZSwgdGhpcyBmYWN0b3Igb2YgOCBpcyByZW1vdmVkIGJ5IHRoZSBxdWFudGl6YXRpb24gc3RlcAotICogKGluIGpjZGN0bWdyLmMpLCBOT1QgaW4gdGhpcyBtb2R1bGUuCi0gKgotICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAotICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcwotICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCi0gKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZwotICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKLSAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgotICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQotICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCi0gKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCi0gKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgotICoKLSAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKLSAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKLSAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKLSAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoRm9yIDEyLWJpdCBzYW1wbGUgZGF0YSwgdGhlIGludGVybWVkaWF0ZQotICogYXJyYXkgaXMgSU5UMzIgYW55d2F5LikKLSAqCi0gKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAotICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCi0gKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMgotI2Vsc2UKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSNlbmRpZgotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gMTMKLSNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoKElOVDMyKSAgMjQ0NikJLyogRklYKDAuMjk4NjMxMzM2KSAqLwotI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoSU5UMzIpICAzMTk2KQkvKiBGSVgoMC4zOTAxODA2NDQpICovCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDQ0MzMpCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLwotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCi0jZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgKChJTlQzMikgIDk2MzMpCS8qIEZJWCgxLjE3NTg3NTYwMikgKi8KLSNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoKElOVDMyKSAgMTIyOTkpCS8qIEZJWCgxLjUwMTMyMTExMCkgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICAoKElOVDMyKSAgMTYwNjkpCS8qIEZJWCgxLjk2MTU3MDU2MCkgKi8KLSNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoKElOVDMyKSAgMTY4MTkpCS8qIEZJWCgyLjA1MzExOTg2OSkgKi8KLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KLSNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICAoKElOVDMyKSAgMjUxNzIpCS8qIEZJWCgzLjA3MjcxMTAyNikgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgRklYKDAuMjk4NjMxMzM2KQotI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgIEZJWCgwLjM5MDE4MDY0NCkKLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKLSNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICBGSVgoMS4xNzU4NzU2MDIpCi0jZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgRklYKDEuNTAxMzIxMTEwKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICBGSVgoMS45NjE1NzA1NjApCi0jZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgRklYKDIuMDUzMTE5ODY5KQotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKLSNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICBGSVgoMy4wNzI3MTEwMjYpCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCi0gKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCi0gKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCi0gKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgotICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKLSNlbHNlCi0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCi0jZW5kaWYKLQotCi0vKgotICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZkY3RfaXNsb3cgKERDVEVMRU0gKiBkYXRhKQotewotICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKLSAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OwotICBEQ1RFTEVNICpkYXRhcHRyOwotICBpbnQgY3RyOwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLwotICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCi0gIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLwotCi0gIGRhdGFwdHIgPSBkYXRhOwotICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7Ci0gICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOwotICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKLSAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07Ci0gICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOwotICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKLSAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07Ci0gICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOwotICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKLSAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgotICAgICAqLwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKSAoKHRtcDEwICsgdG1wMTEpIDw8IFBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkgKCh0bXAxMCAtIHRtcDExKSA8PCBQQVNTMV9CSVRTKTsKLSAgICAKLSAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCi0JCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAotCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgotICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgotICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KLSAgICAgKi8KLSAgICAKLSAgICB6MSA9IHRtcDQgKyB0bXA3OwotICAgIHoyID0gdG1wNSArIHRtcDY7Ci0gICAgejMgPSB0bXA0ICsgdG1wNjsKLSAgICB6NCA9IHRtcDUgKyB0bXA3OwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA0ICsgejEgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNSArIHoyICsgejQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICAKLSAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotCi0gIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgotICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAotICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgotICAgKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKLSAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgotICAgICAqLwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgKyB0bXAxMSwgUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgLSB0bXAxMSwgUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOwotICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIAotICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KLSAgICAgKiBjSyByZXByZXNlbnRzIGNvcyhLKnBpLzE2KS4KLSAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXA0Li50bXA3IGhlcmUuCi0gICAgICovCi0gICAgCi0gICAgejEgPSB0bXA0ICsgdG1wNzsKLSAgICB6MiA9IHRtcDUgKyB0bXA2OwotICAgIHozID0gdG1wNCArIHRtcDY7Ci0gICAgejQgPSB0bXA1ICsgdG1wNzsKLSAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLwotICAgIAotICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KLSAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCi0gICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCi0gICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KLSAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLwotICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KLSAgICAKLSAgICB6MyArPSB6NTsKLSAgICB6NCArPSB6NTsKLSAgICAKLSAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA0ICsgejEgKyB6MywKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA2ICsgejIgKyB6MywKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICAKLSAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ppZGN0Zmx0LmMgYi9saWJqcGVndHdycC9qaWRjdGZsdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg4Y2UzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ppZGN0Zmx0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIGppZGN0Zmx0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZsb2F0aW5nLXBvaW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKLSAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIGVpdGhlciBvZiB0aGUgaW50ZWdlcgotICogSURDVCBpbXBsZW1lbnRhdGlvbnMuICBIb3dldmVyLCBpdCBtYXkgbm90IGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBvbiBhbGwKLSAqIG1hY2hpbmVzIGJlY2F1c2Ugb2YgZGlmZmVyZW5jZXMgaW4gcm91bmRvZmYgYmVoYXZpb3IuICBTcGVlZCB3aWxsIGRlcGVuZAotICogb24gdGhlIGhhcmR3YXJlJ3MgZmxvYXRpbmcgcG9pbnQgY2FwYWNpdHkuCi0gKgotICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAotICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0Ci0gKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCi0gKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgotICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KLSAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAotICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKLSAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgotICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCi0gKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCi0gKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCi0gKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCi0gKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgotICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBhIGZpeGVkLXBvaW50Ci0gKiBpbXBsZW1lbnRhdGlvbiwgYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICogc2NhbGVkIHF1YW50aXphdGlvbiB2YWx1ZXMuICBIb3dldmVyLCB0aGF0IHByb2JsZW0gZG9lcyBub3QgYXJpc2UgaWYKLSAqIHdlIHVzZSBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQotICogZW50cnk7IHByb2R1Y2UgYSBmbG9hdCByZXN1bHQuCi0gKi8KLQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChGQVNUX0ZMT0FUKSAoY29lZikpICogKHF1YW50dmFsKSkKLQotCi0vKgotICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF9mbG9hdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIEZBU1RfRkxPQVQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgRkFTVF9GTE9BVCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKLSAgRkFTVF9GTE9BVCB6NSwgejEwLCB6MTEsIHoxMiwgejEzOwotICBKQ09FRlBUUiBpbnB0cjsKLSAgRkxPQVRfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEZBU1RfRkxPQVQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKEZMT0FUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAotICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCi0gICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKLSAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCi0gICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCi0gICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQotICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgotICAgICAqLwotICAgIAotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBGQVNUX0ZMT0FUIGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICAgIAotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOwotICAgICAgCi0gICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICAgIHF1YW50cHRyKys7Ci0gICAgICB3c3B0cisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotCi0gICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7Ci0gICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7Ci0gICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7Ci0KLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwkvKiBwaGFzZSAzICovCi0gICAgdG1wMTEgPSB0bXAwIC0gdG1wMjsKLQotICAgIHRtcDEzID0gdG1wMSArIHRtcDM7CS8qIHBoYXNlcyA1LTMgKi8KLSAgICB0bXAxMiA9ICh0bXAxIC0gdG1wMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCi0KLSAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOwotICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOwotICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXA0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLSAgICB0bXA1ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKLSAgICB0bXA2ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB0bXA3ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKLQotICAgIHoxMyA9IHRtcDYgKyB0bXA1OwkJLyogcGhhc2UgNiAqLwotICAgIHoxMCA9IHRtcDYgLSB0bXA1OwotICAgIHoxMSA9IHRtcDQgKyB0bXA3OwotICAgIHoxMiA9IHRtcDQgLSB0bXA3OwotCi0gICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KLSAgICB0bXAxMSA9ICh6MTEgLSB6MTMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KLQotICAgIHo1ID0gKHoxMCArIHoxMikgKiAoKEZBU1RfRkxPQVQpIDEuODQ3NzU5MDY1KTsgLyogMipjMiAqLwotICAgIHRtcDEwID0gKChGQVNUX0ZMT0FUKSAxLjA4MjM5MjIwMCkgKiB6MTIgLSB6NTsgLyogMiooYzItYzYpICovCi0gICAgdG1wMTIgPSAoKEZBU1RfRkxPQVQpIC0yLjYxMzEyNTkzMCkgKiB6MTAgKyB6NTsgLyogLTIqKGMyK2M2KSAqLwotCi0gICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7Ci0gICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKLQotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSB0bXAwICsgdG1wNzsKLSAgICB3c3B0cltEQ1RTSVpFKjddID0gdG1wMCAtIHRtcDc7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IHRtcDEgKyB0bXA2OwotICAgIHdzcHRyW0RDVFNJWkUqNl0gPSB0bXAxIC0gdG1wNjsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gdG1wMiArIHRtcDU7Ci0gICAgd3NwdHJbRENUU0laRSo1XSA9IHRtcDIgLSB0bXA1OwotICAgIHdzcHRyW0RDVFNJWkUqNF0gPSB0bXAzICsgdG1wNDsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gdG1wMyAtIHRtcDQ7Ci0KLSAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIHdzcHRyKys7Ci0gIH0KLSAgCi0gIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0gIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgotICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbwotICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgotICAgICAqIEFuZCB0ZXN0aW5nIGZsb2F0cyBmb3IgemVybyBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSwgc28gd2UgZG9uJ3QgYm90aGVyLgotICAgICAqLwotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotCi0gICAgdG1wMTAgPSB3c3B0clswXSArIHdzcHRyWzRdOwotICAgIHRtcDExID0gd3NwdHJbMF0gLSB3c3B0cls0XTsKLQotICAgIHRtcDEzID0gd3NwdHJbMl0gKyB3c3B0cls2XTsKLSAgICB0bXAxMiA9ICh3c3B0clsyXSAtIHdzcHRyWzZdKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpIC0gdG1wMTM7Ci0KLSAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsKLSAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKLSAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKLSAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKLQotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB6MTMgPSB3c3B0cls1XSArIHdzcHRyWzNdOwotICAgIHoxMCA9IHdzcHRyWzVdIC0gd3NwdHJbM107Ci0gICAgejExID0gd3NwdHJbMV0gKyB3c3B0cls3XTsKLSAgICB6MTIgPSB3c3B0clsxXSAtIHdzcHRyWzddOwotCi0gICAgdG1wNyA9IHoxMSArIHoxMzsKLSAgICB0bXAxMSA9ICh6MTEgLSB6MTMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2Mik7Ci0KLSAgICB6NSA9ICh6MTAgKyB6MTIpICogKChGQVNUX0ZMT0FUKSAxLjg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KLSAgICB0bXAxMCA9ICgoRkFTVF9GTE9BVCkgMS4wODIzOTIyMDApICogejEyIC0gejU7IC8qIDIqKGMyLWM2KSAqLwotICAgIHRtcDEyID0gKChGQVNUX0ZMT0FUKSAtMi42MTMxMjU5MzApICogejEwICsgejU7IC8qIC0yKihjMitjNikgKi8KLQotICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7Ci0gICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKLSAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCi0KLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDAgKyB0bXA3KSwgMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMCAtIHRtcDcpLCAzKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAxICsgdG1wNiksIDMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDEgLSB0bXA2KSwgMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMiArIHRtcDUpLCAzKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAyIC0gdG1wNSksIDMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDMgKyB0bXA0KSwgMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMyAtIHRtcDQpLCAzKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBEQ1RfRkxPQVRfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qaWRjdGZzdC5jIGIvbGlianBlZ3R3cnAvamlkY3Rmc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhNDIxNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qaWRjdGZzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qCi0gKiBqaWRjdGZzdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmYXN0LCBub3Qgc28gYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCi0gKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgotICoKLSAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKLSAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAotICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQotICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKLSAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCi0gKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKLSAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCi0gKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KLSAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcwotICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQotICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQotICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCi0gKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcwotICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KLSAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggZml4ZWQtcG9pbnQgbWF0aCwKLSAqIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGVkCi0gKiBxdWFudGl6YXRpb24gdmFsdWVzLiAgVGhlIHNtYWxsZXIgdGhlIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyeSwgdGhlIGxlc3MKLSAqIHByZWNpc2UgdGhlIHNjYWxlZCB2YWx1ZSwgc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIHdvcnNlIHdpdGggaGlnaC0KLSAqIHF1YWxpdHktc2V0dGluZyBmaWxlcyB0aGFuIHdpdGggbG93LXF1YWxpdHkgb25lcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKiBTY2FsaW5nIGRlY2lzaW9ucyBhcmUgZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIGluIHRoZSBMTCZNIGFsZ29yaXRobTsKLSAqIHNlZSBqaWRjdGludC5jIGZvciBtb3JlIGRldGFpbHMuICBIb3dldmVyLCB3ZSBjaG9vc2UgdG8gZGVzY2FsZQotICogKHJpZ2h0IHNoaWZ0KSBtdWx0aXBsaWNhdGlvbiBwcm9kdWN0cyBhcyBzb29uIGFzIHRoZXkgYXJlIGZvcm1lZCwKLSAqIHJhdGhlciB0aGFuIGNhcnJ5aW5nIGFkZGl0aW9uYWwgZnJhY3Rpb25hbCBiaXRzIGludG8gc3Vic2VxdWVudCBhZGRpdGlvbnMuCi0gKiBUaGlzIGNvbXByb21pc2VzIGFjY3VyYWN5IHNsaWdodGx5LCBidXQgaXQgbGV0cyB1cyBzYXZlIGEgZmV3IHNoaWZ0cy4KLSAqIE1vcmUgaW1wb3J0YW50bHksIDE2LWJpdCBhcml0aG1ldGljIGlzIHRoZW4gYWRlcXVhdGUgKGZvciA4LWJpdCBzYW1wbGVzKQotICogZXZlcnl3aGVyZSBleGNlcHQgaW4gdGhlIG11bHRpcGxpY2F0aW9ucyBwcm9wZXI7IHRoaXMgc2F2ZXMgYSBnb29kIGRlYWwKLSAqIG9mIHdvcmsgb24gMTYtYml0LWludCBtYWNoaW5lcy4KLSAqCi0gKiBUaGUgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIGFyZSBub3QgaW50ZWdlcnMgYmVjYXVzZSB0aGUgQUEmTiBzY2FsaW5nCi0gKiBmYWN0b3JzIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQuICBXZSByZXByZXNlbnQgdGhlbSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUywKLSAqIHNvIHRoYXQgdGhlIGZpcnN0IGFuZCBzZWNvbmQgSURDVCByb3VuZHMgaGF2ZSB0aGUgc2FtZSBpbnB1dCBzY2FsaW5nLgotICogRm9yIDgtYml0IEpTQU1QTEVzLCB3ZSBjaG9vc2UgSUZBU1RfU0NBTEVfQklUUyA9IFBBU1MxX0JJVFMgc28gYXMgdG8KLSAqIGF2b2lkIGEgZGVzY2FsaW5nIHNoaWZ0OyB0aGlzIGNvbXByb21pc2VzIGFjY3VyYWN5IHJhdGhlciBkcmFzdGljYWxseQotICogZm9yIHNtYWxsIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyaWVzLCBidXQgaXQgc2F2ZXMgYSBsb3Qgb2Ygc2hpZnRzLgotICogRm9yIDEyLWJpdCBKU0FNUExFcywgdGhlcmUncyBubyBob3BlIG9mIHVzaW5nIDE2eDE2IG11bHRpcGxpZXMgYW55d2F5LAotICogc28gd2UgdXNlIGEgbXVjaCBsYXJnZXIgc2NhbGluZyBmYWN0b3IgdG8gcHJlc2VydmUgYWNjdXJhY3kuCi0gKgotICogQSBmaW5hbCBjb21wcm9taXNlIGlzIHRvIHJlcHJlc2VudCB0aGUgbXVsdGlwbGljYXRpdmUgY29uc3RhbnRzIHRvIG9ubHkKLSAqIDggZnJhY3Rpb25hbCBiaXRzLCByYXRoZXIgdGhhbiAxMy4gIFRoaXMgc2F2ZXMgc29tZSBzaGlmdGluZyB3b3JrIG9uIHNvbWUKLSAqIG1hY2hpbmVzLCBhbmQgbWF5IGFsc28gcmVkdWNlIHRoZSBjb3N0IG9mIG11bHRpcGxpY2F0aW9uIChzaW5jZSB0aGVyZQotICogYXJlIGZld2VyIG9uZS1iaXRzIGluIHRoZSBjb25zdGFudHMpLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICA4Ci0jZGVmaW5lIFBBU1MxX0JJVFMgIDIKLSNlbHNlCi0jZGVmaW5lIENPTlNUX0JJVFMgIDgKLSNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSNlbmRpZgotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gOAotI2RlZmluZSBGSVhfMV8wODIzOTIyMDAgICgoSU5UMzIpICAyNzcpCQkvKiBGSVgoMS4wODIzOTIyMDApICovCi0jZGVmaW5lIEZJWF8xXzQxNDIxMzU2MiAgKChJTlQzMikgIDM2MikJCS8qIEZJWCgxLjQxNDIxMzU2MikgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgNDczKQkJLyogRklYKDEuODQ3NzU5MDY1KSAqLwotI2RlZmluZSBGSVhfMl82MTMxMjU5MzAgICgoSU5UMzIpICA2NjkpCQkvKiBGSVgoMi42MTMxMjU5MzApICovCi0jZWxzZQotI2RlZmluZSBGSVhfMV8wODIzOTIyMDAgIEZJWCgxLjA4MjM5MjIwMCkKLSNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICBGSVgoMS40MTQyMTM1NjIpCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQotI2RlZmluZSBGSVhfMl82MTMxMjU5MzAgIEZJWCgyLjYxMzEyNTkzMCkKLSNlbmRpZgotCi0KLS8qIFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCi0gKiBieSBvbWl0dGluZyB0aGUgYWRkaXRpb24gaW4gYSBkZXNjYWxpbmcgc2hpZnQuICBUaGlzIHlpZWxkcyBhbiBpbmNvcnJlY3RseQotICogcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgotICovCi0KLSNpZm5kZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCi0jdW5kZWYgREVTQ0FMRQotI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhIERDVEVMRU0gdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQotICogZGVzY2FsZSB0byB5aWVsZCBhIERDVEVMRU0gcmVzdWx0LgotICovCi0KLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChEQ1RFTEVNKSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCi0KLQotLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCi0gKiBlbnRyeTsgcHJvZHVjZSBhIERDVEVMRU0gcmVzdWx0LiAgRm9yIDgtYml0IGRhdGEgYSAxNngxNi0+MTYKLSAqIG11bHRpcGxpY2F0aW9uIHdpbGwgZG8uICBGb3IgMTItYml0IGRhdGEsIHRoZSBtdWx0aXBsaWVyIHRhYmxlIGlzCi0gKiBkZWNsYXJlZCBJTlQzMiwgc28gYSAzMi1iaXQgbXVsdGlwbHkgd2lsbCBiZSB1c2VkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChJRkFTVF9NVUxUX1RZUEUpIChjb2VmKSkgKiAocXVhbnR2YWwpKQotI2Vsc2UKLSNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgXAotCURFU0NBTEUoKGNvZWYpKihxdWFudHZhbCksIElGQVNUX1NDQUxFX0JJVFMtUEFTUzFfQklUUykKLSNlbmRpZgotCi0KLS8qIExpa2UgREVTQ0FMRSwgYnV0IGFwcGxpZXMgdG8gYSBEQ1RFTEVNIGFuZCBwcm9kdWNlcyBhbiBpbnQuCi0gKiBXZSBhc3N1bWUgdGhhdCBpbnQgcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgaWYgSU5UMzIgcmlnaHQgc2hpZnQgaXMuCi0gKi8KLQotI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0jZGVmaW5lIElTSElGVF9URU1QUwlEQ1RFTEVNIGlzaGlmdF90ZW1wOwotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIERDVEVMRU1CSVRTICAxNgkJLyogRENURUxFTSBtYXkgYmUgMTYgb3IgMzIgYml0cyAqLwotI2Vsc2UKLSNkZWZpbmUgRENURUxFTUJJVFMgIDMyCQkvKiBEQ1RFTEVNIG11c3QgYmUgMzIgYml0cyAqLwotI2VuZGlmCi0jZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpICBcCi0gICAgKChpc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAotICAgICAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofigoRENURUxFTSkgMCkpIDw8IChEQ1RFTEVNQklUUy0oc2hmdCkpKSA6IFwKLSAgICAgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkpCi0jZWxzZQotI2RlZmluZSBJU0hJRlRfVEVNUFMKLSNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkJKCh4KSA+PiAoc2hmdCkpCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORwotI2RlZmluZSBJREVTQ0FMRSh4LG4pICAoKGludCkgSVJJR0hUX1NISUZUKCh4KSArICgxIDw8ICgobiktMSkpLCBuKSkKLSNlbHNlCi0jZGVmaW5lIElERVNDQUxFKHgsbikgICgoaW50KSBJUklHSFRfU0hJRlQoeCwgbikpCi0jZW5kaWYKLQotCi0vKgotICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF9pZmFzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIERDVEVMRU0gdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgRENURUxFTSB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKLSAgRENURUxFTSB6NSwgejEwLCB6MTEsIHoxMiwgejEzOwotICBKQ09FRlBUUiBpbnB0cjsKLSAgSUZBU1RfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIGludCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIGludCB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgU0hJRlRfVEVNUFMJCQkvKiBmb3IgREVTQ0FMRSAqLwotICBJU0hJRlRfVEVNUFMJCQkvKiBmb3IgSURFU0NBTEUgKi8KLQotICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCi0KLSAgaW5wdHIgPSBjb2VmX2Jsb2NrOwotICBxdWFudHB0ciA9IChJRkFTVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBjdHItLSkgewotICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKLSAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcwotICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCi0gICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQotICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgotICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKLSAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KLSAgICAgKi8KLSAgICAKLSAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgaW50IGRjdmFsID0gKGludCkgREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLQotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOwotICAgICAgCi0gICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICAgIHF1YW50cHRyKys7Ci0gICAgICB3c3B0cisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotCi0gICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7Ci0gICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7Ci0gICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7Ci0KLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwkvKiBwaGFzZSAzICovCi0gICAgdG1wMTEgPSB0bXAwIC0gdG1wMjsKLQotICAgIHRtcDEzID0gdG1wMSArIHRtcDM7CS8qIHBoYXNlcyA1LTMgKi8KLSAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEgLSB0bXAzLCBGSVhfMV80MTQyMTM1NjIpIC0gdG1wMTM7IC8qIDIqYzQgKi8KLQotICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7Ci0gICAgdG1wMSA9IHRtcDExICsgdG1wMTI7Ci0gICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHRtcDQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIHRtcDUgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIHRtcDYgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOwotICAgIHRtcDcgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotCi0gICAgejEzID0gdG1wNiArIHRtcDU7CQkvKiBwaGFzZSA2ICovCi0gICAgejEwID0gdG1wNiAtIHRtcDU7Ci0gICAgejExID0gdG1wNCArIHRtcDc7Ci0gICAgejEyID0gdG1wNCAtIHRtcDc7Ci0KLSAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLwotICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOyAvKiAyKmM0ICovCi0KLSAgICB6NSA9IE1VTFRJUExZKHoxMCArIHoxMiwgRklYXzFfODQ3NzU5MDY1KTsgLyogMipjMiAqLwotICAgIHRtcDEwID0gTVVMVElQTFkoejEyLCBGSVhfMV8wODIzOTIyMDApIC0gejU7IC8qIDIqKGMyLWM2KSAqLwotICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsgLyogLTIqKGMyK2M2KSAqLwotCi0gICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7Ci0gICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKLQotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSAodG1wMCArIHRtcDcpOwotICAgIHdzcHRyW0RDVFNJWkUqN10gPSAoaW50KSAodG1wMCAtIHRtcDcpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSAodG1wMSArIHRtcDYpOwotICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSAodG1wMSAtIHRtcDYpOwotICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSAodG1wMiArIHRtcDUpOwotICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSAodG1wMiAtIHRtcDUpOwotICAgIHdzcHRyW0RDVFNJWkUqNF0gPSAoaW50KSAodG1wMyArIHRtcDQpOwotICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSAodG1wMyAtIHRtcDQpOwotCi0gICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgcXVhbnRwdHIrKzsKLSAgICB3c3B0cisrOwotICB9Ci0gIAotICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLwotICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KLSAgLyogYW5kIGFsc28gdW5kbyB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgotICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbwotICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgotICAgICAqIE9uIG1hY2hpbmVzIHdpdGggdmVyeSBmYXN0IG11bHRpcGxpY2F0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi0gICAgICogdGVzdCB0YWtlcyBtb3JlIHRpbWUgdGhhbiBpdCdzIHdvcnRoLiAgSW4gdGhhdCBjYXNlIHRoaXMgc2VjdGlvbgotICAgICAqIG1heSBiZSBjb21tZW50ZWQgb3V0LgotICAgICAqLwotICAgIAotI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCi0gICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzRdID09IDAgJiYKLQl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFtJREVTQ0FMRSh3c3B0clswXSwgUEFTUzFfQklUUyszKQotCQkJCSAgJiBSQU5HRV9NQVNLXTsKLSAgICAgIAotICAgICAgb3V0cHRyWzBdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsyXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzNdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls1XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzZdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbN10gPSBkY3ZhbDsKLQotICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICAgICAgY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0KLSAgICB0bXAxMCA9ICgoRENURUxFTSkgd3NwdHJbMF0gKyAoRENURUxFTSkgd3NwdHJbNF0pOwotICAgIHRtcDExID0gKChEQ1RFTEVNKSB3c3B0clswXSAtIChEQ1RFTEVNKSB3c3B0cls0XSk7Ci0KLSAgICB0bXAxMyA9ICgoRENURUxFTSkgd3NwdHJbMl0gKyAoRENURUxFTSkgd3NwdHJbNl0pOwotICAgIHRtcDEyID0gTVVMVElQTFkoKERDVEVMRU0pIHdzcHRyWzJdIC0gKERDVEVMRU0pIHdzcHRyWzZdLCBGSVhfMV80MTQyMTM1NjIpCi0JICAgIC0gdG1wMTM7Ci0KLSAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsKLSAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKLSAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKLSAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKLQotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB6MTMgPSAoRENURUxFTSkgd3NwdHJbNV0gKyAoRENURUxFTSkgd3NwdHJbM107Ci0gICAgejEwID0gKERDVEVMRU0pIHdzcHRyWzVdIC0gKERDVEVMRU0pIHdzcHRyWzNdOwotICAgIHoxMSA9IChEQ1RFTEVNKSB3c3B0clsxXSArIChEQ1RFTEVNKSB3c3B0cls3XTsKLSAgICB6MTIgPSAoRENURUxFTSkgd3NwdHJbMV0gLSAoRENURUxFTSkgd3NwdHJbN107Ci0KLSAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLwotICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOyAvKiAyKmM0ICovCi0KLSAgICB6NSA9IE1VTFRJUExZKHoxMCArIHoxMiwgRklYXzFfODQ3NzU5MDY1KTsgLyogMipjMiAqLwotICAgIHRtcDEwID0gTVVMVElQTFkoejEyLCBGSVhfMV8wODIzOTIyMDApIC0gejU7IC8qIDIqKGMyLWM2KSAqLwotICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsgLyogLTIqKGMyK2M2KSAqLwotCi0gICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7Ci0gICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogc2NhbGUgZG93biBieSBhIGZhY3RvciBvZiA4IGFuZCByYW5nZS1saW1pdCAqLwotCi0gICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMCArIHRtcDcsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgLSB0bXA3LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxICsgdG1wNiwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMSAtIHRtcDYsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDIgKyB0bXA1LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyIC0gdG1wNSwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMyArIHRtcDQsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgLSB0bXA0LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLQotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0lGQVNUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvamlkY3RpbnQuYyBiL2xpYmpwZWd0d3JwL2ppZGN0aW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmIzMjAuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvamlkY3RpbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogamlkY3RpbnQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCi0gKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgotICoKLSAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKLSAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAotICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQotICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KLSAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAotICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKLSAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgotICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCi0gKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCi0gKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKLSAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgotICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgotICoKLSAqIEVhY2ggMS1EIElEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCi0gKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBJRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCi0gKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQotICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgotICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIElEQ1QsCi0gKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgaW5wdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KLSAqCi0gKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCi0gKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCi0gKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKLSAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCi0gKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQotICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCi0gKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCi0gKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKLSAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKLSAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCi0gKgotICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAotICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cwotICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAotICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChUbyBzY2FsZSB1cCAxMi1iaXQgc2FtcGxlIGRhdGEgZnVydGhlciwgYW4KLSAqIGludGVybWVkaWF0ZSBJTlQzMiBhcnJheSB3b3VsZCBiZSBuZWVkZWQuKQotICoKLSAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0Ci0gKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKLSAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSAxMwotI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCi0jZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLwotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KLSNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLwotI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLwotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLwotI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLwotI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLwotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLwotI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLwotI2Vsc2UKLSNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCi0jZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQotI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQotI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKLSNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQotI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKLSNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQotI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKLSAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKLSAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCi0gKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQotI2Vsc2UKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0KLS8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQotICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0Ci0gKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KLSAqLwotCi0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCi0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfaXNsb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKLSAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OwotICBKQ09FRlBUUiBpbnB0cjsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIGludCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIGludCB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgU0hJRlRfVEVNUFMKLQotICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCi0gIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIElEQ1Q7ICovCi0gIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKLSAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0Ci0gICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKLSAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAotICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKLSAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KLSAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCi0gICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCi0gICAgICovCi0gICAgCi0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKLSAgICAgIAotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOwotICAgICAgCi0gICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICAgIHF1YW50cHRyKys7Ci0gICAgICB3c3B0cisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KLSAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLwotICAgIAotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOwotICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7Ci0gICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKLQotICAgIHRtcDAgPSAoejIgKyB6MykgPDwgQ09OU1RfQklUUzsKLSAgICB0bXAxID0gKHoyIC0gejMpIDw8IENPTlNUX0JJVFM7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCi0gICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCi0gICAgICovCi0gICAgCi0gICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7Ci0gICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7Ci0gICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgCi0gICAgejEgPSB0bXAwICsgdG1wMzsKLSAgICB6MiA9IHRtcDEgKyB0bXAyOwotICAgIHozID0gdG1wMCArIHRtcDI7Ci0gICAgejQgPSB0bXAxICsgdG1wMzsKLSAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KLSAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCi0gICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCi0gICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KLSAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLwotICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KLSAgICAKLSAgICB6MyArPSB6NTsKLSAgICB6NCArPSB6NTsKLSAgICAKLSAgICB0bXAwICs9IHoxICsgejM7Ci0gICAgdG1wMSArPSB6MiArIHo0OwotICAgIHRtcDIgKz0gejIgKyB6MzsKLSAgICB0bXAzICs9IHoxICsgejQ7Ci0gICAgCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLwotICAgIAotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgcXVhbnRwdHIrKzsKLSAgICB3c3B0cisrOwotICB9Ci0gIAotICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLwotICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KLSAgLyogYW5kIGFsc28gdW5kbyB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgotICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbwotICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgotICAgICAqIE9uIG1hY2hpbmVzIHdpdGggdmVyeSBmYXN0IG11bHRpcGxpY2F0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi0gICAgICogdGVzdCB0YWtlcyBtb3JlIHRpbWUgdGhhbiBpdCdzIHdvcnRoLiAgSW4gdGhhdCBjYXNlIHRoaXMgc2VjdGlvbgotICAgICAqIG1heSBiZSBjb21tZW50ZWQgb3V0LgotICAgICAqLwotICAgIAotI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCi0gICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzRdID09IDAgJiYKLQl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKLQkJCQkgICYgUkFOR0VfTUFTS107Ci0gICAgICAKLSAgICAgIG91dHB0clswXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzFdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clszXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzRdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls2XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzddID0gZGN2YWw7Ci0KLSAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KLSAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLwotICAgIAotICAgIHoyID0gKElOVDMyKSB3c3B0clsyXTsKLSAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOwotICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7Ci0gICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdICsgKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKLSAgICB0bXAxID0gKChJTlQzMikgd3NwdHJbMF0gLSAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cwotICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgotICAgICAqLwotICAgIAotICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzddOwotICAgIHRtcDEgPSAoSU5UMzIpIHdzcHRyWzVdOwotICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzNdOwotICAgIHRtcDMgPSAoSU5UMzIpIHdzcHRyWzFdOwotICAgIAotICAgIHoxID0gdG1wMCArIHRtcDM7Ci0gICAgejIgPSB0bXAxICsgdG1wMjsKLSAgICB6MyA9IHRtcDAgKyB0bXAyOwotICAgIHo0ID0gdG1wMSArIHRtcDM7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKLSAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCi0gICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwotICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgdG1wMCArPSB6MSArIHozOwotICAgIHRtcDEgKz0gejIgKyB6NDsKLSAgICB0bXAyICs9IHoyICsgejM7Ci0gICAgdG1wMyArPSB6MSArIHo0OwotICAgIAotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qaWRjdHJlZC5jIGIvbGlianBlZ3R3cnAvamlkY3RyZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZjNjNy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qaWRjdHJlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKiBqaWRjdHJlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW52ZXJzZS1EQ1Qgcm91dGluZXMgdGhhdCBwcm9kdWNlIHJlZHVjZWQtc2l6ZSBvdXRwdXQ6Ci0gKiBlaXRoZXIgNHg0LCAyeDIsIG9yIDF4MSBwaXhlbHMgZnJvbSBhbiA4eDggRENUIGJsb2NrLgotICoKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgTG9lZmZsZXIsIExpZ3RlbmJlcmcgYW5kIE1vc2NoeXR6IChMTCZNKQotICogYWxnb3JpdGhtIHVzZWQgaW4gamlkY3RpbnQuYy4gIFdlIHNpbXBseSByZXBsYWNlIGVhY2ggOC10by04IDEtRCBJRENUIHN0ZXAKLSAqIHdpdGggYW4gOC10by00IHN0ZXAgdGhhdCBwcm9kdWNlcyB0aGUgZm91ciBhdmVyYWdlcyBvZiB0d28gYWRqYWNlbnQgb3V0cHV0cwotICogKG9yIGFuIDgtdG8tMiBzdGVwIHByb2R1Y2luZyB0d28gYXZlcmFnZXMgb2YgZm91ciBvdXRwdXRzLCBmb3IgMngyIG91dHB1dCkuCi0gKiBUaGVzZSBzdGVwcyB3ZXJlIGRlcml2ZWQgYnkgY29tcHV0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgbm9ybWFsIExMJk0gY29kZSwgdGhlbiBzaW1wbGlmeWluZyBhcyBtdWNoIGFzIHBvc3NpYmxlLgotICoKLSAqIDF4MSBpcyB0cml2aWFsOiBqdXN0IHRha2UgdGhlIERDIGNvZWZmaWNpZW50IGRpdmlkZWQgYnkgOC4KLSAqCi0gKiBTZWUgamlkY3RpbnQuYyBmb3IgYWRkaXRpb25hbCBjb21tZW50cy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKiBTY2FsaW5nIGlzIHRoZSBzYW1lIGFzIGluIGppZGN0aW50LmMuICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSAxMwotI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgoSU5UMzIpICAxNzMwKQkvKiBGSVgoMC4yMTExNjQyNDMpICovCi0jZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgKChJTlQzMikgIDQxNzYpCS8qIEZJWCgwLjUwOTc5NTU3OSkgKi8KLSNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICAoKElOVDMyKSAgNDkyNikJLyogRklYKDAuNjAxMzQ0ODg3KSAqLwotI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICgoSU5UMzIpICA1OTA2KQkvKiBGSVgoMC43MjA5NTk4MjIpICovCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KLSNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICAoKElOVDMyKSAgNjk2NykJLyogRklYKDAuODUwNDMwMDk1KSAqLwotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCi0jZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgKChJTlQzMikgIDg2OTcpCS8qIEZJWCgxLjA2MTU5NDMzNykgKi8KLSNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICAoKElOVDMyKSAgMTA0MjYpCS8qIEZJWCgxLjI3Mjc1ODU4MCkgKi8KLSNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICAoKElOVDMyKSAgMTE4OTMpCS8qIEZJWCgxLjQ1MTc3NDk4MSkgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICAoKElOVDMyKSAgMTc3OTkpCS8qIEZJWCgyLjE3MjczNDgwMykgKi8KLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KLSNkZWZpbmUgRklYXzNfNjI0NTA5Nzg1ICAoKElOVDMyKSAgMjk2OTIpCS8qIEZJWCgzLjYyNDUwOTc4NSkgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgRklYKDAuMjExMTY0MjQzKQotI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgIEZJWCgwLjUwOTc5NTU3OSkKLSNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICBGSVgoMC42MDEzNDQ4ODcpCi0jZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgRklYKDAuNzIwOTU5ODIyKQotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKLSNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICBGSVgoMC44NTA0MzAwOTUpCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQotI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgIEZJWCgxLjA2MTU5NDMzNykKLSNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICBGSVgoMS4yNzI3NTg1ODApCi0jZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAgRklYKDEuNDUxNzc0OTgxKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICBGSVgoMi4xNzI3MzQ4MDMpCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQotI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgIEZJWCgzLjYyNDUwOTc4NSkKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKLSAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKLSAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCi0gKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQotI2Vsc2UKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0KLS8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQotICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0Ci0gKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KLSAqLwotCi0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCi0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgNHg0IG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMiwgdG1wMTAsIHRtcDEyOwotICBJTlQzMiB6MSwgejIsIHozLCB6NDsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUqNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyssIGN0ci0tKSB7Ci0gICAgLyogRG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgY29sdW1uIDQsIGJlY2F1c2Ugc2Vjb25kIHBhc3Mgd29uJ3QgdXNlIGl0ICovCi0gICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTQpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtIDQgZm9yIDR4NCBvdXRwdXQgKi8KLSAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKLSAgICAgIAotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOwotICAgICAgCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMCA8PD0gKENPTlNUX0JJVFMrMSk7Ci0gICAgCi0gICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOwotICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLQotICAgIHRtcDIgPSBNVUxUSVBMWSh6MiwgRklYXzFfODQ3NzU5MDY1KSArIE1VTFRJUExZKHozLCAtIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0gICAgCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCi0JICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KLQkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCi0JICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLwotCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIDQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIGEgemVybyByb3cgdGVzdCBpcyB3b3J0aHdoaWxlIGhlcmUgLi4uICovCi0KLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJgotCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQotCQkJCSAgJiBSQU5HRV9NQVNLXTsKLSAgICAgIAotICAgICAgb3V0cHRyWzBdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsyXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzNdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSkgPDwgKENPTlNUX0JJVFMrMSk7Ci0gICAgCi0gICAgdG1wMiA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbMl0sIEZJWF8xXzg0Nzc1OTA2NSkKLQkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzZdLCAtIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0gICAgCi0gICAgejEgPSAoSU5UMzIpIHdzcHRyWzddOwotICAgIHoyID0gKElOVDMyKSB3c3B0cls1XTsKLSAgICB6MyA9IChJTlQzMikgd3NwdHJbM107Ci0gICAgejQgPSAoSU5UMzIpIHdzcHRyWzFdOwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCi0JICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KLQkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCi0JICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLwotCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMTAsIHoxOwotICBKQ09FRlBUUiBpbnB0cjsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIGludCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIGludCB3b3Jrc3BhY2VbRENUU0laRSoyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW5zIDIsNCw2ICovCi0gICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTIgfHwgY3RyID09IERDVFNJWkUtNCB8fCBjdHIgPT0gRENUU0laRS02KQotICAgICAgY29udGludWU7Ci0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtcyAyLDQsNiBmb3IgMngyIG91dHB1dCAqLwotICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOwotICAgICAgCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMTAgPSB6MSA8PCAoQ09OU1RfQklUUysyKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF83MjA5NTk4MjIpOyAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLwotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfMF84NTA0MzAwOTUpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgLSBGSVhfMV8yNzI3NTg1ODApOyAvKiBzcXJ0KDIpICogKC1jMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLwotICAgIAotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOwotICB9Ci0gIAotICAvKiBQYXNzIDI6IHByb2Nlc3MgMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgMjsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KLQotI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCi0gICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls1XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysyKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wMCA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbN10sIC0gRklYXzBfNzIwOTU5ODIyKSAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNV0sIEZJWF8wXzg1MDQzMDA5NSkgLyogc3FydCgyKSAqICgtYzErYzMrYzUrYzcpICovCi0JICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clszXSwgLSBGSVhfMV8yNzI3NTg1ODApIC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbMV0sIEZJWF8zXzYyNDUwOTc4NSk7IC8qIHNxcnQoMikgKiAoYzErYzMrYzUrYzcpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIAotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDF4MSBvdXRwdXQgYmxvY2suCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfMXgxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIGludCBkY3ZhbDsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogV2UgaGFyZGx5IG5lZWQgYW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBmb3IgdGhpczoganVzdCB0YWtlIHRoZQotICAgKiBhdmVyYWdlIHBpeGVsIHZhbHVlLCB3aGljaCBpcyBvbmUtZWlnaHRoIG9mIHRoZSBEQyBjb2VmZmljaWVudC4KLSAgICovCi0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIGRjdmFsID0gREVRVUFOVElaRShjb2VmX2Jsb2NrWzBdLCBxdWFudHB0clswXSk7Ci0gIGRjdmFsID0gKGludCkgREVTQ0FMRSgoSU5UMzIpIGRjdmFsLCAzKTsKLQotICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbZGN2YWwgJiBSQU5HRV9NQVNLXTsKLX0KLQotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ppZGN0dmVudW0uYyBiL2xpYmpwZWd0d3JwL2ppZGN0dmVudW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1OGJiNS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qaWRjdHZlbnVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoKLSAqIGppZGN0dmVudW0uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlIEF1cm9yYSBGb3J1bSwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIgICAgLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIEFORFJPSURfSlBFR19VU0VfVkVOVU0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCi0gKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKLSAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgotICovCi0KLSNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKChjb2VmKSAqICgoSU5UMTYpcXVhbnR2YWwpKQotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF9pc2xvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0gICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBKQ09FRlBUUiBjb2VmcHRyOwotICBpbnQgY3RyOwotCi0gIC8qIGlkY3Rfb3V0IHRlbXAgYnVmZmVyIGlzIG5lZWRlZCBiZWNhdXNlIG91dHB1dF9idWYgc2FtcGxlIGFsbG9jYXRpb24gaXMgOCBiaXRzLAotICAgKiB3aGlsZSBJRENUIG91dHB1dCBleHBlY3RzIDE2IGJpdHMuCi0gICAqLwotICBJTlQxNiBpZGN0X291dFtEQ1RTSVpFMl07ICAvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgSlNBTVBST1cgb3V0cHRyOwotICBJTlQxNiogIGlkY3RwdHI7Ci0KLSAgY29lZnB0ciAgPSBjb2VmX2Jsb2NrOwotICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotCi0gIC8qIERlcXVhbnRpemUgdGhlIGNvZWZmIGJ1ZmZlciBhbmQgd3JpdGUgaXQgYmFjayB0byB0aGUgc2FtZSBsb2NhdGlvbiAqLwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgY29lZnB0clswXSAgICAgICAgID0gREVRVUFOVElaRShjb2VmcHRyWzBdICAgICAgICAsIHF1YW50cHRyWzBdICAgICAgICApOwotICAgIGNvZWZwdHJbRENUU0laRSoxXSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqMl0gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjNdID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIGNvZWZwdHJbRENUU0laRSo0XSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqNV0gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjZdID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOwotICAgIGNvZWZwdHJbRENUU0laRSo3XSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKLQotICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIGNvZWZwdHIrKzsKLSAgfQotCi0gIGlkY3RfOHg4X3ZlbnVtKChJTlQxNiopY29lZl9ibG9jaywKLSAgICAgICAgICAgICAgICAgKElOVDE2KilpZGN0X291dCwKLSAgICAgICAgICAgICAgICAgRENUU0laRSAqIHNpemVvZihJTlQxNikpOwotCi0gIGlkY3RwdHIgPSBpZGN0X291dDsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLy8gb3V0cHRyIHNhbXBsZSBzaXplIGlzIDEgYnl0ZSB3aGlsZSBpZGN0cHRyIHNhbXBsZSBzaXplIGlzIDIgYnl0ZXMKLSAgICBvdXRwdHJbMF0gPSBpZGN0cHRyWzBdOwotICAgIG91dHB0clsxXSA9IGlkY3RwdHJbMV07Ci0gICAgb3V0cHRyWzJdID0gaWRjdHB0clsyXTsKLSAgICBvdXRwdHJbM10gPSBpZGN0cHRyWzNdOwotICAgIG91dHB0cls0XSA9IGlkY3RwdHJbNF07Ci0gICAgb3V0cHRyWzVdID0gaWRjdHB0cls1XTsKLSAgICBvdXRwdHJbNl0gPSBpZGN0cHRyWzZdOwotICAgIG91dHB0cls3XSA9IGlkY3RwdHJbN107Ci0gICAgaWRjdHB0ciAgKz0gRENUU0laRTsgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfNHg0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLSAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0gICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLQotICAvKiBOb3RlOiBNdXN0IGFsbG9jYXRlIDh4NCBldmVuIHRob3VnaCBvbmx5IDR4NCBpcyB1c2VkIGJlY2F1c2UKLSAgICogSURDVCBmdW5jdGlvbiBleHBlY3RzIHN0cmlkZSBvZiA4LiBTdHJpZGUgaW5wdXQgdG8gZnVuY3Rpb24gaXMgaWdub3JlZC4KLSAgICovCi0gIElOVDE2ICAgIGlkY3Rfb3V0W0RDVFNJWkUgKiAoRENUU0laRT4+MSldOyAgLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIElOVDE2KiAgIGlkY3RwdHI7Ci0gIEpDT0VGUFRSIGNvZWZwdHI7Ci0gIGludCBjdHI7Ci0KLSAgY29lZnB0ciAgPSBjb2VmX2Jsb2NrOwotICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotCi0gIC8qIERlcXVhbnRpemUgdGhlIGNvZWZmIGJ1ZmZlciBhbmQgd3JpdGUgaXQgYmFjayB0byB0aGUgc2FtZSBsb2NhdGlvbiAqLwotICBmb3IgKGN0ciA9IChEQ1RTSVpFPj4xKTsgY3RyID4gMDsgY3RyLS0pIHsKLSAgICBjb2VmcHRyWzBdICAgICAgICAgPSBERVFVQU5USVpFKGNvZWZwdHJbMF0gICAgICAgICwgcXVhbnRwdHJbMF0gICAgICAgICk7Ci0gICAgY29lZnB0cltEQ1RTSVpFKjFdID0gREVRVUFOVElaRShjb2VmcHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIGNvZWZwdHJbRENUU0laRSoyXSA9IERFUVVBTlRJWkUoY29lZnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqM10gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0KLSAgICAvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgcXVhbnRwdHIrKzsKLSAgICBjb2VmcHRyKys7Ci0gIH0KLQotICBpZGN0XzR4NF92ZW51bSgoSU5UMTYqKWNvZWZfYmxvY2ssCi0gICAgICAgICAgICAgICAgIChJTlQxNiopaWRjdF9vdXQsCi0gICAgICAgICAgICAgICAgICBEQ1RTSVpFICogc2l6ZW9mKElOVDE2KSk7Ci0KLSAgaWRjdHB0ciA9IGlkY3Rfb3V0OwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IChEQ1RTSVpFPj4xKTsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotCi0gICAgLyogb3V0cHRyIHNhbXBsZSBzaXplIGlzIDEgYnl0ZSB3aGlsZSBpZGN0cHRyIHNhbXBsZSBzaXplIGlzIDIgYnl0ZXMgKi8KLSAgICBvdXRwdHJbMF0gPSBpZGN0cHRyWzBdOwotICAgIG91dHB0clsxXSA9IGlkY3RwdHJbMV07Ci0gICAgb3V0cHRyWzJdID0gaWRjdHB0clsyXTsKLSAgICBvdXRwdHJbM10gPSBpZGN0cHRyWzNdOwotICAgIC8qIElEQ1QgZnVuY3Rpb24gYXNzdW1lcyBzdHJpZGUgb2YgOCB1bml0cyAqLwotICAgIGlkY3RwdHIgKz0gKERDVFNJWkUpOyAgICAvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfMngyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLSAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0gICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLQotICAvKiBOb3RlOiBNdXN0IGFsbG9jYXRlIDh4MiBldmVuIHRob3VnaCBvbmx5IDJ4MiBpcyB1c2VkIGJlY2F1c2UKLSAgICogSURDVCBmdW5jdGlvbiBleHBlY3RzIHN0cmlkZSBvZiA4LiBTdHJpZGUgaW5wdXQgdG8gZnVuY3Rpb24gaXMgaWdub3JlZC4KLSAgICogVGhlcmUgaXMgYWxzbyBhIGh3IGxpbWl0YXRpb24gcmVxdWlyaW5nIGlucHV0IHNpemUgdG8gYmUgOHgyLgotICAgKi8KLSAgSU5UMTYgICAgaWRjdF9vdXRbRENUU0laRSAqIChEQ1RTSVpFPj4yKV07ICAvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgSU5UMTYqICAgaWRjdHB0cjsKLSAgSkNPRUZQVFIgY29lZnB0cjsKLSAgaW50IGN0cjsKLQotICBjb2VmcHRyICA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0KLSAgLyogRGVxdWFudGl6ZSB0aGUgY29lZmYgYnVmZmVyIGFuZCB3cml0ZSBpdCBiYWNrIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCi0gIGZvciAoY3RyID0gKERDVFNJWkU+PjIpOyBjdHIgPiAwOyBjdHItLSkgewotICAgIGNvZWZwdHJbMF0gICAgICAgICA9IERFUVVBTlRJWkUoY29lZnB0clswXSAgICAgICAgLCBxdWFudHB0clswXSAgICAgICAgKTsKLSAgICBjb2VmcHRyW0RDVFNJWkUqMV0gPSBERVFVQU5USVpFKGNvZWZwdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0KLSAgICAvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgcXVhbnRwdHIrKzsKLSAgICBjb2VmcHRyKys7Ci0gIH0KLQotICBpZGN0XzJ4Ml92ZW51bSgoSU5UMTYqKWNvZWZfYmxvY2ssCi0gICAgICAgICAgICAgICAgIChJTlQxNiopaWRjdF9vdXQsCi0gICAgICAgICAgICAgICAgICBEQ1RTSVpFICogc2l6ZW9mKElOVDE2KSk7Ci0KLSAgaWRjdHB0ciA9IGlkY3Rfb3V0OwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IChEQ1RTSVpFPj4yKTsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotCi0gICAgLyogb3V0cHRyIHNhbXBsZSBzaXplIGlzIDEgYnl0ZXMsIGlkY3RwdHIgc2FtcGxlIHNpemUgaXMgMiBieXRlcyAqLwotICAgIG91dHB0clswXSA9IGlkY3RwdHJbMF07Ci0gICAgb3V0cHRyWzFdID0gaWRjdHB0clsxXTsKLQotICAgIC8qIElEQ1QgZnVuY3Rpb24gYXNzdW1lcyBzdHJpZGUgb2YgOCB1bml0cyAqLwotICAgIGlkY3RwdHIgKz0gKERDVFNJWkUpOyAgICAvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLSAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgSlNBTVBST1cgb3V0cHRyOyAvLyA4LWJpdCB0eXBlCi0gIElOVDE2ICAgIGlkY3Rfb3V0W0RDVFNJWkVdOyAvKiBSZXF1aXJlZCB0byBhbGxvY2F0ZSA4IHNhbXBsZXMsIGV2ZW4gdGhvdWdoIHdlIG9ubHkgdXNlIG9uZS4gKi8KLSAgSkNPRUZQVFIgY29lZnB0cjsKLSAgaW50IGN0cjsKLQotICBjb2VmcHRyICA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIG91dHB0ciAgID0gb3V0cHV0X2J1ZlswXSArIG91dHB1dF9jb2w7Ci0KLSAgLyogRGVxdWFudGl6ZSB0aGUgY29lZmYgYnVmZmVyIGFuZCB3cml0ZSBpdCBiYWNrIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCi0gIGNvZWZwdHJbMF0gPSBERVFVQU5USVpFKGNvZWZwdHJbMF0sIHF1YW50cHRyWzBdKTsKLQotICBpZGN0XzF4MV92ZW51bSgoSU5UMTYqKWNvZWZfYmxvY2ssCi0gICAgICAgICAgICAgICAgIChJTlQxNiopaWRjdF9vdXQsCi0gICAgICAgICAgICAgICAgIERDVFNJWkUgKiBzaXplb2YoSU5UMTYpKTsKLSAgb3V0cHRyWzBdID0gaWRjdF9vdXRbMF07Ci19Ci0KLQotI2VuZGlmIC8qIEFORFJPSURfSlBFR19VU0VfVkVOVU0gKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ppbmNsdWRlLmggYi9saWJqcGVndHdycC9qaW5jbHVkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTRmMTUxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ppbmNsdWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogamluY2x1ZGUuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGV4aXN0cyB0byBwcm92aWRlIGEgc2luZ2xlIHBsYWNlIHRvIGZpeCBhbnkgcHJvYmxlbXMgd2l0aAotICogaW5jbHVkaW5nIHRoZSB3cm9uZyBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIChDb21tb24gcHJvYmxlbXMgYXJlIHRha2VuCi0gKiBjYXJlIG9mIGJ5IHRoZSBzdGFuZGFyZCBqY29uZmlnIHN5bWJvbHMsIGJ1dCBvbiByZWFsbHkgd2VpcmQgc3lzdGVtcwotICogeW91IG1heSBoYXZlIHRvIGVkaXQgdGhpcyBmaWxlLikKLSAqCi0gKiBOT1RFOiB0aGlzIGZpbGUgaXMgTk9UIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGJ5IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKLSAqIEpQRUcgbGlicmFyeS4gIE1vc3QgYXBwbGljYXRpb25zIG5lZWQgb25seSBpbmNsdWRlIGpwZWdsaWIuaC4KLSAqLwotCi0KLS8qIEluY2x1ZGUgYXV0by1jb25maWcgZmlsZSB0byBmaW5kIG91dCB3aGljaCBzeXN0ZW0gaW5jbHVkZSBmaWxlcyB3ZSBuZWVkLiAqLwotCi0jaW5jbHVkZSAiamNvbmZpZy5oIgkJLyogYXV0byBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KLSNkZWZpbmUgSkNPTkZJR19JTkNMVURFRAkvKiBzbyB0aGF0IGpwZWdsaWIuaCBkb2Vzbid0IGRvIGl0IGFnYWluICovCi0KLS8qCi0gKiBXZSBuZWVkIHRoZSBOVUxMIG1hY3JvIGFuZCBzaXplX3QgdHlwZWRlZi4KLSAqIE9uIGFuIEFOU0ktY29uZm9ybWluZyBzeXN0ZW0gaXQgaXMgc3VmZmljaWVudCB0byBpbmNsdWRlIDxzdGRkZWYuaD4uCi0gKiBPdGhlcndpc2UsIHdlIGdldCB0aGVtIGZyb20gPHN0ZGxpYi5oPiBvciA8c3RkaW8uaD47IHdlIG1heSBoYXZlIHRvCi0gKiBwdWxsIGluIDxzeXMvdHlwZXMuaD4gYXMgd2VsbC4KLSAqIE5vdGUgdGhhdCB0aGUgY29yZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgcmVxdWlyZSA8c3RkaW8uaD47Ci0gKiBvbmx5IHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgYW5kIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1vZHVsZXMgZG8uCi0gKiBCdXQgd2UgbXVzdCBwdWxsIGl0IGluIGJlY2F1c2Ugb2YgdGhlIHJlZmVyZW5jZXMgdG8gRklMRSBpbiBqcGVnbGliLmguCi0gKiBZb3UgY2FuIHJlbW92ZSB0aG9zZSByZWZlcmVuY2VzIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgd2l0aG91dCA8c3RkaW8uaD4uCi0gKi8KLQotI2lmZGVmIEhBVkVfU1REREVGX0gKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qCi0gKiBXZSBuZWVkIG1lbW9yeSBjb3B5aW5nIGFuZCB6ZXJvaW5nIGZ1bmN0aW9ucywgcGx1cyBzdHJuY3B5KCkuCi0gKiBBTlNJIGFuZCBTeXN0ZW0gViBpbXBsZW1lbnRhdGlvbnMgZGVjbGFyZSB0aGVzZSBpbiA8c3RyaW5nLmg+LgotICogQlNEIGRvZXNuJ3QgaGF2ZSB0aGUgbWVtKCkgZnVuY3Rpb25zLCBidXQgaXQgZG9lcyBoYXZlIGJjb3B5KCkvYnplcm8oKS4KLSAqIFNvbWUgc3lzdGVtcyBtYXkgZGVjbGFyZSBtZW1zZXQgYW5kIG1lbWNweSBpbiA8bWVtb3J5Lmg+LgotICoKLSAqIE5PVEU6IHdlIGFzc3VtZSB0aGUgc2l6ZSBwYXJhbWV0ZXJzIHRvIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb2YgdHlwZSBzaXplX3QuCi0gKiBDaGFuZ2UgdGhlIGNhc3RzIGluIHRoZXNlIG1hY3JvcyBpZiBub3QhCi0gKi8KLQotI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKLQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNkZWZpbmUgTUVNWkVSTyh0YXJnZXQsc2l6ZSkJYnplcm8oKHZvaWQgKikodGFyZ2V0KSwgKHNpemVfdCkoc2l6ZSkpCi0jZGVmaW5lIE1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJYmNvcHkoKGNvbnN0IHZvaWQgKikoc3JjKSwgKHZvaWQgKikoZGVzdCksIChzaXplX3QpKHNpemUpKQotCi0jZWxzZSAvKiBub3QgQlNELCBhc3N1bWUgQU5TSS9TeXNWIHN0cmluZyBsaWIgKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQltZW1zZXQoKHZvaWQgKikodGFyZ2V0KSwgMCwgKHNpemVfdCkoc2l6ZSkpCi0jZGVmaW5lIE1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJbWVtY3B5KCh2b2lkICopKGRlc3QpLCAoY29uc3Qgdm9pZCAqKShzcmMpLCAoc2l6ZV90KShzaXplKSkKLQotI2VuZGlmCi0KLS8qCi0gKiBJbiBBTlNJIEMsIGFuZCBpbmRlZWQgYW55IHJhdGlvbmFsIGltcGxlbWVudGF0aW9uLCBzaXplX3QgaXMgYWxzbyB0aGUKLSAqIHR5cGUgcmV0dXJuZWQgYnkgc2l6ZW9mKCkuICBIb3dldmVyLCBpdCBzZWVtcyB0aGVyZSBhcmUgc29tZSBpcnJhdGlvbmFsCi0gKiBpbXBsZW1lbnRhdGlvbnMgb3V0IHRoZXJlLCBpbiB3aGljaCBzaXplb2YoKSByZXR1cm5zIGFuIGludCBldmVuIHRob3VnaAotICogc2l6ZV90IGlzIGRlZmluZWQgYXMgbG9uZyBvciB1bnNpZ25lZCBsb25nLiAgVG8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0cwotICogd2UgYWx3YXlzIHVzZSB0aGlzIFNJWkVPRigpIG1hY3JvIGluIHBsYWNlIG9mIHVzaW5nIHNpemVvZigpIGRpcmVjdGx5LgotICovCi0KLSNkZWZpbmUgU0laRU9GKG9iamVjdCkJKChzaXplX3QpIHNpemVvZihvYmplY3QpKQotCi0vKgotICogVGhlIG1vZHVsZXMgdGhhdCB1c2UgZnJlYWQoKSBhbmQgZndyaXRlKCkgYWx3YXlzIGludm9rZSB0aGVtIHRocm91Z2gKLSAqIHRoZXNlIG1hY3Jvcy4gIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gdHdpZGRsZSB0aGUgYXJndW1lbnQgY2FzdHMuCi0gKiBDQVVUSU9OOiBhcmd1bWVudCBvcmRlciBpcyBkaWZmZXJlbnQgZnJvbSB1bmRlcmx5aW5nIGZ1bmN0aW9ucyEKLSAqLwotCi0jZGVmaW5lIEpGUkVBRChmaWxlLGJ1ZixzaXplb2ZidWYpICBcCi0gICgoc2l6ZV90KSBmcmVhZCgodm9pZCAqKSAoYnVmKSwgKHNpemVfdCkgMSwgKHNpemVfdCkgKHNpemVvZmJ1ZiksIChmaWxlKSkpCi0jZGVmaW5lIEpGV1JJVEUoZmlsZSxidWYsc2l6ZW9mYnVmKSAgXAotICAoKHNpemVfdCkgZndyaXRlKChjb25zdCB2b2lkICopIChidWYpLCAoc2l6ZV90KSAxLCAoc2l6ZV90KSAoc2l6ZW9mYnVmKSwgKGZpbGUpKSkKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW0tYW5kcm9pZC5jIGIvbGlianBlZ3R3cnAvam1lbS1hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTRkMGEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvam1lbS1hbmRyb2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOwotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQJCS8qIHByZS1BTlNJIHN5c3RlbXMgbWF5IG5vdCBkZWZpbmUgdGhpczsgKi8KLSNkZWZpbmUgU0VFS19TRVQgIDAJCS8qIGlmIG5vdCwgYXNzdW1lIDAgaXMgY29ycmVjdCAqLwotI2VuZGlmCi0KLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgotICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKLSAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCi0gKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCi0gKi8KLQotR0xPQkFMKHZvaWQgRkFSICopCi1qcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCi0gKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0Ci0gKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLwotI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDAwTCAvKiBkZWZhdWx0OiB0ZW4gbWVnYWJ5dGUgKi8KLSNlbmRpZgotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCi0gKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCi0gKi8KLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCi0gICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCi17Ci0gIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOwotICAvKiBTaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdG1wZmlsZSgpIHRvIGNyZWF0ZSB0aGUgZmlsZSwKLSAgICogbm8gZXhwbGljaXQgZmlsZSBkZWxldGlvbiBpcyBuZWVkZWQuCi0gICAqLwotfQotCi1zdGF0aWMgRklMRSogZ2V0VGVtcEZpbGVGcm9tUGF0aChjb25zdCBjaGFyICogcGF0aCkgewotICAgIEZJTEUgKiBmZCA9IGZvcGVuKHBhdGgsICJ3KyIpOwotICAgIHVubGluayhwYXRoKTsKLSAgICByZXR1cm4gZmQ7Ci19Ci0KLXN0YXRpYyBGSUxFKiBnZXRUZW1wRmlsZSgpIHsKLSAgICBjaGFyIHBhdGhbMTAyNF07Ci0gICAgc25wcmludGYocGF0aCwgMTAyMywgIi9zZGNhcmQvLiVkLnRtcCIsIGdldHBpZCgpKTsKLSAgICBGSUxFICogZmQgPSBnZXRUZW1wRmlsZUZyb21QYXRoKHBhdGgpOwotICAgIGlmIChmZCA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIGFueXdoZXJlIGVsc2Ugd2UgY2FuIGNyZWF0ZSBhIHRlbXAgZmlsZT8KLQkJLy8JICAgIHNucHJpbnRmKHBhdGgsIDEwMjMsICIvZGF0YS9kYXRhLy4lZC50bXAiLCBnZXRwaWQoKSk7Ci0JCS8vICAgICAgZmQgPSBnZXRUZW1wRmlsZUZyb21QYXRoKHBhdGgpOwotICAgIH0KLSAgICByZXR1cm4gZmQ7Ci19Ci0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqCi0gKiBUaGlzIHZlcnNpb24gdXNlcyB0bXBmaWxlKCksIHdoaWNoIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBmaWxlIG5hbWUKLSAqIGJlaGluZCB0aGUgc2NlbmVzLiAgV2UgZG9uJ3QgaGF2ZSB0byB1c2UgaW5mby0+dGVtcF9uYW1lW10gYXQgYWxsOwotICogaW5kZWVkLCB3ZSBjYW4ndCBldmVuIGZpbmQgb3V0IHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdGVtcCBmaWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSBnZXRUZW1wRmlsZSgpKSA9PSBOVUxMKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOwotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOwotICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKLX0KLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAotICogY2xlYW51cCByZXF1aXJlZC4KLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW0tYXNobWVtLmMgYi9saWJqcGVndHdycC9qbWVtLWFzaG1lbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE3YjAyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW0tYXNobWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci0jZW5kaWYKLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgotICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKLSAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCi0gKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCi0gKi8KLQotR0xPQkFMKHZvaWQgRkFSICopCi1qcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgotICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAotICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwMEwgLyogZGVmYXVsdDogdGVuIG1lZ2FieXRlICovCi0jZW5kaWYKLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQotewotICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQotICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBtZW1tb3ZlKGJ1ZmZlcl9hZGRyZXNzLCBpbmZvLT5hZGRyICsgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBtZW1tb3ZlKGluZm8tPmFkZHIgKyBmaWxlX29mZnNldCwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotY2xvc2VfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQotewotICBtdW5tYXAoaW5mby0+YWRkciwgaW5mby0+c2l6ZSk7Ci0gIGNsb3NlKGluZm8tPnRlbXBfZmlsZSk7Ci19Ci0KLUxPQ0FMKGludCkKLWdldF9hc2htZW0oYmFja2luZ19zdG9yZV9wdHIgaW5mbywgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIGNoYXIgcGF0aFsxMDI0XTsKLSAgc25wcmludGYocGF0aCwgMTAyMywgIiVkLnRtcC5hc2htZW0iLCBnZXRwaWQoKSk7Ci0gIGludCBmZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKHBhdGgsIHRvdGFsX2J5dGVzX25lZWRlZCk7Ci0gIGlmIChmZCA9PSAtMSkgewotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGludCBlcnIgPSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSAgaWYgKGVycikgewotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGluZm8tPmFkZHIgPSBtbWFwKE5VTEwsIHRvdGFsX2J5dGVzX25lZWRlZCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLSAgaW5mby0+c2l6ZSA9IHRvdGFsX2J5dGVzX25lZWRlZDsKLSAgaW5mby0+dGVtcF9maWxlID0gZmQ7Ci0gIHJldHVybiBmZDsKLX0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgotICogVGhpcyB2ZXJzaW9uIHVzZXMgYXNobWVtIHRvIGdldCBhIHNoYXJlZCBtZW1vcnkgb2YgdG90YWwtYnl0ZXNfbmVlZGVkLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgaWYgKGdldF9hc2htZW0oaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSA9PSAtMSkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICIiKTsKLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7Ci19Ci0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbWFuc2kuYyBiL2xpYmpwZWd0d3JwL2ptZW1hbnNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTNlNDkuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvam1lbWFuc2kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogam1lbWFuc2kuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgc2ltcGxlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgotICogYXNzdW1lcyB0aGF0IHlvdSBoYXZlIHRoZSBBTlNJLXN0YW5kYXJkIGxpYnJhcnkgcm91dGluZSB0bXBmaWxlKCkuCi0gKiBBbHNvLCB0aGUgcHJvYmxlbSBvZiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUKLSAqIGlzIHNob3ZlZCBvbnRvIHRoZSB1c2VyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KLWV4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKLWV4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCQkvKiBwcmUtQU5TSSBzeXN0ZW1zIG1heSBub3QgZGVmaW5lIHRoaXM7ICovCi0jZGVmaW5lIFNFRUtfU0VUICAwCQkvKiBpZiBub3QsIGFzc3VtZSAwIGlzIGNvcnJlY3QgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KLSAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCi0gKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAotICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgotICovCi0KLUdMT0JBTCh2b2lkIEZBUiAqKQotanBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgotICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAotICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwTCAvKiBkZWZhdWx0OiBvbmUgbWVnYWJ5dGUgKi8KLSNlbmRpZgotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCi0gKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCi0gKi8KLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCi0gICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKLSAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCi17Ci0gIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOwotICAvKiBTaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdG1wZmlsZSgpIHRvIGNyZWF0ZSB0aGUgZmlsZSwKLSAgICogbm8gZXhwbGljaXQgZmlsZSBkZWxldGlvbiBpcyBuZWVkZWQuCi0gICAqLwotfQotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqCi0gKiBUaGlzIHZlcnNpb24gdXNlcyB0bXBmaWxlKCksIHdoaWNoIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBmaWxlIG5hbWUKLSAqIGJlaGluZCB0aGUgc2NlbmVzLiAgV2UgZG9uJ3QgaGF2ZSB0byB1c2UgaW5mby0+dGVtcF9uYW1lW10gYXQgYWxsOwotICogaW5kZWVkLCB3ZSBjYW4ndCBldmVuIGZpbmQgb3V0IHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdGVtcCBmaWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSB0bXBmaWxlKCkpID09IE5VTEwpCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiIik7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbWRvcy5jIGIvbGlianBlZ3R3cnAvam1lbWRvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI0NWM2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW1kb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKgotICogam1lbWRvcy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gTVMtRE9TLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGVtcG9yYXJ5IGRhdGEgY2FuIGJlCi0gKiBzdG9yZWQgaW4gZXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGFzIHdlbGwgYXMgaW4gcmVndWxhciBET1MgZmlsZXMuCi0gKgotICogSWYgeW91IHVzZSB0aGlzIGZpbGUsIHlvdSBtdXN0IGJlIHN1cmUgdGhhdCBORUVEX0ZBUl9QT0lOVEVSUyBpcyBkZWZpbmVkCi0gKiBpZiB5b3UgY29tcGlsZSBpbiBhIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsOyBpdCBzaG91bGQgTk9UIGJlIGRlZmluZWQgaWYKLSAqIHlvdSB1c2UgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbC4gIFRoaXMgZmlsZSBpcyBub3QgcmVjb21tZW5kZWQgaWYgeW91Ci0gKiBhcmUgdXNpbmcgYSBmbGF0LW1lbW9yeS1zcGFjZSAzODYgZW52aXJvbm1lbnQgc3VjaCBhcyBESkdDQyBvciBXYXRjb20gQy4KLSAqIEFsc28sIHRoaXMgY29kZSB3aWxsIE5PVCB3b3JrIGlmIHN0cnVjdCBmaWVsZHMgYXJlIGFsaWduZWQgb24gZ3JlYXRlciB0aGFuCi0gKiAyLWJ5dGUgYm91bmRhcmllcy4KLSAqCi0gKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEdlJyBXZWlqZXJzLgotICovCi0KLS8qCi0gKiBJZiB5b3UgaGF2ZSBib3RoIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnksIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlCi0gKiBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSB0cmllZCBpbiBqb3Blbl9iYWNraW5nX3N0b3JlLiAgT24gYSAyODYgbWFjaGluZQotICogZXhwYW5kZWQgbWVtb3J5IGlzIHVzdWFsbHkgZmFzdGVyLCBzaW5jZSBleHRlbmRlZCBtZW1vcnkgYWNjZXNzIGludm9sdmVzCi0gKiBhbiBleHBlbnNpdmUgcHJvdGVjdGVkLW1vZGUtYW5kLWJhY2sgc3dpdGNoLiAgT24gMzg2IGFuZCBiZXR0ZXIsIGV4dGVuZGVkCi0gKiBtZW1vcnkgaXMgdXN1YWxseSBmYXN0ZXIuICBBcyBkaXN0cmlidXRlZCwgdGhlIGNvZGUgdHJpZXMgZXh0ZW5kZWQgbWVtb3J5Ci0gKiBmaXJzdCAod2hhdD8gbm90IGV2ZXJ5b25lIGhhcyBhIDM4Nj8gOi0pLgotICoKLSAqIFlvdSBjYW4gZGlzYWJsZSB1c2Ugb2YgZXh0ZW5kZWQvZXhwYW5kZWQgbWVtb3J5IGVudGlyZWx5IGJ5IGFsdGVyaW5nIHRoZXNlCi0gKiBkZWZpbml0aW9ucyBvciBvdmVycmlkaW5nIHRoZW0gZnJvbSB0aGUgTWFrZWZpbGUgKGVnLCAtREVNU19TVVBQT1JURUQ9MCkuCi0gKi8KLQotI2lmbmRlZiBYTVNfU1VQUE9SVEVECi0jZGVmaW5lIFhNU19TVVBQT1JURUQgIDEKLSNlbmRpZgotI2lmbmRlZiBFTVNfU1VQUE9SVEVECi0jZGVmaW5lIEVNU19TVVBQT1JURUQgIDEKLSNlbmRpZgotCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSB0aGVzZSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOwotZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotCi0jaWZkZWYgX19UVVJCT0NfXwotLyogVGhlc2UgZGVmaW5pdGlvbnMgd29yayBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSAqLwotI2luY2x1ZGUgPGFsbG9jLmg+CQkvKiBuZWVkIGZhcm1hbGxvYygpLCBmYXJmcmVlKCkgKi8KLSNkZWZpbmUgZmFyX21hbGxvYyh4KQlmYXJtYWxsb2MoeCkKLSNkZWZpbmUgZmFyX2ZyZWUoeCkJZmFyZnJlZSh4KQotI2Vsc2UKLS8qIFRoZXNlIGRlZmluaXRpb25zIHdvcmsgZm9yIE1pY3Jvc29mdCBDIGFuZCBjb21wYXRpYmxlIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgPG1hbGxvYy5oPgkJLyogbmVlZCBfZm1hbGxvYygpLCBfZmZyZWUoKSAqLwotI2RlZmluZSBmYXJfbWFsbG9jKHgpCV9mbWFsbG9jKHgpCi0jZGVmaW5lIGZhcl9mcmVlKHgpCV9mZnJlZSh4KQotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBORUVEX0ZBUl9QT0lOVEVSUyAqLwotCi0jZGVmaW5lIGZhcl9tYWxsb2MoeCkJbWFsbG9jKHgpCi0jZGVmaW5lIGZhcl9mcmVlKHgpCWZyZWUoeCkKLQotI2VuZGlmIC8qIE5FRURfRkFSX1BPSU5URVJTICovCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZWxzZQotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCi0jZW5kaWYKLQotI2lmbmRlZiBVU0VfTVNET1NfTUVNTUdSCS8qIG1ha2Ugc3VyZSB1c2VyIGdvdCBjb25maWd1cmF0aW9uIHJpZ2h0ICovCi0gIFlvdSBmb3Jnb3QgdG8gZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLwotI2VuZGlmCi0KLSNpZiBNQVhfQUxMT0NfQ0hVTksgPj0gNjU1MzVMCS8qIG1ha2Ugc3VyZSBqY29uZmlnLmggZ290IHRoaXMgcmlnaHQgKi8KLSAgTUFYX0FMTE9DX0NIVU5LIHNob3VsZCBiZSBsZXNzIHRoYW4gNjRLLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLwotI2VuZGlmCi0KLQotLyoKLSAqIERlY2xhcmF0aW9ucyBmb3IgYXNzZW1ibHktbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyAoc2VlIGptZW1kb3NhLmFzbSkuCi0gKgotICogVGhlIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgImZhciIgYXMgYXJlIGFsbCB0aGVpciBwb2ludGVyIGFyZ3VtZW50czsKLSAqIHRoaXMgZW5zdXJlcyB0aGUgYXNzZW1ibHkgc291cmNlIGNvZGUgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gKiBjb21waWxlciBtZW1vcnkgbW9kZWwuICBXZSBhc3N1bWUgInNob3J0IiBpcyAxNiBiaXRzLCAibG9uZyIgaXMgMzIuCi0gKi8KLQotdHlwZWRlZiB2b2lkIGZhciAqIFhNU0RSSVZFUjsJLyogYWN0dWFsbHkgYSBwb2ludGVyIHRvIGNvZGUgKi8KLXR5cGVkZWYgc3RydWN0IHsJCS8qIHJlZ2lzdGVycyBmb3IgY2FsbGluZyBYTVMgZHJpdmVyICovCi0JdW5zaWduZWQgc2hvcnQgYXgsIGR4LCBieDsKLQl2b2lkIGZhciAqIGRzX3NpOwotICAgICAgfSBYTVNjb250ZXh0OwotdHlwZWRlZiBzdHJ1Y3QgewkJLyogcmVnaXN0ZXJzIGZvciBjYWxsaW5nIEVNUyBkcml2ZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBheCwgZHgsIGJ4OwotCXZvaWQgZmFyICogZHNfc2k7Ci0gICAgICB9IEVNU2NvbnRleHQ7Ci0KLWV4dGVybiBzaG9ydCBmYXIgamRvc19vcGVuIEpQUCgoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKSk7Ci1leHRlcm4gc2hvcnQgZmFyIGpkb3NfY2xvc2UgSlBQKChzaG9ydCBoYW5kbGUpKTsKLWV4dGVybiBzaG9ydCBmYXIgamRvc19zZWVrIEpQUCgoc2hvcnQgaGFuZGxlLCBsb25nIG9mZnNldCkpOwotZXh0ZXJuIHNob3J0IGZhciBqZG9zX3JlYWQgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAotCQkJCXVuc2lnbmVkIHNob3J0IGNvdW50KSk7Ci1leHRlcm4gc2hvcnQgZmFyIGpkb3Nfd3JpdGUgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAotCQkJCSB1bnNpZ25lZCBzaG9ydCBjb3VudCkpOwotZXh0ZXJuIHZvaWQgZmFyIGp4bXNfZ2V0ZHJpdmVyIEpQUCgoWE1TRFJJVkVSIGZhciAqKSk7Ci1leHRlcm4gdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIEpQUCgoWE1TRFJJVkVSLCBYTVNjb250ZXh0IGZhciAqKSk7Ci1leHRlcm4gc2hvcnQgZmFyIGplbXNfYXZhaWxhYmxlIEpQUCgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciBKUFAoKEVNU2NvbnRleHQgZmFyICopKTsKLQotCi0vKgotICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgotICogVGhpcyBpcyBoaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYW5kIHlvdSBtYXkgd2FudCB0byBjdXN0b21pemUgaXQuCi0gKi8KLQotc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KLQotTE9DQUwodm9pZCkKLXNlbGVjdF9maWxlX25hbWUgKGNoYXIgKiBmbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqIGVudjsKLSAgY2hhciAqIHB0cjsKLSAgRklMRSAqIHRmaWxlOwotCi0gIC8qIEtlZXAgZ2VuZXJhdGluZyBmaWxlIG5hbWVzIHRpbGwgd2UgZmluZCBvbmUgdGhhdCdzIG5vdCBpbiB1c2UgKi8KLSAgZm9yICg7OykgewotICAgIC8qIEdldCB0ZW1wIGRpcmVjdG9yeSBuYW1lIGZyb20gZW52aXJvbm1lbnQgVE1QIG9yIFRFTVAgdmFyaWFibGU7Ci0gICAgICogaWYgbm9uZSwgdXNlICIuIgotICAgICAqLwotICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJUTVAiKSkgPT0gTlVMTCkKLSAgICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJURU1QIikpID09IE5VTEwpCi0JZW52ID0gIi4iOwotICAgIGlmICgqZW52ID09ICdcMCcpCQkvKiBudWxsIHN0cmluZyBtZWFucyAiLiIgKi8KLSAgICAgIGVudiA9ICIuIjsKLSAgICBwdHIgPSBmbmFtZTsJCS8qIGNvcHkgbmFtZSB0byBmbmFtZSAqLwotICAgIHdoaWxlICgqZW52ICE9ICdcMCcpCi0gICAgICAqcHRyKysgPSAqZW52Kys7Ci0gICAgaWYgKHB0clstMV0gIT0gJ1xcJyAmJiBwdHJbLTFdICE9ICcvJykKLSAgICAgICpwdHIrKyA9ICdcXCc7CQkvKiBhcHBlbmQgYmFja3NsYXNoIGlmIG5vdCBpbiBlbnYgdmFyaWFibGUgKi8KLSAgICAvKiBBcHBlbmQgYSBzdWl0YWJsZSBmaWxlIG5hbWUgKi8KLSAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KLSAgICBzcHJpbnRmKHB0ciwgIkpQRyUwM2QuVE1QIiwgbmV4dF9maWxlX251bSk7Ci0gICAgLyogUHJvYmUgdG8gc2VlIGlmIGZpbGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSAqLwotICAgIGlmICgodGZpbGUgPSBmb3BlbihmbmFtZSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKQotICAgICAgYnJlYWs7Ci0gICAgZmNsb3NlKHRmaWxlKTsJCS8qIG9vcHMsIGl0J3MgdGhlcmU7IGNsb3NlIHRmaWxlICYgdHJ5IGFnYWluICovCi0gIH0KLX0KLQotCi0vKgotICogTmVhci1tZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIGZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgaW4gZmFyIG1lbW9yeSwgaWYgcG9zc2libGUKLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgZmFyX21hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZmFyX2ZyZWUob2JqZWN0KTsKLX0KLQotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgotICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAotICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KLSNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkzMDAwMDBMIC8qIGZvciB0b3RhbCB1c2FnZSBhYm91dCA0NTBLICovCi0jZW5kaWYKLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQotewotICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQotICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgotICovCi0KLS8qCi0gKiBGb3IgTVMtRE9TIHdlIHN1cHBvcnQgdGhyZWUgdHlwZXMgb2YgYmFja2luZyBzdG9yYWdlOgotICogICAxLiBDb252ZW50aW9uYWwgRE9TIGZpbGVzLiAgV2UgYWNjZXNzIHRoZXNlIGJ5IGRpcmVjdCBET1MgY2FsbHMgcmF0aGVyCi0gKiAgICAgIHRoYW4gdmlhIHRoZSBzdGRpbyBwYWNrYWdlLiAgVGhpcyBwcm92aWRlcyBhIGJpdCBiZXR0ZXIgcGVyZm9ybWFuY2UsCi0gKiAgICAgIGJ1dCB0aGUgcmVhbCByZWFzb24gaXMgdGhhdCB0aGUgYnVmZmVycyB0byBiZSByZWFkIG9yIHdyaXR0ZW4gYXJlIEZBUi4KLSAqICAgICAgVGhlIHN0ZGlvIGxpYnJhcnkgZm9yIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVscyBjYW4ndCBjb3BlIHdpdGggdGhhdC4KLSAqICAgMi4gRXh0ZW5kZWQgbWVtb3J5LCBhY2Nlc3NlZCBwZXIgdGhlIFhNUyBWMi4wIHNwZWNpZmljYXRpb24uCi0gKiAgIDMuIEV4cGFuZGVkIG1lbW9yeSwgYWNjZXNzZWQgcGVyIHRoZSBMSU0vRU1TIDQuMCBzcGVjaWZpY2F0aW9uLgotICogWW91J2xsIG5lZWQgY29waWVzIG9mIHRob3NlIHNwZWNzIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIHJlbGF0ZWQgY29kZS4KLSAqIFRoZSBzcGVjcyBhcmUgYXZhaWxhYmxlIGJ5IEludGVybmV0IEZUUCBmcm9tIHRoZSBTSU1URUwgYXJjaGl2ZXMgCi0gKiAob2FrLm9ha2xhbmQuZWR1IGFuZCBpdHMgdmFyaW91cyBtaXJyb3Igc2l0ZXMpLiAgU2VlIGZpbGVzCi0gKiBwdWIvbXNkb3MvbWljcm9zb2Z0L3htczIwLmFyYyBhbmQgcHViL21zZG9zL2luZm8vbGltZW1zNDEuemlwLgotICovCi0KLQotLyoKLSAqIEFjY2VzcyBtZXRob2RzIGZvciBhIERPUyBmaWxlLgotICovCi0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChqZG9zX3NlZWsoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBmaWxlX29mZnNldCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgLyogU2luY2UgTUFYX0FMTE9DX0NIVU5LIGlzIGxlc3MgdGhhbiA2NEssIGJ5dGVfY291bnQgd2lsbCBiZSB0b28uICovCi0gIGlmIChieXRlX2NvdW50ID4gNjU1MzVMKQkvKiBzYWZldHkgY2hlY2sgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7Ci0gIGlmIChqZG9zX3JlYWQoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBidWZmZXJfYWRkcmVzcywKLQkJKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBpZiAoamRvc19zZWVrKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSwgZmlsZV9vZmZzZXQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0gIC8qIFNpbmNlIE1BWF9BTExPQ19DSFVOSyBpcyBsZXNzIHRoYW4gNjRLLCBieXRlX2NvdW50IHdpbGwgYmUgdG9vLiAqLwotICBpZiAoYnl0ZV9jb3VudCA+IDY1NTM1TCkJLyogc2FmZXR5IGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOwotICBpZiAoamRvc193cml0ZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGJ1ZmZlcl9hZGRyZXNzLAotCQkgKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgamRvc19jbG9zZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLwotICByZW1vdmUoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCi0vKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgcmVtb3ZlKCksIHRyeSB1bmxpbmsoKSBpbnN0ZWFkLgotICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0Ci0gKiB1bmxpbmsoKSB3YXMgbW9yZSBjb21tb24gaW4gcHJlLUFOU0kgc3lzdGVtcy4KLSAqLwotICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotb3Blbl9maWxlX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgc2hvcnQgaGFuZGxlOwotCi0gIHNlbGVjdF9maWxlX25hbWUoaW5mby0+dGVtcF9uYW1lKTsKLSAgaWYgKGpkb3Nfb3Blbigoc2hvcnQgZmFyICopICYgaGFuZGxlLCAoY2hhciBmYXIgKikgaW5mby0+dGVtcF9uYW1lKSkgewotICAgIC8qIG1pZ2h0IGFzIHdlbGwgZXhpdCBzaW5jZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZSB3aWxsIGZhaWwgYW55d2F5ICovCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotICBpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUgPSBoYW5kbGU7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfZmlsZV9zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2ZpbGVfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9maWxlX3N0b3JlOwotICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOwotICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KLX0KLQotCi0vKgotICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4dGVuZGVkIG1lbW9yeS4KLSAqLwotCi0jaWYgWE1TX1NVUFBPUlRFRAotCi1zdGF0aWMgWE1TRFJJVkVSIHhtc19kcml2ZXI7CS8qIHNhdmVkIGFkZHJlc3Mgb2YgWE1TIGRyaXZlciAqLwotCi10eXBlZGVmIHVuaW9uIHsJCQkvKiBlaXRoZXIgbG9uZyBvZmZzZXQgb3IgcmVhbC1tb2RlIHBvaW50ZXIgKi8KLQlsb25nIG9mZnNldDsKLQl2b2lkIGZhciAqIHB0cjsKLSAgICAgIH0gWE1TUFRSOwotCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBYTVMgbW92ZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqLwotCWxvbmcgbGVuZ3RoOwotCVhNU0ggc3JjX2hhbmRsZTsKLQlYTVNQVFIgc3JjOwotCVhNU0ggZHN0X2hhbmRsZTsKLQlYTVNQVFIgZHN0OwotICAgICAgfSBYTVNzcGVjOwotCi0jZGVmaW5lIE9ERChYKQkoKChYKSAmIDFMKSAhPSAwKQotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBYTVNjb250ZXh0IGN0eDsKLSAgWE1Tc3BlYyBzcGVjOwotICBjaGFyIGVuZGJ1ZmZlclsyXTsKLQotICAvKiBUaGUgWE1TIGRyaXZlciBjYW4ndCBjb3BlIHdpdGggYW4gb2RkIGxlbmd0aCwgc28gaGFuZGxlIHRoZSBsYXN0IGJ5dGUKLSAgICogc3BlY2lhbGx5IGlmIGJ5dGVfY291bnQgaXMgb2RkLiAgV2UgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gYmUgY29tbW9uLgotICAgKi8KLQotICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQgJiAofiAxTCk7Ci0gIHNwZWMuc3JjX2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOwotICBzcGVjLnNyYy5vZmZzZXQgPSBmaWxlX29mZnNldDsKLSAgc3BlYy5kc3RfaGFuZGxlID0gMDsKLSAgc3BlYy5kc3QucHRyID0gYnVmZmVyX2FkZHJlc3M7Ci0gIAotICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOwotICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCAhPSAxKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1JFQUQpOwotCi0gIGlmIChPREQoYnl0ZV9jb3VudCkpIHsKLSAgICByZWFkX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKLQkJICAgZmlsZV9vZmZzZXQgKyBieXRlX2NvdW50IC0gMUwsIDJMKTsKLSAgICAoKGNoYXIgRkFSICopIGJ1ZmZlcl9hZGRyZXNzKVtieXRlX2NvdW50IC0gMUxdID0gZW5kYnVmZmVyWzBdOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIFhNU2NvbnRleHQgY3R4OwotICBYTVNzcGVjIHNwZWM7Ci0gIGNoYXIgZW5kYnVmZmVyWzJdOwotCi0gIC8qIFRoZSBYTVMgZHJpdmVyIGNhbid0IGNvcGUgd2l0aCBhbiBvZGQgbGVuZ3RoLCBzbyBoYW5kbGUgdGhlIGxhc3QgYnl0ZQotICAgKiBzcGVjaWFsbHkgaWYgYnl0ZV9jb3VudCBpcyBvZGQuICBXZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBjb21tb24uCi0gICAqLwotCi0gIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudCAmICh+IDFMKTsKLSAgc3BlYy5zcmNfaGFuZGxlID0gMDsKLSAgc3BlYy5zcmMucHRyID0gYnVmZmVyX2FkZHJlc3M7Ci0gIHNwZWMuZHN0X2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOwotICBzcGVjLmRzdC5vZmZzZXQgPSBmaWxlX29mZnNldDsKLQotICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOwotICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCAhPSAxKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1dSSVRFKTsKLQotICBpZiAoT0REKGJ5dGVfY291bnQpKSB7Ci0gICAgcmVhZF94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCi0JCSAgIGZpbGVfb2Zmc2V0ICsgYnl0ZV9jb3VudCAtIDFMLCAyTCk7Ci0gICAgZW5kYnVmZmVyWzBdID0gKChjaGFyIEZBUiAqKSBidWZmZXJfYWRkcmVzcylbYnl0ZV9jb3VudCAtIDFMXTsKLSAgICB3cml0ZV94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCi0JCSAgICBmaWxlX29mZnNldCArIGJ5dGVfY291bnQgLSAxTCwgMkwpOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgWE1TY29udGV4dCBjdHg7Ci0KLSAgY3R4LmR4ID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7Ci0gIGN0eC5heCA9IDB4MGEwMDsKLSAganhtc19jYWxsZHJpdmVyKHhtc19kcml2ZXIsIChYTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19DTE9TRSwgaW5mby0+aGFuZGxlLnhtc19oYW5kbGUpOwotICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KLX0KLQotCi1MT0NBTChib29sZWFuKQotb3Blbl94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIFhNU2NvbnRleHQgY3R4OwotCi0gIC8qIEdldCBhZGRyZXNzIG9mIFhNUyBkcml2ZXIgKi8KLSAganhtc19nZXRkcml2ZXIoKFhNU0RSSVZFUiBmYXIgKikgJiB4bXNfZHJpdmVyKTsKLSAgaWYgKHhtc19kcml2ZXIgPT0gTlVMTCkKLSAgICByZXR1cm4gRkFMU0U7CQkvKiBubyBkcml2ZXIgdG8gYmUgaGFkICovCi0KLSAgLyogR2V0IHZlcnNpb24gbnVtYmVyLCBtdXN0IGJlID49IDIuMDAgKi8KLSAgY3R4LmF4ID0gMHgwMDAwOwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCA8ICh1bnNpZ25lZCBzaG9ydCkgMHgwMjAwKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBUcnkgdG8gZ2V0IHNwYWNlIChleHByZXNzZWQgaW4ga2lsb2J5dGVzKSAqLwotICBjdHguZHggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgMTAyM0wpID4+IDEwKTsKLSAgY3R4LmF4ID0gMHgwOTAwOwotICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKGN0eC5heCAhPSAxKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBTdWNjZWVkZWQsIHNhdmUgdGhlIGhhbmRsZSBhbmQgYXdheSB3ZSBnbyAqLwotICBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZSA9IGN0eC5keDsKLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF94bXNfc3RvcmU7Ci0gIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV94bXNfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV94bXNfc3RvcmU7Ci0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19PUEVOLCBjdHguZHgpOwotICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KLX0KLQotI2VuZGlmIC8qIFhNU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4cGFuZGVkIG1lbW9yeS4KLSAqLwotCi0jaWYgRU1TX1NVUFBPUlRFRAotCi0vKiBUaGUgRU1TIG1vdmUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZXMgd29yZCBhbmQgbG9uZyBmaWVsZHMgYWxpZ25lZAotICogYXQgb2RkIGJ5dGUgYm91bmRhcmllcy4gIFNvbWUgY29tcGlsZXJzIHdpbGwgYWxpZ24gc3RydWN0IGZpZWxkcyBhdCBldmVuCi0gKiBieXRlIGJvdW5kYXJpZXMuICBXaGlsZSBpdCdzIHVzdWFsbHkgcG9zc2libGUgdG8gZm9yY2UgYnl0ZSBhbGlnbm1lbnQsCi0gKiB0aGF0IGNhdXNlcyBhbiBvdmVyYWxsIHBlcmZvcm1hbmNlIHBlbmFsdHkgYW5kIG1heSBwb3NlIHByb2JsZW1zIGluIG1lcmdpbmcKLSAqIEpQRUcgaW50byBhIGxhcmdlciBhcHBsaWNhdGlvbi4gIEluc3RlYWQgd2UgYWNjZXB0IHNvbWUgcmF0aGVyIGRpcnR5IGNvZGUKLSAqIGhlcmUuICBOb3RlIHRoaXMgY29kZSB3b3VsZCBmYWlsIGlmIHRoZSBoYXJkd2FyZSBkaWQgbm90IGFsbG93IG9kZC1ieXRlCi0gKiB3b3JkICYgbG9uZyBhY2Nlc3NlcywgYnV0IGFsbCA4MHg4NiBDUFVzIGRvLgotICovCi0KLXR5cGVkZWYgdm9pZCBmYXIgKiBFTVNQVFI7Ci0KLXR5cGVkZWYgdW5pb24gewkJCS8qIEVNUyBtb3ZlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCi0JbG9uZyBsZW5ndGg7CQkvKiBJdCdzIGVhc3kgdG8gYWNjZXNzIGZpcnN0IDQgYnl0ZXMgKi8KLQljaGFyIGJ5dGVzWzE4XTsJCS8qIE1pc2FsaWduZWQgZmllbGRzIGluIGhlcmUhICovCi0gICAgICB9IEVNU3NwZWM7Ci0KLS8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIG1pc2FsaWduZWQgZmllbGRzICovCi0jZGVmaW5lIEZJRUxEX0FUKHNwZWMsb2Zmc2V0LHR5cGUpICAoKigodHlwZSAqKSAmKHNwZWMuYnl0ZXNbb2Zmc2V0XSkpKQotI2RlZmluZSBTUkNfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYyw0LGNoYXIpCi0jZGVmaW5lIFNSQ19IQU5ETEUoc3BlYykJRklFTERfQVQoc3BlYyw1LEVNU0gpCi0jZGVmaW5lIFNSQ19PRkZTRVQoc3BlYykJRklFTERfQVQoc3BlYyw3LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBTUkNfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYyw5LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBTUkNfUFRSKHNwZWMpCQlGSUVMRF9BVChzcGVjLDcsRU1TUFRSKQotI2RlZmluZSBEU1RfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYywxMSxjaGFyKQotI2RlZmluZSBEU1RfSEFORExFKHNwZWMpCUZJRUxEX0FUKHNwZWMsMTIsRU1TSCkKLSNkZWZpbmUgRFNUX09GRlNFVChzcGVjKQlGSUVMRF9BVChzcGVjLDE0LHVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBEU1RfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYywxNix1bnNpZ25lZCBzaG9ydCkKLSNkZWZpbmUgRFNUX1BUUihzcGVjKQkJRklFTERfQVQoc3BlYywxNCxFTVNQVFIpCi0KLSNkZWZpbmUgRU1TUEFHRVNJWkUJMTYzODRMCS8qIGdvc3BlbCwgc2VlIHRoZSBFTVMgc3BlY3MgKi8KLQotI2RlZmluZSBISUJZVEUoVykgICgoKFcpID4+IDgpICYgMHhGRikKLSNkZWZpbmUgTE9CWVRFKFcpICAoKFcpICYgMHhGRikKLQotCi1NRVRIT0RERUYodm9pZCkKLXJlYWRfZW1zX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCXZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCWxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0gIEVNU3NwZWMgc3BlYzsKLQotICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7Ci0gIFNSQ19UWVBFKHNwZWMpID0gMTsKLSAgU1JDX0hBTkRMRShzcGVjKSA9IGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlOwotICBTUkNfUEFHRShzcGVjKSAgID0gKHVuc2lnbmVkIHNob3J0KSAoZmlsZV9vZmZzZXQgLyBFTVNQQUdFU0laRSk7Ci0gIFNSQ19PRkZTRVQoc3BlYykgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAlIEVNU1BBR0VTSVpFKTsKLSAgRFNUX1RZUEUoc3BlYykgPSAwOwotICBEU1RfSEFORExFKHNwZWMpID0gMDsKLSAgRFNUX1BUUihzcGVjKSAgICA9IGJ1ZmZlcl9hZGRyZXNzOwotICAKLSAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKLSAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCi0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19SRUFEKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0gIEVNU3NwZWMgc3BlYzsKLQotICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7Ci0gIFNSQ19UWVBFKHNwZWMpID0gMDsKLSAgU1JDX0hBTkRMRShzcGVjKSA9IDA7Ci0gIFNSQ19QVFIoc3BlYykgICAgPSBidWZmZXJfYWRkcmVzczsKLSAgRFNUX1RZUEUoc3BlYykgPSAxOwotICBEU1RfSEFORExFKHNwZWMpID0gaW5mby0+aGFuZGxlLmVtc19oYW5kbGU7Ci0gIERTVF9QQUdFKHNwZWMpICAgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAvIEVNU1BBR0VTSVpFKTsKLSAgRFNUX09GRlNFVChzcGVjKSA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0ICUgRU1TUEFHRVNJWkUpOwotICAKLSAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKLSAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCi0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19XUklURSk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jbG9zZV9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgRU1TY29udGV4dCBjdHg7Ci0KLSAgY3R4LmF4ID0gMHg0NTAwOwotICBjdHguZHggPSBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZTsKLSAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7Ci0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0VNU19DTE9TRSwgaW5mby0+aGFuZGxlLmVtc19oYW5kbGUpOwotICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KLX0KLQotCi1MT0NBTChib29sZWFuKQotb3Blbl9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIEVNU2NvbnRleHQgY3R4OwotCi0gIC8qIElzIEVNUyBkcml2ZXIgdGhlcmU/ICovCi0gIGlmICghIGplbXNfYXZhaWxhYmxlKCkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEdldCBzdGF0dXMsIG1ha2Ugc3VyZSBFTVMgaXMgT0sgKi8KLSAgY3R4LmF4ID0gMHg0MDAwOwotICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKEhJQllURShjdHguYXgpICE9IDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEdldCB2ZXJzaW9uLCBtdXN0IGJlID49IDQuMCAqLwotICBjdHguYXggPSAweDQ2MDA7Ci0gIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOwotICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCB8fCBMT0JZVEUoY3R4LmF4KSA8IDB4NDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFRyeSB0byBhbGxvY2F0ZSByZXF1ZXN0ZWQgc3BhY2UgKi8KLSAgY3R4LmF4ID0gMHg0MzAwOwotICBjdHguYnggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgRU1TUEFHRVNJWkUtMUwpIC8gRU1TUEFHRVNJWkUpOwotICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKLSAgaWYgKEhJQllURShjdHguYXgpICE9IDApCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFN1Y2NlZWRlZCwgc2F2ZSB0aGUgaGFuZGxlIGFuZCBhd2F5IHdlIGdvICovCi0gIGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlID0gY3R4LmR4OwotICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2Vtc19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2Vtc19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2Vtc19zdG9yZTsKLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRU1TX09QRU4sIGN0eC5keCk7Ci0gIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLwotfQotCi0jZW5kaWYgLyogRU1TX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIC8qIFRyeSBleHRlbmRlZCBtZW1vcnksIHRoZW4gZXhwYW5kZWQgbWVtb3J5LCB0aGVuIHJlZ3VsYXIgZmlsZS4gKi8KLSNpZiBYTVNfU1VQUE9SVEVECi0gIGlmIChvcGVuX3htc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKLSAgICByZXR1cm47Ci0jZW5kaWYKLSNpZiBFTVNfU1VQUE9SVEVECi0gIGlmIChvcGVuX2Vtc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKLSAgICByZXR1cm47Ci0jZW5kaWYKLSAgaWYgKG9wZW5fZmlsZV9zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKLSAgICByZXR1cm47Ci0gIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBuZXh0X2ZpbGVfbnVtID0gMDsJCS8qIGluaXRpYWxpemUgdGVtcCBmaWxlIG5hbWUgZ2VuZXJhdG9yICovCi0gIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBNaWNyb3NvZnQgQywgYXQgbGVhc3QgaW4gdjYuMDBBLCB3aWxsIG5vdCBzdWNjZXNzZnVsbHkgcmVjbGFpbSBmcmVlZAotICAgKiBibG9ja3Mgb2Ygc2l6ZSA+IDMyS2J5dGVzIHVubGVzcyB3ZSBnaXZlIGl0IGEga2ljayBpbiB0aGUgcmVhciwgbGlrZSBzbzoKLSAgICovCi0jaWZkZWYgTkVFRF9GSEVBUE1JTgotICBfZmhlYXBtaW4oKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvam1lbWRvc2EuYXNtIGIvbGlianBlZ3R3cnAvam1lbWRvc2EuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q0MzcyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2ptZW1kb3NhLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi07Ci07IGptZW1kb3NhLmFzbQotOwotOyBDb3B5cmlnaHQgKEMpIDE5OTIsIFRob21hcyBHLiBMYW5lLgotOyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotOyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi07Ci07IFRoaXMgZmlsZSBjb250YWlucyBsb3ctbGV2ZWwgaW50ZXJmYWNlIHJvdXRpbmVzIHRvIHN1cHBvcnQgdGhlIE1TLURPUwotOyBiYWNraW5nIHN0b3JlIG1hbmFnZXIgKGptZW1kb3MuYykuICBSb3V0aW5lcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIGRpc2sKLTsgZmlsZXMgdGhyb3VnaCBkaXJlY3QgRE9TIGNhbGxzLCBhbmQgdG8gYWNjZXNzIFhNUyBhbmQgRU1TIGRyaXZlcnMuCi07Ci07IFRoaXMgZmlsZSBzaG91bGQgYXNzZW1ibGUgd2l0aCBNaWNyb3NvZnQncyBNQVNNIG9yIGFueSBjb21wYXRpYmxlCi07IGFzc2VtYmxlciAoaW5jbHVkaW5nIEJvcmxhbmQncyBUdXJibyBBc3NlbWJsZXIpLiAgSWYgeW91IGhhdmVuJ3QgZ290Ci07IGEgY29tcGF0aWJsZSBhc3NlbWJsZXIsIGJldHRlciBmYWxsIGJhY2sgdG8gam1lbWFuc2kuYyBvciBqbWVtbmFtZS5jLgotOwotOyBUbyBtaW5pbWl6ZSBkZXBlbmRlbmNlIG9uIHRoZSBDIGNvbXBpbGVyJ3MgcmVnaXN0ZXIgdXNhZ2UgY29udmVudGlvbnMsCi07IHdlIHNhdmUgYW5kIHJlc3RvcmUgYWxsIDgwODYgcmVnaXN0ZXJzLCBldmVuIHRob3VnaCBtb3N0IGNvbXBpbGVycyBvbmx5Ci07IHJlcXVpcmUgU0ksREksRFMgdG8gYmUgcHJlc2VydmVkLiAgQWxzbywgd2UgdXNlIG9ubHkgMTYtYml0LXdpZGUgcmV0dXJuCi07IHZhbHVlcywgd2hpY2ggZXZlcnlib2R5IHJldHVybnMgaW4gQVguCi07Ci07IEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgR2UnIFdlaWplcnMuCi07Ci0KLUpNRU1ET1NBX1RYVAlzZWdtZW50IGJ5dGUgcHVibGljICdDT0RFJwotCi0JCWFzc3VtZQljczpKTUVNRE9TQV9UWFQKLQotCQlwdWJsaWMJX2pkb3Nfb3BlbgotCQlwdWJsaWMJX2pkb3NfY2xvc2UKLQkJcHVibGljCV9qZG9zX3NlZWsKLQkJcHVibGljCV9qZG9zX3JlYWQKLQkJcHVibGljCV9qZG9zX3dyaXRlCi0JCXB1YmxpYwlfanhtc19nZXRkcml2ZXIKLQkJcHVibGljCV9qeG1zX2NhbGxkcml2ZXIKLQkJcHVibGljCV9qZW1zX2F2YWlsYWJsZQotCQlwdWJsaWMJX2plbXNfY2FsbGRyaXZlcgotCi07Ci07IHNob3J0IGZhciBqZG9zX29wZW4gKHNob3J0IGZhciAqIGhhbmRsZSwgY2hhciBmYXIgKiBmaWxlbmFtZSkKLTsKLTsgQ3JlYXRlIGFuZCBvcGVuIGEgdGVtcG9yYXJ5IGZpbGUKLTsKLV9qZG9zX29wZW4JcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCW1vdgljeCwwCQkJOyBub3JtYWwgZmlsZSBhdHRyaWJ1dGVzCi0JCWxkcwlkeCxkd29yZCBwdHIgW2JwKzEwXQk7IGdldCBmaWxlbmFtZSBwb2ludGVyCi0JCW1vdglhaCwzY2gJCQk7IGNyZWF0ZSBmaWxlCi0JCWludAkyMWgKLQkJamMJb3Blbl9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQotCQlsZHMJYngsZHdvcmQgcHRyIFticCs2XQk7IGdldCBoYW5kbGUgcG9pbnRlcgotCQltb3YJd29yZCBwdHIgW2J4XSxheAk7IHNhdmUgdGhlIGhhbmRsZQotCQl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSwotb3Blbl9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX29wZW4JZW5kcAotCi0KLTsKLTsgc2hvcnQgZmFyIGpkb3NfY2xvc2UgKHNob3J0IGhhbmRsZSkKLTsKLTsgQ2xvc2UgdGhlIGZpbGUgaGFuZGxlCi07Ci1famRvc19jbG9zZQlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCW1vdglhaCwzZWgJCQk7IGNsb3NlIGZpbGUKLQkJaW50CTIxaAotCQlqYwljbG9zZV9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQotCQl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSwotY2xvc2VfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1famRvc19jbG9zZQllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamRvc19zZWVrIChzaG9ydCBoYW5kbGUsIGxvbmcgb2Zmc2V0KQotOwotOyBTZXQgZmlsZSBwb3NpdGlvbgotOwotX2pkb3Nfc2Vlawlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCW1vdglkeCx3b3JkIHB0ciBbYnArOF0JOyBMUyBvZmZzZXQKLQkJbW92CWN4LHdvcmQgcHRyIFticCsxMF0JOyBNUyBvZmZzZXQKLQkJbW92CWF4LDQyMDBoCQk7IGFic29sdXRlIHNlZWsKLQkJaW50CTIxaAotCQlqYwlzZWVrX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCi0JCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi1zZWVrX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAotCQlwb3AJZXMKLQkJcG9wCWR4Ci0JCXBvcAljeAotCQlwb3AJYngKLQkJcG9wCWRpCi0JCXBvcAlzaQotCQlwb3AgCWJwCi0JCXJldAotX2pkb3Nfc2VlawllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamRvc19yZWFkIChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCkKLTsKLTsgUmVhZCBmcm9tIGZpbGUKLTsKLV9qZG9zX3JlYWQJcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCW1vdglieCx3b3JkIHB0ciBbYnArNl0JOyBmaWxlIGhhbmRsZQotCQlsZHMJZHgsZHdvcmQgcHRyIFticCs4XQk7IGJ1ZmZlciBhZGRyZXNzCi0JCW1vdgljeCx3b3JkIHB0ciBbYnArMTJdCTsgbnVtYmVyIG9mIGJ5dGVzCi0JCW1vdglhaCwzZmgJCQk7IHJlYWQgZmlsZQotCQlpbnQJMjFoCi0JCWpjCXJlYWRfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKLQkJY21wCWF4LHdvcmQgcHRyIFticCsxMl0JOyBtYWtlIHN1cmUgYWxsIGJ5dGVzIHdlcmUgcmVhZAotCQlqZQlyZWFkX29rCi0JCW1vdglheCwxCQkJOyBlbHNlIHJldHVybiAxIGZvciBub3QgT0sKLQkJam1wCXNob3J0IHJlYWRfZXJyCi1yZWFkX29rOgl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSwotcmVhZF9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX3JlYWQJZW5kcAotCi0KLTsKLTsgc2hvcnQgZmFyIGpkb3Nfd3JpdGUgKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsIHVuc2lnbmVkIHNob3J0IGNvdW50KQotOwotOyBXcml0ZSB0byBmaWxlCi07Ci1famRvc193cml0ZQlwcm9jCWZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCi0JCWxkcwlkeCxkd29yZCBwdHIgW2JwKzhdCTsgYnVmZmVyIGFkZHJlc3MKLQkJbW92CWN4LHdvcmQgcHRyIFticCsxMl0JOyBudW1iZXIgb2YgYnl0ZXMKLQkJbW92CWFoLDQwaAkJCTsgd3JpdGUgZmlsZQotCQlpbnQJMjFoCi0JCWpjCXdyaXRlX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCi0JCWNtcAlheCx3b3JkIHB0ciBbYnArMTJdCTsgbWFrZSBzdXJlIGFsbCBieXRlcyB3cml0dGVuCi0JCWplCXdyaXRlX29rCi0JCW1vdglheCwxCQkJOyBlbHNlIHJldHVybiAxIGZvciBub3QgT0sKLQkJam1wCXNob3J0IHdyaXRlX2Vycgotd3JpdGVfb2s6CXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCi13cml0ZV9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wIAlicAotCQlyZXQKLV9qZG9zX3dyaXRlCWVuZHAKLQotCi07Ci07IHZvaWQgZmFyIGp4bXNfZ2V0ZHJpdmVyIChYTVNEUklWRVIgZmFyICopCi07Ci07IEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgWE1TIGRyaXZlciwgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlCi07Ci1fanhtc19nZXRkcml2ZXIJcHJvYwlmYXIKLQkJcHVzaAlicAkJCTsgbGlua2FnZQotCQltb3YgCWJwLHNwCi0JCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5Ci0JCXB1c2gJZGkKLQkJcHVzaAlieAotCQlwdXNoCWN4Ci0JCXB1c2gJZHgKLQkJcHVzaAllcwotCQlwdXNoCWRzCi0JCW1vdiAJYXgsNDMwMGgJCTsgY2FsbCBtdWx0aXBsZXggaW50ZXJydXB0IHdpdGgKLQkJaW50CTJmaAkJCTsgYSBtYWdpYyBjb29raWUsIGhleCA0MzAwCi0JCWNtcCAJYWwsODBoCQkJOyBBTCBzaG91bGQgY29udGFpbiBoZXggODAKLQkJamUJeG1zYXZhaWwKLQkJeG9yIAlkeCxkeAkJCTsgbm8gWE1TIGRyaXZlciBhdmFpbGFibGUKLQkJeG9yIAlheCxheAkJCTsgcmV0dXJuIGEgbmlsIHBvaW50ZXIKLQkJam1wCXNob3J0IHhtc2F2YWlsX2RvbmUKLXhtc2F2YWlsOgltb3YgCWF4LDQzMTBoCQk7IGZldGNoIGRyaXZlciBhZGRyZXNzIHdpdGgKLQkJaW50CTJmaAkJCTsgYW5vdGhlciBtYWdpYyBjb29raWUKLQkJbW92IAlkeCxlcwkJCTsgY29weSBhZGRyZXNzIHRvIGR4OmF4Ci0JCW1vdiAJYXgsYngKLXhtc2F2YWlsX2RvbmU6CWxlcyAJYngsZHdvcmQgcHRyIFticCs2XQk7IGdldCBwb2ludGVyIHRvIHJldHVybiB2YWx1ZQotCQltb3YJd29yZCBwdHIgZXM6W2J4XSxheAotCQltb3YJd29yZCBwdHIgZXM6W2J4KzJdLGR4Ci0JCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKLQkJcG9wCWVzCi0JCXBvcAlkeAotCQlwb3AJY3gKLQkJcG9wCWJ4Ci0JCXBvcAlkaQotCQlwb3AJc2kKLQkJcG9wCWJwCi0JCXJldAotX2p4bXNfZ2V0ZHJpdmVyCWVuZHAKLQotCi07Ci07IHZvaWQgZmFyIGp4bXNfY2FsbGRyaXZlciAoWE1TRFJJVkVSLCBYTVNjb250ZXh0IGZhciAqKQotOwotOyBUaGUgWE1TY29udGV4dCBzdHJ1Y3R1cmUgY29udGFpbnMgdmFsdWVzIGZvciB0aGUgQVgsRFgsQlgsU0ksRFMgcmVnaXN0ZXJzLgotOyBUaGVzZSBhcmUgbG9hZGVkLCB0aGUgWE1TIGNhbGwgaXMgcGVyZm9ybWVkLCBhbmQgdGhlIG5ldyB2YWx1ZXMgb2YgdGhlCi07IEFYLERYLEJYIHJlZ2lzdGVycyBhcmUgd3JpdHRlbiBiYWNrIHRvIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4KLTsKLV9qeG1zX2NhbGxkcml2ZXIgCXByb2MJZmFyCi0JCXB1c2gJYnAJCQk7IGxpbmthZ2UKLQkJbW92IAlicCxzcAotCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQotCQlwdXNoCWRpCi0JCXB1c2gJYngKLQkJcHVzaAljeAotCQlwdXNoCWR4Ci0JCXB1c2gJZXMKLQkJcHVzaAlkcwotCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IFhNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCWF4LHdvcmQgcHRyIGVzOltieF0JOyBsb2FkIHJlZ2lzdGVycwotCQltb3YgCWR4LHdvcmQgcHRyIGVzOltieCsyXQotCQltb3YgCXNpLHdvcmQgcHRyIGVzOltieCs2XQotCQltb3YgCWRzLHdvcmQgcHRyIGVzOltieCs4XQotCQltb3YgCWJ4LHdvcmQgcHRyIGVzOltieCs0XQotCQljYWxsCWR3b3JkIHB0ciBbYnArNl0JOyBjYWxsIHRoZSBkcml2ZXIKLQkJbW92CWN4LGJ4CQkJOyBzYXZlIHJldHVybmVkIEJYIGZvciBhIHNlYwotCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IFhNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCXdvcmQgcHRyIGVzOltieF0sYXgJOyBwdXQgYmFjayBheCxkeCxieAotCQltb3YgCXdvcmQgcHRyIGVzOltieCsyXSxkeAotCQltb3YgCXdvcmQgcHRyIGVzOltieCs0XSxjeAotCQlwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1fanhtc19jYWxsZHJpdmVyIAllbmRwCi0KLQotOwotOyBzaG9ydCBmYXIgamVtc19hdmFpbGFibGUgKHZvaWQpCi07Ci07IEhhdmUgd2UgZ290IGFuIEVNUyBkcml2ZXI/ICh0aGlzIGNvbWVzIHN0cmFpZ2h0IGZyb20gdGhlIEVNUyA0LjAgc3BlY3MpCi07Ci1famVtc19hdmFpbGFibGUJcHJvYwlmYXIKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbW92CWF4LDM1NjdoCQk7IGdldCBpbnRlcnJ1cHQgdmVjdG9yIDY3aAotCQlpbnQJMjFoCi0JCXB1c2gJY3MKLQkJcG9wCWRzCi0JCW1vdglkaSwwMDBhaAkJOyBjaGVjayBvZmZzIDEwIGluIHJldHVybmVkIHNlZwotCQlsZWEJc2ksQVNDSUlfZGV2aWNlX25hbWUJOyBhZ2FpbnN0IGxpdGVyYWwgc3RyaW5nCi0JCW1vdgljeCw4Ci0JCWNsZAotCQlyZXBlIGNtcHNiCi0JCWpuZQlub19lbXMKLQkJbW92CWF4LDEJCQk7IG1hdGNoLCBpdCdzIHRoZXJlCi0JCWptcAlzaG9ydCBhdmFpbF9kb25lCi1ub19lbXM6CQl4b3IJYXgsYXgJCQk7IGl0J3Mgbm90IHRoZXJlCi1hdmFpbF9kb25lOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXJldAotCi1BU0NJSV9kZXZpY2VfbmFtZQlkYgkiRU1NWFhYWDAiCi0KLV9qZW1zX2F2YWlsYWJsZQllbmRwCi0KLQotOwotOyB2b2lkIGZhciBqZW1zX2NhbGxkcml2ZXIgKEVNU2NvbnRleHQgZmFyICopCi07Ci07IFRoZSBFTVNjb250ZXh0IHN0cnVjdHVyZSBjb250YWlucyB2YWx1ZXMgZm9yIHRoZSBBWCxEWCxCWCxTSSxEUyByZWdpc3RlcnMuCi07IFRoZXNlIGFyZSBsb2FkZWQsIHRoZSBFTVMgdHJhcCBpcyBwZXJmb3JtZWQsIGFuZCB0aGUgbmV3IHZhbHVlcyBvZiB0aGUKLTsgQVgsRFgsQlggcmVnaXN0ZXJzIGFyZSB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlLgotOwotX2plbXNfY2FsbGRyaXZlcglwcm9jIGZhcgotCQlwdXNoCWJwCQkJOyBsaW5rYWdlCi0JCW1vdiAJYnAsc3AKLQkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKLQkJcHVzaAlkaQotCQlwdXNoCWJ4Ci0JCXB1c2gJY3gKLQkJcHVzaAlkeAotCQlwdXNoCWVzCi0JCXB1c2gJZHMKLQkJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IEVNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCWF4LHdvcmQgcHRyIGVzOltieF0JOyBsb2FkIHJlZ2lzdGVycwotCQltb3YgCWR4LHdvcmQgcHRyIGVzOltieCsyXQotCQltb3YgCXNpLHdvcmQgcHRyIGVzOltieCs2XQotCQltb3YgCWRzLHdvcmQgcHRyIGVzOltieCs4XQotCQltb3YgCWJ4LHdvcmQgcHRyIGVzOltieCs0XQotCQlpbnQJNjdoCQkJOyBjYWxsIHRoZSBFTVMgZHJpdmVyCi0JCW1vdgljeCxieAkJCTsgc2F2ZSByZXR1cm5lZCBCWCBmb3IgYSBzZWMKLQkJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IEVNU2NvbnRleHQgcG9pbnRlcgotCQltb3YgCXdvcmQgcHRyIGVzOltieF0sYXgJOyBwdXQgYmFjayBheCxkeCxieAotCQltb3YgCXdvcmQgcHRyIGVzOltieCsyXSxkeAotCQltb3YgCXdvcmQgcHRyIGVzOltieCs0XSxjeAotCQlwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0Ci0JCXBvcAllcwotCQlwb3AJZHgKLQkJcG9wCWN4Ci0JCXBvcAlieAotCQlwb3AJZGkKLQkJcG9wCXNpCi0JCXBvcCAJYnAKLQkJcmV0Ci1famVtc19jYWxsZHJpdmVyCWVuZHAKLQotSk1FTURPU0FfVFhUCWVuZHMKLQotCQllbmQKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW1tYWMuYyBiL2xpYmpwZWd0d3JwL2ptZW1tYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ZjliZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtbWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIGptZW1tYWMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogam1lbW1hYy5jIHByb3ZpZGVzIGFuIEFwcGxlIE1hY2ludG9zaCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQotICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuCi0gKgotICogSWYgeW91IHVzZSBqbWVtbWFjLmMsIHRoZW4geW91IG11c3QgZGVmaW5lIFVTRV9NQUNfTUVNTUdSIGluIHRoZQotICogSlBFR19JTlRFUk5BTFMgcGFydCBvZiBqY29uZmlnLmguCi0gKgotICogam1lbW1hYy5jIHVzZXMgdGhlIE1hY2ludG9zaCB0b29sYm94IHJvdXRpbmVzIE5ld1B0ciBhbmQgRGlzcG9zZVB0cgotICogaW5zdGVhZCBvZiBtYWxsb2MgYW5kIGZyZWUuICBJdCBhY2N1cmF0ZWx5IGRldGVybWluZXMgdGhlIGFtb3VudCBvZgotICogbWVtb3J5IGF2YWlsYWJsZSBieSB1c2luZyBDb21wYWN0TWVtLiAgTm90aWNlIHRoYXQgaWYgbGVmdCB0byBpdHMKLSAqIG93biBkZXZpY2VzLCB0aGlzIGNvZGUgY2FuIGNoZXcgdXAgYWxsIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUKLSAqIGFwcGxpY2F0aW9uJ3Mgem9uZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSByYXRoZXIgc21hbGwgInNsb3AiCi0gKiBmYWN0b3IgY29tcHV0ZWQgaW4ganBlZ19tZW1fYXZhaWxhYmxlKCkuICBUaGUgYXBwbGljYXRpb24gY2FuIGVuc3VyZQotICogdGhhdCBtb3JlIHNwYWNlIGlzIGxlZnQgb3ZlciBieSByZWR1Y2luZyBtYXhfbWVtb3J5X3RvX3VzZS4KLSAqCi0gKiBMYXJnZSBpbWFnZXMgYXJlIHN3YXBwZWQgdG8gZGlzayB1c2luZyB0ZW1wb3JhcnkgZmlsZXMgYW5kIFN5c3RlbSA3LjArJ3MKLSAqIHRlbXBvcmFyeSBmb2xkZXIgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBOb3RlIHRoYXQgam1lbW1hYy5jIGRlcGVuZHMgb24gdHdvIGZlYXR1cmVzIG9mIE1hY09TIHRoYXQgd2VyZSBmaXJzdAotICogaW50cm9kdWNlZCBpbiBTeXN0ZW0gNzogRmluZEZvbGRlciBhbmQgdGhlIEZTU3BlYy1iYXNlZCBjYWxscy4KLSAqIElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyBqbWVtbWFjLmMgYW5kIGlzIHJ1biB1bmRlciBTeXN0ZW0gNiBvciBlYXJsaWVyLAotICogYW5kIHRoZSBqcGVnIGxpYnJhcnkgZGVjaWRlcyBpdCBuZWVkcyBhIHRlbXBvcmFyeSBmaWxlLCBpdCB3aWxsIGFib3J0LAotICogcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMgYWJvdXQgcmVxdWlyaW5nIFN5c3RlbSA3LiAgKElmIG5vIHRlbXBvcmFyeSBmaWxlcwotICogYXJlIGNyZWF0ZWQsIGl0IHdpbGwgcnVuIGZpbmUuKQotICoKLSAqIElmIHlvdSB3YW50IHRvIHVzZSBqbWVtbWFjLmMgaW4gYW4gYXBwbGljYXRpb24gdGhhdCBtaWdodCBiZSB1c2VkIHdpdGgKLSAqIFN5c3RlbSA2IG9yIGVhcmxpZXIsIHRoZW4geW91IHNob3VsZCByZW1vdmUgZGVwZW5kZW5jaWVzIG9uIEZpbmRGb2xkZXIKLSAqIGFuZCB0aGUgRlNTcGVjIGNhbGxzLiAgWW91IHdpbGwgbmVlZCB0byByZXBsYWNlIEZpbmRGb2xkZXIgd2l0aCBzb21lCi0gKiBvdGhlciBtZWNoYW5pc20gZm9yIGZpbmRpbmcgYSBwbGFjZSB0byBwdXQgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgeW91Ci0gKiBzaG91bGQgcmVwbGFjZSB0aGUgRlNTcGVjIGNhbGxzIHdpdGggdGhlaXIgSEZTIGVxdWl2YWxlbnRzOgotICoKLSAqICAgICBGU3BEZWxldGUgICAgIC0+ICBIRGVsZXRlCi0gKiAgICAgRlNwR2V0RkluZm8gICAtPiAgSEdldEZJbmZvCi0gKiAgICAgRlNwQ3JlYXRlICAgICAtPiAgSENyZWF0ZQotICogICAgIEZTcE9wZW5ERiAgICAgLT4gIEhPcGVuICAgICAgKioqIE5vdGU6IG5vdCBIT3BlbkRGICoqKgotICogICAgIEZTTWFrZUZTU3BlYyAgLT4gIChmaWxsIGluIHNwZWMgYnkgaGFuZC4pCi0gKgotICogKFVzZSBIT3BlbiBpbnN0ZWFkIG9mIEhPcGVuREYuICBIT3BlbiBpcyBqdXN0IGEgZ2x1ZS1pbnRlcmZhY2UgdG8gUEJIT3BlbiwKLSAqIHdoaWNoIGlzIG9uIGFsbCBIRlMgbWFjcy4gIEhPcGVuREYgaXMgYSBTeXN0ZW0gNyBhZGRpdGlvbiB3aGljaCBhdm9pZHMgdGhlCi0gKiBhZ2VzLW9sZCBwcm9ibGVtIG9mIG5hbWVzIHN0YXJ0aW5nIHdpdGggYSBwZXJpb2QuKQotICoKLSAqIENvbnRyaWJ1dGVkIGJ5IFNhbSBCdXNoZWxsIChqc2FtQGlhZ3Uub24ubmV0KSBhbmQKLSAqIERhbiBHaWxkb3IgKGd5bGRAaW4tdG91Y2guY29tKS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIiAgICAvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgVVNFX01BQ19NRU1NR1IJLyogbWFrZSBzdXJlIHVzZXIgZ290IGNvbmZpZ3VyYXRpb24gcmlnaHQgKi8KLSAgWW91IGZvcmdvdCB0byBkZWZpbmUgVVNFX01BQ19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxNZW1vcnkuaD4gICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgbWVtb3J5IG1hbmFnZXIgKi8KLSNpbmNsdWRlIDxGaWxlcy5oPiAgICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgRmlsZSBzdHVmZiAqLwotI2luY2x1ZGUgPEZvbGRlcnMuaD4gICAgLyogd2UgdXNlIHRoZSBNYWNPUyBIRlMgc3R1ZmYgKi8KLSNpbmNsdWRlIDxTY3JpcHQuaD4gICAgIC8qIGZvciBzbVN5c3RlbVNjcmlwdCAqLwotI2luY2x1ZGUgPEdlc3RhbHQuaD4gICAgLyogd2UgdXNlIEdlc3RhbHQgdG8gdGVzdCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLwotCi0jaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KLSNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICJKUEclMDNkLlRNUCIKLSNlbmRpZgotCi1zdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLwotCi0KLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgTWFjT1MgbGlicmFyeQotICogcm91dGluZXMgTmV3UHRyKCkgYW5kIERpc3Bvc2VQdHIoKSwgd2hpY2ggYWxsb2NhdGUgZml4ZWQtYWRkcmVzcwotICogc3RvcmFnZS4gIFVuZm9ydHVuYXRlbHksIHRoZSBJSkcgbGlicmFyeSBpc24ndCBzbWFydCBlbm91Z2ggdG8gY29wZQotICogd2l0aCByZWxvY2F0YWJsZSBzdG9yYWdlLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgKikgTmV3UHRyKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIERpc3Bvc2VQdHIoKFB0cikgb2JqZWN0KTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KLSAqIE5COiB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMgc2ltcGx5IGZvcgotICogY29uc2lzdGVuY3kgd2l0aCB0aGUgcmVzdCBvZiB0aGUgSUpHIGNvZGU7IEZBUiBzaG91bGQgZXhwYW5kIHRvIGVtcHR5Ci0gKiBvbiByYXRpb25hbCBhcmNoaXRlY3R1cmVzIGxpa2UgdGhlIE1hYy4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgTmV3UHRyKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBEaXNwb3NlUHRyKChQdHIpIG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIGxvbmcgbGltaXQgPSBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOwotICBsb25nIHNsb3AsIG1lbTsKLQotICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiB3aGF0IGFwcGxpY2F0aW9uIGhhcyB0b2xkIHVzIHdlIG1heSB1c2UgKi8KLSAgaWYgKG1heF9ieXRlc19uZWVkZWQgPiBsaW1pdCAmJiBsaW1pdCA+IDApCi0gICAgbWF4X2J5dGVzX25lZWRlZCA9IGxpbWl0OwotICAvKiBGaW5kIHdoZXRoZXIgdGhlcmUncyBhIGJpZyBlbm91Z2ggZnJlZSBibG9jayBpbiB0aGUgaGVhcC4KLSAgICogQ29tcGFjdE1lbSB0cmllcyB0byBjcmVhdGUgYSBjb250aWd1b3VzIGJsb2NrIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSwKLSAgICogYW5kIHRoZW4gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBmcmVlIGJsb2NrICh3aGljaCBjb3VsZCBiZQotICAgKiBtdWNoIG1vcmUgb3IgbXVjaCBsZXNzIHRoYW4gd2UgYXNrZWQgZm9yKS4KLSAgICogV2UgYWRkIHNvbWUgc2xvcCB0byBlbnN1cmUgd2UgZG9uJ3QgdXNlIHVwIGFsbCBhdmFpbGFibGUgbWVtb3J5LgotICAgKi8KLSAgc2xvcCA9IG1heF9ieXRlc19uZWVkZWQgLyAxNiArIDMyNzY4TDsKLSAgbWVtID0gQ29tcGFjdE1lbShtYXhfYnl0ZXNfbmVlZGVkICsgc2xvcCkgLSBzbG9wOwotICBpZiAobWVtIDwgMCkKLSAgICBtZW0gPSAwOwkJCS8qIHNpZ2gsIGNvdWxkbid0IGV2ZW4gZ2V0IHRoZSBzbG9wICovCi0gIC8qIERvbid0IHRha2UgbW9yZSB0aGFuIHRoZSBhcHBsaWNhdGlvbiBzYXlzIHdlIGNhbiBoYXZlICovCi0gIGlmIChtZW0gPiBsaW1pdCAmJiBsaW1pdCA+IDApCi0gICAgbWVtID0gbGltaXQ7Ci0gIHJldHVybiBtZW07Ci19Ci0KLQotLyoKLSAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgotICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKLSAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KLSAqLwotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBsb25nIGJ5dGVzID0gYnl0ZV9jb3VudDsKLSAgbG9uZyByZXRWYWw7Ci0KLSAgaWYgKCBTZXRGUG9zICggaW5mby0+dGVtcF9maWxlLCBmc0Zyb21TdGFydCwgZmlsZV9vZmZzZXQgKSAhPSBub0VyciApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLQotICByZXRWYWwgPSBGU1JlYWQgKCBpbmZvLT50ZW1wX2ZpbGUsICZieXRlcywKLQkJICAgICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcl9hZGRyZXNzICk7Ci0gIGlmICggcmV0VmFsICE9IG5vRXJyIHx8IGJ5dGVzICE9IGJ5dGVfY291bnQgKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGxvbmcgYnl0ZXMgPSBieXRlX2NvdW50OwotICBsb25nIHJldFZhbDsKLQotICBpZiAoIFNldEZQb3MgKCBpbmZvLT50ZW1wX2ZpbGUsIGZzRnJvbVN0YXJ0LCBmaWxlX29mZnNldCApICE9IG5vRXJyICkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOwotCi0gIHJldFZhbCA9IEZTV3JpdGUgKCBpbmZvLT50ZW1wX2ZpbGUsICZieXRlcywKLQkJICAgICAodW5zaWduZWQgY2hhciAqKSBidWZmZXJfYWRkcmVzcyApOwotICBpZiAoIHJldFZhbCAhPSBub0VyciB8fCBieXRlcyAhPSBieXRlX2NvdW50ICkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWNsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKLXsKLSAgRlNDbG9zZSAoIGluZm8tPnRlbXBfZmlsZSApOwotICBGU3BEZWxldGUgKCAmKGluZm8tPnRlbXBTcGVjKSApOwotfQotCi0KLS8qCi0gKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KLSAqCi0gKiBUaGlzIHZlcnNpb24gdXNlcyBGaW5kRm9sZGVyIHRvIGZpbmQgdGhlIFRlbXBvcmFyeSBJdGVtcyBmb2xkZXIsCi0gKiBhbmQgcHV0cyB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlcmUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBzaG9ydCAgICAgICAgIHRtcFJlZiwgdlJlZk51bTsKLSAgbG9uZyAgICAgICAgICBkaXJJRDsKLSAgRkluZm8gICAgICAgICBmaW5kZXJJbmZvOwotICBGU1NwZWMgICAgICAgIHRoZVNwZWM7Ci0gIFN0cjI1NSAgICAgICAgZk5hbWU7Ci0gIE9TRXJyICAgICAgICAgb3NFcnI7Ci0gIGxvbmcgICAgICAgICAgZ2VzdGFsdFJlc3BvbnNlID0gMDsKLQotICAvKiBDaGVjayB0aGF0IEZTU3BlYyBjYWxscyBhcmUgYXZhaWxhYmxlLiAqLwotICBvc0VyciA9IEdlc3RhbHQoIGdlc3RhbHRGU0F0dHIsICZnZXN0YWx0UmVzcG9uc2UgKTsKLSAgaWYgKCAoIG9zRXJyICE9IG5vRXJyICkKLSAgICAgICB8fCAhKCBnZXN0YWx0UmVzcG9uc2UgJiAoMTw8Z2VzdGFsdEhhc0ZTU3BlY0NhbGxzKSApICkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICItIFN5c3RlbSA3LjAgb3IgbGF0ZXIgcmVxdWlyZWQiKTsKLSAgLyogVE8gRE86IGFkZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGplcnJvci5oLiAqLwotCi0gIC8qIENoZWNrIHRoYXQgRmluZEZvbGRlciBpcyBhdmFpbGFibGUuICovCi0gIG9zRXJyID0gR2VzdGFsdCggZ2VzdGFsdEZpbmRGb2xkZXJBdHRyLCAmZ2VzdGFsdFJlc3BvbnNlICk7Ci0gIGlmICggKCBvc0VyciAhPSBub0VyciApCi0gICAgICAgfHwgISggZ2VzdGFsdFJlc3BvbnNlICYgKDE8PGdlc3RhbHRGaW5kRm9sZGVyUHJlc2VudCkgKSApCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSBTeXN0ZW0gNy4wIG9yIGxhdGVyIHJlcXVpcmVkLiIpOwotICAvKiBUTyBETzogYWRkIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UgdG8gamVycm9yLmguICovCi0KLSAgb3NFcnIgPSBGaW5kRm9sZGVyICgga09uU3lzdGVtRGlzaywga1RlbXBvcmFyeUZvbGRlclR5cGUsIGtDcmVhdGVGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLCAmZGlySUQgKTsKLSAgaWYgKCBvc0VyciAhPSBub0VyciApCi0gICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSB0ZW1wb3JhcnkgaXRlbXMgZm9sZGVyIHVuYXZhaWxhYmxlIik7Ci0gIC8qIFRPIERPOiBUcnkgcHV0dGluZyB0aGUgdGVtcCBmaWxlcyBzb21ld2hlcmUgZWxzZS4gKi8KLQotICAvKiBLZWVwIGdlbmVyYXRpbmcgZmlsZSBuYW1lcyB0aWxsIHdlIGZpbmQgb25lIHRoYXQncyBub3QgaW4gdXNlICovCi0gIGZvciAoOzspIHsKLSAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KLQotICAgIHNwcmludGYoaW5mby0+dGVtcF9uYW1lLCBURU1QX0ZJTEVfTkFNRSwgbmV4dF9maWxlX251bSk7Ci0gICAgc3RyY3B5ICggKFB0cilmTmFtZSsxLCBpbmZvLT50ZW1wX25hbWUgKTsKLSAgICAqZk5hbWUgPSBzdHJsZW4gKGluZm8tPnRlbXBfbmFtZSk7Ci0gICAgb3NFcnIgPSBGU01ha2VGU1NwZWMgKCB2UmVmTnVtLCBkaXJJRCwgZk5hbWUsICZ0aGVTcGVjICk7Ci0KLSAgICBpZiAoIChvc0VyciA9IEZTcEdldEZJbmZvICggJnRoZVNwZWMsICZmaW5kZXJJbmZvICkgKSAhPSBub0VyciApCi0gICAgICBicmVhazsKLSAgfQotCi0gIG9zRXJyID0gRlNwQ3JlYXRlICggJnRoZVNwZWMsICc/Pz8/JywgJz8/Pz8nLCBzbVN5c3RlbVNjcmlwdCApOwotICBpZiAoIG9zRXJyICE9IG5vRXJyICkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7Ci0KLSAgb3NFcnIgPSBGU3BPcGVuREYgKCAmdGhlU3BlYywgZnNSZFdyUGVybSwgJihpbmZvLT50ZW1wX2ZpbGUpICk7Ci0gIGlmICggb3NFcnIgIT0gbm9FcnIgKQotICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKLQotICBpbmZvLT50ZW1wU3BlYyA9IHRoZVNwZWM7Ci0KLSAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOwotICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7Ci0gIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIG5leHRfZmlsZV9udW0gPSAwOwotCi0gIC8qIG1heF9tZW1vcnlfdG9fdXNlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gRnJlZU1lbSgpJ3MgcmVzdWx0OwotICAgKiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtaWdodCBsYXRlciByZWR1Y2UgaXQsIGZvciBleGFtcGxlCi0gICAqIHRvIGxlYXZlIHJvb20gdG8gaW52b2tlIG11bHRpcGxlIEpQRUcgb2JqZWN0cy4KLSAgICogTm90ZSB0aGF0IEZyZWVNZW0gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZyZWUgYnl0ZXM7Ci0gICAqIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gYWxsb2NhdGUgYSBzaW5nbGUgYmxvY2sgb2YgdGhpcyBzaXplLgotICAgKi8KLSAgcmV0dXJuIEZyZWVNZW0oKTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2ptZW1tZ3IuYyBiL2xpYmpwZWd0d3JwL2ptZW1tZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwMWIzMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtbWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE4ICswLDAgQEAKLS8qCi0gKiBqbWVtbWdyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlBFRyBzeXN0ZW0taW5kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZW1lbnQKLSAqIHJvdXRpbmVzLiAgVGhpcyBjb2RlIGlzIHVzYWJsZSBhY3Jvc3MgYSB3aWRlIHZhcmlldHkgb2YgbWFjaGluZXM7IG1vc3QKLSAqIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIGZpbGUuCi0gKiBUaGUgbWFqb3IgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUgYXJlOgotICogICAqIHBvb2wtYmFzZWQgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBvZiBtZW1vcnk7Ci0gKiAgICogcG9saWN5IGRlY2lzaW9ucyBhYm91dCBob3cgdG8gZGl2aWRlIGF2YWlsYWJsZSBtZW1vcnkgYW1vbmcgdGhlCi0gKiAgICAgdmlydHVhbCBhcnJheXM7Ci0gKiAgICogY29udHJvbCBsb2dpYyBmb3Igc3dhcHBpbmcgdmlydHVhbCBhcnJheXMgYmV0d2VlbiBtYWluIG1lbW9yeSBhbmQKLSAqICAgICBiYWNraW5nIHN0b3JhZ2UuCi0gKiBUaGUgc2VwYXJhdGUgc3lzdGVtLWRlcGVuZGVudCBmaWxlIHByb3ZpZGVzIHRoZSBhY3R1YWwgYmFja2luZy1zdG9yYWdlCi0gKiBhY2Nlc3MgY29kZSwgYW5kIGl0IGNvbnRhaW5zIHRoZSBwb2xpY3kgZGVjaXNpb24gYWJvdXQgaG93IG11Y2ggdG90YWwKLSAqIG1haW4gbWVtb3J5IHRvIHVzZS4KLSAqIFRoaXMgZmlsZSBpcyBzeXN0ZW0tZGVwZW5kZW50IGluIHRoZSBzZW5zZSB0aGF0IHNvbWUgb2YgaXRzIGZ1bmN0aW9ucwotICogYXJlIHVubmVjZXNzYXJ5IGluIHNvbWUgc3lzdGVtcy4gIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBlbm91Z2ggdmlydHVhbAotICogbWVtb3J5IHNvIHRoYXQgYmFja2luZyBzdG9yYWdlIHdpbGwgbmV2ZXIgYmUgdXNlZCwgbXVjaCBvZiB0aGUgdmlydHVhbAotICogYXJyYXkgY29udHJvbCBsb2dpYyBjb3VsZCBiZSByZW1vdmVkLiAgKE9mIGNvdXJzZSwgaWYgeW91IGhhdmUgdGhhdCBtdWNoCi0gKiBtZW1vcnkgdGhlbiB5b3Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgYSBsaXR0bGUgYml0IG9mIHVudXNlZCBjb2RlLi4uKQotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNkZWZpbmUgQU1fTUVNT1JZX01BTkFHRVIJLyogd2UgZGVmaW5lIGp2aXJ0X1hhcnJheV9jb250cm9sIHN0cnVjdHMgKi8KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgTk9fR0VURU5WCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgZ2V0ZW52KCkgKi8KLWV4dGVybiBjaGFyICogZ2V0ZW52IEpQUCgoY29uc3QgY2hhciAqIG5hbWUpKTsKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFNvbWUgaW1wb3J0YW50IG5vdGVzOgotICogICBUaGUgYWxsb2NhdGlvbiByb3V0aW5lcyBwcm92aWRlZCBoZXJlIG11c3QgbmV2ZXIgcmV0dXJuIE5VTEwuCi0gKiAgIFRoZXkgc2hvdWxkIGV4aXQgdG8gZXJyb3JfZXhpdCBpZiB1bnN1Y2Nlc3NmdWwuCi0gKgotICogICBJdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgdG8gbWVyZ2UgdGhlIHNhcnJheSBhbmQgYmFycmF5IHJvdXRpbmVzLAotICogICBldmVuIHRob3VnaCB0aGV5IGFyZSB0ZXh0dWFsbHkgYWxtb3N0IHRoZSBzYW1lLCBiZWNhdXNlIHNhbXBsZXMgYXJlCi0gKiAgIHVzdWFsbHkgc3RvcmVkIGFzIGJ5dGVzIHdoaWxlIGNvZWZmaWNpZW50cyBhcmUgc2hvcnRzIG9yIGludHMuICBUaHVzLAotICogICBpbiBtYWNoaW5lcyB3aGVyZSBieXRlIHBvaW50ZXJzIGhhdmUgYSBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb24gZnJvbQotICogICB3b3JkIHBvaW50ZXJzLCB0aGUgcmVzdWx0aW5nIG1hY2hpbmUgY29kZSBjb3VsZCBub3QgYmUgdGhlIHNhbWUuCi0gKi8KLQotCi0vKgotICogTWFueSBtYWNoaW5lcyByZXF1aXJlIHN0b3JhZ2UgYWxpZ25tZW50OiBsb25ncyBtdXN0IHN0YXJ0IG9uIDQtYnl0ZQotICogYm91bmRhcmllcywgZG91YmxlcyBvbiA4LWJ5dGUgYm91bmRhcmllcywgZXRjLiAgT24gc3VjaCBtYWNoaW5lcywgbWFsbG9jKCkKLSAqIGFsd2F5cyByZXR1cm5zIHBvaW50ZXJzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKLSAqIHJlcXVpcmVtZW50LCBhbmQgd2UgaGFkIGJldHRlciBkbyBzbyB0b28uCi0gKiBUaGVyZSBpc24ndCBhbnkgcmVhbGx5IHBvcnRhYmxlIHdheSB0byBkZXRlcm1pbmUgdGhlIHdvcnN0LWNhc2UgYWxpZ25tZW50Ci0gKiByZXF1aXJlbWVudC4gIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhhdCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzCi0gKiBtdWx0aXBsZXMgb2Ygc2l6ZW9mKEFMSUdOX1RZUEUpLgotICogQnkgZGVmYXVsdCwgd2UgZGVmaW5lIEFMSUdOX1RZUEUgYXMgZG91YmxlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgb24gc29tZQotICogd29ya3N0YXRpb25zICh3aGVyZSBkb3VibGVzIHJlYWxseSBkbyBuZWVkIDgtYnl0ZSBhbGlnbm1lbnQpIGFuZCB3aWxsIHdvcmsKLSAqIGZpbmUgb24gbmVhcmx5IGV2ZXJ5dGhpbmcuICBJZiB5b3VyIG1hY2hpbmUgaGFzIGxlc3NlciBhbGlnbm1lbnQgbmVlZHMsCi0gKiB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgbWFraW5nIEFMSUdOX1RZUEUgc21hbGxlci4KLSAqIFRoZSBvbmx5IHBsYWNlIEkga25vdyBvZiB3aGVyZSB0aGlzIHdpbGwgTk9UIHdvcmsgaXMgY2VydGFpbiBNYWNpbnRvc2gKLSAqIDY4MHgwIGNvbXBpbGVycyB0aGF0IGRlZmluZSBkb3VibGUgYXMgYSAxMC1ieXRlIElFRUUgZXh0ZW5kZWQgZmxvYXQuCi0gKiBEb2luZyAxMC1ieXRlIGFsaWdubWVudCBpcyBjb3VudGVycHJvZHVjdGl2ZSBiZWNhdXNlIGxvbmd3b3JkcyB3b24ndCBiZQotICogYWxpZ25lZCB3ZWxsLiAgUHV0ICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgaW4gamNvbmZpZy5oIGlmIHlvdSBoYXZlCi0gKiBzdWNoIGEgY29tcGlsZXIuCi0gKi8KLQotI2lmbmRlZiBBTElHTl9UWVBFCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggKi8KLSNkZWZpbmUgQUxJR05fVFlQRSAgZG91YmxlCi0jZW5kaWYKLQotCi0vKgotICogV2UgYWxsb2NhdGUgb2JqZWN0cyBmcm9tICJwb29scyIsIHdoZXJlIGVhY2ggcG9vbCBpcyBnb3R0ZW4gd2l0aCBhIHNpbmdsZQotICogcmVxdWVzdCB0byBqcGVnX2dldF9zbWFsbCgpIG9yIGpwZWdfZ2V0X2xhcmdlKCkuICBUaGVyZSBpcyBubyBwZXItb2JqZWN0Ci0gKiBvdmVyaGVhZCB3aXRoaW4gYSBwb29sLCBleGNlcHQgZm9yIGFsaWdubWVudCBwYWRkaW5nLiAgRWFjaCBwb29sIGhhcyBhCi0gKiBoZWFkZXIgd2l0aCBhIGxpbmsgdG8gdGhlIG5leHQgcG9vbCBvZiB0aGUgc2FtZSBjbGFzcy4KLSAqIFNtYWxsIGFuZCBsYXJnZSBwb29sIGhlYWRlcnMgYXJlIGlkZW50aWNhbCBleGNlcHQgdGhhdCB0aGUgbGF0dGVyJ3MKLSAqIGxpbmsgcG9pbnRlciBtdXN0IGJlIEZBUiBvbiA4MHg4NiBtYWNoaW5lcy4KLSAqIE5vdGljZSB0aGF0IHRoZSAicmVhbCIgaGVhZGVyIGZpZWxkcyBhcmUgdW5pb24nZWQgd2l0aCBhIGR1bW15IEFMSUdOX1RZUEUKLSAqIGZpZWxkLiAgVGhpcyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIG1ha2UgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKSBhIG11bHRpcGxlCi0gKiBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIEFMSUdOX1RZUEUuCi0gKi8KLQotdHlwZWRlZiB1bmlvbiBzbWFsbF9wb29sX3N0cnVjdCAqIHNtYWxsX3Bvb2xfcHRyOwotCi10eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0IHsKLSAgc3RydWN0IHsKLSAgICBzbWFsbF9wb29sX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3Qgb2YgcG9vbHMgKi8KLSAgICBzaXplX3QgYnl0ZXNfdXNlZDsJCS8qIGhvdyBtYW55IGJ5dGVzIGFscmVhZHkgdXNlZCB3aXRoaW4gcG9vbCAqLwotICAgIHNpemVfdCBieXRlc19sZWZ0OwkJLyogYnl0ZXMgc3RpbGwgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCAqLwotICB9IGhkcjsKLSAgQUxJR05fVFlQRSBkdW1teTsJCS8qIGluY2x1ZGVkIGluIHVuaW9uIHRvIGVuc3VyZSBhbGlnbm1lbnQgKi8KLX0gc21hbGxfcG9vbF9oZHI7Ci0KLXR5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgRkFSICogbGFyZ2VfcG9vbF9wdHI7Ci0KLXR5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgewotICBzdHJ1Y3QgewotICAgIGxhcmdlX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLwotICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCi0gICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCi0gIH0gaGRyOwotICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLwotfSBsYXJnZV9wb29sX2hkcjsKLQotCi0vKgotICogSGVyZSBpcyB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIGEgbWVtb3J5IG1hbmFnZXIgb2JqZWN0LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfbWVtb3J5X21nciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBFYWNoIHBvb2wgaWRlbnRpZmllciAobGlmZXRpbWUgY2xhc3MpIG5hbWVzIGEgbGlua2VkIGxpc3Qgb2YgcG9vbHMuICovCi0gIHNtYWxsX3Bvb2xfcHRyIHNtYWxsX2xpc3RbSlBPT0xfTlVNUE9PTFNdOwotICBsYXJnZV9wb29sX3B0ciBsYXJnZV9saXN0W0pQT09MX05VTVBPT0xTXTsKLQotICAvKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGxpZmV0aW1lIGNsYXNzIG9mIHZpcnR1YWwgYXJyYXlzLCBvbmx5IG9uZQotICAgKiBsaW5rZWQgbGlzdCBpcyBuZWNlc3NhcnkgKGZvciBlYWNoIGRhdGF0eXBlKS4gIE5vdGUgdGhhdCB0aGUgdmlydHVhbAotICAgKiBhcnJheSBjb250cm9sIGJsb2NrcyBiZWluZyBsaW5rZWQgdG9nZXRoZXIgYXJlIGFjdHVhbGx5IHN0b3JlZCBzb21ld2hlcmUKLSAgICogaW4gdGhlIHNtYWxsLXBvb2wgbGlzdC4KLSAgICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgdmlydF9zYXJyYXlfbGlzdDsKLSAganZpcnRfYmFycmF5X3B0ciB2aXJ0X2JhcnJheV9saXN0OwotCi0gIC8qIFRoaXMgY291bnRzIHRvdGFsIHNwYWNlIG9idGFpbmVkIGZyb20ganBlZ19nZXRfc21hbGwvbGFyZ2UgKi8KLSAgbG9uZyB0b3RhbF9zcGFjZV9hbGxvY2F0ZWQ7Ci0KLSAgLyogYWxsb2Nfc2FycmF5IGFuZCBhbGxvY19iYXJyYXkgc2V0IHRoaXMgdmFsdWUgZm9yIHVzZSBieSB2aXJ0dWFsCi0gICAqIGFycmF5IHJvdXRpbmVzLgotICAgKi8KLSAgSkRJTUVOU0lPTiBsYXN0X3Jvd3NwZXJjaHVuazsJLyogZnJvbSBtb3N0IHJlY2VudCBhbGxvY19zYXJyYXkvYmFycmF5ICovCi19IG15X21lbW9yeV9tZ3I7Ci0KLXR5cGVkZWYgbXlfbWVtb3J5X21nciAqIG15X21lbV9wdHI7Ci0KLQotLyoKLSAqIFRoZSBjb250cm9sIGJsb2NrcyBmb3IgdmlydHVhbCBhcnJheXMuCi0gKiBOb3RlIHRoYXQgdGhlc2UgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlICJzbWFsbCIgcG9vbCBhcmVhLgotICogU3lzdGVtLWRlcGVuZGVudCBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCBiYWNraW5nIHN0b3JlIChpZiBhbnkpIGlzIGhpZGRlbgotICogaW5zaWRlIHRoZSBiYWNraW5nX3N0b3JlX2luZm8gc3RydWN0LgotICovCi0KLXN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7Ci0gIEpTQU1QQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLwotICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3c7CS8qIHdpZHRoIG9mIGFycmF5IChhbmQgb2YgbWVtb3J5IGJ1ZmZlcikgKi8KLSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3M7CQkvKiBtYXggcm93cyBhY2Nlc3NlZCBieSBhY2Nlc3NfdmlydF9zYXJyYXkgKi8KLSAgSkRJTUVOU0lPTiByb3dzX2luX21lbTsJLyogaGVpZ2h0IG9mIG1lbW9yeSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bms7CS8qIGFsbG9jYXRpb24gY2h1bmsgc2l6ZSBpbiBtZW1fYnVmZmVyICovCi0gIEpESU1FTlNJT04gY3VyX3N0YXJ0X3JvdzsJLyogZmlyc3QgbG9naWNhbCByb3cgIyBpbiB0aGUgYnVmZmVyICovCi0gIEpESU1FTlNJT04gZmlyc3RfdW5kZWZfcm93OwkvKiByb3cgIyBvZiBmaXJzdCB1bmluaXRpYWxpemVkIHJvdyAqLwotICBib29sZWFuIHByZV96ZXJvOwkJLyogcHJlLXplcm8gbW9kZSByZXF1ZXN0ZWQ/ICovCi0gIGJvb2xlYW4gZGlydHk7CQkvKiBkbyBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBuZWVkIHdyaXR0ZW4/ICovCi0gIGJvb2xlYW4gYl9zX29wZW47CQkvKiBpcyBiYWNraW5nLXN0b3JlIGRhdGEgdmFsaWQ/ICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgbmV4dDsJLyogbGluayB0byBuZXh0IHZpcnR1YWwgc2FycmF5IGNvbnRyb2wgYmxvY2sgKi8KLSAgYmFja2luZ19zdG9yZV9pbmZvIGJfc19pbmZvOwkvKiBTeXN0ZW0tZGVwZW5kZW50IGNvbnRyb2wgaW5mbyAqLwotfTsKLQotc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsKLSAgSkJMT0NLQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLwotICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLwotICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X2JhcnJheSAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCi0gIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KLSAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KLSAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KLSAganZpcnRfYmFycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBiYXJyYXkgY29udHJvbCBibG9jayAqLwotICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCi19OwotCi0KLSNpZmRlZiBNRU1fU1RBVFMJCS8qIG9wdGlvbmFsIGV4dHJhIHN0dWZmIGZvciBzdGF0aXN0aWNzICovCi0KLUxPQ0FMKHZvaWQpCi1wcmludF9tZW1fc3RhdHMgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOwotICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKLQotICAvKiBTaW5jZSB0aGlzIGlzIG9ubHkgYSBkZWJ1Z2dpbmcgc3R1Yiwgd2UgY2FuIGNoZWF0IGEgbGl0dGxlIGJ5IHVzaW5nCi0gICAqIGZwcmludGYgZGlyZWN0bHkgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaCB0aGUgdHJhY2UgbWVzc2FnZSBjb2RlLgotICAgKiBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBtZXNzYWdlIHBhcm0gYXJyYXkgY2FuJ3QgaGFuZGxlIGxvbmdzLgotICAgKi8KLSAgZnByaW50ZihzdGRlcnIsICJGcmVlaW5nIHBvb2wgJWQsIHRvdGFsIHNwYWNlID0gJWxkXG4iLAotCSAgcG9vbF9pZCwgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOwotCi0gIGZvciAobGhkcl9wdHIgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07IGxoZHJfcHRyICE9IE5VTEw7Ci0gICAgICAgbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgTGFyZ2UgY2h1bmsgdXNlZCAlbGRcbiIsCi0JICAgIChsb25nKSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQpOwotICB9Ci0KLSAgZm9yIChzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsgc2hkcl9wdHIgIT0gTlVMTDsKLSAgICAgICBzaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiICBTbWFsbCBjaHVuayB1c2VkICVsZCBmcmVlICVsZFxuIiwKLQkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCwKLQkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCk7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIE1FTV9TVEFUUyAqLwotCi0KLUxPQ0FMKHZvaWQpCi1vdXRfb2ZfbWVtb3J5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCB3aGljaCkKLS8qIFJlcG9ydCBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIGFuZCBzdG9wIGV4ZWN1dGlvbiAqLwotLyogSWYgd2UgY29tcGlsZWQgTUVNX1NUQVRTIHN1cHBvcnQsIHJlcG9ydCBhbGxvYyByZXF1ZXN0cyBiZWZvcmUgZHlpbmcgKi8KLXsKLSNpZmRlZiBNRU1fU1RBVFMKLSAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAyOwkvKiBmb3JjZSBzZWxmX2Rlc3RydWN0IHRvIHJlcG9ydCBzdGF0cyAqLwotI2VuZGlmCi0gIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIHdoaWNoKTsKLX0KLQotCi0vKgotICogQWxsb2NhdGlvbiBvZiAic21hbGwiIG9iamVjdHMuCi0gKgotICogRm9yIHRoZXNlLCB3ZSB1c2UgcG9vbGVkIHN0b3JhZ2UuICBXaGVuIGEgbmV3IHBvb2wgbXVzdCBiZSBjcmVhdGVkLAotICogd2UgdHJ5IHRvIGdldCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgcGx1cyBhICJzbG9wIiBmYWN0b3IsCi0gKiB3aGVyZSB0aGUgc2xvcCB3aWxsIGJlIHRoZSBhbW91bnQgb2YgbGVmdG92ZXIgc3BhY2UgaW4gdGhlIG5ldyBwb29sLgotICogVGhlIHNwZWVkIHZzLiBzcGFjZSB0cmFkZW9mZiBpcyBsYXJnZWx5IGRldGVybWluZWQgYnkgdGhlIHNsb3AgdmFsdWVzLgotICogQSBkaWZmZXJlbnQgc2xvcCB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgZWFjaCBwb29sIGNsYXNzIChsaWZldGltZSksCi0gKiBhbmQgd2UgYWxzbyBkaXN0aW5ndWlzaCB0aGUgZmlyc3QgcG9vbCBvZiBhIGNsYXNzIGZyb20gbGF0ZXIgb25lcy4KLSAqIE5PVEU6IHRoZSB2YWx1ZXMgZ2l2ZW4gd29yayBmYWlybHkgd2VsbCBvbiBib3RoIDE2LSBhbmQgMzItYml0LWludAotICogbWFjaGluZXMsIGJ1dCBtYXkgYmUgdG9vIHNtYWxsIGlmIGxvbmdzIGFyZSA2NCBiaXRzIG9yIG1vcmUuCi0gKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBmaXJzdF9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCi17Ci0JMTYwMCwJCQkvKiBmaXJzdCBQRVJNQU5FTlQgcG9vbCAqLwotCTE2MDAwCQkJLyogZmlyc3QgSU1BR0UgcG9vbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBleHRyYV9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCi17Ci0JMCwJCQkvKiBhZGRpdGlvbmFsIFBFUk1BTkVOVCBwb29scyAqLwotCTUwMDAJCQkvKiBhZGRpdGlvbmFsIElNQUdFIHBvb2xzICovCi19OwotCi0jZGVmaW5lIE1JTl9TTE9QICA1MAkJLyogZ3JlYXRlciB0aGFuIDAgdG8gYXZvaWQgZnV0aWxlIGxvb3BpbmcgKi8KLQotCi1NRVRIT0RERUYodm9pZCAqKQotYWxsb2Nfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCi0vKiBBbGxvY2F0ZSBhICJzbWFsbCIgb2JqZWN0ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIHNtYWxsX3Bvb2xfcHRyIGhkcl9wdHIsIHByZXZfaGRyX3B0cjsKLSAgY2hhciAqIGRhdGFfcHRyOwotICBzaXplX3Qgb2RkX2J5dGVzLCBtaW5fcmVxdWVzdCwgc2xvcDsKLQotICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLwotICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0Yoc21hbGxfcG9vbF9oZHIpKSkKLSAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAxKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KLQotICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KLSAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOwotICBpZiAob2RkX2J5dGVzID4gMCkKLSAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOwotCi0gIC8qIFNlZSBpZiBzcGFjZSBpcyBhdmFpbGFibGUgaW4gYW55IGV4aXN0aW5nIHBvb2wgKi8KLSAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLSAgcHJldl9oZHJfcHRyID0gTlVMTDsKLSAgaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKLSAgd2hpbGUgKGhkcl9wdHIgIT0gTlVMTCkgewotICAgIGlmIChoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA+PSBzaXplb2ZvYmplY3QpCi0gICAgICBicmVhazsJCQkvKiBmb3VuZCBwb29sIHdpdGggZW5vdWdoIHNwYWNlICovCi0gICAgcHJldl9oZHJfcHRyID0gaGRyX3B0cjsKLSAgICBoZHJfcHRyID0gaGRyX3B0ci0+aGRyLm5leHQ7Ci0gIH0KLQotICAvKiBUaW1lIHRvIG1ha2UgYSBuZXcgcG9vbD8gKi8KLSAgaWYgKGhkcl9wdHIgPT0gTlVMTCkgewotICAgIC8qIG1pbl9yZXF1ZXN0IGlzIHdoYXQgd2UgbmVlZCBub3csIHNsb3AgaXMgd2hhdCB3aWxsIGJlIGxlZnRvdmVyICovCi0gICAgbWluX3JlcXVlc3QgPSBzaXplb2ZvYmplY3QgKyBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOwotICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KLSAgICAgIHNsb3AgPSBmaXJzdF9wb29sX3Nsb3BbcG9vbF9pZF07Ci0gICAgZWxzZQotICAgICAgc2xvcCA9IGV4dHJhX3Bvb2xfc2xvcFtwb29sX2lkXTsKLSAgICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiBNQVhfQUxMT0NfQ0hVTksgKi8KLSAgICBpZiAoc2xvcCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpKQotICAgICAgc2xvcCA9IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpOwotICAgIC8qIFRyeSB0byBnZXQgc3BhY2UsIGlmIGZhaWwgcmVkdWNlIHNsb3AgYW5kIHRyeSBhZ2FpbiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgIGhkcl9wdHIgPSAoc21hbGxfcG9vbF9wdHIpIGpwZWdfZ2V0X3NtYWxsKGNpbmZvLCBtaW5fcmVxdWVzdCArIHNsb3ApOwotICAgICAgaWYgKGhkcl9wdHIgIT0gTlVMTCkKLQlicmVhazsKLSAgICAgIHNsb3AgLz0gMjsKLSAgICAgIGlmIChzbG9wIDwgTUlOX1NMT1ApCS8qIGdpdmUgdXAgd2hlbiBpdCBnZXRzIHJlYWwgc21hbGwgKi8KLQlvdXRfb2ZfbWVtb3J5KGNpbmZvLCAyKTsgLyoganBlZ19nZXRfc21hbGwgZmFpbGVkICovCi0gICAgfQotICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IG1pbl9yZXF1ZXN0ICsgc2xvcDsKLSAgICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBlbmQgb2YgbGlzdCAqLwotICAgIGhkcl9wdHItPmhkci5uZXh0ID0gTlVMTDsKLSAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IDA7Ci0gICAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSBzaXplb2ZvYmplY3QgKyBzbG9wOwotICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KLSAgICAgIG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXSA9IGhkcl9wdHI7Ci0gICAgZWxzZQotICAgICAgcHJldl9oZHJfcHRyLT5oZHIubmV4dCA9IGhkcl9wdHI7Ci0gIH0KLQotICAvKiBPSywgYWxsb2NhdGUgdGhlIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHBvb2wgKi8KLSAgZGF0YV9wdHIgPSAoY2hhciAqKSAoaGRyX3B0ciArIDEpOyAvKiBwb2ludCB0byBmaXJzdCBkYXRhIGJ5dGUgaW4gcG9vbCAqLwotICBkYXRhX3B0ciArPSBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZDsgLyogcG9pbnQgdG8gcGxhY2UgZm9yIG9iamVjdCAqLwotICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArPSBzaXplb2ZvYmplY3Q7Ci0gIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0IC09IHNpemVvZm9iamVjdDsKLQotICByZXR1cm4gKHZvaWQgKikgZGF0YV9wdHI7Ci19Ci0KLQotLyoKLSAqIEFsbG9jYXRpb24gb2YgImxhcmdlIiBvYmplY3RzLgotICoKLSAqIFRoZSBleHRlcm5hbCBzZW1hbnRpY3Mgb2YgdGhlc2UgYXJlIHRoZSBzYW1lIGFzICJzbWFsbCIgb2JqZWN0cywKLSAqIGV4Y2VwdCB0aGF0IEZBUiBwb2ludGVycyBhcmUgdXNlZCBvbiA4MHg4Ni4gIEhvd2V2ZXIgdGhlIHBvb2wKLSAqIG1hbmFnZW1lbnQgaGV1cmlzdGljcyBhcmUgcXVpdGUgZGlmZmVyZW50LiAgV2UgYXNzdW1lIHRoYXQgZWFjaAotICogcmVxdWVzdCBpcyBsYXJnZSBlbm91Z2ggdGhhdCBpdCBtYXkgYXMgd2VsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KLSAqIGpwZWdfZ2V0X2xhcmdlOyB0aGUgcG9vbCBtYW5hZ2VtZW50IGp1c3QgbGlua3MgZXZlcnl0aGluZyB0b2dldGhlcgotICogc28gdGhhdCB3ZSBjYW4gZnJlZSBpdCBhbGwgb24gZGVtYW5kLgotICogTm90ZTogdGhlIG1ham9yIHVzZSBvZiAibGFyZ2UiIG9iamVjdHMgaXMgaW4gSlNBTVBBUlJBWSBhbmQgSkJMT0NLQVJSQVkKLSAqIHN0cnVjdHVyZXMuICBUaGUgcm91dGluZXMgdGhhdCBjcmVhdGUgdGhlc2Ugc3RydWN0dXJlcyAoc2VlIGJlbG93KQotICogZGVsaWJlcmF0ZWx5IGJ1bmNoIHJvd3MgdG9nZXRoZXIgdG8gZW5zdXJlIGEgbGFyZ2UgcmVxdWVzdCBzaXplLgotICovCi0KLU1FVEhPRERFRih2b2lkIEZBUiAqKQotYWxsb2NfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCi0vKiBBbGxvY2F0ZSBhICJsYXJnZSIgb2JqZWN0ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGxhcmdlX3Bvb2xfcHRyIGhkcl9wdHI7Ci0gIHNpemVfdCBvZGRfYnl0ZXM7Ci0KLSAgLyogQ2hlY2sgZm9yIHVuc2F0aXNmaWFibGUgcmVxdWVzdCAoZG8gbm93IHRvIGVuc3VyZSBubyBvdmVyZmxvdyBiZWxvdykgKi8KLSAgaWYgKHNpemVvZm9iamVjdCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkpCi0gICAgb3V0X29mX21lbW9yeShjaW5mbywgMyk7CS8qIHJlcXVlc3QgZXhjZWVkcyBtYWxsb2MncyBhYmlsaXR5ICovCi0KLSAgLyogUm91bmQgdXAgdGhlIHJlcXVlc3RlZCBzaXplIHRvIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpICovCi0gIG9kZF9ieXRlcyA9IHNpemVvZm9iamVjdCAlIFNJWkVPRihBTElHTl9UWVBFKTsKLSAgaWYgKG9kZF9ieXRlcyA+IDApCi0gICAgc2l6ZW9mb2JqZWN0ICs9IFNJWkVPRihBTElHTl9UWVBFKSAtIG9kZF9ieXRlczsKLQotICAvKiBBbHdheXMgbWFrZSBhIG5ldyBwb29sICovCi0gIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCi0KLSAgaGRyX3B0ciA9IChsYXJnZV9wb29sX3B0cikganBlZ19nZXRfbGFyZ2UoY2luZm8sIHNpemVvZm9iamVjdCArCi0JCQkJCSAgICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpKTsKLSAgaWYgKGhkcl9wdHIgPT0gTlVMTCkKLSAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCA0KTsJLyoganBlZ19nZXRfbGFyZ2UgZmFpbGVkICovCi0gIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IHNpemVvZm9iamVjdCArIFNJWkVPRihsYXJnZV9wb29sX2hkcik7Ci0KLSAgLyogU3VjY2VzcywgaW5pdGlhbGl6ZSB0aGUgbmV3IHBvb2wgaGVhZGVyIGFuZCBhZGQgdG8gbGlzdCAqLwotICBoZHJfcHRyLT5oZHIubmV4dCA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKLSAgLyogV2UgbWFpbnRhaW4gc3BhY2UgY291bnRzIGluIGVhY2ggcG9vbCBoZWFkZXIgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzLAotICAgKiBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QgbmVlZGVkIGZvciBhbGxvY2F0aW9uLgotICAgKi8KLSAgaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgPSBzaXplb2ZvYmplY3Q7Ci0gIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID0gMDsKLSAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKLQotICByZXR1cm4gKHZvaWQgRkFSICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCi19Ci0KLQotLyoKLSAqIENyZWF0aW9uIG9mIDItRCBzYW1wbGUgYXJyYXlzLgotICogVGhlIHBvaW50ZXJzIGFyZSBpbiBuZWFyIGhlYXAsIHRoZSBzYW1wbGVzIHRoZW1zZWx2ZXMgaW4gRkFSIGhlYXAuCi0gKgotICogVG8gbWluaW1pemUgYWxsb2NhdGlvbiBvdmVyaGVhZCBhbmQgdG8gYWxsb3cgSS9PIG9mIGxhcmdlIGNvbnRpZ3VvdXMKLSAqIGJsb2Nrcywgd2UgYWxsb2NhdGUgdGhlIHNhbXBsZSByb3dzIGluIGdyb3VwcyBvZiBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUKLSAqIHdpdGhvdXQgZXhjZWVkaW5nIE1BWF9BTExPQ19DSFVOSyB0b3RhbCBieXRlcyBwZXIgYWxsb2NhdGlvbiByZXF1ZXN0LgotICogTkI6IHRoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgcm91dGluZXMsIGxhdGVyIGluIHRoaXMgZmlsZSwga25vdyBhYm91dAotICogdGhpcyBjaHVua2luZyBvZiByb3dzLiAgVGhlIHJvd3NwZXJjaHVuayB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBtZW0gbWFuYWdlcgotICogb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkIGF3YXkgaWYgdGhpcyBzYXJyYXkgaXMgdGhlIHdvcmtzcGFjZSBmb3IKLSAqIGEgdmlydHVhbCBhcnJheS4KLSAqLwotCi1NRVRIT0RERUYoSlNBTVBBUlJBWSkKLWFsbG9jX3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkgICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cykKLS8qIEFsbG9jYXRlIGEgMi1EIHNhbXBsZSBhcnJheSAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBKU0FNUEFSUkFZIHJlc3VsdDsKLSAgSlNBTVBST1cgd29ya3NwYWNlOwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOwotICBsb25nIGx0ZW1wOwotCi0gIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KLSAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KLQkgICgobG9uZykgc2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKSk7Ci0gIGlmIChsdGVtcCA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOwotICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKLSAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gIGVsc2UKLSAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOwotICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOwotCi0gIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCi0gIHJlc3VsdCA9IChKU0FNUEFSUkFZKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKLQkJCQkgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSlNBTVBST1cpKSk7Ci0KLSAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCi0gIGN1cnJvdyA9IDA7Ci0gIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7Ci0gICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7Ci0gICAgd29ya3NwYWNlID0gKEpTQU1QUk9XKSBhbGxvY19sYXJnZShjaW5mbywgcG9vbF9pZCwKLQkoc2l6ZV90KSAoKHNpemVfdCkgcm93c3BlcmNodW5rICogKHNpemVfdCkgc2FtcGxlc3BlcnJvdwotCQkgICogU0laRU9GKEpTQU1QTEUpKSk7Ci0gICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7Ci0gICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOwotICAgICAgd29ya3NwYWNlICs9IHNhbXBsZXNwZXJyb3c7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKgotICogQ3JlYXRpb24gb2YgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4KLSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNvZGUgZm9yIHNhbXBsZSBhcnJheXMsIGFib3ZlLgotICovCi0KLU1FVEhPRERFRihKQkxPQ0tBUlJBWSkKLWFsbG9jX2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkgICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQotLyogQWxsb2NhdGUgYSAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgSkJMT0NLQVJSQVkgcmVzdWx0OwotICBKQkxPQ0tST1cgd29ya3NwYWNlOwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOwotICBsb25nIGx0ZW1wOwotCi0gIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KLSAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KLQkgICgobG9uZykgYmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSykpOwotICBpZiAobHRlbXAgPD0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKLSAgaWYgKGx0ZW1wIDwgKGxvbmcpIG51bXJvd3MpCi0gICAgcm93c3BlcmNodW5rID0gKEpESU1FTlNJT04pIGx0ZW1wOwotICBlbHNlCi0gICAgcm93c3BlcmNodW5rID0gbnVtcm93czsKLSAgbWVtLT5sYXN0X3Jvd3NwZXJjaHVuayA9IHJvd3NwZXJjaHVuazsKLQotICAvKiBHZXQgc3BhY2UgZm9yIHJvdyBwb2ludGVycyAoc21hbGwgb2JqZWN0KSAqLwotICByZXN1bHQgPSAoSkJMT0NLQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAotCQkJCSAgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSkJMT0NLUk9XKSkpOwotCi0gIC8qIEdldCB0aGUgcm93cyB0aGVtc2VsdmVzIChsYXJnZSBvYmplY3RzKSAqLwotICBjdXJyb3cgPSAwOwotICB3aGlsZSAoY3Vycm93IDwgbnVtcm93cykgewotICAgIHJvd3NwZXJjaHVuayA9IE1JTihyb3dzcGVyY2h1bmssIG51bXJvd3MgLSBjdXJyb3cpOwotICAgIHdvcmtzcGFjZSA9IChKQkxPQ0tST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAotCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBibG9ja3NwZXJyb3cKLQkJICAqIFNJWkVPRihKQkxPQ0spKSk7Ci0gICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7Ci0gICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOwotICAgICAgd29ya3NwYWNlICs9IGJsb2Nrc3BlcnJvdzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qCi0gKiBBYm91dCB2aXJ0dWFsIGFycmF5IG1hbmFnZW1lbnQ6Ci0gKgotICogVGhlIGFib3ZlICJub3JtYWwiIGFycmF5IHJvdXRpbmVzIGFyZSBvbmx5IHVzZWQgdG8gYWxsb2NhdGUgc3RyaXAgYnVmZmVycwotICogKGFzIHdpZGUgYXMgdGhlIGltYWdlLCBidXQganVzdCBhIGZldyByb3dzIGhpZ2gpLiAgRnVsbC1pbWFnZS1zaXplZCBidWZmZXJzCi0gKiBhcmUgaGFuZGxlZCBhcyAidmlydHVhbCIgYXJyYXlzLiAgVGhlIGFycmF5IGlzIHN0aWxsIGFjY2Vzc2VkIGEgc3RyaXAgYXQgYQotICogdGltZSwgYnV0IHRoZSBtZW1vcnkgbWFuYWdlciBtdXN0IHNhdmUgdGhlIHdob2xlIGFycmF5IGZvciByZXBlYXRlZAotICogYWNjZXNzZXMuICBUaGUgaW50ZW5kZWQgaW1wbGVtZW50YXRpb24gaXMgdGhhdCB0aGVyZSBpcyBhIHN0cmlwIGJ1ZmZlciBpbgotICogbWVtb3J5IChhcyBoaWdoIGFzIGlzIHBvc3NpYmxlIGdpdmVuIHRoZSBkZXNpcmVkIG1lbW9yeSBsaW1pdCksIHBsdXMgYQotICogYmFja2luZyBmaWxlIHRoYXQgaG9sZHMgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgotICoKLSAqIFRoZSByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHRvbGQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGltYWdlIGFuZAotICogdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIGFjY2Vzc2VkIGF0IG9uY2UuICBUaGUgaW4tbWVtb3J5Ci0gKiBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbWF4YWNjZXNzIHZhbHVlLgotICoKLSAqIFRoZSByZXF1ZXN0IHJvdXRpbmVzIGNyZWF0ZSBjb250cm9sIGJsb2NrcyBidXQgbm90IHRoZSBpbi1tZW1vcnkgYnVmZmVycy4KLSAqIFRoYXQgaXMgcG9zdHBvbmVkIHVudGlsIHJlYWxpemVfdmlydF9hcnJheXMgaXMgY2FsbGVkLiAgQXQgdGhhdCB0aW1lIHRoZQotICogdG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBpcyBrbm93biAoYXBwcm94aW1hdGVseSwgYW55d2F5KSwgc28gZnJlZQotICogbWVtb3J5IGNhbiBiZSBkaXZpZGVkIHVwIGZhaXJseS4KLSAqCi0gKiBUaGUgYWNjZXNzX3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBzcGVjaWZpYyBzdHJpcAotICogYXJlYSBhY2Nlc3NpYmxlIChhZnRlciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGJhY2tpbmcgZmlsZSwgaWYgbmVjZXNzYXJ5KS4KLSAqIE5vdGUgdGhhdCB0aGUgYWNjZXNzIHJvdXRpbmVzIGFyZSB0b2xkIHdoZXRoZXIgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeQotICogdGhlIGFjY2Vzc2VkIHN0cmlwOyBkdXJpbmcgYSByZWFkLW9ubHkgcGFzcyB0aGlzIHNhdmVzIGhhdmluZyB0byByZXdyaXRlCi0gKiBkYXRhIHRvIGRpc2suICBUaGUgYWNjZXNzIHJvdXRpbmVzIGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBwcmUtemVyb2luZwotICogYW55IG5ld2x5IGFjY2Vzc2VkIHJvd3MsIGlmIHByZS16ZXJvaW5nIHdhcyByZXF1ZXN0ZWQuCi0gKgotICogSW4gY3VycmVudCB1c2FnZSwgdGhlIGFjY2VzcyByZXF1ZXN0cyBhcmUgdXN1YWxseSBmb3Igbm9ub3ZlcmxhcHBpbmcKLSAqIHN0cmlwczsgdGhhdCBpcywgc3VjY2Vzc2l2ZSBhY2Nlc3Mgc3RhcnRfcm93IG51bWJlcnMgZGlmZmVyIGJ5IGV4YWN0bHkKLSAqIG51bV9yb3dzID0gbWF4YWNjZXNzLiAgVGhpcyBtZWFucyB3ZSBjYW4gZ2V0IGdvb2QgcGVyZm9ybWFuY2Ugd2l0aCBzaW1wbGUKLSAqIGJ1ZmZlciBkdW1wL3JlbG9hZCBsb2dpYywgYnkgbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVyIGJlIGEgbXVsdGlwbGUKLSAqIG9mIHRoZSBhY2Nlc3MgaGVpZ2h0OyB0aGVuIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYWNjZXNzZXMgYWNyb3NzIGJ1ZmZlcmxvYWQKLSAqIGJvdW5kYXJpZXMuICBUaGUgY29kZSB3aWxsIHN0aWxsIHdvcmsgd2l0aCBvdmVybGFwcGluZyBhY2Nlc3MgcmVxdWVzdHMsCi0gKiBidXQgaXQgZG9lc24ndCBoYW5kbGUgYnVmZmVybG9hZCBvdmVybGFwcyB2ZXJ5IGVmZmljaWVudGx5LgotICovCi0KLQotTUVUSE9EREVGKGp2aXJ0X3NhcnJheV9wdHIpCi1yZXF1ZXN0X3ZpcnRfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAotCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQotLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIHNhbXBsZSBhcnJheSAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBqdmlydF9zYXJyYXlfcHRyIHJlc3VsdDsKLQotICAvKiBPbmx5IElNQUdFLWxpZmV0aW1lIHZpcnR1YWwgYXJyYXlzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkICovCi0gIGlmIChwb29sX2lkICE9IEpQT09MX0lNQUdFKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCi0KLSAgLyogZ2V0IGNvbnRyb2wgYmxvY2sgKi8KLSAgcmVzdWx0ID0gKGp2aXJ0X3NhcnJheV9wdHIpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAotCQkJCQkgIFNJWkVPRihzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wpKTsKLQotICByZXN1bHQtPm1lbV9idWZmZXIgPSBOVUxMOwkvKiBtYXJrcyBhcnJheSBub3QgeWV0IHJlYWxpemVkICovCi0gIHJlc3VsdC0+cm93c19pbl9hcnJheSA9IG51bXJvd3M7Ci0gIHJlc3VsdC0+c2FtcGxlc3BlcnJvdyA9IHNhbXBsZXNwZXJyb3c7Ci0gIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOwotICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87Ci0gIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLwotICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCi0gIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IHJlc3VsdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLU1FVEhPRERFRihqdmlydF9iYXJyYXlfcHRyKQotcmVxdWVzdF92aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgYm9vbGVhbiBwcmVfemVybywKLQkJICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQotLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGp2aXJ0X2JhcnJheV9wdHIgcmVzdWx0OwotCi0gIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KLSAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotICAvKiBnZXQgY29udHJvbCBibG9jayAqLwotICByZXN1bHQgPSAoanZpcnRfYmFycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCi0JCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCkpOwotCi0gIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KLSAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKLSAgcmVzdWx0LT5ibG9ja3NwZXJyb3cgPSBibG9ja3NwZXJyb3c7Ci0gIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOwotICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87Ci0gIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLwotICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCi0gIG1lbS0+dmlydF9iYXJyYXlfbGlzdCA9IHJlc3VsdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhbGl6ZV92aXJ0X2FycmF5cyAoal9jb21tb25fcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvciBhbnkgdW5yZWFsaXplZCB2aXJ0dWFsIGFycmF5cyAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBsb25nIHNwYWNlX3Blcl9taW5oZWlnaHQsIG1heGltdW1fc3BhY2UsIGF2YWlsX21lbTsKLSAgbG9uZyBtaW5oZWlnaHRzLCBtYXhfbWluaGVpZ2h0czsKLSAganZpcnRfc2FycmF5X3B0ciBzcHRyOwotICBqdmlydF9iYXJyYXlfcHRyIGJwdHI7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgbWluaW11bSBzcGFjZSBuZWVkZWQgKG1heGFjY2VzcyByb3dzIGluIGVhY2ggYnVmZmVyKQotICAgKiBhbmQgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIChmdWxsIGltYWdlIGhlaWdodCBpbiBlYWNoIGJ1ZmZlcikuCi0gICAqIFRoZXNlIG1heSBiZSBvZiB1c2UgdG8gdGhlIHN5c3RlbS1kZXBlbmRlbnQganBlZ19tZW1fYXZhaWxhYmxlIHJvdXRpbmUuCi0gICAqLwotICBzcGFjZV9wZXJfbWluaGVpZ2h0ID0gMDsKLSAgbWF4aW11bV9zcGFjZSA9IDA7Ci0gIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgewotICAgIGlmIChzcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLwotICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgc3B0ci0+bWF4YWNjZXNzICoKLQkJCSAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7Ci0gICAgICBtYXhpbXVtX3NwYWNlICs9IChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5ICoKLQkJICAgICAgIChsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOwotICAgIH0KLSAgfQotICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKLSAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KLSAgICAgIHNwYWNlX3Blcl9taW5oZWlnaHQgKz0gKGxvbmcpIGJwdHItPm1heGFjY2VzcyAqCi0JCQkgICAgIChsb25nKSBicHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKLSAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgKgotCQkgICAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOwotICAgIH0KLSAgfQotCi0gIGlmIChzcGFjZV9wZXJfbWluaGVpZ2h0IDw9IDApCi0gICAgcmV0dXJuOwkJCS8qIG5vIHVucmVhbGl6ZWQgYXJyYXlzLCBubyB3b3JrICovCi0KLSAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBtZW1vcnkgdG8gYWN0dWFsbHkgdXNlOyB0aGlzIGlzIHN5c3RlbS1kZXBlbmRlbnQuICovCi0gIGF2YWlsX21lbSA9IGpwZWdfbWVtX2F2YWlsYWJsZShjaW5mbywgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwKLQkJCQkgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOwotCi0gIC8qIElmIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBpcyBhdmFpbGFibGUsIG1ha2UgYWxsIHRoZSBidWZmZXJzIGZ1bGwKLSAgICogaGVpZ2h0OyBvdGhlcndpc2UgcGFyY2VsIGl0IG91dCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBtaW5oZWlnaHRzCi0gICAqIGluIGVhY2ggYnVmZmVyLgotICAgKi8KLSAgaWYgKGF2YWlsX21lbSA+PSBtYXhpbXVtX3NwYWNlKQotICAgIG1heF9taW5oZWlnaHRzID0gMTAwMDAwMDAwMEw7Ci0gIGVsc2UgewotICAgIG1heF9taW5oZWlnaHRzID0gYXZhaWxfbWVtIC8gc3BhY2VfcGVyX21pbmhlaWdodDsKLSAgICAvKiBJZiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgZW5vdWdoIHNwYWNlLCB0cnkgdG8gZ2V0IHRoZSBtaW5pbXVtCi0gICAgICogYW55d2F5LiAgVGhpcyBhbGxvd3MgYSAic3R1YiIgaW1wbGVtZW50YXRpb24gb2YganBlZ19tZW1fYXZhaWxhYmxlKCkuCi0gICAgICovCi0gICAgaWYgKG1heF9taW5oZWlnaHRzIDw9IDApCi0gICAgICBtYXhfbWluaGVpZ2h0cyA9IDE7Ci0gIH0KLQotICAvKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgYW5kIGluaXRpYWxpemUgYmFja2luZyBzdG9yZSBhcyBuZWVkZWQuICovCi0KLSAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7Ci0gICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCi0gICAgICBtaW5oZWlnaHRzID0gKChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5IC0gMUwpIC8gc3B0ci0+bWF4YWNjZXNzICsgMUw7Ci0gICAgICBpZiAobWluaGVpZ2h0cyA8PSBtYXhfbWluaGVpZ2h0cykgewotCS8qIFRoaXMgYnVmZmVyIGZpdHMgaW4gbWVtb3J5ICovCi0Jc3B0ci0+cm93c19pbl9tZW0gPSBzcHRyLT5yb3dzX2luX2FycmF5OwotICAgICAgfSBlbHNlIHsKLQkvKiBJdCBkb2Vzbid0IGZpdCBpbiBtZW1vcnksIGNyZWF0ZSBiYWNraW5nIHN0b3JlLiAqLwotCXNwdHItPnJvd3NfaW5fbWVtID0gKEpESU1FTlNJT04pIChtYXhfbWluaGVpZ2h0cyAqIHNwdHItPm1heGFjY2Vzcyk7Ci0JanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUoY2luZm8sICYgc3B0ci0+Yl9zX2luZm8sCi0JCQkJKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgotCQkJCShsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICoKLQkJCQkobG9uZykgU0laRU9GKEpTQU1QTEUpKTsKLQlzcHRyLT5iX3Nfb3BlbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBzcHRyLT5tZW1fYnVmZmVyID0gYWxsb2Nfc2FycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBzcHRyLT5zYW1wbGVzcGVycm93LCBzcHRyLT5yb3dzX2luX21lbSk7Ci0gICAgICBzcHRyLT5yb3dzcGVyY2h1bmsgPSBtZW0tPmxhc3Rfcm93c3BlcmNodW5rOwotICAgICAgc3B0ci0+Y3VyX3N0YXJ0X3JvdyA9IDA7Ci0gICAgICBzcHRyLT5maXJzdF91bmRlZl9yb3cgPSAwOwotICAgICAgc3B0ci0+ZGlydHkgPSBGQUxTRTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKLSAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KLSAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBicHRyLT5tYXhhY2Nlc3MgKyAxTDsKLSAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7Ci0JLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KLQlicHRyLT5yb3dzX2luX21lbSA9IGJwdHItPnJvd3NfaW5fYXJyYXk7Ci0gICAgICB9IGVsc2UgewotCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCi0JYnB0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogYnB0ci0+bWF4YWNjZXNzKTsKLQlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBicHRyLT5iX3NfaW5mbywKLQkJCQkobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCi0JCQkJKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqCi0JCQkJKGxvbmcpIFNJWkVPRihKQkxPQ0spKTsKLQlicHRyLT5iX3Nfb3BlbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBicHRyLT5tZW1fYnVmZmVyID0gYWxsb2NfYmFycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBicHRyLT5ibG9ja3NwZXJyb3csIGJwdHItPnJvd3NfaW5fbWVtKTsKLSAgICAgIGJwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7Ci0gICAgICBicHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKLSAgICAgIGJwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7Ci0gICAgICBicHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19zYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKLS8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5ICovCi17Ci0gIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOwotCi0gIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKLSAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKLSAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgewotICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCi0gICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCi0gICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOwotICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCi0gICAgICBicmVhazsKLSAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OwotICAgIGlmICh3cml0aW5nKQotICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAotCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKLSAgICBlbHNlCi0gICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKLQkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fYmFycmF5X2lvIChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLCBib29sZWFuIHdyaXRpbmcpCi0vKiBEbyBiYWNraW5nIHN0b3JlIHJlYWQgb3Igd3JpdGUgb2YgYSB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCi17Ci0gIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOwotCi0gIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7Ci0gIGZpbGVfb2Zmc2V0ID0gcHRyLT5jdXJfc3RhcnRfcm93ICogYnl0ZXNwZXJyb3c7Ci0gIC8qIExvb3AgdG8gcmVhZCBvciB3cml0ZSBlYWNoIGFsbG9jYXRpb24gY2h1bmsgaW4gbWVtX2J1ZmZlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgKGxvbmcpIHB0ci0+cm93c19pbl9tZW07IGkgKz0gcHRyLT5yb3dzcGVyY2h1bmspIHsKLSAgICAvKiBPbmUgY2h1bmssIGJ1dCBjaGVjayBmb3Igc2hvcnQgY2h1bmsgYXQgZW5kIG9mIGJ1ZmZlciAqLwotICAgIHJvd3MgPSBNSU4oKGxvbmcpIHB0ci0+cm93c3BlcmNodW5rLCAobG9uZykgcHRyLT5yb3dzX2luX21lbSAtIGkpOwotICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBpcyBjdXJyZW50bHkgZGVmaW5lZCAqLwotICAgIHRoaXNyb3cgPSAobG9uZykgcHRyLT5jdXJfc3RhcnRfcm93ICsgaTsKLSAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPmZpcnN0X3VuZGVmX3JvdyAtIHRoaXNyb3cpOwotICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBmaXRzIGluIGZpbGUgKi8KLSAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPnJvd3NfaW5fYXJyYXkgLSB0aGlzcm93KTsKLSAgICBpZiAocm93cyA8PSAwKQkJLyogdGhpcyBjaHVuayBtaWdodCBiZSBwYXN0IGVuZCBvZiBmaWxlISAqLwotICAgICAgYnJlYWs7Ci0gICAgYnl0ZV9jb3VudCA9IHJvd3MgKiBieXRlc3BlcnJvdzsKLSAgICBpZiAod3JpdGluZykKLSAgICAgICgqcHRyLT5iX3NfaW5mby53cml0ZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKLQkJCQkJICAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCi0JCQkJCSAgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7Ci0gICAgZWxzZQotICAgICAgKCpwdHItPmJfc19pbmZvLnJlYWRfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCi0JCQkJCSAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCi0JCQkJCSAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKLSAgICBmaWxlX29mZnNldCArPSBieXRlX2NvdW50OwotICB9Ci19Ci0KLQotTUVUSE9EREVGKEpTQU1QQVJSQVkpCi1hY2Nlc3NfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsCi0JCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBudW1fcm93cywKLQkJICAgIGJvb2xlYW4gd3JpdGFibGUpCi0vKiBBY2Nlc3MgdGhlIHBhcnQgb2YgYSB2aXJ0dWFsIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KLS8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLwotLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLwotewotICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7Ci0KLSAgLyogZGVidWdnaW5nIGNoZWNrICovCi0gIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKLSAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLQotICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLwotICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8Ci0gICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKLSAgICBpZiAoISBwdHItPmJfc19vcGVuKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7Ci0gICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAocHRyLT5kaXJ0eSkgewotICAgICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOwotICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgotICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKLSAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKLSAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCi0gICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQotICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KLSAgICAgKi8KLSAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7Ci0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCi0gICAgICBsb25nIGx0ZW1wOwotCi0gICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07Ci0gICAgICBpZiAobHRlbXAgPCAwKQotCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCi0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gICAgfQotICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgotICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCi0gICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgotICAgICAqLwotICAgIGRvX3NhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7Ci0gIH0KLSAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KLSAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKLSAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgotICAgKi8KLSAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgewotICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgewotICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0gICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCi0gICAgfSBlbHNlIHsKLSAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OwotICAgIH0KLSAgICBpZiAod3JpdGFibGUpCi0gICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7Ci0gICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKLSAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKLSAgICAgIHVuZGVmX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7IC8qIG1ha2UgaW5kZXhlcyByZWxhdGl2ZSB0byBidWZmZXIgKi8KLSAgICAgIGVuZF9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OwotICAgICAgd2hpbGUgKHVuZGVmX3JvdyA8IGVuZF9yb3cpIHsKLQlqemVyb19mYXIoKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlclt1bmRlZl9yb3ddLCBieXRlc3BlcnJvdyk7Ci0JdW5kZWZfcm93Kys7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghIHdyaXRhYmxlKQkJLyogcmVhZGVyIGxvb2tpbmcgYXQgdW5kZWZpbmVkIGRhdGEgKi8KLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0gICAgfQotICB9Ci0gIC8qIEZsYWcgdGhlIGJ1ZmZlciBkaXJ0eSBpZiBjYWxsZXIgd2lsbCB3cml0ZSBpbiBpdCAqLwotICBpZiAod3JpdGFibGUpCi0gICAgcHRyLT5kaXJ0eSA9IFRSVUU7Ci0gIC8qIFJldHVybiBhZGRyZXNzIG9mIHByb3BlciBwYXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgcmV0dXJuIHB0ci0+bWVtX2J1ZmZlciArIChzdGFydF9yb3cgLSBwdHItPmN1cl9zdGFydF9yb3cpOwotfQotCi0KLU1FVEhPRERFRihKQkxPQ0tBUlJBWSkKLWFjY2Vzc192aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyIHB0ciwKLQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAotCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKLS8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgc3RhcnRpbmcgYXQgc3RhcnRfcm93ICovCi0vKiBhbmQgZXh0ZW5kaW5nIGZvciBudW1fcm93cyByb3dzLiAgd3JpdGFibGUgaXMgdHJ1ZSBpZiAgKi8KLS8qIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeSB0aGUgYWNjZXNzZWQgYXJlYS4gKi8KLXsKLSAgSkRJTUVOU0lPTiBlbmRfcm93ID0gc3RhcnRfcm93ICsgbnVtX3Jvd3M7Ci0gIEpESU1FTlNJT04gdW5kZWZfcm93OwotCi0gIC8qIGRlYnVnZ2luZyBjaGVjayAqLwotICBpZiAoZW5kX3JvdyA+IHB0ci0+cm93c19pbl9hcnJheSB8fCBudW1fcm93cyA+IHB0ci0+bWF4YWNjZXNzIHx8Ci0gICAgICBwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0KLSAgLyogTWFrZSB0aGUgZGVzaXJlZCBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGFycmF5IGFjY2Vzc2libGUgKi8KLSAgaWYgKHN0YXJ0X3JvdyA8IHB0ci0+Y3VyX3N0YXJ0X3JvdyB8fAotICAgICAgZW5kX3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdytwdHItPnJvd3NfaW5fbWVtKSB7Ci0gICAgaWYgKCEgcHRyLT5iX3Nfb3BlbikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVklSVFVBTF9CVUcpOwotICAgIC8qIEZsdXNoIG9sZCBidWZmZXIgY29udGVudHMgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKHB0ci0+ZGlydHkpIHsKLSAgICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBUUlVFKTsKLSAgICAgIHB0ci0+ZGlydHkgPSBGQUxTRTsKLSAgICB9Ci0gICAgLyogRGVjaWRlIHdoYXQgcGFydCBvZiB2aXJ0dWFsIGFycmF5IHRvIGFjY2Vzcy4KLSAgICAgKiBBbGdvcml0aG06IGlmIHRhcmdldCBhZGRyZXNzID4gY3VycmVudCB3aW5kb3csIGFzc3VtZSBmb3J3YXJkIHNjYW4sCi0gICAgICogbG9hZCBzdGFydGluZyBhdCB0YXJnZXQgYWRkcmVzcy4gIElmIHRhcmdldCBhZGRyZXNzIDwgY3VycmVudCB3aW5kb3csCi0gICAgICogYXNzdW1lIGJhY2t3YXJkIHNjYW4sIGxvYWQgc28gdGhhdCB0YXJnZXQgYXJlYSBpcyB0b3Agb2Ygd2luZG93LgotICAgICAqIE5vdGUgdGhhdCB3aGVuIHN3aXRjaGluZyBmcm9tIGZvcndhcmQgd3JpdGUgdG8gZm9yd2FyZCByZWFkLCB3aWxsIGhhdmUKLSAgICAgKiBzdGFydF9yb3cgPSAwLCBzbyB0aGUgbGltaXRpbmcgY2FzZSBhcHBsaWVzIGFuZCB3ZSBsb2FkIGZyb20gMCBhbnl3YXkuCi0gICAgICovCi0gICAgaWYgKHN0YXJ0X3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdykgewotICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gc3RhcnRfcm93OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiB1c2UgbG9uZyBhcml0aG1ldGljIGhlcmUgdG8gYXZvaWQgb3ZlcmZsb3cgJiB1bnNpZ25lZCBwcm9ibGVtcyAqLwotICAgICAgbG9uZyBsdGVtcDsKLQotICAgICAgbHRlbXAgPSAobG9uZykgZW5kX3JvdyAtIChsb25nKSBwdHItPnJvd3NfaW5fbWVtOwotICAgICAgaWYgKGx0ZW1wIDwgMCkKLQlsdGVtcCA9IDA7CQkvKiBkb24ndCBmYWxsIG9mZiBmcm9udCBlbmQgb2YgZmlsZSAqLwotICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gKEpESU1FTlNJT04pIGx0ZW1wOwotICAgIH0KLSAgICAvKiBSZWFkIGluIHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBhcnJheS4KLSAgICAgKiBEdXJpbmcgdGhlIGluaXRpYWwgd3JpdGUgcGFzcywgd2Ugd2lsbCBkbyBubyBhY3R1YWwgcmVhZAotICAgICAqIGJlY2F1c2UgdGhlIHNlbGVjdGVkIHBhcnQgaXMgYWxsIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBkb19iYXJyYXlfaW8oY2luZm8sIHB0ciwgRkFMU0UpOwotICB9Ci0gIC8qIEVuc3VyZSB0aGUgYWNjZXNzZWQgcGFydCBvZiB0aGUgYXJyYXkgaXMgZGVmaW5lZDsgcHJlemVybyBpZiBuZWVkZWQuCi0gICAqIFRvIGltcHJvdmUgbG9jYWxpdHkgb2YgYWNjZXNzLCB3ZSBvbmx5IHByZXplcm8gdGhlIHBhcnQgb2YgdGhlIGFycmF5Ci0gICAqIHRoYXQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBhY2Nlc3MsIG5vdCB0aGUgZW50aXJlIGluLW1lbW9yeSBhcnJheS4KLSAgICovCi0gIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IGVuZF9yb3cpIHsKLSAgICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBzdGFydF9yb3cpIHsKLSAgICAgIGlmICh3cml0YWJsZSkJCS8qIHdyaXRlciBza2lwcGVkIG92ZXIgYSBzZWN0aW9uIG9mIGFycmF5ICovCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOwotICAgICAgdW5kZWZfcm93ID0gc3RhcnRfcm93OwkvKiBidXQgcmVhZGVyIGlzIGFsbG93ZWQgdG8gcmVhZCBhaGVhZCAqLwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmRlZl9yb3cgPSBwdHItPmZpcnN0X3VuZGVmX3JvdzsKLSAgICB9Ci0gICAgaWYgKHdyaXRhYmxlKQotICAgICAgcHRyLT5maXJzdF91bmRlZl9yb3cgPSBlbmRfcm93OwotICAgIGlmIChwdHItPnByZV96ZXJvKSB7Ci0gICAgICBzaXplX3QgYnl0ZXNwZXJyb3cgPSAoc2l6ZV90KSBwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOwotICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLwotICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7Ci0gICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgewotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKLQl1bmRlZl9yb3crKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLwotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLSAgICB9Ci0gIH0KLSAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCi0gIGlmICh3cml0YWJsZSkKLSAgICBwdHItPmRpcnR5ID0gVFJVRTsKLSAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Ci19Ci0KLQotLyoKLSAqIFJlbGVhc2UgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIHBvb2wuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mcmVlX3Bvb2wgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOwotICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKLSAgc2l6ZV90IHNwYWNlX2ZyZWVkOwotCi0gIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCi0KLSNpZmRlZiBNRU1fU1RBVFMKLSAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID4gMSkKLSAgICBwcmludF9tZW1fc3RhdHMoY2luZm8sIHBvb2xfaWQpOyAvKiBwcmludCBwb29sJ3MgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MgKi8KLSNlbmRpZgotCi0gIC8qIElmIGZyZWVpbmcgSU1BR0UgcG9vbCwgY2xvc2UgYW55IHZpcnR1YWwgYXJyYXlzIGZpcnN0ICovCi0gIGlmIChwb29sX2lkID09IEpQT09MX0lNQUdFKSB7Ci0gICAganZpcnRfc2FycmF5X3B0ciBzcHRyOwotICAgIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKLQotICAgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgewotICAgICAgaWYgKHNwdHItPmJfc19vcGVuKSB7CS8qIHRoZXJlIG1heSBiZSBubyBiYWNraW5nIHN0b3JlICovCi0Jc3B0ci0+Yl9zX29wZW4gPSBGQUxTRTsJLyogcHJldmVudCByZWN1cnNpdmUgY2xvc2UgaWYgZXJyb3IgKi8KLQkoKnNwdHItPmJfc19pbmZvLmNsb3NlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBzcHRyLT5iX3NfaW5mbyk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IE5VTEw7Ci0gICAgZm9yIChicHRyID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyBicHRyICE9IE5VTEw7IGJwdHIgPSBicHRyLT5uZXh0KSB7Ci0gICAgICBpZiAoYnB0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KLQlicHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLwotCSgqYnB0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKLSAgfQotCi0gIC8qIFJlbGVhc2UgbGFyZ2Ugb2JqZWN0cyAqLwotICBsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKLSAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gTlVMTDsKLQotICB3aGlsZSAobGhkcl9wdHIgIT0gTlVMTCkgewotICAgIGxhcmdlX3Bvb2xfcHRyIG5leHRfbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQ7Ci0gICAgc3BhY2VfZnJlZWQgPSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKwotCQkgIGxoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCi0JCSAgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKLSAgICBqcGVnX2ZyZWVfbGFyZ2UoY2luZm8sICh2b2lkIEZBUiAqKSBsaGRyX3B0ciwgc3BhY2VfZnJlZWQpOwotICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkIC09IHNwYWNlX2ZyZWVkOwotICAgIGxoZHJfcHRyID0gbmV4dF9saGRyX3B0cjsKLSAgfQotCi0gIC8qIFJlbGVhc2Ugc21hbGwgb2JqZWN0cyAqLwotICBzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKLSAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gTlVMTDsKLQotICB3aGlsZSAoc2hkcl9wdHIgIT0gTlVMTCkgewotICAgIHNtYWxsX3Bvb2xfcHRyIG5leHRfc2hkcl9wdHIgPSBzaGRyX3B0ci0+aGRyLm5leHQ7Ci0gICAgc3BhY2VfZnJlZWQgPSBzaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKwotCQkgIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCi0JCSAgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsKLSAgICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIHNoZHJfcHRyLCBzcGFjZV9mcmVlZCk7Ci0gICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7Ci0gICAgc2hkcl9wdHIgPSBuZXh0X3NoZHJfcHRyOwotICB9Ci19Ci0KLQotLyoKLSAqIENsb3NlIHVwIHNob3AgZW50aXJlbHkuCi0gKiBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHVubGVzcyBjaW5mby0+bWVtIGlzIG5vbi1OVUxMLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2VsZl9kZXN0cnVjdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBpbnQgcG9vbDsKLQotICAvKiBDbG9zZSBhbGwgYmFja2luZyBzdG9yZSwgcmVsZWFzZSBhbGwgbWVtb3J5LgotICAgKiBSZWxlYXNpbmcgcG9vbHMgaW4gcmV2ZXJzZSBvcmRlciBtaWdodCBoZWxwIGF2b2lkIGZyYWdtZW50YXRpb24KLSAgICogd2l0aCBzb21lIChicmFpbi1kYW1hZ2VkKSBtYWxsb2MgbGlicmFyaWVzLgotICAgKi8KLSAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgIGZyZWVfcG9vbChjaW5mbywgcG9vbCk7Ci0gIH0KLQotICAvKiBSZWxlYXNlIHRoZSBtZW1vcnkgbWFuYWdlciBjb250cm9sIGJsb2NrIHRvby4gKi8KLSAganBlZ19mcmVlX3NtYWxsKGNpbmZvLCAodm9pZCAqKSBjaW5mby0+bWVtLCBTSVpFT0YobXlfbWVtb3J5X21ncikpOwotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGVuc3VyZXMgSSB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKi8KLQotICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJCS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLwotfQotCi0KLS8qCi0gKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbi4KLSAqIFdoZW4gdGhpcyBpcyBjYWxsZWQsIG9ubHkgdGhlIGVycm9yIG1hbmFnZXIgcG9pbnRlciBpcyB2YWxpZCBpbiBjaW5mbyEKLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21lbW9yeV9tZ3IgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgbXlfbWVtX3B0ciBtZW07Ci0gIGxvbmcgbWF4X3RvX3VzZTsKLSAgaW50IHBvb2w7Ci0gIHNpemVfdCB0ZXN0X21hYzsKLQotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGZvciBzYWZldHkgaWYgaW5pdCBmYWlscyAqLwotCi0gIC8qIENoZWNrIGZvciBjb25maWd1cmF0aW9uIGVycm9ycy4KLSAgICogU0laRU9GKEFMSUdOX1RZUEUpIHNob3VsZCBiZSBhIHBvd2VyIG9mIDI7IG90aGVyd2lzZSwgaXQgcHJvYmFibHkKLSAgICogZG9lc24ndCByZWZsZWN0IGFueSByZWFsIGhhcmR3YXJlIGFsaWdubWVudCByZXF1aXJlbWVudC4KLSAgICogVGhlIHRlc3QgaXMgYSBsaXR0bGUgdHJpY2t5OiBmb3IgWD4wLCBYIGFuZCBYLTEgaGF2ZSBubyBvbmUtYml0cwotICAgKiBpbiBjb21tb24gaWYgYW5kIG9ubHkgaWYgWCBpcyBhIHBvd2VyIG9mIDIsIGllIGhhcyBvbmx5IG9uZSBvbmUtYml0LgotICAgKiBTb21lIGNvbXBpbGVycyBtYXkgZ2l2ZSBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBoZXJlOyBpZ25vcmUgaXQuCi0gICAqLwotICBpZiAoKFNJWkVPRihBTElHTl9UWVBFKSAmIChTSVpFT0YoQUxJR05fVFlQRSktMSkpICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxJR05fVFlQRSk7Ci0gIC8qIE1BWF9BTExPQ19DSFVOSyBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZSBzaXplX3QsIGFuZCBtdXN0IGJlCi0gICAqIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpLgotICAgKiBBZ2FpbiwgYW4gInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmcgbWF5IGJlIGlnbm9yZWQgaGVyZS4KLSAgICogQnV0IGEgImNvbnN0YW50IHRvbyBsYXJnZSIgd2FybmluZyBtZWFucyB5b3UgbmVlZCB0byBmaXggTUFYX0FMTE9DX0NIVU5LLgotICAgKi8KLSAgdGVzdF9tYWMgPSAoc2l6ZV90KSBNQVhfQUxMT0NfQ0hVTks7Ci0gIGlmICgobG9uZykgdGVzdF9tYWMgIT0gTUFYX0FMTE9DX0NIVU5LIHx8Ci0gICAgICAoTUFYX0FMTE9DX0NIVU5LICUgU0laRU9GKEFMSUdOX1RZUEUpKSAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMTE9DX0NIVU5LKTsKLQotICBtYXhfdG9fdXNlID0ganBlZ19tZW1faW5pdChjaW5mbyk7IC8qIHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gKi8KLQotICAvKiBBdHRlbXB0IHRvIGFsbG9jYXRlIG1lbW9yeSBtYW5hZ2VyJ3MgY29udHJvbCBibG9jayAqLwotICBtZW0gPSAobXlfbWVtX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7Ci0KLSAgaWYgKG1lbSA9PSBOVUxMKSB7Ci0gICAganBlZ19tZW1fdGVybShjaW5mbyk7CS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIDApOwotICB9Ci0KLSAgLyogT0ssIGZpbGwgaW4gdGhlIG1ldGhvZCBwb2ludGVycyAqLwotICBtZW0tPnB1Yi5hbGxvY19zbWFsbCA9IGFsbG9jX3NtYWxsOwotICBtZW0tPnB1Yi5hbGxvY19sYXJnZSA9IGFsbG9jX2xhcmdlOwotICBtZW0tPnB1Yi5hbGxvY19zYXJyYXkgPSBhbGxvY19zYXJyYXk7Ci0gIG1lbS0+cHViLmFsbG9jX2JhcnJheSA9IGFsbG9jX2JhcnJheTsKLSAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X3NhcnJheSA9IHJlcXVlc3RfdmlydF9zYXJyYXk7Ci0gIG1lbS0+cHViLnJlcXVlc3RfdmlydF9iYXJyYXkgPSByZXF1ZXN0X3ZpcnRfYmFycmF5OwotICBtZW0tPnB1Yi5yZWFsaXplX3ZpcnRfYXJyYXlzID0gcmVhbGl6ZV92aXJ0X2FycmF5czsKLSAgbWVtLT5wdWIuYWNjZXNzX3ZpcnRfc2FycmF5ID0gYWNjZXNzX3ZpcnRfc2FycmF5OwotICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9iYXJyYXkgPSBhY2Nlc3NfdmlydF9iYXJyYXk7Ci0gIG1lbS0+cHViLmZyZWVfcG9vbCA9IGZyZWVfcG9vbDsKLSAgbWVtLT5wdWIuc2VsZl9kZXN0cnVjdCA9IHNlbGZfZGVzdHJ1Y3Q7Ci0KLSAgLyogTWFrZSBNQVhfQUxMT0NfQ0hVTksgYWNjZXNzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIG1lbS0+cHViLm1heF9hbGxvY19jaHVuayA9IE1BWF9BTExPQ19DSFVOSzsKLQotICAvKiBJbml0aWFsaXplIHdvcmtpbmcgc3RhdGUgKi8KLSAgbWVtLT5wdWIubWF4X21lbW9yeV90b191c2UgPSBtYXhfdG9fdXNlOwotCi0gIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPj0gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKLSAgICBtZW0tPnNtYWxsX2xpc3RbcG9vbF0gPSBOVUxMOwotICAgIG1lbS0+bGFyZ2VfbGlzdFtwb29sXSA9IE5VTEw7Ci0gIH0KLSAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKLSAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKLQotICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCA9IFNJWkVPRihteV9tZW1vcnlfbWdyKTsKLQotICAvKiBEZWNsYXJlIG91cnNlbHZlcyBvcGVuIGZvciBidXNpbmVzcyAqLwotICBjaW5mby0+bWVtID0gJiBtZW0tPnB1YjsKLQotICAvKiBDaGVjayBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgSlBFR01FTTsgaWYgZm91bmQsIG92ZXJyaWRlIHRoZQotICAgKiBkZWZhdWx0IG1heF9tZW1vcnkgc2V0dGluZyBmcm9tIGpwZWdfbWVtX2luaXQuICBOb3RlIHRoYXQgdGhlCi0gICAqIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBhZ2FpbiBvdmVycmlkZSB0aGlzIHZhbHVlLgotICAgKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgZ2V0ZW52KCksIGRlZmluZSBOT19HRVRFTlYgdG8gZGlzYWJsZQotICAgKiB0aGlzIGZlYXR1cmUuCi0gICAqLwotI2lmbmRlZiBOT19HRVRFTlYKLSAgeyBjaGFyICogbWVtZW52OwotCi0gICAgaWYgKChtZW1lbnYgPSBnZXRlbnYoIkpQRUdNRU0iKSkgIT0gTlVMTCkgewotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKHNzY2FuZihtZW1lbnYsICIlbGQlYyIsICZtYXhfdG9fdXNlLCAmY2gpID4gMCkgewotCWlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQotCSAgbWF4X3RvX3VzZSAqPSAxMDAwTDsKLQltZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2UgKiAxMDAwTDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSNlbmRpZgotCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbWVtbmFtZS5jIGIvbGlianBlZ3R3cnAvam1lbW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5NmRlZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBqbWVtbmFtZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tZGVwZW5kZW50Ci0gKiBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQKLSAqIHlvdSBtdXN0IGV4cGxpY2l0bHkgY29uc3RydWN0IGEgbmFtZSBmb3IgZWFjaCB0ZW1wIGZpbGUuCi0gKiBBbHNvLCB0aGUgcHJvYmxlbSBvZiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUKLSAqIGlzIHNob3ZlZCBvbnRvIHRoZSB1c2VyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KLWV4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKLWV4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCQkvKiBwcmUtQU5TSSBzeXN0ZW1zIG1heSBub3QgZGVmaW5lIHRoaXM7ICovCi0jZGVmaW5lIFNFRUtfU0VUICAwCQkvKiBpZiBub3QsIGFzc3VtZSAwIGlzIGNvcnJlY3QgKi8KLSNlbmRpZgotCi0jaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyIgotI2RlZmluZSBSV19CSU5BUlkJIncrIgotI2Vsc2UKLSNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKLSNkZWZpbmUgUldfQklOQVJZCSJ3K2IiLCAiY3R4PXN0bSIKLSNlbHNlCQkJCS8qIHN0YW5kYXJkIEFOU0ktY29tcGxpYW50IGNhc2UgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIgotI2RlZmluZSBSV19CSU5BUlkJIncrYiIKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFNlbGVjdGlvbiBvZiBhIGZpbGUgbmFtZSBmb3IgYSB0ZW1wb3JhcnkgZmlsZS4KLSAqIFRoaXMgaXMgc3lzdGVtLWRlcGVuZGVudCEKLSAqCi0gKiBUaGUgY29kZSBhcyBnaXZlbiBpcyBzdWl0YWJsZSBmb3IgbW9zdCBVbml4IHN5c3RlbXMsIGFuZCBpdCBpcyBlYXNpbHkKLSAqIG1vZGlmaWVkIGZvciBtb3N0IG5vbi1Vbml4IHN5c3RlbXMuICBTb21lIG5vdGVzOgotICogIDEuICBUaGUgdGVtcCBmaWxlIGlzIGNyZWF0ZWQgaW4gdGhlIGRpcmVjdG9yeSBuYW1lZCBieSBURU1QX0RJUkVDVE9SWS4KLSAqICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgL3Vzci90bXAsIHdoaWNoIGlzIHRoZSBjb252ZW50aW9uYWwgcGxhY2UgZm9yCi0gKiAgICAgIGNyZWF0aW5nIGxhcmdlIHRlbXAgZmlsZXMgb24gVW5peC4gIE9uIG90aGVyIHN5c3RlbXMgeW91J2xsIHByb2JhYmx5Ci0gKiAgICAgIHdhbnQgdG8gY2hhbmdlIHRoZSBmaWxlIGxvY2F0aW9uLiAgWW91IGNhbiBkbyB0aGlzIGJ5IGVkaXRpbmcgdGhlCi0gKiAgICAgICNkZWZpbmUsIG9yIChwcmVmZXJyZWQpIGJ5IGRlZmluaW5nIFRFTVBfRElSRUNUT1JZIGluIGpjb25maWcuaC4KLSAqCi0gKiAgMi4gIElmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgZmlsZSBuYW1lIGFzIHdlbGwgYXMgaXRzIGxvY2F0aW9uLAotICogICAgICB5b3UgY2FuIG92ZXJyaWRlIHRoZSBURU1QX0ZJTEVfTkFNRSBtYWNyby4gIChOb3RlIHRoYXQgdGhpcyBpcwotICogICAgICBhY3R1YWxseSBhIHByaW50ZiBmb3JtYXQgc3RyaW5nOyBpdCBtdXN0IGNvbnRhaW4gJXMgYW5kICVkLikKLSAqICAgICAgRmV3IHBlb3BsZSBzaG91bGQgbmVlZCB0byBkbyB0aGlzLgotICoKLSAqICAzLiAgbWt0ZW1wKCkgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBtdWx0aXBsZSBwcm9jZXNzZXMgcnVubmluZwotICogICAgICBzaW11bHRhbmVvdXNseSB3b24ndCBzZWxlY3QgdGhlIHNhbWUgZmlsZSBuYW1lcy4gIElmIHlvdXIgc3lzdGVtCi0gKiAgICAgIGRvZXNuJ3QgaGF2ZSBta3RlbXAoKSwgZGVmaW5lIE5PX01LVEVNUCB0byBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gKiAgICAgIChJZiB5b3UgZG9uJ3QgaGF2ZSA8ZXJybm8uaD4sIGFsc28gZGVmaW5lIE5PX0VSUk5PX0guKQotICoKLSAqICA0LiAgWW91IHByb2JhYmx5IHdhbnQgdG8gZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIgc28gdGhhdCBjanBlZy5jL2RqcGVnLmMKLSAqICAgICAgd2lsbCBjYXVzZSB0aGUgdGVtcCBmaWxlcyB0byBiZSByZW1vdmVkIGlmIHlvdSBzdG9wIHRoZSBwcm9ncmFtIGVhcmx5LgotICovCi0KLSNpZm5kZWYgVEVNUF9ESVJFQ1RPUlkJCS8qIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCBvciBNYWtlZmlsZSAqLwotI2RlZmluZSBURU1QX0RJUkVDVE9SWSAgIi91c3IvdG1wLyIgLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgVW5peCAqLwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbmV4dF9maWxlX251bTsJLyogdG8gZGlzdGluZ3Vpc2ggYW1vbmcgc2V2ZXJhbCB0ZW1wIGZpbGVzICovCi0KLSNpZmRlZiBOT19NS1RFTVAKLQotI2lmbmRlZiBURU1QX0ZJTEVfTkFNRQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCi0jZGVmaW5lIFRFTVBfRklMRV9OQU1FICAiJXNKUEclMDNkLlRNUCIKLSNlbmRpZgotCi0jaWZuZGVmIE5PX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgkJLyogdG8gZGVmaW5lIEVOT0VOVCAqLwotI2VuZGlmCi0KLS8qIEFOU0kgQyBzcGVjaWZpZXMgdGhhdCBlcnJubyBpcyBhIG1hY3JvLCBidXQgb24gb2xkZXIgc3lzdGVtcyBpdCdzIG1vcmUKLSAqIGxpa2VseSB0byBiZSBhIHBsYWluIGludCB2YXJpYWJsZS4gIEFuZCBub3QgYWxsIHZlcnNpb25zIG9mIGVycm5vLmgKLSAqIGJvdGhlciB0byBkZWNsYXJlIGl0LCBzbyB3ZSBoYXZlIHRvIGluIG9yZGVyIHRvIGJlIG1vc3QgcG9ydGFibGUuICBUaHVzOgotICovCi0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLQotTE9DQUwodm9pZCkKLXNlbGVjdF9maWxlX25hbWUgKGNoYXIgKiBmbmFtZSkKLXsKLSAgRklMRSAqIHRmaWxlOwotCi0gIC8qIEtlZXAgZ2VuZXJhdGluZyBmaWxlIG5hbWVzIHRpbGwgd2UgZmluZCBvbmUgdGhhdCdzIG5vdCBpbiB1c2UgKi8KLSAgZm9yICg7OykgewotICAgIG5leHRfZmlsZV9udW0rKzsJCS8qIGFkdmFuY2UgY291bnRlciAqLwotICAgIHNwcmludGYoZm5hbWUsIFRFTVBfRklMRV9OQU1FLCBURU1QX0RJUkVDVE9SWSwgbmV4dF9maWxlX251bSk7Ci0gICAgaWYgKCh0ZmlsZSA9IGZvcGVuKGZuYW1lLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIC8qIGZvcGVuIGNvdWxkIGhhdmUgZmFpbGVkIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIHRoZSBmaWxlIG5vdAotICAgICAgICogYmVpbmcgdGhlcmU7IGZvciBleGFtcGxlLCBmaWxlIHRoZXJlIGJ1dCB1bnJlYWRhYmxlLgotICAgICAgICogSWYgPGVycm5vLmg+IGlzbid0IGF2YWlsYWJsZSwgdGhlbiB3ZSBjYW5ub3QgdGVzdCB0aGUgY2F1c2UuCi0gICAgICAgKi8KLSNpZmRlZiBFTk9FTlQKLSAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JY29udGludWU7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBmY2xvc2UodGZpbGUpOwkJLyogb29wcywgaXQncyB0aGVyZTsgY2xvc2UgdGZpbGUgJiB0cnkgYWdhaW4gKi8KLSAgfQotfQotCi0jZWxzZSAvKiAhIE5PX01LVEVNUCAqLwotCi0vKiBOb3RlIHRoYXQgbWt0ZW1wKCkgcmVxdWlyZXMgdGhlIGluaXRpYWwgZmlsZW5hbWUgdG8gZW5kIGluIHNpeCBYJ3MgKi8KLSNpZm5kZWYgVEVNUF9GSUxFX05BTUUJCS8qIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCBvciBNYWtlZmlsZSAqLwotI2RlZmluZSBURU1QX0ZJTEVfTkFNRSAgIiVzSlBHJWRYWFhYWFgiCi0jZW5kaWYKLQotTE9DQUwodm9pZCkKLXNlbGVjdF9maWxlX25hbWUgKGNoYXIgKiBmbmFtZSkKLXsKLSAgbmV4dF9maWxlX251bSsrOwkJLyogYWR2YW5jZSBjb3VudGVyICovCi0gIHNwcmludGYoZm5hbWUsIFRFTVBfRklMRV9OQU1FLCBURU1QX0RJUkVDVE9SWSwgbmV4dF9maWxlX251bSk7Ci0gIG1rdGVtcChmbmFtZSk7CQkvKiBtYWtlIHN1cmUgZmlsZSBuYW1lIGlzIHVuaXF1ZSAqLwotICAvKiBta3RlbXAgcmVwbGFjZXMgdGhlIHRyYWlsaW5nIFhYWFhYWCB3aXRoIGEgdW5pcXVlIHN0cmluZyBvZiBjaGFyYWN0ZXJzICovCi19Ci0KLSNlbmRpZiAvKiBOT19NS1RFTVAgKi8KLQotCi0vKgotICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQotICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KLSAqLwotCi1HTE9CQUwodm9pZCAqKQotanBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCi0gKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAotICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKLSAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAqIEl0J3MgaW1wb3NzaWJsZSB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5OyBvdXIgY3VycmVudCBzb2x1dGlvbiBpcwotICogdG8gbWFrZSB0aGUgdXNlciB0ZWxsIHVzICh3aXRoIGEgZGVmYXVsdCB2YWx1ZSBzZXQgYXQgY29tcGlsZSB0aW1lKS4KLSAqIElmIHlvdSBjYW4gYWN0dWFsbHkgZ2V0IHRoZSBhdmFpbGFibGUgc3BhY2UsIGl0J3MgYSBnb29kIGlkZWEgdG8gc3VidHJhY3QKLSAqIGEgc2xvcCBmYWN0b3Igb2YgNSUgb3Igc28uCi0gKi8KLQotI2lmbmRlZiBERUZBVUxUX01BWF9NRU0JCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIG1ha2VmaWxlICovCi0jZGVmaW5lIERFRkFVTFRfTUFYX01FTQkJMTAwMDAwMEwgLyogZGVmYXVsdDogb25lIG1lZ2FieXRlICovCi0jZW5kaWYKLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQotewotICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQotICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgotICovCi0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCi17Ci0gIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKLSAgaWYgKEpGUkVBRChpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQotICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQotewotICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7Ci0gIGlmIChKRldSSVRFKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCi0gICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotY2xvc2VfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQotewotICBmY2xvc2UoaW5mby0+dGVtcF9maWxlKTsJLyogY2xvc2UgdGhlIGZpbGUgKi8KLSAgdW5saW5rKGluZm8tPnRlbXBfbmFtZSk7CS8qIGRlbGV0ZSB0aGUgZmlsZSAqLwotLyogSWYgeW91ciBzeXN0ZW0gZG9lc24ndCBoYXZlIHVubGluaygpLCB1c2UgcmVtb3ZlKCkgaW5zdGVhZC4KLSAqIHJlbW92ZSgpIGlzIHRoZSBBTlNJLXN0YW5kYXJkIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24sIGJ1dCBpZgotICogeW91ciBzeXN0ZW0gd2FzIEFOU0kgeW91J2QgYmUgdXNpbmcgam1lbWFuc2kuYywgcmlnaHQ/Ci0gKi8KLSAgVFJBQ0VNU1MoY2luZm8sIDEsIEpUUkNfVEZJTEVfQ0xPU0UsIGluZm8tPnRlbXBfbmFtZSk7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKLXsKLSAgc2VsZWN0X2ZpbGVfbmFtZShpbmZvLT50ZW1wX25hbWUpOwotICBpZiAoKGluZm8tPnRlbXBfZmlsZSA9IGZvcGVuKGluZm8tPnRlbXBfbmFtZSwgUldfQklOQVJZKSkgPT0gTlVMTCkKLSAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7Ci0gIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKLSAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7Ci0gIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOwotICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBuZXh0X2ZpbGVfbnVtID0gMDsJCS8qIGluaXRpYWxpemUgdGVtcCBmaWxlIG5hbWUgZ2VuZXJhdG9yICovCi0gIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbWVtbm9icy5jIGIvbGlianBlZ3R3cnAvam1lbW5vYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4YzMzNy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbWVtbm9icy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBqbWVtbm9icy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSByZWFsbHkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tCi0gKiBkZXBlbmRlbnQgcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24KLSAqIGFzc3VtZXMgdGhhdCBubyBiYWNraW5nLXN0b3JlIGZpbGVzIGFyZSBuZWVkZWQ6IGFsbCByZXF1aXJlZCBzcGFjZQotICogY2FuIGJlIG9idGFpbmVkIGZyb20gbWFsbG9jKCkuCi0gKiBUaGlzIGlzIHZlcnkgcG9ydGFibGUgaW4gdGhlIHNlbnNlIHRoYXQgaXQnbGwgY29tcGlsZSBvbiBhbG1vc3QgYW55dGhpbmcsCi0gKiBidXQgeW91J2QgYmV0dGVyIGhhdmUgbG90cyBvZiBtYWluIG1lbW9yeSAob3IgdmlydHVhbCBtZW1vcnkpIGlmIHlvdSB3YW50Ci0gKiB0byBwcm9jZXNzIGJpZyBpbWFnZXMuCi0gKiBOb3RlIHRoYXQgdGhlIG1heF9tZW1vcnlfdG9fdXNlIG9wdGlvbiBpcyBpZ25vcmVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLwotZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOwotI2VuZGlmCi0KLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgotICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKLSAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCi0gKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCi0gKi8KLQotR0xPQkFMKHZvaWQgRkFSICopCi1qcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLSAgZnJlZShvYmplY3QpOwotfQotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBIZXJlIHdlIGFsd2F5cyBzYXksICJ3ZSBnb3QgYWxsIHlvdSB3YW50IGJ1ZCEiCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQotewotICByZXR1cm4gbWF4X2J5dGVzX25lZWRlZDsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBTaW5jZSBqcGVnX21lbV9hdmFpbGFibGUgYWx3YXlzIHByb21pc2VkIHRoZSBtb29uLAotICogdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFuZCB3ZSBjYW4ganVzdCBlcnJvciBvdXQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0JBQ0tJTkdfU1RPUkUpOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLiAgSGVyZSwgdGhlcmUgaXNuJ3QgYW55LgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICByZXR1cm4gMDsJCQkvKiBqdXN0IHNldCBtYXhfbWVtb3J5X3RvX3VzZSB0byAwICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbWVtc3lzLmggYi9saWJqcGVndHdycC9qbWVtc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDFjNjMuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvam1lbXN5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBqbWVtc3lzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgaW5jbHVkZSBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQKLSAqIGFuZCBzeXN0ZW0tZGVwZW5kZW50IHBvcnRpb25zIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgTm8gb3RoZXIKLSAqIG1vZHVsZXMgbmVlZCBpbmNsdWRlIGl0LiAgKFRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgcG9ydGlvbiBpcyBqbWVtbWdyLmM7Ci0gKiB0aGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbi4pCi0gKgotICogVGhpcyBmaWxlIHdvcmtzIGFzLWlzIGZvciB0aGUgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlcnMgc3VwcGxpZWQKLSAqIGluIHRoZSBJSkcgZGlzdHJpYnV0aW9uLiAgWW91IG1heSBuZWVkIHRvIG1vZGlmeSBpdCBpZiB5b3Ugd3JpdGUgYQotICogY3VzdG9tIG1lbW9yeSBtYW5hZ2VyLiAgSWYgc3lzdGVtLWRlcGVuZGVudCBjaGFuZ2VzIGFyZSBuZWVkZWQgaW4KLSAqIHRoaXMgZmlsZSwgdGhlIGJlc3QgbWV0aG9kIGlzIHRvICNpZmRlZiB0aGVtIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbgotICogc3ltYm9sIHN1cHBsaWVkIGluIGpjb25maWcuaCwgYXMgd2UgaGF2ZSBkb25lIHdpdGggVVNFX01TRE9TX01FTU1HUgotICogYW5kIFVTRV9NQUNfTUVNTUdSLgotICovCi0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfZ2V0X3NtYWxsCQlqR2V0U21hbGwKLSNkZWZpbmUganBlZ19mcmVlX3NtYWxsCQlqRnJlZVNtYWxsCi0jZGVmaW5lIGpwZWdfZ2V0X2xhcmdlCQlqR2V0TGFyZ2UKLSNkZWZpbmUganBlZ19mcmVlX2xhcmdlCQlqRnJlZUxhcmdlCi0jZGVmaW5lIGpwZWdfbWVtX2F2YWlsYWJsZQlqTWVtQXZhaWwKLSNkZWZpbmUganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUJak9wZW5CYWNrU3RvcmUKLSNkZWZpbmUganBlZ19tZW1faW5pdAkJak1lbUluaXQKLSNkZWZpbmUganBlZ19tZW1fdGVybQkJak1lbVRlcm0KLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyoKLSAqIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYWxsb2NhdGUgYW5kIHJlbGVhc2Ugc21hbGwgY2h1bmtzIG9mCi0gKiBtZW1vcnkuICAoVHlwaWNhbGx5IHRoZSB0b3RhbCBhbW91bnQgcmVxdWVzdGVkIHRocm91Z2gganBlZ19nZXRfc21hbGwgaXMKLSAqIG5vIG1vcmUgdGhhbiAyMEsgb3Igc287IHRoaXMgd2lsbCBiZSByZXF1ZXN0ZWQgaW4gY2h1bmtzIG9mIGEgZmV3IEsgZWFjaC4pCi0gKiBCZWhhdmlvciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBtYWxsb2MKLSAqIGFuZCBmcmVlOyBpbiBwYXJ0aWN1bGFyLCBqcGVnX2dldF9zbWFsbCBtdXN0IHJldHVybiBOVUxMIG9uIGZhaWx1cmUuCi0gKiBPbiBtb3N0IHN5c3RlbXMsIHRoZXNlIEFSRSBtYWxsb2MgYW5kIGZyZWUuICBqcGVnX2ZyZWVfc21hbGwgaXMgcGFzc2VkIHRoZQotICogc2l6ZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGZyZWVkLCBqdXN0IGluIGNhc2UgaXQncyBuZWVkZWQuCi0gKiBPbiBhbiA4MHg4NiBtYWNoaW5lIHVzaW5nIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsLCB0aGVzZSBtYW5hZ2UgbmVhciBoZWFwLgotICovCi0KLUVYVEVSTih2b2lkICopIGpwZWdfZ2V0X3NtYWxsIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci1FWFRFUk4odm9pZCkganBlZ19mcmVlX3NtYWxsIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LAotCQkJCSAgc2l6ZV90IHNpemVvZm9iamVjdCkpOwotCi0vKgotICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBsYXJnZSBjaHVua3Mgb2YKLSAqIG1lbW9yeSAodXAgdG8gdGhlIHRvdGFsIGZyZWUgc3BhY2UgZGVzaWduYXRlZCBieSBqcGVnX21lbV9hdmFpbGFibGUpLgotICogVGhlIGludGVyZmFjZSBpcyB0aGUgc2FtZSBhcyBhYm92ZSwgZXhjZXB0IHRoYXQgb24gYW4gODB4ODYgbWFjaGluZSwKLSAqIGZhciBwb2ludGVycyBhcmUgdXNlZC4gIE9uIG1vc3Qgb3RoZXIgbWFjaGluZXMgdGhlc2UgYXJlIGlkZW50aWNhbCB0bwotICogdGhlIGpwZWdfZ2V0L2ZyZWVfc21hbGwgcm91dGluZXM7IGJ1dCB3ZSBrZWVwIHRoZW0gc2VwYXJhdGUgYW55d2F5LAotICogaW4gY2FzZSBhIGRpZmZlcmVudCBhbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIGRlc2lyYWJsZSBmb3IgbGFyZ2UgY2h1bmtzLgotICovCi0KLUVYVEVSTih2b2lkIEZBUiAqKSBqcGVnX2dldF9sYXJnZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkgICAgICAgc2l6ZV90IHNpemVvZm9iamVjdCkpOwotRVhURVJOKHZvaWQpIGpwZWdfZnJlZV9sYXJnZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsCi0JCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci0KLS8qCi0gKiBUaGUgbWFjcm8gTUFYX0FMTE9DX0NIVU5LIGRlc2lnbmF0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5Ci0gKiBiZSByZXF1ZXN0ZWQgaW4gYSBzaW5nbGUgY2FsbCB0byBqcGVnX2dldF9sYXJnZSAoYW5kIGpwZWdfZ2V0X3NtYWxsIGZvciB0aGF0Ci0gKiBtYXR0ZXIsIGJ1dCB0aGF0IGNhc2Ugc2hvdWxkIG5ldmVyIGNvbWUgaW50byBwbGF5KS4gIFRoaXMgbWFjcm8gaXMgbmVlZGVkCi0gKiB0byBtb2RlbCB0aGUgNjRLYi1zZWdtZW50LXNpemUgbGltaXQgb2YgZmFyIGFkZHJlc3Npbmcgb24gODB4ODYgbWFjaGluZXMuCi0gKiBPbiB0aG9zZSBtYWNoaW5lcywgd2UgZXhwZWN0IHRoYXQgamNvbmZpZy5oIHdpbGwgcHJvdmlkZSBhIHByb3BlciB2YWx1ZS4KLSAqIE9uIG1hY2hpbmVzIHdpdGggMzItYml0IGZsYXQgYWRkcmVzcyBzcGFjZXMsIGFueSBsYXJnZSBjb25zdGFudCBtYXkgYmUgdXNlZC4KLSAqCi0gKiBOQjogam1lbW1nci5jIGV4cGVjdHMgdGhhdCBNQVhfQUxMT0NfQ0hVTksgd2lsbCBiZSByZXByZXNlbnRhYmxlIGFzIHR5cGUKLSAqIHNpemVfdCBhbmQgd2lsbCBiZSBhIG11bHRpcGxlIG9mIHNpemVvZihhbGlnbl90eXBlKS4KLSAqLwotCi0jaWZuZGVmIE1BWF9BTExPQ19DSFVOSwkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCi0jZGVmaW5lIE1BWF9BTExPQ19DSFVOSyAgMTAwMDAwMDAwMEwKLSNlbmRpZgotCi0vKgotICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBzcGFjZSBzdGlsbCBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gYnkKLSAqIGpwZWdfZ2V0X2xhcmdlLiAgSWYgbW9yZSBzcGFjZSB0aGFuIHRoaXMgaXMgbmVlZGVkLCBiYWNraW5nIHN0b3JlIHdpbGwgYmUKLSAqIHVzZWQuICBOT1RFOiBhbnkgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkIG11c3Qgbm90IGJlIGNvdW50ZWQuCi0gKgotICogVGhlcmUgaXMgYSBtaW5pbXVtIHNwYWNlIHJlcXVpcmVtZW50LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaW5pbXVtCi0gKiBmZWFzaWJsZSBidWZmZXIgc2l6ZXM7IGptZW1tZ3IuYyB3aWxsIHJlcXVlc3QgdGhhdCBtdWNoIHNwYWNlIGV2ZW4gaWYKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSByZXR1cm5zIHplcm8uICBUaGUgbWF4aW11bSBzcGFjZSBuZWVkZWQsIGVub3VnaCB0byBob2xkCi0gKiBhbGwgd29ya2luZyBzdG9yYWdlIGluIG1lbW9yeSwgaXMgYWxzbyBwYXNzZWQgaW4gY2FzZSBpdCBpcyB1c2VmdWwuCi0gKiBGaW5hbGx5LCB0aGUgdG90YWwgc3BhY2UgYWxyZWFkeSBhbGxvY2F0ZWQgaXMgcGFzc2VkLiAgSWYgbm8gYmV0dGVyCi0gKiBtZXRob2QgaXMgYXZhaWxhYmxlLCBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkCi0gKiBpcyBvZnRlbiBhIHN1aXRhYmxlIGNhbGN1bGF0aW9uLgotICoKLSAqIEl0IGlzIE9LIGZvciBqcGVnX21lbV9hdmFpbGFibGUgdG8gdW5kZXJlc3RpbWF0ZSB0aGUgc3BhY2UgYXZhaWxhYmxlCi0gKiAodGhhdCdsbCBqdXN0IGxlYWQgdG8gbW9yZSBiYWNraW5nLXN0b3JlIGFjY2VzcyB0aGFuIGlzIHJlYWxseSBuZWNlc3NhcnkpLgotICogSG93ZXZlciwgYW4gb3ZlcmVzdGltYXRlIHdpbGwgbGVhZCB0byBmYWlsdXJlLiAgSGVuY2UgaXQncyB3aXNlIHRvIHN1YnRyYWN0Ci0gKiBhIHNsb3AgZmFjdG9yIGZyb20gdGhlIHRydWUgYXZhaWxhYmxlIHNwYWNlLiAgNSUgc2hvdWxkIGJlIGVub3VnaC4KLSAqCi0gKiBPbiBtYWNoaW5lcyB3aXRoIGxvdHMgb2YgdmlydHVhbCBtZW1vcnksIGFueSBsYXJnZSBjb25zdGFudCBtYXkgYmUgcmV0dXJuZWQuCi0gKiBDb252ZXJzZWx5LCB6ZXJvIG1heSBiZSByZXR1cm5lZCB0byBhbHdheXMgdXNlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkuCi0gKi8KLQotRVhURVJOKGxvbmcpIGpwZWdfbWVtX2F2YWlsYWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkgICAgIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKLQkJCQkgICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwKLQkJCQkgICAgIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpKTsKLQotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgd2hhdGV2ZXIgc3RhdGUgaXMgbmVlZGVkIHRvIGFjY2VzcyBhIHNpbmdsZQotICogYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGUgcmVhZC93cml0ZS9jbG9zZSBtZXRob2QgcG9pbnRlcnMgYXJlIGNhbGxlZAotICogYnkgam1lbW1nci5jIHRvIG1hbmlwdWxhdGUgdGhlIGJhY2tpbmctc3RvcmUgb2JqZWN0OyBhbGwgb3RoZXIgZmllbGRzCi0gKiBhcmUgcHJpdmF0ZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBiYWNraW5nIHN0b3JlIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgVEVNUF9OQU1FX0xFTkdUSCAgIDY0CS8qIG1heCBsZW5ndGggb2YgYSB0ZW1wb3JhcnkgZmlsZSdzIG5hbWUgKi8KLQotCi0jaWZkZWYgVVNFX01TRE9TX01FTU1HUgkJLyogRE9TLXNwZWNpZmljIGp1bmsgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBYTVNIOwkvKiB0eXBlIG9mIGV4dGVuZGVkLW1lbW9yeSBoYW5kbGVzICovCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IEVNU0g7CS8qIHR5cGUgb2YgZXhwYW5kZWQtbWVtb3J5IGhhbmRsZXMgKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHNob3J0IGZpbGVfaGFuZGxlOwkJLyogRE9TIGZpbGUgaGFuZGxlIGlmIGl0J3MgYSB0ZW1wIGZpbGUgKi8KLSAgWE1TSCB4bXNfaGFuZGxlOwkJLyogaGFuZGxlIGlmIGl0J3MgYSBjaHVuayBvZiBYTVMgKi8KLSAgRU1TSCBlbXNfaGFuZGxlOwkJLyogaGFuZGxlIGlmIGl0J3MgYSBjaHVuayBvZiBFTVMgKi8KLX0gaGFuZGxlX3VuaW9uOwotCi0jZW5kaWYgLyogVVNFX01TRE9TX01FTU1HUiAqLwotCi0jaWZkZWYgVVNFX01BQ19NRU1NR1IJCS8qIE1hYy1zcGVjaWZpYyBqdW5rICovCi0jaW5jbHVkZSA8RmlsZXMuaD4KLSNlbmRpZiAvKiBVU0VfTUFDX01FTU1HUiAqLwotCi0KLXR5cGVkZWYgc3RydWN0IGJhY2tpbmdfc3RvcmVfc3RydWN0ICogYmFja2luZ19zdG9yZV9wdHI7Ci0KLXR5cGVkZWYgc3RydWN0IGJhY2tpbmdfc3RvcmVfc3RydWN0IHsKLSAgLyogTWV0aG9kcyBmb3IgcmVhZGluZy93cml0aW5nL2Nsb3NpbmcgdGhpcyBiYWNraW5nLXN0b3JlIG9iamVjdCAqLwotICBKTUVUSE9EKHZvaWQsIHJlYWRfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkgICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJCSAgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCi0JCQkJICAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KSk7Ci0gIEpNRVRIT0Qodm9pZCwgY2xvc2VfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkgICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKSk7Ci0KLSAgLyogUHJpdmF0ZSBmaWVsZHMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgYmFja2luZy1zdG9yZSBtYW5hZ2VtZW50ICovCi0jaWZkZWYgVVNFX01TRE9TX01FTU1HUgotICAvKiBGb3IgdGhlIE1TLURPUyBtYW5hZ2VyIChqbWVtZG9zLmMpLCB3ZSBuZWVkOiAqLwotICBoYW5kbGVfdW5pb24gaGFuZGxlOwkJLyogcmVmZXJlbmNlIHRvIGJhY2tpbmctc3RvcmUgc3RvcmFnZSBvYmplY3QgKi8KLSAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgaWYgaXQncyBhIGZpbGUgKi8KLSNlbHNlCi0jaWZkZWYgVVNFX01BQ19NRU1NR1IKLSAgLyogRm9yIHRoZSBNYWMgbWFuYWdlciAoam1lbW1hYy5jKSwgd2UgbmVlZDogKi8KLSAgc2hvcnQgdGVtcF9maWxlOwkJLyogZmlsZSByZWZlcmVuY2UgbnVtYmVyIHRvIHRlbXAgZmlsZSAqLwotICBGU1NwZWMgdGVtcFNwZWM7CQkvKiB0aGUgRlNTcGVjIGZvciB0aGUgdGVtcCBmaWxlICovCi0gIGNoYXIgdGVtcF9uYW1lW1RFTVBfTkFNRV9MRU5HVEhdOyAvKiBuYW1lIGlmIGl0J3MgYSBmaWxlICovCi0jZWxzZQotI2lmZGVmIFVTRV9BTkRST0lEX0FTSE1FTQotICBzaG9ydCB0ZW1wX2ZpbGU7CQkvKiBmaWxlIHJlZmVyZW5jZSBudW1iZXIgdG8gdGVtcCBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIqIGFkZHI7ICAvKiB0aGUgbWVtb3J5IGFkZHJlc3MgbWFwcGVkIHRvIGFzaG1lbSAqLwotICBsb25nIHNpemU7ICAgICAgICAgICAgLyogdGhlIHJlcXVlc3RlZCBhc2htZW0gc2l6ZSAqLwotI2Vsc2UKLSAgLyogRm9yIGEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHRlbXAgZmlsZXMsIHdlIG5lZWQ6ICovCi0gIEZJTEUgKiB0ZW1wX2ZpbGU7CQkvKiBzdGRpbyByZWZlcmVuY2UgdG8gdGVtcCBmaWxlICovCi0gIGNoYXIgdGVtcF9uYW1lW1RFTVBfTkFNRV9MRU5HVEhdOyAvKiBuYW1lIG9mIHRlbXAgZmlsZSAqLwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotfSBiYWNraW5nX3N0b3JlX2luZm87Ci0KLQotLyoKLSAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LiAgVGhpcyBtdXN0IGZpbGwgaW4gdGhlCi0gKiByZWFkL3dyaXRlL2Nsb3NlIHBvaW50ZXJzIGluIHRoZSBvYmplY3QuICBUaGUgcmVhZC93cml0ZSByb3V0aW5lcwotICogbWF5IHRha2UgYW4gZXJyb3IgZXhpdCBpZiB0aGUgc3BlY2lmaWVkIG1heGltdW0gZmlsZSBzaXplIGlzIGV4Y2VlZGVkLgotICogKElmIGpwZWdfbWVtX2F2YWlsYWJsZSBhbHdheXMgcmV0dXJucyBhIGxhcmdlIHZhbHVlLCB0aGlzIHJvdXRpbmUgY2FuCi0gKiBqdXN0IHRha2UgYW4gZXJyb3IgZXhpdC4pCi0gKi8KLQotRVhURVJOKHZvaWQpIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkJCSAgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpKTsKLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAotICogY2xlYW51cCByZXF1aXJlZC4gIGpwZWdfbWVtX2luaXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGlzCi0gKiBhbGxvY2F0ZWQgKGFuZCwgdGhlcmVmb3JlLCBub3RoaW5nIGluIGNpbmZvIGlzIG9mIHVzZSBleGNlcHQgdGhlIGVycm9yCi0gKiBtYW5hZ2VyIHBvaW50ZXIpLiAgSXQgc2hvdWxkIHJldHVybiBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgZm9yCi0gKiBtYXhfbWVtb3J5X3RvX3VzZTsgdGhpcyBtYXkgc3Vic2VxdWVudGx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIHN1cnJvdW5kaW5nCi0gKiBhcHBsaWNhdGlvbi4gIChOb3RlIHRoYXQgbWF4X21lbW9yeV90b191c2UgaXMgb25seSBpbXBvcnRhbnQgaWYKLSAqIGpwZWdfbWVtX2F2YWlsYWJsZSBjaG9vc2VzIHRvIGNvbnN1bHQgaXQgLi4uIG5vIG9uZSBlbHNlIHdpbGwuKQotICoganBlZ19tZW1fdGVybSBtYXkgYXNzdW1lIHRoYXQgYWxsIHJlcXVlc3RlZCBtZW1vcnkgaGFzIGJlZW4gZnJlZWQgYW5kIHRoYXQKLSAqIGFsbCBvcGVuZWQgYmFja2luZy1zdG9yZSBvYmplY3RzIGhhdmUgYmVlbiBjbG9zZWQuCi0gKi8KLQotRVhURVJOKGxvbmcpIGpwZWdfbWVtX2luaXQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX21lbV90ZXJtIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qbW9yZWNmZy5oIGIvbGlianBlZ3R3cnAvam1vcmVjZmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2YmJjYi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qbW9yZWNmZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qCi0gKiBqbW9yZWNmZy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBjdXN0b21pemUgdGhlCi0gKiBKUEVHIHNvZnR3YXJlIGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucyBvciBzdXBwb3J0IG1hY2hpbmUtZGVwZW5kZW50Ci0gKiBvcHRpbWl6YXRpb25zLiAgTW9zdCB1c2VycyB3aWxsIG5vdCBuZWVkIHRvIHRvdWNoIHRoaXMgZmlsZS4KLSAqLwotCi0vKgotICogRGVmaW5lIEFORFJPSURfUkdCIHRvIGVuYWJsZSBzcGVjaWZpYyBvcHRpbWl6YXRpb25zIGZvciBBbmRyb2lkCi0gKiAgIEpDU19SR0JBXzg4ODggc3VwcG9ydAotICogICBKQ1NfUkdCXzU2NSBzdXBwb3J0Ci0gKiAKLSAqLwotCi0jZGVmaW5lIEFORFJPSURfUkdCCi0KLSNpZmRlZiBBTkRST0lEX1JHQgotI2RlZmluZSBQQUNLX1NIT1JUXzU2NShyLGcsYikgICgoKChyKTw8OCkmMHhmODAwKXwoKChnKTw8MykmMHg3RTApfCgoYik+PjMpKQotI2RlZmluZSBQQUNLX1RXT19QSVhFTFMobCxyKSAgICgocjw8MTYpIHwgbCkKLSNkZWZpbmUgUEFDS19ORUVEX0FMSUdOTUVOVChwdHIpICgoKGludCkocHRyKSkmMykKLSNkZWZpbmUgV1JJVEVfVFdPX1BJWEVMUyhhZGRyLCBwaXhlbHMpIGRvIHsgICAgIFwKLSAgICAgICAgICgoSU5UMTYqKShhZGRyKSlbMF0gPSAocGl4ZWxzKTsgICAgICAgIFwKLSAgICAgICAgICgoSU5UMTYqKShhZGRyKSlbMV0gPSAocGl4ZWxzKT4+MTY7ICAgIFwKLSAgICB9IHdoaWxlKDApCi0jZGVmaW5lIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhhZGRyLCBwaXhlbHMpICAoKCooSU5UMzIqKShhZGRyKSkgPSBwaXhlbHMpCi0jZGVmaW5lIERJVEhFUl81NjVfUihyLCBkaXRoZXIpICgocikgKyAoKGRpdGhlcikmMHhGRikpCi0jZGVmaW5lIERJVEhFUl81NjVfRyhnLCBkaXRoZXIpICgoZykgKyAoKChkaXRoZXIpJjB4RkYpPj4xKSkKLSNkZWZpbmUgRElUSEVSXzU2NV9CKGIsIGRpdGhlcikgKChiKSArICgoZGl0aGVyKSYweEZGKSkKLSNlbmRpZgotCi0vKgotICogRGVmaW5lIEJJVFNfSU5fSlNBTVBMRSBhcyBlaXRoZXIKLSAqICAgOCAgIGZvciA4LWJpdCBzYW1wbGUgdmFsdWVzICh0aGUgdXN1YWwgc2V0dGluZykKLSAqICAgMTIgIGZvciAxMi1iaXQgc2FtcGxlIHZhbHVlcwotICogT25seSA4IGFuZCAxMiBhcmUgbGVnYWwgZGF0YSBwcmVjaXNpb25zIGZvciBsb3NzeSBKUEVHIGFjY29yZGluZyB0byB0aGUKLSAqIEpQRUcgc3RhbmRhcmQsIGFuZCB0aGUgSUpHIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyBlbHNlIQotICogV2UgZG8gbm90IHN1cHBvcnQgcnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRhdGEgcHJlY2lzaW9uLCBzb3JyeS4KLSAqLwotCi0jZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSAgOAkvKiB1c2UgOCBvciAxMiAqLwotCi0KLS8qCi0gKiBNYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgYWxsb3dlZCBpbiBKUEVHIGltYWdlLgotICogVG8gbWVldCB0aGUgbGV0dGVyIG9mIHRoZSBKUEVHIHNwZWMsIHNldCB0aGlzIHRvIDI1NS4gIEhvd2V2ZXIsIGRhcm4KLSAqIGZldyBhcHBsaWNhdGlvbnMgbmVlZCBtb3JlIHRoYW4gNCBjaGFubmVscyAobWF5YmUgNSBmb3IgQ01ZSyArIGFscGhhCi0gKiBtYXNrKS4gIFdlIHJlY29tbWVuZCAxMCBhcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZTsgdXNlIDQgaWYgeW91IGFyZQotICogcmVhbGx5IHNob3J0IG9uIG1lbW9yeS4gIChFYWNoIGFsbG93ZWQgY29tcG9uZW50IGNvc3RzIGEgaHVuZHJlZCBvciBzbwotICogYnl0ZXMgb2Ygc3RvcmFnZSwgd2hldGhlciBhY3R1YWxseSB1c2VkIGluIGFuIGltYWdlIG9yIG5vdC4pCi0gKi8KLQotI2RlZmluZSBNQVhfQ09NUE9ORU5UUyAgMTAJLyogbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgY29tcG9uZW50cyAqLwotCi0KLS8qCi0gKiBCYXNpYyBkYXRhIHR5cGVzLgotICogWW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBpZiB5b3UgaGF2ZSBhIG1hY2hpbmUgd2l0aCB1bnVzdWFsIGRhdGEKLSAqIHR5cGUgc2l6ZXM7IGZvciBleGFtcGxlLCAiY2hhciIgbm90IDggYml0cywgInNob3J0IiBub3QgMTYgYml0cywKLSAqIG9yICJsb25nIiBub3QgMzIgYml0cy4gIFdlIGRvbid0IGNhcmUgd2hldGhlciAiaW50IiBpcyAxNiBvciAzMiBiaXRzLAotICogYnV0IGl0IGhhZCBiZXR0ZXIgYmUgYXQgbGVhc3QgMTYuCi0gKi8KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIChwaXhlbCBlbGVtZW50IHZhbHVlKS4KLSAqIFdlIGZyZXF1ZW50bHkgYWxsb2NhdGUgbGFyZ2UgYXJyYXlzIG9mIHRoZXNlLCBzbyBpdCdzIGltcG9ydGFudCB0byBrZWVwCi0gKiB0aGVtIHNtYWxsLiAgQnV0IGlmIHlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCBhY2Nlc3MgdG8gY2hhciBvciBzaG9ydAotICogYXJyYXlzIGlzIHZlcnkgc2xvdyBvbiB5b3VyIGhhcmR3YXJlLCB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlc2UuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0vKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjI1NS4KLSAqIFlvdSBjYW4gdXNlIGEgc2lnbmVkIGNoYXIgYnkgaGF2aW5nIEdFVEpTQU1QTEUgbWFzayBpdCB3aXRoIDB4RkYuCi0gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSlNBTVBMRTsKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQotCi0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLXR5cGVkZWYgY2hhciBKU0FNUExFOwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQotI2Vsc2UKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpICYgMHhGRikKLSNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCi0KLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotI2RlZmluZSBNQVhKU0FNUExFCTI1NQotI2RlZmluZSBDRU5URVJKU0FNUExFCTEyOAotCi0jZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDggKi8KLQotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDEyCi0vKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjQwOTUuCi0gKiBPbiBuZWFybHkgYWxsIG1hY2hpbmVzICJzaG9ydCIgd2lsbCBkbyBuaWNlbHkuCi0gKi8KLQotdHlwZWRlZiBzaG9ydCBKU0FNUExFOwotI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCi0KLSNkZWZpbmUgTUFYSlNBTVBMRQk0MDk1Ci0jZGVmaW5lIENFTlRFUkpTQU1QTEUJMjA0OAotCi0jZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDEyICovCi0KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSBEQ1QgZnJlcXVlbmN5IGNvZWZmaWNpZW50LgotICogVGhpcyBzaG91bGQgYmUgYSBzaWduZWQgdmFsdWUgb2YgYXQgbGVhc3QgMTYgYml0czsgInNob3J0IiBpcyB1c3VhbGx5IE9LLgotICogQWdhaW4sIHdlIGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgYnV0IHlvdSBjYW4gY2hhbmdlIHRvIGludAotICogaWYgeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kICJzaG9ydCIgaXMgcmVhbGx5IHNsb3cuCi0gKi8KLQotdHlwZWRlZiBzaG9ydCBKQ09FRjsKLQotCi0vKiBDb21wcmVzc2VkIGRhdGFzdHJlYW1zIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgSk9DVEVULgotICogVGhlc2UgbXVzdCBiZSBFWEFDVExZIDggYml0cyB3aWRlLCBhdCBsZWFzdCBvbmNlIHRoZXkgYXJlIHdyaXR0ZW4gdG8KLSAqIGV4dGVybmFsIHN0b3JhZ2UuICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGUgc3RkaW8gZGF0YSBzb3VyY2UvZGVzdGluYXRpb24KLSAqIG1hbmFnZXJzLCB0aGlzIGlzIGFsc28gdGhlIGRhdGEgdHlwZSBwYXNzZWQgdG8gZnJlYWQvZndyaXRlLgotICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEpPQ1RFVDsKLSNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQotCi0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLXR5cGVkZWYgY2hhciBKT0NURVQ7Ci0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAodmFsdWUpCi0jZWxzZQotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAoKHZhbHVlKSAmIDB4RkYpCi0jZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLwotCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLQotLyogVGhlc2UgdHlwZWRlZnMgYXJlIHVzZWQgZm9yIHZhcmlvdXMgdGFibGUgZW50cmllcyBhbmQgc28gZm9ydGguCi0gKiBUaGV5IG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBzcGVjaWZpZWQ7IGJ1dCBtYWtpbmcgdGhlbSB0b28gYmlnCi0gKiB3b24ndCBjb3N0IGEgaHVnZSBhbW91bnQgb2YgbWVtb3J5LCBzbyB3ZSBkb24ndCBwcm92aWRlIHNwZWNpYWwKLSAqIGV4dHJhY3Rpb24gY29kZSBsaWtlIHdlIGRpZCBmb3IgSlNBTVBMRS4gIChJbiBvdGhlciB3b3JkcywgdGhlc2UKLSAqIHR5cGVkZWZzIGxpdmUgYXQgYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHNwZWVkL3NwYWNlIHRyYWRlb2ZmIGN1cnZlLikKLSAqLwotCi0vKiBVSU5UOCBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAwLi4yNTUuICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKLSNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLSNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECi10eXBlZGVmIGNoYXIgVUlOVDg7Ci0jZWxzZSAvKiBub3QgQ0hBUl9JU19VTlNJR05FRCAqLwotdHlwZWRlZiBzaG9ydCBVSU5UODsKLSNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLS8qIFVJTlQxNiBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAwLi42NTUzNS4gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwotI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfU0hPUlQgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQxNjsKLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX1NIT1JUICovCi0KLS8qIElOVDE2IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIC0zMjc2OC4uMzI3NjcuICovCi0KLSNpZm5kZWYgWE1EX0gJCQkvKiBYMTEveG1kLmggY29ycmVjdGx5IGRlZmluZXMgSU5UMTYgKi8KLXR5cGVkZWYgc2hvcnQgSU5UMTY7Ci0jZW5kaWYKLQotLyogSU5UMzIgbXVzdCBob2xkIGF0IGxlYXN0IHNpZ25lZCAzMi1iaXQgdmFsdWVzLiAqLwotCi0jaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDMyICovCi10eXBlZGVmIGxvbmcgSU5UMzI7Ci0jZW5kaWYKLQotLyogRGF0YXR5cGUgdXNlZCBmb3IgaW1hZ2UgZGltZW5zaW9ucy4gIFRoZSBKUEVHIHN0YW5kYXJkIG9ubHkgc3VwcG9ydHMKLSAqIGltYWdlcyB1cCB0byA2NEsqNjRLIGR1ZSB0byAxNi1iaXQgZmllbGRzIGluIFNPRiBtYXJrZXJzLiAgVGhlcmVmb3JlCi0gKiAidW5zaWduZWQgaW50IiBpcyBzdWZmaWNpZW50IG9uIGFsbCBtYWNoaW5lcy4gIEhvd2V2ZXIsIGlmIHlvdSBuZWVkIHRvCi0gKiBoYW5kbGUgbGFyZ2VyIGltYWdlcyBhbmQgeW91IGRvbid0IG1pbmQgZGV2aWF0aW5nIGZyb20gdGhlIHNwZWMsIHlvdQotICogY2FuIGNoYW5nZSB0aGlzIGRhdGF0eXBlLgotICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IEpESU1FTlNJT047Ci0KLSNkZWZpbmUgSlBFR19NQVhfRElNRU5TSU9OICA2NTUwMEwgIC8qIGEgdGFkIHVuZGVyIDY0SyB0byBwcmV2ZW50IG92ZXJmbG93cyAqLwotCi0KLS8qIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBpbiBhbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIGV4dGVybiBkZWNsYXJhdGlvbnMuCi0gKiBZb3UgY291bGQgbW9kaWZ5IHRoZW0gaWYgeW91IG5lZWQgdG8gY2hhbmdlIGZ1bmN0aW9uIGxpbmthZ2UgY29udmVudGlvbnM7Ci0gKiBpbiBwYXJ0aWN1bGFyLCB5b3UnbGwgbmVlZCB0byBkbyB0aGF0IHRvIG1ha2UgdGhlIGxpYnJhcnkgYSBXaW5kb3dzIERMTC4KLSAqIEFub3RoZXIgYXBwbGljYXRpb24gaXMgdG8gbWFrZSBhbGwgZnVuY3Rpb25zIGdsb2JhbCBmb3IgdXNlIHdpdGggZGVidWdnZXJzCi0gKiBvciBjb2RlIHByb2ZpbGVycyB0aGF0IHJlcXVpcmUgaXQuCi0gKi8KLQotLyogYSBmdW5jdGlvbiBjYWxsZWQgdGhyb3VnaCBtZXRob2QgcG9pbnRlcnM6ICovCi0jZGVmaW5lIE1FVEhPRERFRih0eXBlKQkJc3RhdGljIHR5cGUKLS8qIGEgZnVuY3Rpb24gdXNlZCBvbmx5IGluIGl0cyBtb2R1bGU6ICovCi0jZGVmaW5lIExPQ0FMKHR5cGUpCQlzdGF0aWMgdHlwZQotLyogYSBmdW5jdGlvbiByZWZlcmVuY2VkIHRocnUgRVhURVJOczogKi8KLSNkZWZpbmUgR0xPQkFMKHR5cGUpCQl0eXBlCi0vKiBhIHJlZmVyZW5jZSB0byBhIEdMT0JBTCBmdW5jdGlvbjogKi8KLSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gdHlwZQotCi0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWNsYXJlIGEgIm1ldGhvZCIsIHRoYXQgaXMsIGEgZnVuY3Rpb24gcG9pbnRlci4KLSAqIFdlIHdhbnQgdG8gc3VwcGx5IHByb3RvdHlwZSBwYXJhbWV0ZXJzIGlmIHRoZSBjb21waWxlciBjYW4gY29wZS4KLSAqIE5vdGUgdGhhdCB0aGUgYXJnbGlzdCBwYXJhbWV0ZXIgbXVzdCBiZSBwYXJlbnRoZXNpemVkIQotICogQWdhaW4sIHlvdSBjYW4gY3VzdG9taXplIHRoaXMgaWYgeW91IG5lZWQgc3BlY2lhbCBsaW5rYWdlIGtleXdvcmRzLgotICovCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSBhcmdsaXN0Ci0jZWxzZQotI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpICgpCi0jZW5kaWYKLQotCi0vKiBIZXJlIGlzIHRoZSBwc2V1ZG8ta2V5d29yZCBmb3IgZGVjbGFyaW5nIHBvaW50ZXJzIHRoYXQgbXVzdCBiZSAiZmFyIgotICogb24gODB4ODYgbWFjaGluZXMuICBNb3N0IG9mIHRoZSBzcGVjaWFsaXplZCBjb2RpbmcgZm9yIDgweDg2IGlzIGhhbmRsZWQKLSAqIGJ5IGp1c3Qgc2F5aW5nICJGQVIgKiIgd2hlcmUgc3VjaCBhIHBvaW50ZXIgaXMgbmVlZGVkLiAgSW4gYSBmZXcgcGxhY2VzCi0gKiBleHBsaWNpdCBjb2RpbmcgaXMgbmVlZGVkOyBzZWUgdXNlcyBvZiB0aGUgTkVFRF9GQVJfUE9JTlRFUlMgc3ltYm9sLgotICovCi0KLSNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI2RlZmluZSBGQVIgIGZhcgotI2Vsc2UKLSNkZWZpbmUgRkFSCi0jZW5kaWYKLQotCi0vKgotICogT24gYSBmZXcgc3lzdGVtcywgdHlwZSBib29sZWFuIGFuZC9vciBpdHMgdmFsdWVzIEZBTFNFLCBUUlVFIG1heSBhcHBlYXIKLSAqIGluIHN0YW5kYXJkIGhlYWRlciBmaWxlcy4gIE9yIHlvdSBtYXkgaGF2ZSBjb25mbGljdHMgd2l0aCBhcHBsaWNhdGlvbi0KLSAqIHNwZWNpZmljIGhlYWRlciBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgdG9nZXRoZXIgd2l0aCB0aGVzZSBmaWxlcy4KLSAqIERlZmluaW5nIEhBVkVfQk9PTEVBTiBiZWZvcmUgaW5jbHVkaW5nIGpwZWdsaWIuaCBzaG91bGQgbWFrZSBpdCB3b3JrLgotICovCi0KLSNpZm5kZWYgSEFWRV9CT09MRUFOCi10eXBlZGVmIGludCBib29sZWFuOwotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCQkJLyogaW4gY2FzZSB0aGVzZSBtYWNyb3MgYWxyZWFkeSBleGlzdCAqLwotI2RlZmluZSBGQUxTRQkwCQkvKiB2YWx1ZXMgb2YgYm9vbGVhbiAqLwotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkxCi0jZW5kaWYKLQotCi0vKgotICogVGhlIHJlbWFpbmluZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKLSAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBtb3N0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeS4KLSAqIFRvIG1pbmltaXplIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBwb2xsdXRpb24sIHRoZSBzeW1ib2xzIHdvbid0IGJlCi0gKiBkZWZpbmVkIHVubGVzcyBKUEVHX0lOVEVSTkFMUyBvciBKUEVHX0lOVEVSTkFMX09QVElPTlMgaGFzIGJlZW4gZGVmaW5lZC4KLSAqLwotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLSNkZWZpbmUgSlBFR19JTlRFUk5BTF9PUFRJT05TCi0jZW5kaWYKLQotI2lmZGVmIEpQRUdfSU5URVJOQUxfT1BUSU9OUwotCi0KLS8qCi0gKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoZXRoZXIgdG8gaW5jbHVkZSB2YXJpb3VzIG9wdGlvbmFsIGZ1bmN0aW9ucy4KLSAqIFVuZGVmaW5pbmcgc29tZSBvZiB0aGVzZSBzeW1ib2xzIHdpbGwgcHJvZHVjZSBhIHNtYWxsZXIgYnV0IGxlc3MgY2FwYWJsZQotICogbGlicmFyeS4gIE5vdGUgdGhhdCB5b3UgY2FuIGxlYXZlIGNlcnRhaW4gc291cmNlIGZpbGVzIG91dCBvZiB0aGUKLSAqIGNvbXBpbGF0aW9uL2xpbmtpbmcgcHJvY2VzcyBpZiB5b3UndmUgI3VuZGVmJ2QgdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9scy4KLSAqIChZb3UgbWF5IEhBVkUgdG8gZG8gdGhhdCBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBudWxsIHNvdXJjZSBmaWxlcy4pCi0gKi8KLQotLyogQXJpdGhtZXRpYyBjb2RpbmcgaXMgdW5zdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuICBDb21wbGFpbnRzIHRvIElCTS4gKi8KLQotLyogQ2FwYWJpbGl0eSBvcHRpb25zIGNvbW1vbiB0byBlbmNvZGVyIGFuZCBkZWNvZGVyOiAqLwotCi0jZGVmaW5lIERDVF9JU0xPV19TVVBQT1JURUQJLyogc2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0gKi8KLSNkZWZpbmUgRENUX0lGQVNUX1NVUFBPUlRFRAkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KLSNkZWZpbmUgRENUX0ZMT0FUX1NVUFBPUlRFRAkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLwotCi0vKiBFbmNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KLQotI3VuZGVmICBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCi0jZGVmaW5lIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCi0jZGVmaW5lIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCi0jZGVmaW5lIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAkgICAgLyogT3B0aW1pemF0aW9uIG9mIGVudHJvcHkgY29kaW5nIHBhcm1zPyAqLwotLyogTm90ZTogaWYgeW91IHNlbGVjdGVkIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgaXQgaXMgZGFuZ2Vyb3VzIHRvIHR1cm4gb2ZmCi0gKiBFTlRST1BZX09QVF9TVVBQT1JURUQuICBUaGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgYXJlIG9ubHkgZ29vZCBmb3IgOC1iaXQKLSAqIHByZWNpc2lvbiwgc28gamNodWZmLmMgbm9ybWFsbHkgdXNlcyBlbnRyb3B5IG9wdGltaXphdGlvbiB0byBjb21wdXRlCi0gKiB1c2FibGUgdGFibGVzIGZvciBoaWdoZXIgcHJlY2lzaW9uLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gZG8gb3B0aW1pemF0aW9uLAotICogeW91J2xsIGhhdmUgdG8gc3VwcGx5IGRpZmZlcmVudCBkZWZhdWx0IEh1ZmZtYW4gdGFibGVzLgotICogVGhlIGV4YWN0IHNhbWUgc3RhdGVtZW50cyBhcHBseSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRzogdGhlIGRlZmF1bHQgdGFibGVzCi0gKiBkb24ndCB3b3JrIGZvciBwcm9ncmVzc2l2ZSBtb2RlLiAgKFRoaXMgbWF5IGdldCBmaXhlZCwgaG93ZXZlci4pCi0gKi8KLSNkZWZpbmUgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRCAgIC8qIElucHV0IGltYWdlIHNtb290aGluZyBvcHRpb24/ICovCi0KLS8qIERlY29kZXIgY2FwYWJpbGl0eSBvcHRpb25zOiAqLwotCi0jdW5kZWYgIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAgICAvKiBBcml0aG1ldGljIGNvZGluZyBiYWNrIGVuZD8gKi8KLSNkZWZpbmUgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEIC8qIE11bHRpcGxlLXNjYW4gSlBFRyBmaWxlcz8gKi8KLSNkZWZpbmUgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQJICAgIC8qIFByb2dyZXNzaXZlIEpQRUc/IChSZXF1aXJlcyBNVUxUSVNDQU4pKi8KLSNkZWZpbmUgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAkgICAgLyoganBlZ19zYXZlX21hcmtlcnMoKSBuZWVkZWQ/ICovCi0jZGVmaW5lIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQgICAvKiBCbG9jayBzbW9vdGhpbmc/IChQcm9ncmVzc2l2ZSBvbmx5KSAqLwotI2RlZmluZSBJRENUX1NDQUxJTkdfU1VQUE9SVEVECSAgICAvKiBPdXRwdXQgcmVzY2FsaW5nIHZpYSBJRENUPyAqLwotI3VuZGVmICBVUFNBTVBMRV9TQ0FMSU5HX1NVUFBPUlRFRCAgLyogT3V0cHV0IHJlc2NhbGluZyBhdCB1cHNhbXBsZSBzdGFnZT8gKi8KLSNkZWZpbmUgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgIC8qIEZhc3QgcGF0aCBmb3Igc2xvcHB5IHVwc2FtcGxpbmc/ICovCi0jZGVmaW5lIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAkgICAgLyogMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KLSNkZWZpbmUgUVVBTlRfMlBBU1NfU1VQUE9SVEVECSAgICAvKiAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uPyAqLwotCi0vKiBtb3JlIGNhcGFiaWxpdHkgb3B0aW9ucyBsYXRlciwgbm8gZG91YnQgKi8KLQotCi0vKgotICogT3JkZXJpbmcgb2YgUkdCIGRhdGEgaW4gc2NhbmxpbmVzIHBhc3NlZCB0byBvciBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KLSAqIElmIHlvdXIgYXBwbGljYXRpb24gd2FudHMgdG8gZGVhbCB3aXRoIGRhdGEgaW4gdGhlIG9yZGVyIEIsRyxSLCBqdXN0Ci0gKiBjaGFuZ2UgdGhlc2UgbWFjcm9zLiAgWW91IGNhbiBhbHNvIGRlYWwgd2l0aCBmb3JtYXRzIHN1Y2ggYXMgUixHLEIsWAotICogKG9uZSBleHRyYSBieXRlIHBlciBwaXhlbCkgYnkgY2hhbmdpbmcgUkdCX1BJWEVMU0laRS4gIE5vdGUgdGhhdCBjaGFuZ2luZwotICogdGhlIG9mZnNldHMgd2lsbCBhbHNvIGNoYW5nZSB0aGUgb3JkZXIgaW4gd2hpY2ggY29sb3JtYXAgZGF0YSBpcyBvcmdhbml6ZWQuCi0gKiBSRVNUUklDVElPTlM6Ci0gKiAxLiBUaGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZyxkanBlZyBkbyBOT1Qgc3VwcG9ydCBtb2RpZmllZCBSR0IgZm9ybWF0cy4KLSAqIDIuIFRoZXNlIG1hY3JvcyBvbmx5IGFmZmVjdCBSR0I8PT5ZQ2JDciBjb2xvciBjb252ZXJzaW9uLCBzbyB0aGV5IGFyZSBub3QKLSAqICAgIHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIEpQRUcgY29sb3Igc3BhY2VzIG90aGVyIHRoYW4gWUNiQ3Igb3IgZ3JheXNjYWxlLgotICogMy4gVGhlIGNvbG9yIHF1YW50aXplciBtb2R1bGVzIHdpbGwgbm90IGJlaGF2ZSBkZXNpcmFibHkgaWYgUkdCX1BJWEVMU0laRQotICogICAgaXMgbm90IDMgKHRoZXkgZG9uJ3QgdW5kZXJzdGFuZCBhYm91dCBkdW1teSBjb2xvciBjb21wb25lbnRzISkuICBTbyB5b3UKLSAqICAgIGNhbid0IHVzZSBjb2xvciBxdWFudGl6YXRpb24gaWYgeW91IGNoYW5nZSB0aGF0IHZhbHVlLgotICovCi0KLSNkZWZpbmUgUkdCX1JFRAkJMAkvKiBPZmZzZXQgb2YgUmVkIGluIGFuIFJHQiBzY2FubGluZSBlbGVtZW50ICovCi0jZGVmaW5lIFJHQl9HUkVFTgkxCS8qIE9mZnNldCBvZiBHcmVlbiAqLwotI2RlZmluZSBSR0JfQkxVRQkyCS8qIE9mZnNldCBvZiBCbHVlICovCi0jaWZkZWYgQU5EUk9JRF9SR0IKLSNkZWZpbmUgUkdCX0FMUEhBICAgMyAgIC8qIE9mZnNldCBvZiBBbHBoYSAqLwotI2VuZGlmCi0jZGVmaW5lIFJHQl9QSVhFTFNJWkUgICAzICAgLyogSlNBTVBMRXMgcGVyIFJHQiBzY2FubGluZSBlbGVtZW50ICovCi0KLS8qIERlZmluaXRpb25zIGZvciBzcGVlZC1yZWxhdGVkIG9wdGltaXphdGlvbnMuICovCi0KLQotLyogSWYgeW91ciBjb21waWxlciBzdXBwb3J0cyBpbmxpbmUgZnVuY3Rpb25zLCBkZWZpbmUgSU5MSU5FCi0gKiBhcyB0aGUgaW5saW5lIGtleXdvcmQ7IG90aGVyd2lzZSBkZWZpbmUgaXQgYXMgZW1wdHkuCi0gKi8KLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwkJCS8qIGZvciBpbnN0YW5jZSwgR05VIEMga25vd3MgYWJvdXQgaW5saW5lICovCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZW5kaWYKLSNpZm5kZWYgSU5MSU5FCi0jZGVmaW5lIElOTElORQkJCS8qIGRlZmF1bHQgaXMgdG8gZGVmaW5lIGl0IGFzIGVtcHR5ICovCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIE9uIHNvbWUgbWFjaGluZXMgKG5vdGFibHkgNjgwMDAgc2VyaWVzKSAiaW50IiBpcyAzMiBiaXRzLCBidXQgbXVsdGlwbHlpbmcKLSAqIHR3byAxNi1iaXQgc2hvcnRzIGlzIGZhc3RlciB0aGFuIG11bHRpcGx5aW5nIHR3byBpbnRzLiAgRGVmaW5lIE1VTFRJUExJRVIKLSAqIGFzIHNob3J0IG9uIHN1Y2ggYSBtYWNoaW5lLiAgTVVMVElQTElFUiBtdXN0IGJlIGF0IGxlYXN0IDE2IGJpdHMgd2lkZS4KLSAqLwotCi0jaWZuZGVmIE1VTFRJUExJRVIKLSNkZWZpbmUgTVVMVElQTElFUiAgaW50CQkvKiB0eXBlIGZvciBmYXN0ZXN0IGludGVnZXIgbXVsdGlwbHkgKi8KLSNlbmRpZgotCi0KLS8qIEZBU1RfRkxPQVQgc2hvdWxkIGJlIGVpdGhlciBmbG9hdCBvciBkb3VibGUsIHdoaWNoZXZlciBpcyBkb25lIGZhc3RlcgotICogYnkgeW91ciBjb21waWxlci4gIChOb3RlIHRoYXQgdGhpcyB0eXBlIGlzIG9ubHkgdXNlZCBpbiB0aGUgZmxvYXRpbmcgcG9pbnQKLSAqIERDVCByb3V0aW5lcywgc28gaXQgb25seSBtYXR0ZXJzIGlmIHlvdSd2ZSBkZWZpbmVkIERDVF9GTE9BVF9TVVBQT1JURUQuKQotICogVHlwaWNhbGx5LCBmbG9hdCBpcyBmYXN0ZXIgaW4gQU5TSSBDIGNvbXBpbGVycywgd2hpbGUgZG91YmxlIGlzIGZhc3RlciBpbgotICogcHJlLUFOU0kgY29tcGlsZXJzIChiZWNhdXNlIHRoZXkgaW5zaXN0IG9uIGNvbnZlcnRpbmcgdG8gZG91YmxlIGFueXdheSkuCi0gKiBUaGUgY29kZSBiZWxvdyB0aGVyZWZvcmUgY2hvb3NlcyBmbG9hdCBpZiB3ZSBoYXZlIEFOU0ktc3R5bGUgcHJvdG90eXBlcy4KLSAqLwotCi0jaWZuZGVmIEZBU1RfRkxPQVQKLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgRkFTVF9GTE9BVCAgZmxvYXQKLSNlbHNlCi0jZGVmaW5lIEZBU1RfRkxPQVQgIGRvdWJsZQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxfT1BUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvanBlZ2ludC5oIGIvbGlianBlZ3R3cnAvanBlZ2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5ZmZlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pwZWdpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKgotICoganBlZ2ludC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSB2YXJpb3VzIEpQRUcgbW9kdWxlcy4KLSAqIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgY29uc2lkZXJlZCBpbnRlcm5hbCB0byB0aGUgSlBFRyBsaWJyYXJ5OyBtb3N0Ci0gKiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzIGZpbGUuCi0gKi8KLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGJvdGggY29tcHJlc3Npb24gJiBkZWNvbXByZXNzaW9uICovCi0KLXR5cGVkZWYgZW51bSB7CQkJLyogT3BlcmF0aW5nIG1vZGVzIGZvciBidWZmZXIgY29udHJvbGxlcnMgKi8KLQlKQlVGX1BBU1NfVEhSVSwJCS8qIFBsYWluIHN0cmlwd2lzZSBvcGVyYXRpb24gKi8KLQkvKiBSZW1haW5pbmcgbW9kZXMgcmVxdWlyZSBhIGZ1bGwtaW1hZ2UgYnVmZmVyIHRvIGhhdmUgYmVlbiBjcmVhdGVkICovCi0JSkJVRl9TQVZFX1NPVVJDRSwJLyogUnVuIHNvdXJjZSBzdWJvYmplY3Qgb25seSwgc2F2ZSBvdXRwdXQgKi8KLQlKQlVGX0NSQU5LX0RFU1QsCS8qIFJ1biBkZXN0IHN1Ym9iamVjdCBvbmx5LCB1c2luZyBzYXZlZCBkYXRhICovCi0JSkJVRl9TQVZFX0FORF9QQVNTCS8qIFJ1biBib3RoIHN1Ym9iamVjdHMsIHNhdmUgb3V0cHV0ICovCi19IEpfQlVGX01PREU7Ci0KLS8qIFZhbHVlcyBvZiBnbG9iYWxfc3RhdGUgZmllbGQgKGpkYXBpLmMgaGFzIHNvbWUgZGVwZW5kZW5jaWVzIG9uIG9yZGVyaW5nISkgKi8KLSNkZWZpbmUgQ1NUQVRFX1NUQVJUCTEwMAkvKiBhZnRlciBjcmVhdGVfY29tcHJlc3MgKi8KLSNkZWZpbmUgQ1NUQVRFX1NDQU5OSU5HCTEwMQkvKiBzdGFydF9jb21wcmVzcyBkb25lLCB3cml0ZV9zY2FubGluZXMgT0sgKi8KLSNkZWZpbmUgQ1NUQVRFX1JBV19PSwkxMDIJLyogc3RhcnRfY29tcHJlc3MgZG9uZSwgd3JpdGVfcmF3X2RhdGEgT0sgKi8KLSNkZWZpbmUgQ1NUQVRFX1dSQ09FRlMJMTAzCS8qIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzIGRvbmUgKi8KLSNkZWZpbmUgRFNUQVRFX1NUQVJUCTIwMAkvKiBhZnRlciBjcmVhdGVfZGVjb21wcmVzcyAqLwotI2RlZmluZSBEU1RBVEVfSU5IRUFERVIJMjAxCS8qIHJlYWRpbmcgaGVhZGVyIG1hcmtlcnMsIG5vIFNPUyB5ZXQgKi8KLSNkZWZpbmUgRFNUQVRFX1JFQURZCTIwMgkvKiBmb3VuZCBTT1MsIHJlYWR5IGZvciBzdGFydF9kZWNvbXByZXNzICovCi0jZGVmaW5lIERTVEFURV9QUkVMT0FECTIwMwkvKiByZWFkaW5nIG11bHRpc2NhbiBmaWxlIGluIHN0YXJ0X2RlY29tcHJlc3MqLwotI2RlZmluZSBEU1RBVEVfUFJFU0NBTgkyMDQJLyogcGVyZm9ybWluZyBkdW1teSBwYXNzIGZvciAyLXBhc3MgcXVhbnQgKi8KLSNkZWZpbmUgRFNUQVRFX1NDQU5OSU5HCTIwNQkvKiBzdGFydF9kZWNvbXByZXNzIGRvbmUsIHJlYWRfc2NhbmxpbmVzIE9LICovCi0jZGVmaW5lIERTVEFURV9SQVdfT0sJMjA2CS8qIHN0YXJ0X2RlY29tcHJlc3MgZG9uZSwgcmVhZF9yYXdfZGF0YSBPSyAqLwotI2RlZmluZSBEU1RBVEVfQlVGSU1BR0UJMjA3CS8qIGV4cGVjdGluZyBqcGVnX3N0YXJ0X291dHB1dCAqLwotI2RlZmluZSBEU1RBVEVfQlVGUE9TVAkyMDgJLyogbG9va2luZyBmb3IgU09TL0VPSSBpbiBqcGVnX2ZpbmlzaF9vdXRwdXQgKi8KLSNkZWZpbmUgRFNUQVRFX1JEQ09FRlMJMjA5CS8qIHJlYWRpbmcgZmlsZSBpbiBqcGVnX3JlYWRfY29lZmZpY2llbnRzICovCi0jZGVmaW5lIERTVEFURV9TVE9QUElORwkyMTAJLyogbG9va2luZyBmb3IgRU9JIGluIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgKi8KLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGNvbXByZXNzaW9uIG1vZHVsZXMgKi8KLQotLyogTWFzdGVyIGNvbnRyb2wgbW9kdWxlICovCi1zdHJ1Y3QganBlZ19jb21wX21hc3RlciB7Ci0gIEpNRVRIT0Qodm9pZCwgcHJlcGFyZV9mb3JfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcGFzc19zdGFydHVwLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIGJvb2xlYW4gY2FsbF9wYXNzX3N0YXJ0dXA7CS8qIFRydWUgaWYgcGFzc19zdGFydHVwIG11c3QgYmUgY2FsbGVkICovCi0gIGJvb2xlYW4gaXNfbGFzdF9wYXNzOwkJLyogVHJ1ZSBkdXJpbmcgbGFzdCBwYXNzICovCi19OwotCi0vKiBNYWluIGJ1ZmZlciBjb250cm9sIChkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcikgKi8KLXN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcHJvY2Vzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCQkgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7Ci19OwotCi0vKiBDb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIChkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIGNvbnRyb2wpICovCi1zdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOwotICBKTUVUSE9EKHZvaWQsIHByZV9wcm9jZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkJCQkgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJCSAgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCwKLQkJCQkgICBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCQkJICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkpOwotfTsKLQotLyogQ29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2wgKi8KLXN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgY29tcHJlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7Ci19OwotCi0vKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gKi8KLXN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgY29sb3JfY29udmVydCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCUpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCQkJSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpKTsKLX07Ci0KLS8qIERvd25zYW1wbGluZyAqLwotc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGRvd25zYW1wbGUsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2luZGV4LAotCQkJICAgICBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCQkgICAgIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cF9pbmRleCkpOwotCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KLX07Ci0KLS8qIEZvcndhcmQgRENUIChhbHNvIGNvbnRyb2xzIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbikgKi8KLXN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogcGVyaGFwcyB0aGlzIHNob3VsZCBiZSBhbiBhcnJheT8/PyAqLwotICBKTUVUSE9EKHZvaWQsIGZvcndhcmRfRENULCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJCSAgICAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKLQkJCSAgICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLQkJCSAgICAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykpOwotfTsKLQotLyogRW50cm9weSBlbmNvZGluZyAqLwotc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpKTsKLSAgSk1FVEhPRChib29sZWFuLCBlbmNvZGVfbWN1LCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0vKiBNYXJrZXIgd3JpdGluZyAqLwotc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciB7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfZmlsZV9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZyYW1lX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfc2Nhbl9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZpbGVfdHJhaWxlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfdGFibGVzX29ubHksIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBUaGVzZSByb3V0aW5lcyBhcmUgZXhwb3J0ZWQgdG8gYWxsb3cgaW5zZXJ0aW9uIG9mIGV4dHJhIG1hcmtlcnMgKi8KLSAgLyogUHJvYmFibHkgb25seSBDT00gYW5kIEFQUG4gbWFya2VycyBzaG91bGQgYmUgd3JpdHRlbiB0aGlzIHdheSAqLwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX21hcmtlcl9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX21hcmtlcl9ieXRlLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpKTsKLX07Ci0KLQotLyogRGVjbGFyYXRpb25zIGZvciBkZWNvbXByZXNzaW9uIG1vZHVsZXMgKi8KLQotLyogTWFzdGVyIGNvbnRyb2wgbW9kdWxlICovCi1zdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBwcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIGJvb2xlYW4gaXNfZHVtbXlfcGFzczsJLyogVHJ1ZSBkdXJpbmcgMXN0IHBhc3MgZm9yIDItcGFzcyBxdWFudCAqLwotfTsKLQotLyogSW5wdXQgY29udHJvbCBtb2R1bGUgKi8KLXN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgewotICBKTUVUSE9EKGludCwgY29uc3VtZV9pbnB1dCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChpbnQsIGNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgc2Nhbl9jb3VudCkpOwotICBKTUVUSE9EKGludCwgY29uc3VtZV9tYXJrZXJzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBzY2FuX2NvdW50KSk7Ci0gIEpNRVRIT0Qodm9pZCwgcmVzZXRfaW5wdXRfY29udHJvbGxlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0gIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLwotICBib29sZWFuIGhhc19tdWx0aXBsZV9zY2FuczsJLyogVHJ1ZSBpZiBmaWxlIGhhcyBtdWx0aXBsZSBzY2FucyAqLwotICBib29sZWFuIGVvaV9yZWFjaGVkOwkJLyogVHJ1ZSB3aGVuIEVPSSBoYXMgYmVlbiBjb25zdW1lZCAqLwotfTsKLQotLyogTWFpbiBidWZmZXIgY29udHJvbCAoZG93bnNhbXBsZWQtZGF0YSBidWZmZXIpICovCi1zdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcHJvY2Vzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJICAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLX07Ci0KLS8qIENvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sICovCi1zdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChpbnQsIGNvbnN1bWVfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChpbnQsIGNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCogaW5kZXgsIGludCBzY2FuX2NvdW50KSk7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoaW50LCBkZWNvbXByZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKLSAgLyogUG9pbnRlciB0byBhcnJheSBvZiBjb2VmZmljaWVudCB2aXJ0dWFsIGFycmF5cywgb3IgTlVMTCBpZiBub25lICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgKmNvZWZfYXJyYXlzOwotCi0gIC8qIGNvbHVtbiBudW1iZXIgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHRpbGUsIHJlc3BlY3RpdmVseSAqLwotICBpbnQgY29sdW1uX2xlZnRfYm91bmRhcnk7Ci0gIGludCBjb2x1bW5fcmlnaHRfYm91bmRhcnk7Ci0KLSAgLyogY29sdW1uIG51bWJlciBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgTUNVLCByZXNwZWN0aXZlbHkgKi8KLSAgaW50IE1DVV9jb2x1bW5fbGVmdF9ib3VuZGFyeTsKLSAgaW50IE1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnk7Ci0KLSAgLyogdGhlIG51bWJlciBvZiBNQ1UgY29sdW1ucyB0byBza2lwIGZyb20gdGhlIGluZGV4ZWQgTUNVLCBpTSwKLSAgICogdG8gdGhlIHJlcXVlc3RlZCBNQ1UgYm91bmRhcnksIHJNLCB3aGVyZSBpTSBpcyB0aGUgTUNVIHRoYXQgd2Ugc2FtcGxlCi0gICAqIGludG8gb3VyIGluZGV4IGFuZCBpcyB0aGUgbmVhcmVzdCBvbmUgdG8gdGhlIGxlZnQgb2Ygck0uCi0gICAqLwotICBpbnQgTUNVX2NvbHVtbnNfdG9fc2tpcDsKLX07Ci0KLS8qIERlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcgKGNvbG9yIHF1YW50aXphdGlvbiBidWZmZXIgY29udHJvbCkgKi8KLXN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBwb3N0X3Byb2Nlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotCQkJCSAgICBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkJCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkJCQkgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLX07Ci0KLS8qIE1hcmtlciByZWFkaW5nICYgcGFyc2luZyAqLwotc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciB7Ci0gIEpNRVRIT0Qodm9pZCwgcmVzZXRfbWFya2VyX3JlYWRlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogUmVhZCBtYXJrZXJzIHVudGlsIFNPUyBvciBFT0kuCi0gICAqIFJldHVybnMgc2FtZSBjb2RlcyBhcyBhcmUgZGVmaW5lZCBmb3IganBlZ19jb25zdW1lX2lucHV0OgotICAgKiBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KLSAgICovCi0gIEpNRVRIT0QoaW50LCByZWFkX21hcmtlcnMsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZ2V0X3Nvc19tYXJrZXJfcG9zaXRpb24sIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCkpOwotICAvKiBSZWFkIGEgcmVzdGFydCBtYXJrZXIgLS0tIGV4cG9ydGVkIGZvciB1c2UgYnkgZW50cm9weSBkZWNvZGVyIG9ubHkgKi8KLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByZWFkX3Jlc3RhcnRfbWFya2VyOwotCi0gIC8qIFN0YXRlIG9mIG1hcmtlciByZWFkZXIgLS0tIG5vbWluYWxseSBpbnRlcm5hbCwgYnV0IGFwcGxpY2F0aW9ucwotICAgKiBzdXBwbHlpbmcgQ09NIG9yIEFQUG4gaGFuZGxlcnMgbWlnaHQgbGlrZSB0byBrbm93IHRoZSBzdGF0ZS4KLSAgICovCi0gIGJvb2xlYW4gc2F3X1NPSTsJCS8qIGZvdW5kIFNPST8gKi8KLSAgYm9vbGVhbiBzYXdfU09GOwkJLyogZm91bmQgU09GPyAqLwotICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgZXhwZWN0ZWQgKDAtNykgKi8KLSAgaW50IGN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbjsKLSAgdW5zaWduZWQgaW50IGRpc2NhcmRlZF9ieXRlczsJLyogIyBvZiBieXRlcyBza2lwcGVkIGxvb2tpbmcgZm9yIGEgbWFya2VyICovCi19OwotCi0vKiBFbnRyb3B5IGRlY29kaW5nICovCi1zdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZGVjb2RlX21jdSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotICBKTUVUSE9EKGJvb2xlYW4sIGRlY29kZV9tY3VfZGlzY2FyZF9jb2VmLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCkpOwotICBKTUVUSE9EKHZvaWQsIGdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbiwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkpOwotCi0gIC8qIFRoaXMgaXMgaGVyZSB0byBzaGFyZSBjb2RlIGJldHdlZW4gYmFzZWxpbmUgYW5kIHByb2dyZXNzaXZlIGRlY29kZXJzOyAqLwotICAvKiBvdGhlciBtb2R1bGVzIHByb2JhYmx5IHNob3VsZCBub3QgdXNlIGl0ICovCi0gIGJvb2xlYW4gaW5zdWZmaWNpZW50X2RhdGE7CS8qIHNldCBUUlVFIGFmdGVyIGVtaXR0aW5nIHdhcm5pbmcgKi8KLQotICBodWZmbWFuX2luZGV4ICppbmRleDsKLX07Ci0KLS8qIEludmVyc2UgRENUIChhbHNvIHBlcmZvcm1zIGRlcXVhbnRpemF0aW9uKSAqLwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGludmVyc2VfRENUX21ldGhvZF9wdHIsCi0JCShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotCi1zdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogSXQgaXMgdXNlZnVsIHRvIGFsbG93IGVhY2ggY29tcG9uZW50IHRvIGhhdmUgYSBzZXBhcmF0ZSBJRENUIG1ldGhvZC4gKi8KLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVFtNQVhfQ09NUE9ORU5UU107Ci19OwotCi0vKiBVcHNhbXBsaW5nIChub3RlIHRoYXQgdXBzYW1wbGVyIG11c3QgYWxzbyBjYWxsIGNvbG9yIGNvbnZlcnRlcikgKi8KLXN0cnVjdCBqcGVnX3Vwc2FtcGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwKLQkJCSAgIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCQkgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JCQkgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLQotICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCi19OwotCi0vKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gKi8KLXN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGNvbG9yX2NvbnZlcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLQkJCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykpOwotfTsKLQotLyogQ29sb3IgcXVhbnRpemF0aW9uIG9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gKi8KLXN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pKTsKLSAgSk1FVEhPRCh2b2lkLCBjb2xvcl9xdWFudGl6ZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JCQkJIGludCBudW1fcm93cykpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIG5ld19jb2xvcl9tYXAsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0jaWZkZWYgQU5EUk9JRF9KUEVHX1VTRV9WRU5VTQotCi0vKiBJRENUIHJvdXRpbmVzICovCi1FWFRFUk4gKHZvaWQpIGlkY3RfMXgxX3ZlbnVtIChJTlQxNiAqIGNvZWZmUHRyLCBJTlQxNiAqIHNhbXBsZVB0ciwgSU5UMzIgc3RyaWRlKTsKLUVYVEVSTiAodm9pZCkgaWRjdF8yeDJfdmVudW0gKElOVDE2ICogY29lZmZQdHIsIElOVDE2ICogc2FtcGxlUHRyLCBJTlQzMiBzdHJpZGUpOwotRVhURVJOICh2b2lkKSBpZGN0XzR4NF92ZW51bSAoSU5UMTYgKiBjb2VmZlB0ciwgSU5UMTYgKiBzYW1wbGVQdHIsIElOVDMyIHN0cmlkZSk7Ci1FWFRFUk4gKHZvaWQpIGlkY3RfOHg4X3ZlbnVtIChJTlQxNiAqIGNvZWZmUHRyLCBJTlQxNiAqIHNhbXBsZVB0ciwgSU5UMzIgc3RyaWRlKTsKLQotI2lmbmRlZiBBTkRST0lEX0pQRUdfRElTQUJMRV9WRU5VTV9ZQ0NfUkdCXzU2NQotLyogQ29sb3IgY29udmVyc2lvbiByb3V0aW5lcyAqLwotRVhURVJOICh2b2lkKSB5dnVwMnJnYjU2NV92ZW51bSAoVUlOVDggKnBMdW1hTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENyTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENiTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcFJHQjU2NUxpbmUsCi0gICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBuTGluZVdpZHRoKTsKLUVYVEVSTiAodm9pZCkgeXl2dXAycmdiNTY1X3ZlbnVtIChVSU5UOCAqIHBMdW1hTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENyTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENiTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqIHBSR0I1NjVMaW5lLAotICAgICAgICAgICAgICAgIEpESU1FTlNJT04gbkxpbmVXaWR0aCk7Ci0jZW5kaWYKLUVYVEVSTiAodm9pZCkgeXZ1cDJiZ3I4ODhfdmVudW0gKFVJTlQ4ICogcEx1bWFMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ3JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ2JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICogcEJHUjg4OExpbmUsCi0gICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBuTGluZVdpZHRoKTsKLUVYVEVSTiAodm9pZCkgeXl2dXAyYmdyODg4X3ZlbnVtIChVSU5UOCAqIHBMdW1hTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENyTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENiTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqIHBCR1I4ODhMaW5lLAotICAgICAgICAgICAgICAgIEpESU1FTlNJT04gbkxpbmVXaWR0aCk7Ci1FWFRFUk4gKHZvaWQpIHl2dXAyYWJncjg4ODhfdmVudW0gKFVJTlQ4ICogcEx1bWFMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ3JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICpwQ2JMaW5lLAotICAgICAgICAgICAgICAgIFVJTlQ4ICogcEFCR1I4ODhMaW5lLAotICAgICAgICAgICAgICAgIEpESU1FTlNJT04gbkxpbmVXaWR0aCk7Ci1FWFRFUk4gKHZvaWQpIHl5dnVwMmFiZ3I4ODg4X3ZlbnVtIChVSU5UOCAqIHBMdW1hTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENyTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqcENiTGluZSwKLSAgICAgICAgICAgICAgICBVSU5UOCAqIHBBQkdSODg4TGluZSwKLSAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG5MaW5lV2lkdGgpOwotI2VuZGlmCi0KLS8qIE1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLwotCi0jdW5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLGIpCSgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgTUlOCi0jZGVmaW5lIE1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLQotLyogV2UgYXNzdW1lIHRoYXQgcmlnaHQgc2hpZnQgY29ycmVzcG9uZHMgdG8gc2lnbmVkIGRpdmlzaW9uIGJ5IDIgd2l0aAotICogcm91bmRpbmcgdG93YXJkcyBtaW51cyBpbmZpbml0eS4gIFRoaXMgaXMgY29ycmVjdCBmb3IgdHlwaWNhbCAiYXJpdGhtZXRpYwotICogc2hpZnQiIGluc3RydWN0aW9ucyB0aGF0IHNoaWZ0IGluIGNvcGllcyBvZiB0aGUgc2lnbiBiaXQuICBCdXQgc29tZQotICogQyBjb21waWxlcnMgaW1wbGVtZW50ID4+IHdpdGggYW4gdW5zaWduZWQgc2hpZnQuICBGb3IgdGhlc2UgbWFjaGluZXMgeW91Ci0gKiBtdXN0IGRlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRC4KLSAqIFJJR0hUX1NISUZUIHByb3ZpZGVzIGEgcHJvcGVyIHNpZ25lZCByaWdodCBzaGlmdCBvZiBhbiBJTlQzMiBxdWFudGl0eS4KLSAqIEl0IGlzIG9ubHkgYXBwbGllZCB3aXRoIGNvbnN0YW50IHNoaWZ0IGNvdW50cy4gIFNISUZUX1RFTVBTIG11c3QgYmUKLSAqIGluY2x1ZGVkIGluIHRoZSB2YXJpYWJsZXMgb2YgYW55IHJvdXRpbmUgdXNpbmcgUklHSFRfU0hJRlQuCi0gKi8KLQotI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0jZGVmaW5lIFNISUZUX1RFTVBTCUlOVDMyIHNoaWZ0X3RlbXA7Ci0jZGVmaW5lIFJJR0hUX1NISUZUKHgsc2hmdCkgIFwKLQkoKHNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKLQkgKHNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofigoSU5UMzIpIDApKSA8PCAoMzItKHNoZnQpKSkgOiBcCi0JIChzaGlmdF90ZW1wID4+IChzaGZ0KSkpCi0jZWxzZQotI2RlZmluZSBTSElGVF9URU1QUwotI2RlZmluZSBSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQotI2VuZGlmCi0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGppbml0X2NvbXByZXNzX21hc3RlcglqSUNvbXByZXNzCi0jZGVmaW5lIGppbml0X2NfbWFzdGVyX2NvbnRyb2wJaklDTWFzdGVyCi0jZGVmaW5lIGppbml0X2NfbWFpbl9jb250cm9sbGVyCWpJQ01haW5DCi0jZGVmaW5lIGppbml0X2NfcHJlcF9jb250cm9sbGVyCWpJQ1ByZXBDCi0jZGVmaW5lIGppbml0X2NfY29lZl9jb250cm9sbGVyCWpJQ0NvZWZDCi0jZGVmaW5lIGppbml0X2NvbG9yX2NvbnZlcnRlcglqSUNDb2xvcgotI2RlZmluZSBqaW5pdF9kb3duc2FtcGxlcglqSURvd25zYW1wbGVyCi0jZGVmaW5lIGppbml0X2ZvcndhcmRfZGN0CWpJRkRDVAotI2RlZmluZSBqaW5pdF9odWZmX2VuY29kZXIJaklIRW5jb2RlcgotI2RlZmluZSBqaW5pdF9waHVmZl9lbmNvZGVyCWpJUEhFbmNvZGVyCi0jZGVmaW5lIGppbml0X21hcmtlcl93cml0ZXIJaklNV3JpdGVyCi0jZGVmaW5lIGppbml0X21hc3Rlcl9kZWNvbXByZXNzCWpJRE1hc3RlcgotI2RlZmluZSBqaW5pdF9kX21haW5fY29udHJvbGxlcglqSURNYWluQwotI2RlZmluZSBqaW5pdF9kX2NvZWZfY29udHJvbGxlcglqSURDb2VmQwotI2RlZmluZSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlcglqSURQb3N0QwotI2RlZmluZSBqaW5pdF9pbnB1dF9jb250cm9sbGVyCWpJSW5DdGxyCi0jZGVmaW5lIGppbml0X21hcmtlcl9yZWFkZXIJaklNUmVhZGVyCi0jZGVmaW5lIGppbml0X2h1ZmZfZGVjb2RlcglqSUhEZWNvZGVyCi0jZGVmaW5lIGppbml0X3BodWZmX2RlY29kZXIJaklQSERlY29kZXIKLSNkZWZpbmUgamluaXRfaW52ZXJzZV9kY3QJaklJRENUCi0jZGVmaW5lIGppbml0X3Vwc2FtcGxlcgkJaklVcHNhbXBsZXIKLSNkZWZpbmUgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIJaklEQ29sb3IKLSNkZWZpbmUgamluaXRfMXBhc3NfcXVhbnRpemVyCWpJMVF1YW50Ci0jZGVmaW5lIGppbml0XzJwYXNzX3F1YW50aXplcglqSTJRdWFudAotI2RlZmluZSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyCWpJTVVwc2FtcGxlcgotI2RlZmluZSBqaW5pdF9tZW1vcnlfbWdyCWpJTWVtTWdyCi0jZGVmaW5lIGpkaXZfcm91bmRfdXAJCWpEaXZSb3VuZAotI2RlZmluZSBqcm91bmRfdXAJCWpSb3VuZAotI2RlZmluZSBqY29weV9zYW1wbGVfcm93cwlqQ29weVNhbXBsZXMKLSNkZWZpbmUgamNvcHlfYmxvY2tfcm93CQlqQ29weUJsb2NrcwotI2RlZmluZSBqemVyb19mYXIJCWpaZXJvRmFyCi0jZGVmaW5lIGpwZWdfemlnemFnX29yZGVyCWpaSUdUYWJsZQotI2RlZmluZSBqcGVnX25hdHVyYWxfb3JkZXIJalpBR1RhYmxlCi0jZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwotCi0KLS8qIENvbXByZXNzaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLwotRVhURVJOKHZvaWQpIGppbml0X2NvbXByZXNzX21hc3RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY19tYXN0ZXJfY29udHJvbCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgYm9vbGVhbiB0cmFuc2NvZGVfb25seSkpOwotRVhURVJOKHZvaWQpIGppbml0X2NfbWFpbl9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY19wcmVwX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9jX2NvZWZfY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2NvbG9yX2NvbnZlcnRlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZG93bnNhbXBsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2ZvcndhcmRfZGN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9odWZmX2VuY29kZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2VuY29kZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl93cml0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotLyogRGVjb21wcmVzc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KLUVYVEVSTih2b2lkKSBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9kX21haW5fY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2RfcG9zdF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9pbnB1dF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl9yZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfaHVmZl9kZWNvZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2h1ZmZfZGVjb2Rlcl9ub19kYXRhIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfaW52ZXJzZV9kY3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfdXBzYW1wbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2NvbG9yX2RlY29udmVydGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0XzFwYXNzX3F1YW50aXplciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF8ycGFzc19xdWFudGl6ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfbWVyZ2VkX3Vwc2FtcGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX2RlY29tcHJlc3NfcGVyX3NjYW5fc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pOwotLyogTWVtb3J5IG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gKi8KLUVYVEVSTih2b2lkKSBqaW5pdF9tZW1vcnlfbWdyIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLS8qIFV0aWxpdHkgcm91dGluZXMgaW4ganV0aWxzLmMgKi8KLUVYVEVSTihsb25nKSBqZGl2X3JvdW5kX3VwIEpQUCgobG9uZyBhLCBsb25nIGIpKTsKLUVYVEVSTihsb25nKSBqcm91bmRfdXAgSlBQKChsb25nIGEsIGxvbmcgYikpOwotRVhURVJOKGxvbmcpIGptaW4gSlBQKChsb25nIGEsIGxvbmcgYikpOwotRVhURVJOKHZvaWQpIGpjb3B5X3NhbXBsZV9yb3dzIEpQUCgoSlNBTVBBUlJBWSBpbnB1dF9hcnJheSwgaW50IHNvdXJjZV9yb3csCi0JCQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2FycmF5LCBpbnQgZGVzdF9yb3csCi0JCQkJICAgIGludCBudW1fcm93cywgSkRJTUVOU0lPTiBudW1fY29scykpOwotRVhURVJOKHZvaWQpIGpjb3B5X2Jsb2NrX3JvdyBKUFAoKEpCTE9DS1JPVyBpbnB1dF9yb3csIEpCTE9DS1JPVyBvdXRwdXRfcm93LAotCQkJCSAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKSk7Ci1FWFRFUk4odm9pZCkganplcm9fZmFyIEpQUCgodm9pZCBGQVIgKiB0YXJnZXQsIHNpemVfdCBieXRlc3RvemVybykpOwotCi1FWFRFUk4odm9pZCkganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KSk7Ci1FWFRFUk4odm9pZCkganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb25fYml0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVfb2Zmc2V0LCBpbnQgYml0X2xlZnQsIElOVDMyIGJ1ZikpOwotCi1FWFRFUk4oaW50KSBqZ2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbiBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLS8qIENvbnN0YW50IHRhYmxlcyBpbiBqdXRpbHMuYyAqLwotI2lmIDAJCQkJLyogVGhpcyB0YWJsZSBpcyBub3QgYWN0dWFsbHkgbmVlZGVkIGluIHY2YSAqLwotZXh0ZXJuIGNvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltdOyAvKiBuYXR1cmFsIGNvZWYgb3JkZXIgdG8gemlnemFnIG9yZGVyICovCi0jZW5kaWYKLWV4dGVybiBjb25zdCBpbnQganBlZ19uYXR1cmFsX29yZGVyW107IC8qIHppZ3phZyBjb2VmIG9yZGVyIHRvIG5hdHVyYWwgb3JkZXIgKi8KLQotLyogU3VwcHJlc3MgdW5kZWZpbmVkLXN0cnVjdHVyZSBjb21wbGFpbnRzIGlmIG5lY2Vzc2FyeS4gKi8KLQotI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0jaWZuZGVmIEFNX01FTU9SWV9NQU5BR0VSCS8qIG9ubHkgam1lbW1nci5jIGRlZmluZXMgdGhlc2UgKi8KLXN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9OwotI2VuZGlmCi0jZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2pwZWdsaWIuaCBiL2xpYmpwZWd0d3JwL2pwZWdsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlNjg3Mi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qcGVnbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg0ICswLDAgQEAKLS8qCi0gKiBqcGVnbGliLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCi0gKiBNb3N0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBuZWVkIG9ubHkgaW5jbHVkZSB0aGlzIGZpbGUsCi0gKiBhbmQgcGVyaGFwcyBqZXJyb3IuaCBpZiB0aGV5IHdhbnQgdG8ga25vdyB0aGUgZXhhY3QgZXJyb3IgY29kZXMuCi0gKi8KLQotI2lmbmRlZiBKUEVHTElCX0gKLSNkZWZpbmUgSlBFR0xJQl9ICi0KLS8qCi0gKiBGaXJzdCB3ZSBpbmNsdWRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgcmVjb3JkIGhvdyB0aGlzCi0gKiBpbnN0YWxsYXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeSBpcyBzZXQgdXAuICBqY29uZmlnLmggY2FuIGJlCi0gKiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmb3IgbWFueSBzeXN0ZW1zLiAgam1vcmVjZmcuaCBjb250YWlucwotICogbWFudWFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IG1vc3QgcGVvcGxlIG5lZWQgbm90IHdvcnJ5IGFib3V0LgotICovCi0KLSNpZm5kZWYgSkNPTkZJR19JTkNMVURFRAkvKiBpbiBjYXNlIGppbmNsdWRlLmggYWxyZWFkeSBkaWQgKi8KLSNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiB3aWRlbHkgdXNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KLSNlbmRpZgotI2luY2x1ZGUgImptb3JlY2ZnLmgiCQkvKiBzZWxkb20gY2hhbmdlZCBvcHRpb25zICovCi0KLQotLyogVmVyc2lvbiBJRCBmb3IgdGhlIEpQRUcgbGlicmFyeS4KLSAqIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgdGVzdHMgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjAiLgotICovCi0KLSNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTiAgNjIJLyogVmVyc2lvbiA2YiAqLwotCi0KLS8qIFZhcmlvdXMgY29uc3RhbnRzIGRldGVybWluaW5nIHRoZSBzaXplcyBvZiB0aGluZ3MuCi0gKiBBbGwgb2YgdGhlc2UgYXJlIHNwZWNpZmllZCBieSB0aGUgSlBFRyBzdGFuZGFyZCwgc28gZG9uJ3QgY2hhbmdlIHRoZW0KLSAqIGlmIHlvdSB3YW50IHRvIGJlIGNvbXBhdGlibGUuCi0gKi8KLQotI2RlZmluZSBEQ1RTSVpFCQkgICAgOAkvKiBUaGUgYmFzaWMgRENUIGJsb2NrIGlzIDh4OCBzYW1wbGVzICovCi0jZGVmaW5lIERDVFNJWkUyCSAgICA2NAkvKiBEQ1RTSVpFIHNxdWFyZWQ7ICMgb2YgZWxlbWVudHMgaW4gYSBibG9jayAqLwotI2RlZmluZSBOVU1fUVVBTlRfVEJMUyAgICAgIDQJLyogUXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLwotI2RlZmluZSBOVU1fSFVGRl9UQkxTICAgICAgIDQJLyogSHVmZm1hbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KLSNkZWZpbmUgTlVNX0FSSVRIX1RCTFMgICAgICAxNgkvKiBBcml0aC1jb2RpbmcgdGFibGVzIGFyZSBudW1iZXJlZCAwLi4xNSAqLwotI2RlZmluZSBNQVhfQ09NUFNfSU5fU0NBTiAgIDQJLyogSlBFRyBsaW1pdCBvbiAjIG9mIGNvbXBvbmVudHMgaW4gb25lIHNjYW4gKi8KLSNkZWZpbmUgTUFYX1NBTVBfRkFDVE9SICAgICA0CS8qIEpQRUcgbGltaXQgb24gc2FtcGxpbmcgZmFjdG9ycyAqLwotLyogVW5mb3J0dW5hdGVseSwgc29tZSBib3pvIGF0IEFkb2JlIHNhdyBubyByZWFzb24gdG8gYmUgYm91bmQgYnkgdGhlIHN0YW5kYXJkOwotICogdGhlIFBvc3RTY3JpcHQgRENUIGZpbHRlciBjYW4gZW1pdCBmaWxlcyB3aXRoIG1hbnkgbW9yZSB0aGFuIDEwIGJsb2Nrcy9NQ1UuCi0gKiBJZiB5b3UgaGFwcGVuIHRvIHJ1biBhY3Jvc3Mgc3VjaCBhIGZpbGUsIHlvdSBjYW4gdXAgRF9NQVhfQkxPQ0tTX0lOX01DVQotICogdG8gaGFuZGxlIGl0LiAgV2UgZXZlbiBsZXQgeW91IGRvIHRoaXMgZnJvbSB0aGUgamNvbmZpZy5oIGZpbGUuICBIb3dldmVyLAotICogd2Ugc3Ryb25nbHkgZGlzY291cmFnZSBjaGFuZ2luZyBDX01BWF9CTE9DS1NfSU5fTUNVOyBqdXN0IGJlY2F1c2UgQWRvYmUKLSAqIHNvbWV0aW1lcyBlbWl0cyBub25jb21wbGlhbnQgZmlsZXMgZG9lc24ndCBtZWFuIHlvdSBzaG91bGQgdG9vLgotICovCi0jZGVmaW5lIENfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KLSNpZm5kZWYgRF9NQVhfQkxPQ0tTX0lOX01DVQotI2RlZmluZSBEX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogZGVjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KLSNlbmRpZgotCi0KLS8qIERhdGEgc3RydWN0dXJlcyBmb3IgaW1hZ2VzIChhcnJheXMgb2Ygc2FtcGxlcyBhbmQgb2YgRENUIGNvZWZmaWNpZW50cykuCi0gKiBPbiA4MHg4NiBtYWNoaW5lcywgdGhlIGltYWdlIGFycmF5cyBhcmUgdG9vIGJpZyBmb3IgbmVhciBwb2ludGVycywKLSAqIGJ1dCB0aGUgcG9pbnRlciBhcnJheXMgY2FuIGZpdCBpbiBuZWFyIG1lbW9yeS4KLSAqLwotCi10eXBlZGVmIEpTQU1QTEUgRkFSICpKU0FNUFJPVzsJLyogcHRyIHRvIG9uZSBpbWFnZSByb3cgb2YgcGl4ZWwgc2FtcGxlcy4gKi8KLXR5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CS8qIHB0ciB0byBzb21lIHJvd3MgKGEgMi1EIHNhbXBsZSBhcnJheSkgKi8KLXR5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJLyogYSAzLUQgc2FtcGxlIGFycmF5OiB0b3AgaW5kZXggaXMgY29sb3IgKi8KLQotdHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwkvKiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzICovCi10eXBlZGVmIEpCTE9DSyBGQVIgKkpCTE9DS1JPVzsJLyogcG9pbnRlciB0byBvbmUgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwotdHlwZWRlZiBKQkxPQ0tST1cgKkpCTE9DS0FSUkFZOwkJLyogYSAyLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCi10eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJLyogYSAzLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCi0KLXR5cGVkZWYgSkNPRUYgRkFSICpKQ09FRlBUUjsJLyogdXNlZnVsIGluIGEgY291cGxlIG9mIHBsYWNlcyAqLwotCi0KLS8qIFR5cGVzIGZvciBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgdGFibGVzLiAqLwotCi0KLS8qIERDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFRoaXMgYXJyYXkgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50IHF1YW50aXplcnMgaW4gbmF0dXJhbCBhcnJheSBvcmRlcgotICAgKiAobm90IHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc3RvcmVkIGluIGEgSlBFRyBEUVQgbWFya2VyKS4KLSAgICogQ0FVVElPTjogSUpHIHZlcnNpb25zIHByaW9yIHRvIHY2YSBrZXB0IHRoaXMgYXJyYXkgaW4gemlnemFnIG9yZGVyLgotICAgKi8KLSAgVUlOVDE2IHF1YW50dmFsW0RDVFNJWkUyXTsJLyogcXVhbnRpemF0aW9uIHN0ZXAgZm9yIGVhY2ggY29lZmZpY2llbnQgKi8KLSAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCi0gICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgotICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCi0gICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQotICAgKi8KLSAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLwotfSBKUVVBTlRfVEJMOwotCi0KLS8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGVzZSB0d28gZmllbGRzIGRpcmVjdGx5IHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgYSBKUEVHIERIVCBtYXJrZXIgKi8KLSAgVUlOVDggYml0c1sxN107CQkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZXMgb2YgKi8KLQkJCQkvKiBsZW5ndGggayBiaXRzOyBiaXRzWzBdIGlzIHVudXNlZCAqLwotICBVSU5UOCBodWZmdmFsWzI1Nl07CQkvKiBUaGUgc3ltYm9scywgaW4gb3JkZXIgb2YgaW5jciBjb2RlIGxlbmd0aCAqLwotICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KLSAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCi0gICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KLSAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCi0gICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCi19IEpIVUZGX1RCTDsKLQotCi0vKiBCYXNpYyBpbmZvIGFib3V0IG9uZSBjb21wb25lbnQgKGNvbG9yIGNoYW5uZWwpLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgZml4ZWQgb3ZlciB0aGUgd2hvbGUgaW1hZ2UuICovCi0gIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KLSAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09GIG1hcmtlci4gKi8KLSAgaW50IGNvbXBvbmVudF9pZDsJCS8qIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50ICgwLi4yNTUpICovCi0gIGludCBjb21wb25lbnRfaW5kZXg7CQkvKiBpdHMgaW5kZXggaW4gU09GIG9yIGNpbmZvLT5jb21wX2luZm9bXSAqLwotICBpbnQgaF9zYW1wX2ZhY3RvcjsJCS8qIGhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLwotICBpbnQgdl9zYW1wX2ZhY3RvcjsJCS8qIHZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KLSAgaW50IHF1YW50X3RibF9ubzsJCS8qIHF1YW50aXphdGlvbiB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KLSAgLyogVGhlc2UgdmFsdWVzIG1heSB2YXJ5IGJldHdlZW4gc2NhbnMuICovCi0gIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KLSAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09TIG1hcmtlci4gKi8KLSAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCi0gIGludCBkY190Ymxfbm87CQkvKiBEQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLwotICBpbnQgYWNfdGJsX25vOwkJLyogQUMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KLQotICAvKiBSZW1haW5pbmcgZmllbGRzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUgYnkgYXBwbGljYXRpb25zLiAqLwotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gc3RhcnR1cDogKi8KLSAgLyogQ29tcG9uZW50J3Mgc2l6ZSBpbiBEQ1QgYmxvY2tzLgotICAgKiBBbnkgZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGNvbXBsZXRlIGFuIE1DVSBhcmUgbm90IGNvdW50ZWQ7IHRoZXJlZm9yZQotICAgKiB0aGVzZSB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB3aGV0aGVyIGEgc2NhbiBpcyBpbnRlcmxlYXZlZCBvciBub3QuCi0gICAqLwotICBKRElNRU5TSU9OIHdpZHRoX2luX2Jsb2NrczsKLSAgSkRJTUVOU0lPTiBoZWlnaHRfaW5fYmxvY2tzOwotICAvKiBTaXplIG9mIGEgRENUIGJsb2NrIGluIHNhbXBsZXMuICBBbHdheXMgRENUU0laRSBmb3IgY29tcHJlc3Npb24uCi0gICAqIEZvciBkZWNvbXByZXNzaW9uIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmcm9tIG9uZSBEQ1QgYmxvY2ssCi0gICAqIHJlZmxlY3RpbmcgYW55IHNjYWxpbmcgd2UgY2hvb3NlIHRvIGFwcGx5IGR1cmluZyB0aGUgSURDVCBzdGVwLgotICAgKiBWYWx1ZXMgb2YgMSwyLDQsOCBhcmUgbGlrZWx5IHRvIGJlIHN1cHBvcnRlZC4gIE5vdGUgdGhhdCBkaWZmZXJlbnQKLSAgICogY29tcG9uZW50cyBtYXkgcmVjZWl2ZSBkaWZmZXJlbnQgSURDVCBzY2FsaW5ncy4KLSAgICovCi0gIGludCBEQ1Rfc2NhbGVkX3NpemU7Ci0gIC8qIFRoZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIGFyZSB0aGUgY29tcG9uZW50J3MgYWN0dWFsLCB1bnBhZGRlZCBudW1iZXIKLSAgICogb2Ygc2FtcGxlcyBhdCB0aGUgbWFpbiBidWZmZXIgKHByZXByb2Nlc3NpbmcvY29tcHJlc3Npb24gaW50ZXJmYWNlKSwgdGh1cwotICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4KQotICAgKiBhbmQgc2ltaWxhcmx5IGZvciBoZWlnaHQuICBGb3IgZGVjb21wcmVzc2lvbiwgSURDVCBzY2FsaW5nIGlzIGluY2x1ZGVkLCBzbwotICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4ICogRENUX3NjYWxlZF9zaXplL0RDVFNJWkUpCi0gICAqLwotICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoOwkgLyogYWN0dWFsIHdpZHRoIGluIHNhbXBsZXMgKi8KLSAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF9oZWlnaHQ7IC8qIGFjdHVhbCBoZWlnaHQgaW4gc2FtcGxlcyAqLwotICAvKiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLiAgSW4gY2FzZXMgd2hlcmUgc29tZSBvZiB0aGUKLSAgICogY29tcG9uZW50cyB3aWxsIGJlIGlnbm9yZWQgKGVnIGdyYXlzY2FsZSBvdXRwdXQgZnJvbSBZQ2JDciBpbWFnZSksCi0gICAqIHdlIGNhbiBza2lwIG1vc3QgY29tcHV0YXRpb25zIGZvciB0aGUgdW51c2VkIGNvbXBvbmVudHMuCi0gICAqLwotICBib29sZWFuIGNvbXBvbmVudF9uZWVkZWQ7CS8qIGRvIHdlIG5lZWQgdGhlIHZhbHVlIG9mIHRoaXMgY29tcG9uZW50PyAqLwotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgc2NhbiBvZiB0aGUgY29tcG9uZW50LiAqLwotICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KLSAgaW50IE1DVV93aWR0aDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgaG9yaXpvbnRhbGx5ICovCi0gIGludCBNQ1VfaGVpZ2h0OwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCB2ZXJ0aWNhbGx5ICovCi0gIGludCBNQ1VfYmxvY2tzOwkJLyogTUNVX3dpZHRoICogTUNVX2hlaWdodCAqLwotICBpbnQgTUNVX3NhbXBsZV93aWR0aDsJCS8qIE1DVSB3aWR0aCBpbiBzYW1wbGVzLCBNQ1Vfd2lkdGgqRENUX3NjYWxlZF9zaXplICovCi0gIGludCBsYXN0X2NvbF93aWR0aDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBhY3Jvc3MgaW4gbGFzdCBNQ1UgKi8KLSAgaW50IGxhc3Rfcm93X2hlaWdodDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBkb3duIGluIGxhc3QgTUNVICovCi0KLSAgLyogU2F2ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGZvciBjb21wb25lbnQ7IE5VTEwgaWYgbm9uZSB5ZXQgc2F2ZWQuCi0gICAqIFNlZSBqZGlucHV0LmMgY29tbWVudHMgYWJvdXQgdGhlIG5lZWQgZm9yIHRoaXMgaW5mb3JtYXRpb24uCi0gICAqIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4KLSAgICovCi0gIEpRVUFOVF9UQkwgKiBxdWFudF90YWJsZTsKLQotICAvKiBQcml2YXRlIHBlci1jb21wb25lbnQgc3RvcmFnZSBmb3IgRENUIG9yIElEQ1Qgc3Vic3lzdGVtLiAqLwotICB2b2lkICogZGN0X3RhYmxlOwotfSBqcGVnX2NvbXBvbmVudF9pbmZvOwotCi0KLS8qIFRoZSBzY3JpcHQgZm9yIGVuY29kaW5nIGEgbXVsdGlwbGUtc2NhbiBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlOiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBjb21wc19pbl9zY2FuOwkJLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgZW5jb2RlZCBpbiB0aGlzIHNjYW4gKi8KLSAgaW50IGNvbXBvbmVudF9pbmRleFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIHRoZWlyIFNPRi9jb21wX2luZm9bXSBpbmRleGVzICovCi0gIGludCBTcywgU2U7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzcGVjdHJhbCBzZWxlY3Rpb24gcGFybXMgKi8KLSAgaW50IEFoLCBBbDsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHN1Y2Nlc3NpdmUgYXBwcm94LiBwYXJtcyAqLwotfSBqcGVnX3NjYW5faW5mbzsKLQotLyogVGhlIGRlY29tcHJlc3NvciBjYW4gc2F2ZSBBUFBuIGFuZCBDT00gbWFya2VycyBpbiBhIGxpc3Qgb2YgdGhlc2U6ICovCi0KLXR5cGVkZWYgc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCBGQVIgKiBqcGVnX3NhdmVkX21hcmtlcl9wdHI7Ci0KLXN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgewotICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0LCBvciBOVUxMICovCi0gIFVJTlQ4IG1hcmtlcjsJCQkvKiBtYXJrZXIgY29kZTogSlBFR19DT00sIG9yIEpQRUdfQVBQMCtuICovCi0gIHVuc2lnbmVkIGludCBvcmlnaW5hbF9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBpbiB0aGUgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgZGF0YV9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBzYXZlZCBhdCBkYXRhW10gKi8KLSAgSk9DVEVUIEZBUiAqIGRhdGE7CQkvKiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIG1hcmtlciAqLwotICAvKiB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGlzIG5vdCBjb3VudGVkIGluIGRhdGFfbGVuZ3RoIG9yIG9yaWdpbmFsX2xlbmd0aCAqLwotfTsKLQotLyogS25vd24gY29sb3Igc3BhY2VzLiAqLwotCi10eXBlZGVmIGVudW0gewotCUpDU19VTktOT1dOLAkJLyogZXJyb3IvdW5zcGVjaWZpZWQgKi8KLQlKQ1NfR1JBWVNDQUxFLAkJLyogbW9ub2Nocm9tZSAqLwotCUpDU19SR0IsCQkvKiByZWQvZ3JlZW4vYmx1ZSAqLwotCUpDU19ZQ2JDciwJCS8qIFkvQ2IvQ3IgKGFsc28ga25vd24gYXMgWVVWKSAqLwotCUpDU19DTVlLLAkJLyogQy9NL1kvSyAqLwotCUpDU19ZQ0NLLAkJLyogWS9DYi9Dci9LICovCi0jaWZkZWYgQU5EUk9JRF9SR0IKLSAgICBKQ1NfUkdCQV84ODg4LCAgLyogcmVkL2dyZWVuL2JsdWUvYWxwaGEgKi8KLSAgICBKQ1NfUkdCXzU2NSAgICAgLyogcmVkL2dyZWVuL2JsdWUgaW4gNTY1IGZvcm1hdCAqLwotI2VuZGlmCi19IEpfQ09MT1JfU1BBQ0U7Ci0KLS8qIERDVC9JRENUIGFsZ29yaXRobSBvcHRpb25zLiAqLwotCi10eXBlZGVmIGVudW0gewotCUpEQ1RfSVNMT1csCQkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLwotCUpEQ1RfSUZBU1QsCQkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KLQlKRENUX0ZMT0FUCQkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLwotfSBKX0RDVF9NRVRIT0Q7Ci0KLSNpZm5kZWYgSkRDVF9ERUZBVUxUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgSkRDVF9ERUZBVUxUICBKRENUX0lTTE9XCi0jZW5kaWYKLSNpZm5kZWYgSkRDVF9GQVNURVNUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgSkRDVF9GQVNURVNUICBKRENUX0lGQVNUCi0jZW5kaWYKLQotLyogRGl0aGVyaW5nIG9wdGlvbnMgZm9yIGRlY29tcHJlc3Npb24uICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkRJVEhFUl9OT05FLAkJLyogbm8gZGl0aGVyaW5nICovCi0JSkRJVEhFUl9PUkRFUkVELAkvKiBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgKi8KLQlKRElUSEVSX0ZTCQkvKiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uIGRpdGhlciAqLwotfSBKX0RJVEhFUl9NT0RFOwotCi0KLS8qIENvbW1vbiBmaWVsZHMgYmV0d2VlbiBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG1hc3RlciBzdHJ1Y3RzLiAqLwotCi0jZGVmaW5lIGpwZWdfY29tbW9uX2ZpZWxkcyBcCi0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycjsJLyogRXJyb3IgaGFuZGxlciBtb2R1bGUgKi9cCi0gIHN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgKiBtZW07CS8qIE1lbW9yeSBtYW5hZ2VyIG1vZHVsZSAqL1wKLSAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyICogcHJvZ3Jlc3M7IC8qIFByb2dyZXNzIG1vbml0b3IsIG9yIE5VTEwgaWYgbm9uZSAqL1wKLSAgdm9pZCAqIGNsaWVudF9kYXRhOwkJLyogQXZhaWxhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb24gKi9cCi0gIGJvb2xlYW4gaXNfZGVjb21wcmVzc29yOwkvKiBTbyBjb21tb24gY29kZSBjYW4gdGVsbCB3aGljaCBpcyB3aGljaCAqL1wKLSAgaW50IGdsb2JhbF9zdGF0ZQkJLyogRm9yIGNoZWNraW5nIGNhbGwgc2VxdWVuY2UgdmFsaWRpdHkgKi8KLQotLyogUm91dGluZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBib3RoIGhhbHZlcyBvZiB0aGUgbGlicmFyeSBhcmUgZGVjbGFyZWQKLSAqIHRvIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlcmUgYXJlIG5vIGFjdHVhbCBpbnN0YW5jZXMgb2YKLSAqIGpwZWdfY29tbW9uX3N0cnVjdCwgb25seSBvZiBqcGVnX2NvbXByZXNzX3N0cnVjdCBhbmQganBlZ19kZWNvbXByZXNzX3N0cnVjdC4KLSAqLwotc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCB7Ci0gIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBjb21tb24gdG8gYm90aCBtYXN0ZXIgc3RydWN0IHR5cGVzICovCi0gIC8qIEFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyBpbiBhbiBhY3R1YWwganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IKLSAgICoganBlZ19kZWNvbXByZXNzX3N0cnVjdC4gIEFsbCB0aHJlZSBzdHJ1Y3RzIG11c3QgYWdyZWUgb24gdGhlc2UKLSAgICogaW5pdGlhbCBmaWVsZHMhICAoVGhpcyB3b3VsZCBiZSBhIGxvdCBjbGVhbmVyIGluIEMrKy4pCi0gICAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0ICogal9jb21tb25fcHRyOwotdHlwZWRlZiBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgKiBqX2NvbXByZXNzX3B0cjsKLXR5cGVkZWYgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKiBqX2RlY29tcHJlc3NfcHRyOwotCi0KLS8qIE1hc3RlciByZWNvcmQgZm9yIGEgY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KLQotc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IHsKLSAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKi8KLQotICAvKiBEZXN0aW5hdGlvbiBmb3IgY29tcHJlc3NlZCBkYXRhICovCi0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3Q7Ci0KLSAgLyogRGVzY3JpcHRpb24gb2Ygc291cmNlIGltYWdlIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBmaWxsZWQgaW4gYnkKLSAgICogb3V0ZXIgYXBwbGljYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGNvbXByZXNzaW9uLiAgaW5fY29sb3Jfc3BhY2UgbXVzdAotICAgKiBiZSBjb3JyZWN0IGJlZm9yZSB5b3UgY2FuIGV2ZW4gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpLgotICAgKi8KLQotICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBpbnB1dCBpbWFnZSB3aWR0aCAqLwotICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogaW5wdXQgaW1hZ2UgaGVpZ2h0ICovCi0gIGludCBpbnB1dF9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIGlucHV0IGltYWdlICovCi0gIEpfQ09MT1JfU1BBQ0UgaW5fY29sb3Jfc3BhY2U7CS8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KLQotICBkb3VibGUgaW5wdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSBvZiBpbnB1dCBpbWFnZSAqLwotCi0gIC8qIENvbXByZXNzaW9uIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZwotICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBXZSByZWNvbW1lbmQgY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIHRvCi0gICAqIGluaXRpYWxpemUgZXZlcnl0aGluZyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB0aGVuIGNoYW5naW5nIGFueXRoaW5nCi0gICAqIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2FsbHkgd2FudHMgdG8gY2hhbmdlLiAgVGhhdCB3YXkgeW91IHdvbid0IGdldAotICAgKiBidXJudCB3aGVuIG5ldyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gIEFsc28gbm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsCi0gICAqIGhlbHBlciByb3V0aW5lcyB0byBzaW1wbGlmeSBjaGFuZ2luZyBwYXJhbWV0ZXJzLgotICAgKi8KLQotICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCi0KLSAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KLSAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KLQotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOwotICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KLQotICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOwotICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KLQotICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotCi0gIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotCi0gIGludCBudW1fc2NhbnM7CQkvKiAjIG9mIGVudHJpZXMgaW4gc2Nhbl9pbmZvIGFycmF5ICovCi0gIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvOyAvKiBzY3JpcHQgZm9yIG11bHRpLXNjYW4gZmlsZSwgb3IgTlVMTCAqLwotICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBzY2FuX2luZm8gaXMgTlVMTCwgd2hpY2ggY2F1c2VzIGEgc2luZ2xlLXNjYW4KLSAgICogc2VxdWVudGlhbCBKUEVHIGZpbGUgdG8gYmUgZW1pdHRlZC4gIFRvIGNyZWF0ZSBhIG11bHRpLXNjYW4gZmlsZSwKLSAgICogc2V0IG51bV9zY2FucyBhbmQgc2Nhbl9pbmZvIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbnMuCi0gICAqLwotCi0gIGJvb2xlYW4gcmF3X2RhdGFfaW47CQkvKiBUUlVFPWNhbGxlciBzdXBwbGllcyBkb3duc2FtcGxlZCBkYXRhICovCi0gIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KLSAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLwotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLwotICBpbnQgc21vb3RoaW5nX2ZhY3RvcjsJCS8qIDEuLjEwMCwgb3IgMCBmb3Igbm8gaW5wdXQgc21vb3RoaW5nICovCi0gIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCi0KLSAgLyogVGhlIHJlc3RhcnQgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBpbiBhYnNvbHV0ZSBNQ1VzIGJ5IHNldHRpbmcKLSAgICogcmVzdGFydF9pbnRlcnZhbCwgb3IgaW4gTUNVIHJvd3MgYnkgc2V0dGluZyByZXN0YXJ0X2luX3Jvd3MKLSAgICogKGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QgcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGZpZ3VyZWQKLSAgICogZm9yIGVhY2ggc2NhbikuCi0gICAqLwotICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLwotICBpbnQgcmVzdGFydF9pbl9yb3dzOwkJLyogaWYgPiAwLCBNQ1Ugcm93cyBwZXIgcmVzdGFydCBpbnRlcnZhbCAqLwotCi0gIC8qIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgZW1pc3Npb24gb2Ygc3BlY2lhbCBtYXJrZXJzLiAqLwotCi0gIGJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXI7CS8qIHNob3VsZCBhIEpGSUYgbWFya2VyIGJlIHdyaXR0ZW4/ICovCi0gIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogV2hhdCB0byB3cml0ZSBmb3IgdGhlIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KLSAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOwotICAvKiBUaGVzZSB0aHJlZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IHRoZSBKUEVHIGNvZGUsIG1lcmVseSBjb3BpZWQgKi8KLSAgLyogaW50byB0aGUgSkZJRiBBUFAwIG1hcmtlci4gIGRlbnNpdHlfdW5pdCBjYW4gYmUgMCBmb3IgdW5rbm93biwgKi8KLSAgLyogMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgTm90ZSB0aGF0IHRoZSBwaXhlbCBhc3BlY3QgKi8KLSAgLyogcmF0aW8gaXMgZGVmaW5lZCBieSBYX2RlbnNpdHkvWV9kZW5zaXR5IGV2ZW4gd2hlbiBkZW5zaXR5X3VuaXQ9MC4gKi8KLSAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCi0gIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KLSAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KLSAgYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXI7CS8qIHNob3VsZCBhbiBBZG9iZSBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KLQotICAvKiBTdGF0ZSB2YXJpYWJsZTogaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSB3cml0dGVuIHRvCi0gICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMKLSAgICogcHJvY2Vzc2luZyBsb29wLCBlLmcuLCAid2hpbGUgKG5leHRfc2NhbmxpbmUgPCBpbWFnZV9oZWlnaHQpIi4KLSAgICovCi0KLSAgSkRJTUVOU0lPTiBuZXh0X3NjYW5saW5lOwkvKiAwIC4uIGltYWdlX2hlaWdodC0xICAqLwotCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQotICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KLSAgICovCi0KLSAgLyoKLSAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cAotICAgKi8KLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLwotICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLwotICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLwotCi0gIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyB0byBiZSBpbnB1dCB0byBjb2VmIGN0bHIgKi8KLSAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgcmVjZWl2ZXMgZGF0YSBpbiB1bml0cyBvZiBNQ1Ugcm93cyBhcyBkZWZpbmVkCi0gICAqIGZvciBmdWxseSBpbnRlcmxlYXZlZCBzY2FucyAod2hldGhlciB0aGUgSlBFRyBmaWxlIGlzIGludGVybGVhdmVkIG9yIG5vdCkuCi0gICAqIFRoZXJlIGFyZSB2X3NhbXBfZmFjdG9yICogRENUU0laRSBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudCBpbiBhbgotICAgKiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93LgotICAgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCi0gICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgotICAgKi8KLSAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOwotICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLwotCi0gIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLwotICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCi0KLSAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLwotICBpbnQgTUNVX21lbWJlcnNoaXBbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLwotICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLwotCi0gIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLwotCi0gIC8qCi0gICAqIExpbmtzIHRvIGNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMgYW5kIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCi0gICAqLwotICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqIG1hc3RlcjsKLSAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKiBtYWluOwotICBzdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciAqIHByZXA7Ci0gIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICogY29lZjsKLSAgc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciAqIG1hcmtlcjsKLSAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyICogY2NvbnZlcnQ7Ci0gIHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICogZG93bnNhbXBsZTsKLSAgc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKiBmZGN0OwotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKiBlbnRyb3B5OwotICBqcGVnX3NjYW5faW5mbyAqIHNjcmlwdF9zcGFjZTsgLyogd29ya3NwYWNlIGZvciBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAqLwotICBpbnQgc2NyaXB0X3NwYWNlX3NpemU7Ci19OwotCi0KLS8qIE1hc3RlciByZWNvcmQgZm9yIGEgZGVjb21wcmVzc2lvbiBpbnN0YW5jZSAqLwotCi1zdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCB7Ci0gIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBzaGFyZWQgd2l0aCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqLwotCi0gIC8qIFNvdXJjZSBvZiBjb21wcmVzc2VkIGRhdGEgKi8KLSAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIHNyYzsKLQotICAvKiBCYXNpYyBkZXNjcmlwdGlvbiBvZiBpbWFnZSAtLS0gZmlsbGVkIGluIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gKi8KLSAgLyogQXBwbGljYXRpb24gbWF5IGluc3BlY3QgdGhlc2UgdmFsdWVzIHRvIGRlY2lkZSBob3cgdG8gcHJvY2VzcyBpbWFnZS4gKi8KLQotICBKRElNRU5TSU9OIG9yaWdpbmFsX2ltYWdlX3dpZHRoOwkvKiBub21pbmFsIGltYWdlIHdpZHRoIChmcm9tIFNPRiBtYXJrZXIpICovCi0KLSAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aDsJLyogbm9taW5hbCBpbWFnZSB3aWR0aCAoZnJvbSBTT0YgbWFya2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBjaGFuZ2VkIGJ5IHRpbGUgZGVjb2RlICovCi0gIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBub21pbmFsIGltYWdlIGhlaWdodCAqLwotICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLwotICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLwotCi0gIC8qIERlY29tcHJlc3Npb24gcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBzZXQgYmVmb3JlCi0gICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBOb3RlIHRoYXQganBlZ19yZWFkX2hlYWRlcigpIGluaXRpYWxpemVzCi0gICAqIHRoZW0gdG8gZGVmYXVsdCB2YWx1ZXMuCi0gICAqLwotCi0gIEpfQ09MT1JfU1BBQ0Ugb3V0X2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIGZvciBvdXRwdXQgKi8KLQotICB1bnNpZ25lZCBpbnQgc2NhbGVfbnVtLCBzY2FsZV9kZW5vbTsgLyogZnJhY3Rpb24gYnkgd2hpY2ggdG8gc2NhbGUgaW1hZ2UgKi8KLQotICBkb3VibGUgb3V0cHV0X2dhbW1hOwkJLyogaW1hZ2UgZ2FtbWEgd2FudGVkIGluIG91dHB1dCAqLwotCi0gIGJvb2xlYW4gYnVmZmVyZWRfaW1hZ2U7CS8qIFRSVUU9bXVsdGlwbGUgb3V0cHV0IHBhc3NlcyAqLwotICBib29sZWFuIHJhd19kYXRhX291dDsJCS8qIFRSVUU9ZG93bnNhbXBsZWQgZGF0YSB3YW50ZWQgKi8KLQotICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogSURDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KLSAgYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nOwkvKiBUUlVFPWFwcGx5IGZhbmN5IHVwc2FtcGxpbmcgKi8KLSAgYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmc7CS8qIFRSVUU9YXBwbHkgaW50ZXJibG9jayBzbW9vdGhpbmcgKi8KLQotICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogVFJVRT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCi0gIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQgaWYgbm90IHF1YW50aXplX2NvbG9yczogKi8KLSAgSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZTsJLyogdHlwZSBvZiBjb2xvciBkaXRoZXJpbmcgdG8gdXNlICovCi0gIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIFRSVUU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLwotICBpbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwkvKiBtYXggIyBjb2xvcnMgdG8gdXNlIGluIGNyZWF0ZWQgY29sb3JtYXAgKi8KLSAgLyogdGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZTogKi8KLSAgYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDEtcGFzcyBxdWFudGl6ZXIgKi8KLSAgYm9vbGVhbiBlbmFibGVfZXh0ZXJuYWxfcXVhbnQ7LyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgZXh0ZXJuYWwgY29sb3JtYXAgKi8KLSAgYm9vbGVhbiBlbmFibGVfMnBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDItcGFzcyBxdWFudGl6ZXIgKi8KLQotICAvKiBEZXNjcmlwdGlvbiBvZiBhY3R1YWwgb3V0cHV0IGltYWdlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byBhcHBsaWNhdGlvbi4KLSAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBieSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLSAgICogWW91IGNhbiBhbHNvIHVzZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKSB0byBkZXRlcm1pbmUgdGhlc2UgdmFsdWVzCi0gICAqIGluIGFkdmFuY2Ugb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLSAgICovCi0KLSAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGg7CS8qIHNjYWxlZCBpbWFnZSB3aWR0aCAqLwotICBKRElNRU5TSU9OIG91dHB1dF9oZWlnaHQ7CS8qIHNjYWxlZCBpbWFnZSBoZWlnaHQgKi8KLSAgaW50IG91dF9jb2xvcl9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlICovCi0gIGludCBvdXRwdXRfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkICovCi0gIC8qIG91dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7Ci0gICAqIG90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuCi0gICAqLwotICBpbnQgcmVjX291dGJ1Zl9oZWlnaHQ7CS8qIG1pbiByZWNvbW1lbmRlZCBoZWlnaHQgb2Ygc2NhbmxpbmUgYnVmZmVyICovCi0gIC8qIElmIHRoZSBidWZmZXIgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBpcyBsZXNzIHRoYW4gdGhpcyBtYW55IHJvd3MKLSAgICogaGlnaCwgc3BhY2UgYW5kIHRpbWUgd2lsbCBiZSB3YXN0ZWQgZHVlIHRvIHVubmVjZXNzYXJ5IGRhdGEgY29weWluZy4KLSAgICogVXN1YWxseSByZWNfb3V0YnVmX2hlaWdodCB3aWxsIGJlIDEgb3IgMiwgYXQgbW9zdCA0LgotICAgKi8KLQotICAvKiBXaGVuIHF1YW50aXppbmcgY29sb3JzLCB0aGUgb3V0cHV0IGNvbG9ybWFwIGlzIGRlc2NyaWJlZCBieSB0aGVzZSBmaWVsZHMuCi0gICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gc3VwcGx5IGEgY29sb3JtYXAgYnkgc2V0dGluZyBjb2xvcm1hcCBub24tTlVMTCBiZWZvcmUKLSAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3M7IG90aGVyd2lzZSBhIGNvbG9ybWFwIGlzIGNyZWF0ZWQgZHVyaW5nCi0gICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBvciBqcGVnX3N0YXJ0X291dHB1dC4KLSAgICogVGhlIG1hcCBoYXMgb3V0X2NvbG9yX2NvbXBvbmVudHMgcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4KLSAgICovCi0gIGludCBhY3R1YWxfbnVtYmVyX29mX2NvbG9yczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdXNlICovCi0gIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBUaGUgY29sb3IgbWFwIGFzIGEgMi1EIHBpeGVsIGFycmF5ICovCi0KLSAgLyogU3RhdGUgdmFyaWFibGVzOiB0aGVzZSB2YXJpYWJsZXMgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIGRlY29tcHJlc3Npb24uCi0gICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgZXhhbWluZSB0aGVzZSBidXQgbXVzdCBub3QgbW9kaWZ5IHRoZW0uCi0gICAqLwotCi0gIC8qIFJvdyBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHJlYWQgZnJvbSBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCi0gICAqIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cyBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sCi0gICAqICJ3aGlsZSAob3V0cHV0X3NjYW5saW5lIDwgb3V0cHV0X2hlaWdodCkiLgotICAgKi8KLSAgSkRJTUVOU0lPTiBvdXRwdXRfc2NhbmxpbmU7CS8qIDAgLi4gb3V0cHV0X2hlaWdodC0xICAqLwotCi0gIC8qIEN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgYW5kIG51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkIGluIHNjYW4uCi0gICAqIFRoZXNlIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiB0aGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUuCi0gICAqLwotICBpbnQgaW5wdXRfc2Nhbl9udW1iZXI7CS8qIE51bWJlciBvZiBTT1MgbWFya2VycyBzZWVuIHNvIGZhciAqLwotICBKRElNRU5TSU9OIGlucHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCAqLwotCi0gIC8qIFRoZSAib3V0cHV0IHNjYW4gbnVtYmVyIiBpcyB0aGUgbm90aW9uYWwgc2NhbiBiZWluZyBkaXNwbGF5ZWQgYnkgdGhlCi0gICAqIG91dHB1dCBzaWRlLiAgVGhlIGRlY29tcHJlc3NvciB3aWxsIG5vdCBhbGxvdyBvdXRwdXQgc2Nhbi9yb3cgbnVtYmVyCi0gICAqIHRvIGdldCBhaGVhZCBvZiBpbnB1dCBzY2FuL3JvdywgYnV0IGl0IGNhbiBmYWxsIGFyYml0cmFyaWx5IGZhciBiZWhpbmQuCi0gICAqLwotICBpbnQgb3V0cHV0X3NjYW5fbnVtYmVyOwkvKiBOb21pbmFsIHNjYW4gbnVtYmVyIGJlaW5nIGRpc3BsYXllZCAqLwotICBKRElNRU5TSU9OIG91dHB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyByZWFkICovCi0KLSAgLyogQ3VycmVudCBwcm9ncmVzc2lvbiBzdGF0dXMuICBjb2VmX2JpdHNbY11baV0gaW5kaWNhdGVzIHRoZSBwcmVjaXNpb24KLSAgICogd2l0aCB3aGljaCBjb21wb25lbnQgYydzIERDVCBjb2VmZmljaWVudCBpIChpbiB6aWd6YWcgb3JkZXIpIGlzIGtub3duLgotICAgKiBJdCBpcyAtMSB3aGVuIG5vIGRhdGEgaGFzIHlldCBiZWVuIHJlY2VpdmVkLCBvdGhlcndpc2UgaXQgaXMgdGhlIHBvaW50Ci0gICAqIHRyYW5zZm9ybSAoc2hpZnQpIHZhbHVlIGZvciB0aGUgbW9zdCByZWNlbnQgc2NhbiBvZiB0aGUgY29lZmZpY2llbnQKLSAgICogKHRodXMsIDAgYXQgY29tcGxldGlvbiBvZiB0aGUgcHJvZ3Jlc3Npb24pLgotICAgKiBUaGlzIHBvaW50ZXIgaXMgTlVMTCB3aGVuIHJlYWRpbmcgYSBub24tcHJvZ3Jlc3NpdmUgZmlsZS4KLSAgICovCi0gIGludCAoKmNvZWZfYml0cylbRENUU0laRTJdOwkvKiAtMSBvciBjdXJyZW50IEFsIHZhbHVlIGZvciBlYWNoIGNvZWYgKi8KLQotICAvKiBJbnRlcm5hbCBKUEVHIHBhcmFtZXRlcnMgLS0tIHRoZSBhcHBsaWNhdGlvbiB1c3VhbGx5IG5lZWQgbm90IGxvb2sgYXQKLSAgICogdGhlc2UgZmllbGRzLiAgTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UKLSAgICogYW55IHBhcmFtZXRlcnMgdGhhdCBjYW4gY2hhbmdlIGJldHdlZW4gc2NhbnMuCi0gICAqLwotCi0gIC8qIFF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMgYXJlIGNhcnJpZWQgZm9yd2FyZCBhY3Jvc3MgaW5wdXQKLSAgICogZGF0YXN0cmVhbXMgd2hlbiBwcm9jZXNzaW5nIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuCi0gICAqLwotCi0gIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107Ci0gIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotCi0gIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0KLSAgLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgbmV2ZXIgY2FycmllZCBhY3Jvc3MgZGF0YXN0cmVhbXMsIHNpbmNlIHRoZXkKLSAgICogYXJlIGdpdmVuIGluIFNPRi9TT1MgbWFya2VycyBvciBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSS4KLSAgICovCi0KLSAgaW50IGRhdGFfcHJlY2lzaW9uOwkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gaW1hZ2UgZGF0YSAqLwotCi0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87Ci0gIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLwotCi0gIGJvb2xlYW4gdGlsZV9kZWNvZGU7ICAgICAgICAgLyogVFJVRSBpZiB1c2luZyB0aWxlIGJhc2VkIGRlY29kaW5nICovCi0gIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBTT0ZuIHNwZWNpZmllcyBwcm9ncmVzc2l2ZSBtb2RlICovCi0gIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KLQotICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0gIFVJTlQ4IGFyaXRoX2FjX0tbTlVNX0FSSVRIX1RCTFNdOyAvKiBLeCB2YWx1ZXMgZm9yIEFDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLQotICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCBpbnRlcnZhbCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyByZWNvcmQgZGF0YSBvYnRhaW5lZCBmcm9tIG9wdGlvbmFsIG1hcmtlcnMgcmVjb2duaXplZCBieQotICAgKiB0aGUgSlBFRyBsaWJyYXJ5LgotICAgKi8KLSAgYm9vbGVhbiBzYXdfSkZJRl9tYXJrZXI7CS8qIFRSVUUgaWZmIGEgSkZJRiBBUFAwIG1hcmtlciB3YXMgZm91bmQgKi8KLSAgLyogRGF0YSBjb3BpZWQgZnJvbSBKRklGIG1hcmtlcjsgb25seSB2YWxpZCBpZiBzYXdfSkZJRl9tYXJrZXIgaXMgVFJVRTogKi8KLSAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBKRklGIHZlcnNpb24gbnVtYmVyICovCi0gIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbjsKLSAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCi0gIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KLSAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KLSAgYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyOwkvKiBUUlVFIGlmZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIGZvdW5kICovCi0gIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybTsJLyogQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIgKi8KLQotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLwotCi0gIC8qIEFzaWRlIGZyb20gdGhlIHNwZWNpZmljIGRhdGEgcmV0YWluZWQgZnJvbSBBUFBuIG1hcmtlcnMga25vd24gdG8gdGhlCi0gICAqIGxpYnJhcnksIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIGFueSBvciBhbGwgQVBQbiBhbmQgQ09NIG1hcmtlcnMKLSAgICogY2FuIGJlIHNhdmVkIGluIGEgbGlzdCBmb3IgZXhhbWluYXRpb24gYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgKi8KLSAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcl9saXN0OyAvKiBIZWFkIG9mIGxpc3Qgb2Ygc2F2ZWQgbWFya2VycyAqLwotCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgZGVjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5Ci0gICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICAgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIHN0YXJ0dXAKLSAgICovCi0gIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCi0gIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCi0KLSAgaW50IG1pbl9EQ1Rfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF9zY2FsZWRfc2l6ZSBvZiBhbnkgY29tcG9uZW50ICovCi0KLSAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIGluIGltYWdlICovCi0gIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgaW5wdXQgYW5kIG91dHB1dCBwcm9ncmVzcyBpcyBtZWFzdXJlZCBpbgotICAgKiB1bml0cyBvZiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93cy4gIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBNQ1Ugcm93cwotICAgKiBpbiBmdWxseSBpbnRlcmxlYXZlZCBKUEVHIHNjYW5zLCBidXQgYXJlIHVzZWQgd2hldGhlciB0aGUgc2NhbiBpcwotICAgKiBpbnRlcmxlYXZlZCBvciBub3QuICBXZSBkZWZpbmUgYW4gaU1DVSByb3cgYXMgdl9zYW1wX2ZhY3RvciBEQ1QgYmxvY2sKLSAgICogcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZXJlZm9yZSwgdGhlIElEQ1Qgb3V0cHV0IGNvbnRhaW5zCi0gICAqIHZfc2FtcF9mYWN0b3IqRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzIG9mIGEgY29tcG9uZW50IHBlciBpTUNVIHJvdy4KLSAgICovCi0KLSAgSlNBTVBMRSAqIHNhbXBsZV9yYW5nZV9saW1pdDsgLyogdGFibGUgZm9yIGZhc3QgcmFuZ2UtbGltaXRpbmcgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCi0gICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgotICAgKiBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtdXN0IG5vdCB1c2UgdGhlc2UgZmllbGRzLgotICAgKi8KLSAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOwotICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLwotCi0gIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLwotICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCi0KLSAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLwotICBpbnQgTUNVX21lbWJlcnNoaXBbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLwotICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLwotCi0gIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLwotCi0gIC8qIFRoaXMgZmllbGQgaXMgc2hhcmVkIGJldHdlZW4gZW50cm9weSBkZWNvZGVyIGFuZCBtYXJrZXIgcGFyc2VyLgotICAgKiBJdCBpcyBlaXRoZXIgemVybyBvciB0aGUgY29kZSBvZiBhIEpQRUcgbWFya2VyIHRoYXQgaGFzIGJlZW4KLSAgICogcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgYnV0IGhhcyBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkLgotICAgKi8KLSAgaW50IHVucmVhZF9tYXJrZXI7Ci0KLSAgLyoKLSAgICogTGlua3MgdG8gZGVjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzLCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQotICAgKi8KLSAgc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciAqIG1hc3RlcjsKLSAgc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKiBtYWluOwotICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciAqIGNvZWY7Ci0gIHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICogcG9zdDsKLSAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciAqIGlucHV0Y3RsOwotICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyICogbWFya2VyOwotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKiBlbnRyb3B5OwotICBzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqIGlkY3Q7Ci0gIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqIHVwc2FtcGxlOwotICBzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciAqIGNjb252ZXJ0OwotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBjcXVhbnRpemU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgLy8gfC0tLSBieXRlX29mZnNldCAtLS18LSBiaXRfbGVmdCAtfAotICAvLyAgXC0tLS0tLSAyNyAtLS0tLS0tLyBcLS0tLSA1IC0tLS0vCi0gIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fb2Zmc2V0OwotICBzaG9ydCBwcmV2X2RjWzNdOwotCi0gIC8vIHJlbWFpbmluZyBFT0JzIGluIEVPQlJVTgotICB1bnNpZ25lZCBzaG9ydCBFT0JSVU47Ci0KLSAgLy8gc2F2ZSB0aGUgZGVjb2RlciBjdXJyZW50IGJpdCBidWZmZXIsIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIuCi0gIElOVDMyIGdldF9idWZmZXI7Ci0KLSAgLy8gc2F2ZSB0aGUgcmVzdGFydCBpbmZvLgotICB1bnNpZ25lZCBzaG9ydCByZXN0YXJ0c190b19nbzsKLSAgdW5zaWduZWQgY2hhciBuZXh0X3Jlc3RhcnRfbnVtOwotfSBodWZmbWFuX29mZnNldF9kYXRhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgLy8gVGhlIGhlYWRlciBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGlzIHNjYW4KLSAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9vZmZzZXQ7Ci0KLSAgLy8gTnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuCi0gIGludCBjb21wc19pbl9zY2FuOwotCi0gIC8vIE51bWJlciBvZiBNQ1VzIGluIGVhY2ggcm93Ci0gIGludCBNQ1VzX3Blcl9yb3c7Ci0gIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0KLSAgLy8gVGhlIGxhc3QgTUNVIHBvc2l0aW9uIGFuZCBpdHMgZGMgdmFsdWUgaW4gdGhpcyBzY2FuCi0gIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgcHJldl9NQ1Vfb2Zmc2V0OwotCi0gIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKipvZmZzZXQ7Ci19IGh1ZmZtYW5fc2Nhbl9oZWFkZXI7Ci0KLSNkZWZpbmUgREVGQVVMVF9NQ1VfU0FNUExFX1NJWkUgMTYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCi0gIC8vIFRoZSBudW1iZXIgb2YgTUNVcyB0aGF0IHdlIHNhbXBsZSBlYWNoIHRpbWUgYXMgYW4gaW5kZXggcG9pbnQKLSAgaW50IE1DVV9zYW1wbGVfc2l6ZTsKLQotICAvLyBOdW1iZXIgb2Ygc2NhbiBpbiB0aGlzIGltYWdlCi0gIGludCBzY2FuX2NvdW50OwotCi0gIC8vIE51bWJlciBvZiBpTUNVcyByb3dzIGluIHRoaXMgaW1hZ2UKLSAgaW50IHRvdGFsX2lNQ1Vfcm93czsKLQotICAvLyBNZW1vcnkgdXNlZCBieSBzY2FuIHN0cnVjdAotICBzaXplX3QgbWVtX3VzZWQ7Ci0gIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW47Ci19IGh1ZmZtYW5faW5kZXg7Ci0KLS8qICJPYmplY3QiIGRlY2xhcmF0aW9ucyBmb3IgSlBFRyBtb2R1bGVzIHRoYXQgbWF5IGJlIHN1cHBsaWVkIG9yIGNhbGxlZAotICogZGlyZWN0bHkgYnkgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICogQXMgd2l0aCBhbGwgb2JqZWN0cyBpbiB0aGUgSlBFRyBsaWJyYXJ5LCB0aGVzZSBzdHJ1Y3RzIG9ubHkgZGVmaW5lIHRoZQotICogcHVibGljbHkgdmlzaWJsZSBtZXRob2RzIGFuZCBzdGF0ZSB2YXJpYWJsZXMgb2YgYSBtb2R1bGUuICBBZGRpdGlvbmFsCi0gKiBwcml2YXRlIGZpZWxkcyBtYXkgZXhpc3QgYWZ0ZXIgdGhlIHB1YmxpYyBvbmVzLgotICovCi0KLQotLyogRXJyb3IgaGFuZGxlciBvYmplY3QgKi8KLQotc3RydWN0IGpwZWdfZXJyb3JfbWdyIHsKLSAgLyogRXJyb3IgZXhpdCBoYW5kbGVyOiBkb2VzIG5vdCByZXR1cm4gdG8gY2FsbGVyICovCi0gIEpNRVRIT0Qodm9pZCwgZXJyb3JfZXhpdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotICAvKiBDb25kaXRpb25hbGx5IGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCBlbWl0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpKTsKLSAgLyogUm91dGluZSB0aGF0IGFjdHVhbGx5IG91dHB1dHMgYSB0cmFjZSBvciBlcnJvciBtZXNzYWdlICovCi0gIEpNRVRIT0Qodm9pZCwgb3V0cHV0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSAgLyogRm9ybWF0IGEgbWVzc2FnZSBzdHJpbmcgZm9yIHRoZSBtb3N0IHJlY2VudCBKUEVHIGVycm9yIG9yIG1lc3NhZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCBmb3JtYXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikpOwotI2RlZmluZSBKTVNHX0xFTkdUSF9NQVggIDIwMAkvKiByZWNvbW1lbmRlZCBzaXplIG9mIGZvcm1hdF9tZXNzYWdlIGJ1ZmZlciAqLwotICAvKiBSZXNldCBlcnJvciBzdGF0ZSB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgYSBuZXcgaW1hZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCByZXNldF9lcnJvcl9tZ3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotICAvKiBUaGUgbWVzc2FnZSBJRCBjb2RlIGFuZCBhbnkgcGFyYW1ldGVycyBhcmUgc2F2ZWQgaGVyZS4KLSAgICogQSBtZXNzYWdlIGNhbiBoYXZlIG9uZSBzdHJpbmcgcGFyYW1ldGVyIG9yIHVwIHRvIDggaW50IHBhcmFtZXRlcnMuCi0gICAqLwotICBpbnQgbXNnX2NvZGU7Ci0jZGVmaW5lIEpNU0dfU1RSX1BBUk1fTUFYICA4MAotICB1bmlvbiB7Ci0gICAgaW50IGlbOF07Ci0gICAgY2hhciBzW0pNU0dfU1RSX1BBUk1fTUFYXTsKLSAgfSBtc2dfcGFybTsKLQotICAvKiBTdGFuZGFyZCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGVycm9yIGZhY2lsaXR5ICovCi0KLSAgaW50IHRyYWNlX2xldmVsOwkJLyogbWF4IG1zZ19sZXZlbCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkICovCi0KLSAgLyogRm9yIHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSBlcnJvcnMsIHdlIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UsCi0gICAqIGJ1dCBrZWVwIGdvaW5nIHVubGVzcyBlbWl0X21lc3NhZ2UgY2hvb3NlcyB0byBhYm9ydC4gIGVtaXRfbWVzc2FnZQotICAgKiBzaG91bGQgY291bnQgd2FybmluZ3MgaW4gbnVtX3dhcm5pbmdzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uCi0gICAqIGNhbiBjaGVjayBmb3IgYmFkIGRhdGEgYnkgc2VlaW5nIGlmIG51bV93YXJuaW5ncyBpcyBub256ZXJvIGF0IHRoZQotICAgKiBlbmQgb2YgcHJvY2Vzc2luZy4KLSAgICovCi0gIGxvbmcgbnVtX3dhcm5pbmdzOwkJLyogbnVtYmVyIG9mIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncyAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBwb2ludCB0byB0aGUgdGFibGUocykgb2YgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLgotICAgKiBBbiBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoZSB0YWJsZSBwb2ludGVyIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudAotICAgKiBtZXNzYWdlIGxpc3QgKHR5cGljYWxseSwgdG8gY2hhbmdlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCBlcnJvcnMgYXJlCi0gICAqIHJlcG9ydGVkKS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIGNvZGVzCi0gICAqIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkgZXJyb3IgbWVjaGFuaXNtOyB0aGUgc2Vjb25kCi0gICAqIHRhYmxlIHBvaW50ZXIgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgotICAgKgotICAgKiBGaXJzdCB0YWJsZSBpbmNsdWRlcyBhbGwgZXJyb3JzIGdlbmVyYXRlZCBieSBKUEVHIGxpYnJhcnkgaXRzZWxmLgotICAgKiBFcnJvciBjb2RlIDAgaXMgcmVzZXJ2ZWQgZm9yIGEgIm5vIHN1Y2ggZXJyb3Igc3RyaW5nIiBtZXNzYWdlLgotICAgKi8KLSAgY29uc3QgY2hhciAqIGNvbnN0ICoganBlZ19tZXNzYWdlX3RhYmxlOyAvKiBMaWJyYXJ5IGVycm9ycyAqLwotICBpbnQgbGFzdF9qcGVnX21lc3NhZ2U7ICAgIC8qIFRhYmxlIGNvbnRhaW5zIHN0cmluZ3MgMC4ubGFzdF9qcGVnX21lc3NhZ2UgKi8KLSAgLyogU2Vjb25kIHRhYmxlIGNhbiBiZSBhZGRlZCBieSBhcHBsaWNhdGlvbiAoc2VlIGNqcGVnL2RqcGVnIGZvciBleGFtcGxlKS4KLSAgICogSXQgY29udGFpbnMgc3RyaW5ncyBudW1iZXJlZCBmaXJzdF9hZGRvbl9tZXNzYWdlLi5sYXN0X2FkZG9uX21lc3NhZ2UuCi0gICAqLwotICBjb25zdCBjaGFyICogY29uc3QgKiBhZGRvbl9tZXNzYWdlX3RhYmxlOyAvKiBOb24tbGlicmFyeSBlcnJvcnMgKi8KLSAgaW50IGZpcnN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGZpcnN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLwotICBpbnQgbGFzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBsYXN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLwotfTsKLQotCi0vKiBQcm9ncmVzcyBtb25pdG9yIG9iamVjdCAqLwotCi1zdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgewotICBKTUVUSE9EKHZvaWQsIHByb2dyZXNzX21vbml0b3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotICBsb25nIHBhc3NfY291bnRlcjsJCS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLwotICBsb25nIHBhc3NfbGltaXQ7CQkvKiB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBpbiB0aGlzIHBhc3MgKi8KLSAgaW50IGNvbXBsZXRlZF9wYXNzZXM7CQkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLwotICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLwotfTsKLQotCi0vKiBEYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgY29tcHJlc3Npb24gKi8KLQotc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKLSAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotCi0gIEpNRVRIT0Qodm9pZCwgaW5pdF9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZW1wdHlfb3V0cHV0X2J1ZmZlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgdGVybV9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0KLS8qIERhdGEgc291cmNlIG9iamVjdCBmb3IgZGVjb21wcmVzc2lvbiAqLwotCi1zdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHsKLSAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIGJ1ZmZlciAqLwotICBjb25zdCBKT0NURVQgKiBzdGFydF9pbnB1dF9ieXRlOyAvKiA9PiBmaXJzdCBieXRlIHRvIHJlYWQgZnJvbSBpbnB1dCAqLwotICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLSAgc2l6ZV90IGN1cnJlbnRfb2Zmc2V0OyAvKiBjdXJyZW50IHJlYWRlZCBpbnB1dCBvZmZzZXQgKi8KLQotICBKTUVUSE9EKHZvaWQsIGluaXRfc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGJvb2xlYW4sIGZpbGxfaW5wdXRfYnVmZmVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHNraXBfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgcmVzeW5jX3RvX3Jlc3RhcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkpOwotICBKTUVUSE9EKHZvaWQsIHRlcm1fc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGJvb2xlYW4sIHNlZWtfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgYnl0ZV9vZmZzZXQpKTsKLX07Ci0KLQotLyogTWVtb3J5IG1hbmFnZXIgb2JqZWN0LgotICogQWxsb2NhdGVzICJzbWFsbCIgb2JqZWN0cyAoYSBmZXcgSyB0b3RhbCksICJsYXJnZSIgb2JqZWN0cyAodGVucyBvZiBLKSwKLSAqIGFuZCAicmVhbGx5IGJpZyIgb2JqZWN0cyAodmlydHVhbCBhcnJheXMgd2l0aCBiYWNraW5nIHN0b3JlIGlmIG5lZWRlZCkuCi0gKiBUaGUgbWVtb3J5IG1hbmFnZXIgZG9lcyBub3QgYWxsb3cgaW5kaXZpZHVhbCBvYmplY3RzIHRvIGJlIGZyZWVkOyByYXRoZXIsCi0gKiBlYWNoIGNyZWF0ZWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGEgcG9vbCwgYW5kIHdob2xlIHBvb2xzIGNhbiBiZSBmcmVlZAotICogYXQgb25jZS4gIFRoaXMgaXMgZmFzdGVyIGFuZCBtb3JlIGNvbnZlbmllbnQgdGhhbiByZW1lbWJlcmluZyBleGFjdGx5IHdoYXQKLSAqIHRvIGZyZWUsIGVzcGVjaWFsbHkgd2hlcmUgbWFsbG9jKCkvZnJlZSgpIGFyZSBub3QgdG9vIHNwZWVkeS4KLSAqIE5COiBhbGxvYyByb3V0aW5lcyBuZXZlciByZXR1cm4gTlVMTC4gIFRoZXkgZXhpdCB0byBlcnJvcl9leGl0IGlmIG5vdAotICogc3VjY2Vzc2Z1bC4KLSAqLwotCi0jZGVmaW5lIEpQT09MX1BFUk1BTkVOVAkwCS8qIGxhc3RzIHVudGlsIG1hc3RlciByZWNvcmQgaXMgZGVzdHJveWVkICovCi0jZGVmaW5lIEpQT09MX0lNQUdFCTEJLyogbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlL2RhdGFzdHJlYW0gKi8KLSNkZWZpbmUgSlBPT0xfTlVNUE9PTFMJMgotCi10eXBlZGVmIHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCAqIGp2aXJ0X3NhcnJheV9wdHI7Ci10eXBlZGVmIHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCAqIGp2aXJ0X2JhcnJheV9wdHI7Ci0KLQotc3RydWN0IGpwZWdfbWVtb3J5X21nciB7Ci0gIC8qIE1ldGhvZCBwb2ludGVycyAqLwotICBKTUVUSE9EKHZvaWQgKiwgYWxsb2Nfc21hbGwsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCXNpemVfdCBzaXplb2ZvYmplY3QpKTsKLSAgSk1FVEhPRCh2b2lkIEZBUiAqLCBhbGxvY19sYXJnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci0gIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWxsb2Nfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkJCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKLQkJCQkgICAgIEpESU1FTlNJT04gbnVtcm93cykpOwotICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhbGxvY19iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LAotCQkJCSAgICAgIEpESU1FTlNJT04gbnVtcm93cykpOwotICBKTUVUSE9EKGp2aXJ0X3NhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCQkgIGludCBwb29sX2lkLAotCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAotCQkJCQkJICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csCi0JCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKLQkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKLSAgSk1FVEhPRChqdmlydF9iYXJyYXlfcHRyLCByZXF1ZXN0X3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkJICBpbnQgcG9vbF9pZCwKLQkJCQkJCSAgYm9vbGVhbiBwcmVfemVybywKLQkJCQkJCSAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCi0JCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKLQkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKLSAgSk1FVEhPRCh2b2lkLCByZWFsaXplX3ZpcnRfYXJyYXlzLCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWNjZXNzX3ZpcnRfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgICBqdmlydF9zYXJyYXlfcHRyIHB0ciwKLQkJCQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csCi0JCQkJCSAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCi0JCQkJCSAgIGJvb2xlYW4gd3JpdGFibGUpKTsKLSAgSk1FVEhPRChKQkxPQ0tBUlJBWSwgYWNjZXNzX3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgICAganZpcnRfYmFycmF5X3B0ciBwdHIsCi0JCQkJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKLQkJCQkJICAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCi0JCQkJCSAgICBib29sZWFuIHdyaXRhYmxlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZnJlZV9wb29sLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkpOwotICBKTUVUSE9EKHZvaWQsIHNlbGZfZGVzdHJ1Y3QsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotICAvKiBMaW1pdCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhpcyBKUEVHIG9iamVjdC4gIChOb3RlIHRoYXQgdGhpcyBpcwotICAgKiBtZXJlbHkgYWR2aXNvcnksIG5vdCBhIGd1YXJhbnRlZWQgbWF4aW11bTsgaXQgb25seSBhZmZlY3RzIHRoZSBzcGFjZQotICAgKiB1c2VkIGZvciB2aXJ0dWFsLWFycmF5IGJ1ZmZlcnMuKSAgTWF5IGJlIGNoYW5nZWQgYnkgb3V0ZXIgYXBwbGljYXRpb24KLSAgICogYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LgotICAgKi8KLSAgbG9uZyBtYXhfbWVtb3J5X3RvX3VzZTsKLQotICAvKiBNYXhpbXVtIGFsbG9jYXRpb24gcmVxdWVzdCBhY2NlcHRlZCBieSBhbGxvY19sYXJnZS4gKi8KLSAgbG9uZyBtYXhfYWxsb2NfY2h1bms7Ci19OwotCi0KLS8qIFJvdXRpbmUgc2lnbmF0dXJlIGZvciBhcHBsaWNhdGlvbi1zdXBwbGllZCBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzLgotICogTmVlZCBub3QgcGFzcyBtYXJrZXIgY29kZSBzaW5jZSBpdCBpcyBzdG9yZWQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCi0gKi8KLXR5cGVkZWYgSk1FVEhPRChib29sZWFuLCBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3Igcm91dGluZXMgY2FsbGVkIGJ5IGFwcGxpY2F0aW9uLgotICogVGhlIEpQUCBtYWNybyBoaWRlcyBwcm90b3R5cGUgcGFyYW1ldGVycyBmcm9tIGNvbXBpbGVycyB0aGF0IGNhbid0IGNvcGUuCi0gKiBOb3RlIEpQUCByZXF1aXJlcyBkb3VibGUgcGFyZW50aGVzZXMuCi0gKi8KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBKUFAoYXJnbGlzdCkJYXJnbGlzdAotI2Vsc2UKLSNkZWZpbmUgSlBQKGFyZ2xpc3QpCSgpCi0jZW5kaWYKLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4KLSAqIFdlIHNob3J0ZW4gZXh0ZXJuYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIHRoZSBmaXJzdCBzaXggbGV0dGVycywgd2hpY2gKLSAqIGlzIGdvb2QgZW5vdWdoIGZvciBhbGwga25vd24gc3lzdGVtcy4KLSAqIChJZiB5b3VyIGNvbXBpbGVyIGl0c2VsZiBuZWVkcyBuYW1lcyB0byBiZSB1bmlxdWUgaW4gbGVzcyB0aGFuIDE1Ci0gKiBjaGFyYWN0ZXJzLCB5b3UgYXJlIG91dCBvZiBsdWNrLiAgR2V0IGEgYmV0dGVyIGNvbXBpbGVyLikKLSAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqcGVnX3N0ZF9lcnJvcgkJalN0ZEVycm9yCi0jZGVmaW5lIGpwZWdfQ3JlYXRlQ29tcHJlc3MJakNyZWFDb21wcmVzcwotI2RlZmluZSBqcGVnX0NyZWF0ZURlY29tcHJlc3MJakNyZWFEZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfZGVzdHJveV9jb21wcmVzcwlqRGVzdENvbXByZXNzCi0jZGVmaW5lIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzCWpEZXN0RGVjb21wcmVzcwotI2RlZmluZSBqcGVnX3N0ZGlvX2Rlc3QJCWpTdGREZXN0Ci0jZGVmaW5lIGpwZWdfc3RkaW9fc3JjCQlqU3RkU3JjCi0jZGVmaW5lIGpwZWdfc2V0X2RlZmF1bHRzCWpTZXREZWZhdWx0cwotI2RlZmluZSBqcGVnX3NldF9jb2xvcnNwYWNlCWpTZXRDb2xvcnNwYWNlCi0jZGVmaW5lIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlCWpEZWZDb2xvcnNwYWNlCi0jZGVmaW5lIGpwZWdfc2V0X3F1YWxpdHkJalNldFF1YWxpdHkKLSNkZWZpbmUganBlZ19zZXRfbGluZWFyX3F1YWxpdHkJalNldExRdWFsaXR5Ci0jZGVmaW5lIGpwZWdfYWRkX3F1YW50X3RhYmxlCWpBZGRRdWFudFRhYmxlCi0jZGVmaW5lIGpwZWdfcXVhbGl0eV9zY2FsaW5nCWpRdWFsaXR5U2NhbGluZwotI2RlZmluZSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbglqU2ltUHJvZ3Jlc3MKLSNkZWZpbmUganBlZ19zdXBwcmVzc190YWJsZXMJalN1cHByZXNzVGFibGVzCi0jZGVmaW5lIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUJakFsY1FUYWJsZQotI2RlZmluZSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUJakFsY0hUYWJsZQotI2RlZmluZSBqcGVnX3N0YXJ0X2NvbXByZXNzCWpTdHJ0Q29tcHJlc3MKLSNkZWZpbmUganBlZ193cml0ZV9zY2FubGluZXMJaldydFNjYW5saW5lcwotI2RlZmluZSBqcGVnX2ZpbmlzaF9jb21wcmVzcwlqRmluQ29tcHJlc3MKLSNkZWZpbmUganBlZ193cml0ZV9yYXdfZGF0YQlqV3J0UmF3RGF0YQotI2RlZmluZSBqcGVnX3dyaXRlX21hcmtlcglqV3J0TWFya2VyCi0jZGVmaW5lIGpwZWdfd3JpdGVfbV9oZWFkZXIJaldydE1IZWFkZXIKLSNkZWZpbmUganBlZ193cml0ZV9tX2J5dGUJaldydE1CeXRlCi0jZGVmaW5lIGpwZWdfd3JpdGVfdGFibGVzCWpXcnRUYWJsZXMKLSNkZWZpbmUganBlZ19yZWFkX2hlYWRlcglqUmVhZEhlYWRlcgotI2RlZmluZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MJalN0cnREZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfcmVhZF9zY2FubGluZXMJalJlYWRTY2FubGluZXMKLSNkZWZpbmUganBlZ19maW5pc2hfZGVjb21wcmVzcwlqRmluRGVjb21wcmVzcwotI2RlZmluZSBqcGVnX3JlYWRfcmF3X2RhdGEJalJlYWRSYXdEYXRhCi0jZGVmaW5lIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zCWpIYXNNdWx0U2NuCi0jZGVmaW5lIGpwZWdfc3RhcnRfb3V0cHV0CWpTdHJ0T3V0cHV0Ci0jZGVmaW5lIGpwZWdfZmluaXNoX291dHB1dAlqRmluT3V0cHV0Ci0jZGVmaW5lIGpwZWdfaW5wdXRfY29tcGxldGUJakluQ29tcGxldGUKLSNkZWZpbmUganBlZ19uZXdfY29sb3JtYXAJak5ld0NNYXAKLSNkZWZpbmUganBlZ19jb25zdW1lX2lucHV0CWpDb25zdW1lSW5wdXQKLSNkZWZpbmUganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zCWpDYWxjRGltZW5zaW9ucwotI2RlZmluZSBqcGVnX3NhdmVfbWFya2VycwlqU2F2ZU1hcmtlcnMKLSNkZWZpbmUganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcglqU2V0TWFya2VyCi0jZGVmaW5lIGpwZWdfcmVhZF9jb2VmZmljaWVudHMJalJlYWRDb2VmcwotI2RlZmluZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cwlqV3J0Q29lZnMKLSNkZWZpbmUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMJakNvcHlDcml0Ci0jZGVmaW5lIGpwZWdfYWJvcnRfY29tcHJlc3MJakFicnRDb21wcmVzcwotI2RlZmluZSBqcGVnX2Fib3J0X2RlY29tcHJlc3MJakFicnREZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfYWJvcnQJCWpBYm9ydAotI2RlZmluZSBqcGVnX2Rlc3Ryb3kJCWpEZXN0cm95Ci0jZGVmaW5lIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQJalJlc3luY1Jlc3RhcnQKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogRGVmYXVsdCBlcnJvci1tYW5hZ2VtZW50IHNldHVwICovCi1FWFRFUk4oc3RydWN0IGpwZWdfZXJyb3JfbWdyICopIGpwZWdfc3RkX2Vycm9yCi0JSlBQKChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIpKTsKLQotLyogSW5pdGlhbGl6YXRpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzLgotICoganBlZ19jcmVhdGVfY29tcHJlc3MoKSBhbmQganBlZ19jcmVhdGVfZGVjb21wcmVzcygpIGFyZSB0aGUgZXhwb3J0ZWQKLSAqIG5hbWVzIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCBjYWxsLiAgVGhlc2UgZXhwYW5kIHRvIGNhbGxzIG9uCi0gKiBqcGVnX0NyZWF0ZUNvbXByZXNzIGFuZCBqcGVnX0NyZWF0ZURlY29tcHJlc3Mgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiBwYXNzZWQgZm9yIHZlcnNpb24gbWlzbWF0Y2ggY2hlY2tpbmcuCi0gKiBOQjogeW91IG11c3Qgc2V0IHVwIHRoZSBlcnJvci1tYW5hZ2VyIEJFRk9SRSBjYWxsaW5nIGpwZWdfY3JlYXRlX3h4eC4KLSAqLwotI2RlZmluZSBqcGVnX2NyZWF0ZV9jb21wcmVzcyhjaW5mbykgXAotICAgIGpwZWdfQ3JlYXRlQ29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAotCQkJKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpCi0jZGVmaW5lIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoY2luZm8pIFwKLSAgICBqcGVnX0NyZWF0ZURlY29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAotCQkJICAoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKQotRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlQ29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZURlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQlpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKLS8qIERlc3RydWN0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cyAqLwotRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIFN0YW5kYXJkIGRhdGEgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2Vyczogc3RkaW8gc3RyZWFtcy4gKi8KLS8qIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyB0aGUgZmlsZSBiZWZvcmUgYW5kIGNsb3NpbmcgYWZ0ZXIuICovCi1FWFRFUk4odm9pZCkganBlZ19zdGRpb19kZXN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBvdXRmaWxlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19zdGRpb19zcmMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKSk7Ci0KLS8qIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X2RlZmF1bHRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLS8qIENvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR1cCBhaWRzICovCi1FWFRFUk4odm9pZCkganBlZ19zZXRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3NldF9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LAotCQkJCSAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGludCBzY2FsZV9mYWN0b3IsCi0JCQkJCSAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfYWRkX3F1YW50X3RhYmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCi0JCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCi0JCQkJICAgICAgIGludCBzY2FsZV9mYWN0b3IsCi0JCQkJICAgICAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKLUVYVEVSTihpbnQpIGpwZWdfcXVhbGl0eV9zY2FsaW5nIEpQUCgoaW50IHF1YWxpdHkpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19zdXBwcmVzc190YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICAgYm9vbGVhbiBzdXBwcmVzcykpOwotRVhURVJOKEpRVUFOVF9UQkwgKikganBlZ19hbGxvY19xdWFudF90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKEpIVUZGX1RCTCAqKSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGNvbXByZXNzaW9uICovCi1FWFRFUk4odm9pZCkganBlZ19zdGFydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykpOwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfc2NhbmxpbmVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCi0JCQkJCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIFJlcGxhY2VzIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdoZW4gd3JpdGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3Jhd19kYXRhIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKU0FNUElNQUdFIGRhdGEsCi0JCQkJCSAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOwotCi0vKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLiAgU2VlIGxpYmpwZWcuZG9jIGNvbmNlcm5pbmcgc2FmZSB1c2FnZS4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21hcmtlcgotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCi0JICAgICBjb25zdCBKT0NURVQgKiBkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOwotLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21faGVhZGVyCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21fYnl0ZQotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpKTsKLQotLyogQWx0ZXJuYXRlIGNvbXByZXNzaW9uIGZ1bmN0aW9uOiBqdXN0IHdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlIGZpbGUgKi8KLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIERlY29tcHJlc3Npb24gc3RhcnR1cDogcmVhZCBzdGFydCBvZiBKUEVHIGRhdGFzdHJlYW0gdG8gc2VlIHdoYXQncyB0aGVyZSAqLwotRVhURVJOKGludCkganBlZ19yZWFkX2hlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICBib29sZWFuIHJlcXVpcmVfaW1hZ2UpKTsKLS8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCi0jZGVmaW5lIEpQRUdfU1VTUEVOREVECQkwIC8qIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCi0jZGVmaW5lIEpQRUdfSEVBREVSX09LCQkxIC8qIEZvdW5kIHZhbGlkIGltYWdlIGRhdGFzdHJlYW0gKi8KLSNkZWZpbmUgSlBFR19IRUFERVJfVEFCTEVTX09OTFkJMiAvKiBGb3VuZCB2YWxpZCB0YWJsZS1zcGVjcy1vbmx5IGRhdGFzdHJlYW0gKi8KLS8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSBUUlVFIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKLSAqIGEgVEFCTEVTX09OTFkgcmV0dXJuIGNvZGU7IGFuIGFiYnJldmlhdGVkIGZpbGUgd2lsbCBjYXVzZSBhbiBlcnJvciBleGl0LgotICogSlBFR19TVVNQRU5ERUQgaXMgb25seSBwb3NzaWJsZSBpZiB5b3UgdXNlIGEgZGF0YSBzb3VyY2UgbW9kdWxlIHRoYXQgY2FuCi0gKiBnaXZlIGEgc3VzcGVuc2lvbiByZXR1cm4gKHRoZSBzdGRpbyBzb3VyY2UgbW9kdWxlIGRvZXNuJ3QpLgotICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBkZWNvbXByZXNzaW9uICovCi1FWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfdGlsZV9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9zY2FubGluZXMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCi0JCQkJCSAgICBKRElNRU5TSU9OIG1heF9saW5lcykpOwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9zY2FubGluZXNfZnJvbSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJCQkJICAgIGludCBsaW5lX29mZnNldCwKLQkJCQkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7Ci1FWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3RpbGVfc2NhbmxpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIHNjYW5saW5lcykpOwotRVhURVJOKHZvaWQpIGpwZWdfaW5pdF9yZWFkX3RpbGVfc2NhbmxpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsCi0JCSAgICAgICAgICAgICAgICBpbnQgKnN0YXJ0X3gsIGludCAqc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogUmVwbGFjZXMganBlZ19yZWFkX3NjYW5saW5lcyB3aGVuIHJlYWRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCi1FWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3Jhd19kYXRhIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgSlNBTVBJTUFHRSBkYXRhLAotCQkJCQkgICBKRElNRU5TSU9OIG1heF9saW5lcykpOwotCi0vKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgIGludCBzY2FuX251bWJlcikpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX2lucHV0X2NvbXBsZXRlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfbmV3X2NvbG9ybWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGludCkganBlZ19jb25zdW1lX2lucHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KLS8qICNkZWZpbmUgSlBFR19TVVNQRU5ERUQJMCAgICBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLwotI2RlZmluZSBKUEVHX1JFQUNIRURfU09TCTEgLyogUmVhY2hlZCBzdGFydCBvZiBuZXcgc2NhbiAqLwotI2RlZmluZSBKUEVHX1JFQUNIRURfRU9JCTIgLyogUmVhY2hlZCBlbmQgb2YgaW1hZ2UgKi8KLSNkZWZpbmUgSlBFR19ST1dfQ09NUExFVEVECTMgLyogQ29tcGxldGVkIG9uZSBpTUNVIHJvdyAqLwotI2RlZmluZSBKUEVHX1NDQU5fQ09NUExFVEVECTQgLyogQ29tcGxldGVkIGxhc3QgaU1DVSByb3cgb2YgYSBzY2FuICovCi0KLS8qIFByZWNhbGN1bGF0ZSBvdXRwdXQgZGltZW5zaW9ucyBmb3IgY3VycmVudCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICovCi1FWFRFUk4odm9pZCkganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBDb250cm9sIHNhdmluZyBvZiBDT00gYW5kIEFQUG4gbWFya2VycyBpbnRvIG1hcmtlcl9saXN0LiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2F2ZV9tYXJrZXJzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCi0JICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KSk7Ci0KLS8qIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKLQkgICAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkpOwotCi0vKiBSZWFkIG9yIHdyaXRlIHJhdyBEQ1QgY29lZmZpY2llbnRzIC0tLSB1c2VmdWwgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nLiAqLwotRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganBlZ19yZWFkX2NvZWZmaWNpZW50cyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXgKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KSk7Ci1FWFRFUk4odm9pZCkganBlZ193cml0ZV9jb2VmZmljaWVudHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCQkJCWpfY29tcHJlc3NfcHRyIGRzdGluZm8pKTsKLQotLyogSWYgeW91IGNob29zZSB0byBhYm9ydCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGJlZm9yZSBjb21wbGV0aW5nCi0gKiBqcGVnX2ZpbmlzaF8oZGUpY29tcHJlc3MsIHRoZW4geW91IG5lZWQgdG8gY2xlYW4gdXAgdG8gcmVsZWFzZSBtZW1vcnksCi0gKiB0ZW1wb3JhcnkgZmlsZXMsIGV0Yy4gIFlvdSBjYW4ganVzdCBjYWxsIGpwZWdfZGVzdHJveV8oZGUpY29tcHJlc3MKLSAqIGlmIHlvdSdyZSBkb25lIHdpdGggdGhlIEpQRUcgb2JqZWN0LCBidXQgaWYgeW91IHdhbnQgdG8gY2xlYW4gaXQgdXAgYW5kCi0gKiByZXVzZSBpdCwgY2FsbCB0aGlzOgotICovCi1FWFRFUk4odm9pZCkganBlZ19hYm9ydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19hYm9ydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBHZW5lcmljIHZlcnNpb25zIG9mIGpwZWdfYWJvcnQgYW5kIGpwZWdfZGVzdHJveSB0aGF0IHdvcmsgb24gZWl0aGVyCi0gKiBmbGF2b3Igb2YgSlBFRyBvYmplY3QuICBUaGVzZSBtYXkgYmUgbW9yZSBjb252ZW5pZW50IGluIHNvbWUgcGxhY2VzLgotICovCi1FWFRFUk4odm9pZCkganBlZ19hYm9ydCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0vKiBEZWZhdWx0IHJlc3RhcnQtbWFya2VyLXJlc3luYyBwcm9jZWR1cmUgZm9yIHVzZSBieSBkYXRhIHNvdXJjZSBtb2R1bGVzICovCi1FWFRFUk4oYm9vbGVhbikganBlZ19yZXN5bmNfdG9fcmVzdGFydCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBpbnQgZGVzaXJlZCkpOwotCi1FWFRFUk4odm9pZCkganBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCk7Ci1FWFRFUk4odm9pZCkganBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCk7Ci1FWFRFUk4odm9pZCkganBlZ19jcmVhdGVfaHVmZm1hbl9pbmRleChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgpOwotRVhURVJOKHZvaWQpIGpwZWdfY29uZmlndXJlX2h1ZmZtYW5faW5kZXhfc2NhbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBzY2FuX25vLCBpbnQgb2Zmc2V0KTsKLUVYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfaHVmZm1hbl9pbmRleChodWZmbWFuX2luZGV4ICppbmRleCk7Ci0KLQotLyogVGhlc2UgbWFya2VyIGNvZGVzIGFyZSBleHBvcnRlZCBzaW5jZSBhcHBsaWNhdGlvbnMgYW5kIGRhdGEgc291cmNlIG1vZHVsZXMKLSAqIGFyZSBsaWtlbHkgdG8gd2FudCB0byB1c2UgdGhlbS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfUlNUMAkweEQwCS8qIFJTVDAgbWFya2VyIGNvZGUgKi8KLSNkZWZpbmUgSlBFR19FT0kJMHhEOQkvKiBFT0kgbWFya2VyIGNvZGUgKi8KLSNkZWZpbmUgSlBFR19BUFAwCTB4RTAJLyogQVBQMCBtYXJrZXIgY29kZSAqLwotI2RlZmluZSBKUEVHX0NPTQkweEZFCS8qIENPTSBtYXJrZXIgY29kZSAqLwotCi0KLS8qIElmIHdlIGhhdmUgYSBicmFpbi1kYW1hZ2VkIGNvbXBpbGVyIHRoYXQgZW1pdHMgd2FybmluZ3MgKG9yIHdvcnNlLCBlcnJvcnMpCi0gKiBmb3Igc3RydWN0dXJlIGRlZmluaXRpb25zIHRoYXQgYXJlIG5ldmVyIGZpbGxlZCBpbiwga2VlcCBpdCBxdWlldCBieQotICogc3VwcGx5aW5nIGR1bW15IGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBzdWJzdHJ1Y3R1cmVzLgotICovCi0KLSNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotI2lmbmRlZiBKUEVHX0lOVEVSTkFMUwkJLyogd2lsbCBiZSBkZWZpbmVkIGluIGpwZWdpbnQuaCAqLwotc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX3Vwc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgeyBsb25nIGR1bW15OyB9OwotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0jZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KLQotCi0vKgotICogVGhlIEpQRUcgbGlicmFyeSBtb2R1bGVzIGRlZmluZSBKUEVHX0lOVEVSTkFMUyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4KLSAqIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIGFyZSByZWFkIG9ubHkgd2hlbiB0aGF0IGlzIHRydWUuCi0gKiBBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBpbmNsdWRlIGpwZWdpbnQuaCwgYnV0IG1heSB3aXNoCi0gKiB0byBpbmNsdWRlIGplcnJvci5oLgotICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImpwZWdpbnQuaCIJCS8qIGZldGNoIHByaXZhdGUgZGVjbGFyYXRpb25zICovCi0jaW5jbHVkZSAiamVycm9yLmgiCQkvKiBmZXRjaCBlcnJvciBjb2RlcyB0b28gKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogSlBFR0xJQl9IICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qcGVndHJhbi4xIGIvbGlianBlZ3R3cnAvanBlZ3RyYW4uMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlMThlMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9qcGVndHJhbi4xCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS5USCBKUEVHVFJBTiAxICIzIEF1Z3VzdCAxOTk3IgotLlNIIE5BTUUKLWpwZWd0cmFuIFwtIGxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIG9mIEpQRUcgZmlsZXMKLS5TSCBTWU5PUFNJUwotLkIganBlZ3RyYW4KLVsKLS5JIG9wdGlvbnMKLV0KLVsKLS5JIGZpbGVuYW1lCi1dCi0uTFAKLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiBqcGVndHJhbgotcGVyZm9ybXMgdmFyaW91cyB1c2VmdWwgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZmlsZXMuCi1JdCBjYW4gdHJhbnNsYXRlIHRoZSBjb2RlZCByZXByZXNlbnRhdGlvbiBmcm9tIG9uZSB2YXJpYW50IG9mIEpQRUcgdG8gYW5vdGhlciwKLWZvciBleGFtcGxlIGZyb20gYmFzZWxpbmUgSlBFRyB0byBwcm9ncmVzc2l2ZSBKUEVHIG9yIHZpY2UgdmVyc2EuICBJdCBjYW4gYWxzbwotcGVyZm9ybSBzb21lIHJlYXJyYW5nZW1lbnRzIG9mIHRoZSBpbWFnZSBkYXRhLCBmb3IgZXhhbXBsZSB0dXJuaW5nIGFuIGltYWdlCi1mcm9tIGxhbmRzY2FwZSB0byBwb3J0cmFpdCBmb3JtYXQgYnkgcm90YXRpb24uCi0uUFAKLS5CIGpwZWd0cmFuCi13b3JrcyBieSByZWFycmFuZ2luZyB0aGUgY29tcHJlc3NlZCBkYXRhIChEQ1QgY29lZmZpY2llbnRzKSwgd2l0aG91dAotZXZlciBmdWxseSBkZWNvZGluZyB0aGUgaW1hZ2UuICBUaGVyZWZvcmUsIGl0cyB0cmFuc2Zvcm1hdGlvbnMgYXJlIGxvc3NsZXNzOgotdGhlcmUgaXMgbm8gaW1hZ2UgZGVncmFkYXRpb24gYXQgYWxsLCB3aGljaCB3b3VsZCBub3QgYmUgdHJ1ZSBpZiB5b3UgdXNlZAotLkIgZGpwZWcKLWZvbGxvd2VkIGJ5Ci0uQiBjanBlZwotdG8gYWNjb21wbGlzaCB0aGUgc2FtZSBjb252ZXJzaW9uLiAgQnV0IGJ5IHRoZSBzYW1lIHRva2VuLAotLkIganBlZ3RyYW4KLWNhbm5vdCBwZXJmb3JtIGxvc3N5IG9wZXJhdGlvbnMgc3VjaCBhcyBjaGFuZ2luZyB0aGUgaW1hZ2UgcXVhbGl0eS4KLS5QUAotLkIganBlZ3RyYW4KLXJlYWRzIHRoZSBuYW1lZCBKUEVHL0pGSUYgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMKLW5hbWVkLCBhbmQgcHJvZHVjZXMgYSBKUEVHL0pGSUYgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotLlNIIE9QVElPTlMKLUFsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwKLS5CIFwtb3B0aW1pemUKLW1heSBiZSB3cml0dGVuCi0uQiBcLW9wdAotb3IKLS5CUiBcLW8gLgotVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQuCi1Ccml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwKLS5CUiBcLW9wdGltaXNlICksCi10aG91Z2ggZm9yIGJyZXZpdHkgdGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCi0uUFAKLVRvIHNwZWNpZnkgdGhlIGNvZGVkIEpQRUcgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUsCi0uQiBqcGVndHJhbgotYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgc3dpdGNoZXMgcmVjb2duaXplZCBieQotLkJSIGNqcGVnIDoKLS5UUAotLkIgXC1vcHRpbWl6ZQotUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLgotLlRQCi0uQiBcLXByb2dyZXNzaXZlCi1DcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLgotLlRQCi0uQkkgXC1yZXN0YXJ0ICIgTiIKLUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5IE4gTUNVIGJsb2NrcyBpZiAiQiIgaXMKLWF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0uVFAKLS5CSSBcLXNjYW5zICIgZmlsZSIKLVVzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi0uUFAKLVNlZQotLkJSIGNqcGVnICgxKQotZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGVzZSBzd2l0Y2hlcy4KLUlmIHlvdSBzcGVjaWZ5IG5vbmUgb2YgdGhlc2Ugc3dpdGNoZXMsIHlvdSBnZXQgYSBwbGFpbiBiYXNlbGluZS1KUEVHIG91dHB1dAotZmlsZS4gIFRoZSBxdWFsaXR5IHNldHRpbmcgYW5kIHNvIGZvcnRoIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnB1dCBmaWxlLgotLlBQCi1UaGUgaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgdHJhbnNmb3JtZWQgYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSBzd2l0Y2hlczoKLS5UUAotLkIgXC1mbGlwIGhvcml6b250YWwKLU1pcnJvciBpbWFnZSBob3Jpem9udGFsbHkgKGxlZnQtcmlnaHQpLgotLlRQCi0uQiBcLWZsaXAgdmVydGljYWwKLU1pcnJvciBpbWFnZSB2ZXJ0aWNhbGx5ICh0b3AtYm90dG9tKS4KLS5UUAotLkIgXC1yb3RhdGUgOTAKLVJvdGF0ZSBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KLS5UUAotLkIgXC1yb3RhdGUgMTgwCi1Sb3RhdGUgaW1hZ2UgMTgwIGRlZ3JlZXMuCi0uVFAKLS5CIFwtcm90YXRlIDI3MAotUm90YXRlIGltYWdlIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZSAob3IgOTAgY2N3KS4KLS5UUAotLkIgXC10cmFuc3Bvc2UKLVRyYW5zcG9zZSBpbWFnZSAoYWNyb3NzIFVMLXRvLUxSIGF4aXMpLgotLlRQCi0uQiBcLXRyYW5zdmVyc2UKLVRyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuCi0uUFAKLVRoZSB0cmFuc3Bvc2UgdHJhbnNmb3JtYXRpb24gaGFzIG5vIHJlc3RyaWN0aW9ucyByZWdhcmRpbmcgaW1hZ2UgZGltZW5zaW9ucy4KLVRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgb3BlcmF0ZSByYXRoZXIgb2RkbHkgaWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdAotYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBzaXplICh1c3VhbGx5IDggb3IgMTYgcGl4ZWxzKSwgYmVjYXVzZSB0aGV5IGNhbiBvbmx5Ci10cmFuc2Zvcm0gY29tcGxldGUgYmxvY2tzIG9mIERDVCBjb2VmZmljaWVudCBkYXRhIGluIHRoZSBkZXNpcmVkIHdheS4KLS5QUAotLkJSIGpwZWd0cmFuICdzCi1kZWZhdWx0IGJlaGF2aW9yIHdoZW4gdHJhbnNmb3JtaW5nIGFuIG9kZC1zaXplIGltYWdlIGlzIGRlc2lnbmVkCi10byBwcmVzZXJ2ZSBleGFjdCByZXZlcnNpYmlsaXR5IGFuZCBtYXRoZW1hdGljYWwgY29uc2lzdGVuY3kgb2YgdGhlCi10cmFuc2Zvcm1hdGlvbiBzZXQuICBBcyBzdGF0ZWQsIHRyYW5zcG9zZSBpcyBhYmxlIHRvIGZsaXAgdGhlIGVudGlyZSBpbWFnZQotYXJlYS4gIEhvcml6b250YWwgbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIGNvbHVtbiBhdCB0aGUgcmlnaHQgZWRnZQotdW50b3VjaGVkLCBidXQgaXMgYWJsZSB0byBmbGlwIGFsbCByb3dzIG9mIHRoZSBpbWFnZS4gIFNpbWlsYXJseSwgdmVydGljYWwKLW1pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSByb3cgYXQgdGhlIGJvdHRvbSBlZGdlIHVudG91Y2hlZCwgYnV0IGlzCi1hYmxlIHRvIGZsaXAgYWxsIGNvbHVtbnMuICBUaGUgb3RoZXIgdHJhbnNmb3JtcyBjYW4gYmUgYnVpbHQgdXAgYXMgc2VxdWVuY2VzCi1vZiB0cmFuc3Bvc2UgYW5kIGZsaXAgb3BlcmF0aW9uczsgZm9yIGNvbnNpc3RlbmN5LCB0aGVpciBhY3Rpb25zIG9uIGVkZ2UKLXBpeGVscyBhcmUgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kIHJlc3VsdCBvZiB0aGUgY29ycmVzcG9uZGluZwotdHJhbnNwb3NlLWFuZC1mbGlwIHNlcXVlbmNlLgotLlBQCi1Gb3IgcHJhY3RpY2FsIHVzZSwgeW91IG1heSBwcmVmZXIgdG8gZGlzY2FyZCBhbnkgdW50cmFuc2Zvcm1hYmxlIGVkZ2UgcGl4ZWxzCi1yYXRoZXIgdGhhbiBoYXZpbmcgYSBzdHJhbmdlLWxvb2tpbmcgc3RyaXAgYWxvbmcgdGhlIHJpZ2h0IGFuZC9vciBib3R0b20gZWRnZXMKLW9mIGEgdHJhbnNmb3JtZWQgaW1hZ2UuICBUbyBkbyB0aGlzLCBhZGQgdGhlCi0uQiBcLXRyaW0KLXN3aXRjaDoKLS5UUAotLkIgXC10cmltCi1Ecm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzLgotLlBQCi1PYnZpb3VzbHksIGEgdHJhbnNmb3JtYXRpb24gd2l0aAotLkIgXC10cmltCi1pcyBub3QgcmV2ZXJzaWJsZSwgc28gc3RyaWN0bHkgc3BlYWtpbmcKLS5CIGpwZWd0cmFuCi13aXRoIHRoaXMgc3dpdGNoIGlzIG5vdCBsb3NzbGVzcy4gIEFsc28sIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwKLWVxdWl2YWxlbmNlcyBiZXR3ZWVuIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbm8gbG9uZ2VyIGhvbGQuICBGb3IgZXhhbXBsZSwKLS5CIFwtcm90IDI3MCAtdHJpbQotdHJpbXMgb25seSB0aGUgYm90dG9tIGVkZ2UsIGJ1dAotLkIgXC1yb3QgOTAgLXRyaW0KLWZvbGxvd2VkIGJ5Ci0uQiBcLXJvdCAxODAgLXRyaW0KLXRyaW1zIGJvdGggZWRnZXMuCi0uUFAKLUFub3RoZXIgbm90LXN0cmljdGx5LWxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIHN3aXRjaCBpczoKLS5UUAotLkIgXC1ncmF5c2NhbGUKLUZvcmNlIGdyYXlzY2FsZSBvdXRwdXQuCi0uUFAKLVRoaXMgb3B0aW9uIGRpc2NhcmRzIHRoZSBjaHJvbWluYW5jZSBjaGFubmVscyBpZiB0aGUgaW5wdXQgaW1hZ2UgaXMgWUNiQ3IKLShpZSwgYSBzdGFuZGFyZCBjb2xvciBKUEVHKSwgcmVzdWx0aW5nIGluIGEgZ3JheXNjYWxlIEpQRUcgZmlsZS4gIFRoZQotbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHksIHNvIHRoaXMgaXMgYSBiZXR0ZXIgbWV0aG9kIG9mIHJlZHVjaW5nCi10byBncmF5c2NhbGUgdGhhbiBkZWNvbXByZXNzaW9uLCBjb252ZXJzaW9uLCBhbmQgcmVjb21wcmVzc2lvbi4gIFRoaXMgc3dpdGNoCi1pcyBwYXJ0aWN1bGFybHkgaGFuZHkgZm9yIGZpeGluZyBhIG1vbm9jaHJvbWUgcGljdHVyZSB0aGF0IHdhcyBtaXN0YWtlbmx5Ci1lbmNvZGVkIGFzIGEgY29sb3IgSlBFRy4gIChJbiBzdWNoIGEgY2FzZSwgdGhlIHNwYWNlIHNhdmluZ3MgZnJvbSBnZXR0aW5nIHJpZAotb2YgdGhlIG5lYXItZW1wdHkgY2hyb21hIGNoYW5uZWxzIHdvbid0IGJlIGxhcmdlOyBidXQgdGhlIGRlY29kaW5nIHRpbWUgZm9yCi1hIGdyYXlzY2FsZSBKUEVHIGlzIHN1YnN0YW50aWFsbHkgbGVzcyB0aGFuIHRoYXQgZm9yIGEgY29sb3IgSlBFRy4pCi0uUFAKLS5CIGpwZWd0cmFuCi1hbHNvIHJlY29nbml6ZXMgdGhlc2Ugc3dpdGNoZXMgdGhhdCBjb250cm9sIHdoYXQgdG8gZG8gd2l0aCAiZXh0cmEiIG1hcmtlcnMsCi1zdWNoIGFzIGNvbW1lbnQgYmxvY2tzOgotLlRQCi0uQiBcLWNvcHkgbm9uZQotQ29weSBubyBleHRyYSBtYXJrZXJzIGZyb20gc291cmNlIGZpbGUuICBUaGlzIHNldHRpbmcgc3VwcHJlc3NlcyBhbGwKLWNvbW1lbnRzIGFuZCBvdGhlciBleGNlc3MgYmFnZ2FnZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1jb3B5IGNvbW1lbnRzCi1Db3B5IG9ubHkgY29tbWVudCBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIGNvcGllcyBjb21tZW50cyBmcm9tIHRoZSBzb3VyY2UgZmlsZSwKLWJ1dCBkaXNjYXJkcyBhbnkgb3RoZXIgaW5lc3NlbnRpYWwgZGF0YS4KLS5UUAotLkIgXC1jb3B5IGFsbAotQ29weSBhbGwgZXh0cmEgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBwcmVzZXJ2ZXMgbWlzY2VsbGFuZW91cyBtYXJrZXJzCi1mb3VuZCBpbiB0aGUgc291cmNlIGZpbGUsIHN1Y2ggYXMgSkZJRiB0aHVtYm5haWxzIGFuZCBQaG90b3Nob3Agc2V0dGluZ3MuCi1JbiBzb21lIGZpbGVzIHRoZXNlIGV4dHJhIG1hcmtlcnMgY2FuIGJlIHNpemFibGUuCi0uUFAKLVRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCi0uQlIgIlwtY29weSBjb21tZW50cyIgLgotKE5vdGU6IGluIElKRyByZWxlYXNlcyB2NiBhbmQgdjZhLAotLkIganBlZ3RyYW4KLWFsd2F5cyBkaWQgdGhlIGVxdWl2YWxlbnQgb2YKLS5CUiAiXC1jb3B5IG5vbmUiIC4pCi0uUFAKLUFkZGl0aW9uYWwgc3dpdGNoZXMgcmVjb2duaXplZCBieSBqcGVndHJhbiBhcmU6Ci0uVFAKLS5CSSBcLW1heG1lbW9yeSAiIE4iCi1TZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKLWluIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQotbnVtYmVyLiAgRm9yIGV4YW1wbGUsCi0uQiBcLW1heCA0bQotc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCi0uVFAKLS5CSSBcLW91dGZpbGUgIiBuYW1lIgotU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCi0uVFAKLS5CIFwtdmVyYm9zZQotRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQotLkJSIFwtdiAncwotZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotLlRQCi0uQiBcLWRlYnVnCi1TYW1lIGFzCi0uQlIgXC12ZXJib3NlIC4KLS5TSCBFWEFNUExFUwotLkxQCi1UaGlzIGV4YW1wbGUgY29udmVydHMgYSBiYXNlbGluZSBKUEVHIGZpbGUgdG8gcHJvZ3Jlc3NpdmUgZm9ybToKLS5JUAotLkIganBlZ3RyYW4gXC1wcm9ncmVzc2l2ZQotLkkgZm9vLmpwZwotLkIgPgotLkkgZm9vcHJvZy5qcGcKLS5QUAotVGhpcyBleGFtcGxlIHJvdGF0ZXMgYW4gaW1hZ2UgOTAgZGVncmVlcyBjbG9ja3dpc2UsIGRpc2NhcmRpbmcgYW55Ci11bnJvdGF0YWJsZSBlZGdlIHBpeGVsczoKLS5JUAotLkIganBlZ3RyYW4gXC1yb3QgOTAgLXRyaW0KLS5JIGZvby5qcGcKLS5CID4KLS5JIGZvbzkwLmpwZwotLlNIIEVOVklST05NRU5UCi0uVFAKLS5CIEpQRUdNRU0KLUlmIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LgotVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgZm9yIHRoZQotLkIgXC1tYXhtZW1vcnkKLXN3aXRjaC4KLS5CIEpQRUdNRU0KLW92ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZAotaXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQKLS5CUiBcLW1heG1lbW9yeSAuCi0uU0ggU0VFIEFMU08KLS5CUiBjanBlZyAoMSksCi0uQlIgZGpwZWcgKDEpLAotLkJSIHJkanBnY29tICgxKSwKLS5CUiB3cmpwZ2NvbSAoMSkKLS5icgotV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAotQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCi0uU0ggQVVUSE9SCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwCi0uU0ggQlVHUwotQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KLS5QUAotVGhlIHRyYW5zZm9ybSBvcHRpb25zIGNhbid0IHRyYW5zZm9ybSBvZGQtc2l6ZSBpbWFnZXMgcGVyZmVjdGx5LiAgVXNlCi0uQiBcLXRyaW0KLWlmIHlvdSBkb24ndCBsaWtlIHRoZSByZXN1bHRzIHdpdGhvdXQgaXQuCi0uUFAKLVRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbnRvIG1lbW9yeSBhbmQgdGhlbiB3cml0dGVuIG91dCBhZ2FpbiwgZXZlbiBpbgotY2FzZXMgd2hlcmUgdGhpcyBpc24ndCByZWFsbHkgbmVjZXNzYXJ5LiAgRXhwZWN0IHN3YXBwaW5nIG9uIGxhcmdlIGltYWdlcywKLWVzcGVjaWFsbHkgd2hlbiB1c2luZyB0aGUgbW9yZSBjb21wbGV4IHRyYW5zZm9ybSBvcHRpb25zLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvanBlZ3RyYW4uYyBiL2xpYmpwZWd0d3JwL2pwZWd0cmFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWYxMTEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvanBlZ3RyYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKgotICoganBlZ3RyYW4uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciBKUEVHIHRyYW5zY29kaW5nLgotICogSXQgaXMgdmVyeSBzaW1pbGFyIHRvIGNqcGVnLmMsIGJ1dCBwcm92aWRlcyBsb3NzbGVzcyB0cmFuc2NvZGluZyBiZXR3ZWVuCi0gKiBkaWZmZXJlbnQgSlBFRyBmaWxlIGZvcm1hdHMuICBJdCBhbHNvIHByb3ZpZGVzIHNvbWUgbG9zc2xlc3MgYW5kIHNvcnQtb2YtCi0gKiBsb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbnMgb2YgSlBFRyBkYXRhLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0jaW5jbHVkZSAidHJhbnN1cHAuaCIJCS8qIFN1cHBvcnQgcm91dGluZXMgZm9yIGpwZWd0cmFuICovCi0jaW5jbHVkZSAianZlcnNpb24uaCIJCS8qIGZvciB2ZXJzaW9uIG1lc3NhZ2UgKi8KLQotI2lmZGVmIFVTRV9DQ09NTUFORAkJLyogY29tbWFuZC1saW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCi0jaWZkZWYgX19NV0VSS1NfXwotI2luY2x1ZGUgPFNJT1VYLmg+ICAgICAgICAgICAgICAvKiBNZXRyb3dlcmtzIG5lZWRzIHRoaXMgKi8KLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiAuLi4gYW5kIHRoaXMgKi8KLSNlbmRpZgotI2lmZGVmIFRISU5LX0MKLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBUaGluayBkZWNsYXJlcyBpdCBoZXJlICovCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qCi0gKiBBcmd1bWVudC1wYXJzaW5nIGNvZGUuCi0gKiBUaGUgc3dpdGNoIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSB1c2VmdWwgd2l0aCBET1Mtc3R5bGUgY29tbWFuZCBsaW5lCi0gKiBzeW50YXgsIGllLCBpbnRlcm1peGVkIHN3aXRjaGVzIGFuZCBmaWxlIG5hbWVzLCB3aGVyZSBvbmx5IHRoZSBzd2l0Y2hlcwotICogdG8gdGhlIGxlZnQgb2YgYSBnaXZlbiBmaWxlIG5hbWUgYWZmZWN0IHByb2Nlc3Npbmcgb2YgdGhhdCBmaWxlLgotICogVGhlIG1haW4gcHJvZ3JhbSBpbiB0aGlzIGZpbGUgZG9lc24ndCBhY3R1YWxseSB1c2UgdGhpcyBjYXBhYmlsaXR5Li4uCi0gKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCi1zdGF0aWMgSkNPUFlfT1BUSU9OIGNvcHlvcHRpb247CS8qIC1jb3B5IHN3aXRjaCAqLwotc3RhdGljIGpwZWdfdHJhbnNmb3JtX2luZm8gdHJhbnNmb3Jtb3B0aW9uOyAvKiBpbWFnZSB0cmFuc2Zvcm1hdGlvbiBvcHRpb25zICovCi0KLQotTE9DQUwodm9pZCkKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKLSNlbHNlCi0gIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOwotI2VuZGlmCi0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvcHkgbm9uZSAgICAgQ29weSBubyBleHRyYSBtYXJrZXJzIGZyb20gc291cmNlIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvcHkgY29tbWVudHMgQ29weSBvbmx5IGNvbW1lbnQgbWFya2VycyAoZGVmYXVsdClcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvcHkgYWxsICAgICAgQ29weSBhbGwgZXh0cmEgbWFya2Vyc1xuIik7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtb3B0aW1pemUgICAgICBPcHRpbWl6ZSBIdWZmbWFuIHRhYmxlIChzbWFsbGVyIGZpbGUsIGJ1dCBzbG93IGNvbXByZXNzaW9uKVxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXByb2dyZXNzaXZlICAgQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZVxuIik7Ci0jZW5kaWYKLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBtb2RpZnlpbmcgdGhlIGltYWdlOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZ3JheXNjYWxlICAgICBSZWR1Y2UgdG8gZ3JheXNjYWxlIChvbWl0IGNvbG9yIGRhdGEpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1mbGlwIFtob3Jpem9udGFsfHZlcnRpY2FsXSAgTWlycm9yIGltYWdlIChsZWZ0LXJpZ2h0IG9yIHRvcC1ib3R0b20pXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1yb3RhdGUgWzkwfDE4MHwyNzBdICAgICAgICAgUm90YXRlIGltYWdlIChkZWdyZWVzIGNsb2Nrd2lzZSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRyYW5zcG9zZSAgICAgVHJhbnNwb3NlIGltYWdlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC10cmFuc3ZlcnNlICAgIFRyYW5zdmVyc2UgdHJhbnNwb3NlIGltYWdlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC10cmltICAgICAgICAgIERyb3Agbm9uLXRyYW5zZm9ybWFibGUgZWRnZSBibG9ja3NcbiIpOwotI2VuZGlmIC8qIFRSQU5TRk9STVNfU1VQUE9SVEVEICovCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcmVzdGFydCBOICAgICBTZXQgcmVzdGFydCBpbnRlcnZhbCBpbiByb3dzLCBvciBpbiBibG9ja3Mgd2l0aCBCXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1tYXhtZW1vcnkgTiAgIE1heGltdW0gbWVtb3J5IHRvIHVzZSAoaW4ga2J5dGVzKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtb3V0ZmlsZSBuYW1lICBTcGVjaWZ5IG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICBvciAgLWRlYnVnICAgRW1pdCBkZWJ1ZyBvdXRwdXRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciB3aXphcmRzOlxuIik7Ci0jaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtYXJpdGhtZXRpYyAgICBVc2UgYXJpdGhtZXRpYyBjb2RpbmdcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbnMgZmlsZSAgICBDcmVhdGUgbXVsdGktc2NhbiBKUEVHIHBlciBzY3JpcHQgZmlsZVxuIik7Ci0jZW5kaWYKLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1zZWxlY3RfdHJhbnNmb3JtIChKWEZPUk1fQ09ERSB0cmFuc2Zvcm0pCi0vKiBTaWxseSBsaXR0bGUgcm91dGluZSB0byBkZXRlY3QgbXVsdGlwbGUgdHJhbnNmb3JtIG9wdGlvbnMsCi0gKiB3aGljaCB3ZSBjYW4ndCBoYW5kbGUuCi0gKi8KLXsKLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotICBpZiAodHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9PSBKWEZPUk1fTk9ORSB8fAotICAgICAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9PSB0cmFuc2Zvcm0pIHsKLSAgICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID0gdHJhbnNmb3JtOwotICB9IGVsc2UgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbiBvbmx5IGRvIG9uZSBpbWFnZSB0cmFuc2Zvcm1hdGlvbiBhdCBhIHRpbWVcbiIsCi0JICAgIHByb2duYW1lKTsKLSAgICB1c2FnZSgpOwotICB9Ci0jZWxzZQotICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgaW1hZ2UgdHJhbnNmb3JtYXRpb24gd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgIHByb2duYW1lKTsKLSAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi19Ci0KLQotTE9DQUwoaW50KQotcGFyc2Vfc3dpdGNoZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCi0JCWludCBsYXN0X2ZpbGVfYXJnX3NlZW4sIGJvb2xlYW4gZm9yX3JlYWwpCi0vKiBQYXJzZSBvcHRpb25hbCBzd2l0Y2hlcy4KLSAqIFJldHVybnMgYXJndltdIGluZGV4IG9mIGZpcnN0IGZpbGUtbmFtZSBhcmd1bWVudCAoPT0gYXJnYyBpZiBub25lKS4KLSAqIEFueSBmaWxlIG5hbWVzIHdpdGggaW5kZXhlcyA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4gYXJlIGlnbm9yZWQ7Ci0gKiB0aGV5IGhhdmUgcHJlc3VtYWJseSBiZWVuIHByb2Nlc3NlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi4KLSAqIChQYXNzIDAgZm9yIGxhc3RfZmlsZV9hcmdfc2VlbiBvbiB0aGUgZmlyc3Qgb3Igb25seSBpdGVyYXRpb24uKQotICogZm9yX3JlYWwgaXMgRkFMU0Ugb24gdGhlIGZpcnN0IChkdW1teSkgcGFzczsgd2UgbWF5IHNraXAgYW55IGV4cGVuc2l2ZQotICogcHJvY2Vzc2luZy4KLSAqLwotewotICBpbnQgYXJnbjsKLSAgY2hhciAqIGFyZzsKLSAgYm9vbGVhbiBzaW1wbGVfcHJvZ3Jlc3NpdmU7Ci0gIGNoYXIgKiBzY2Fuc2FyZyA9IE5VTEw7CS8qIHNhdmVzIC1zY2FucyBwYXJtIGlmIGFueSAqLwotCi0gIC8qIFNldCB1cCBkZWZhdWx0IEpQRUcgcGFyYW1ldGVycy4gKi8KLSAgc2ltcGxlX3Byb2dyZXNzaXZlID0gRkFMU0U7Ci0gIG91dGZpbGVuYW1lID0gTlVMTDsKLSAgY29weW9wdGlvbiA9IEpDT1BZT1BUX0RFRkFVTFQ7Ci0gIHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPSBKWEZPUk1fTk9ORTsKLSAgdHJhbnNmb3Jtb3B0aW9uLnRyaW0gPSBGQUxTRTsKLSAgdHJhbnNmb3Jtb3B0aW9uLmZvcmNlX2dyYXlzY2FsZSA9IEZBTFNFOwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7Ci0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYWRqdXN0IHBhcmFtZXRlcnMgKi8KLQotICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7Ci0gICAgYXJnID0gYXJndlthcmduXTsKLSAgICBpZiAoKmFyZyAhPSAnLScpIHsKLSAgICAgIC8qIE5vdCBhIHN3aXRjaCwgbXVzdCBiZSBhIGZpbGUgbmFtZSBhcmd1bWVudCAqLwotICAgICAgaWYgKGFyZ24gPD0gbGFzdF9maWxlX2FyZ19zZWVuKSB7Ci0Jb3V0ZmlsZW5hbWUgPSBOVUxMOwkvKiAtb3V0ZmlsZSBhcHBsaWVzIHRvIGp1c3Qgb25lIGlucHV0IGZpbGUgKi8KLQljb250aW51ZTsJCS8qIGlnbm9yZSB0aGlzIG5hbWUgaWYgcHJldmlvdXNseSBwcm9jZXNzZWQgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwkJCS8qIGVsc2UgZG9uZSBwYXJzaW5nIHN3aXRjaGVzICovCi0gICAgfQotICAgIGFyZysrOwkJCS8qIGFkdmFuY2UgcGFzdCBzd2l0Y2ggbWFya2VyIGNoYXJhY3RlciAqLwotCi0gICAgaWYgKGtleW1hdGNoKGFyZywgImFyaXRobWV0aWMiLCAxKSkgewotICAgICAgLyogVXNlIGFyaXRobWV0aWMgY29kaW5nLiAqLwotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICAgICAgY2luZm8tPmFyaXRoX2NvZGUgPSBUUlVFOwotI2Vsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBhcml0aG1ldGljIGNvZGluZyBub3Qgc3VwcG9ydGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjb3B5IiwgMSkpIHsKLSAgICAgIC8qIFNlbGVjdCB3aGljaCBleHRyYSBtYXJrZXJzIHRvIGNvcHkuICovCi0gICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwotCXVzYWdlKCk7Ci0gICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm5vbmUiLCAxKSkgewotCWNvcHlvcHRpb24gPSBKQ09QWU9QVF9OT05FOwotICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiY29tbWVudHMiLCAxKSkgewotCWNvcHlvcHRpb24gPSBKQ09QWU9QVF9DT01NRU5UUzsKLSAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImFsbCIsIDEpKSB7Ci0JY29weW9wdGlvbiA9IEpDT1BZT1BUX0FMTDsKLSAgICAgIH0gZWxzZQotCXVzYWdlKCk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRlYnVnIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7Ci0gICAgICAvKiBFbmFibGUgZGVidWcgcHJpbnRvdXRzLiAqLwotICAgICAgLyogT24gZmlyc3QgLWQsIHByaW50IHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KLSAgICAgIHN0YXRpYyBib29sZWFuIHByaW50ZWRfdmVyc2lvbiA9IEZBTFNFOwotCi0gICAgICBpZiAoISBwcmludGVkX3ZlcnNpb24pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHVFJBTiwgdmVyc2lvbiAlc1xuJXNcbiIsCi0JCUpWRVJTSU9OLCBKQ09QWVJJR0hUKTsKLQlwcmludGVkX3ZlcnNpb24gPSBUUlVFOwotICAgICAgfQotICAgICAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwrKzsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZmxpcCIsIDEpKSB7Ci0gICAgICAvKiBNaXJyb3IgbGVmdC1yaWdodCBvciB0b3AtYm90dG9tLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJob3Jpem9udGFsIiwgMSkpCi0Jc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fRkxJUF9IKTsKLSAgICAgIGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJ2ZXJ0aWNhbCIsIDEpKQotCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX0ZMSVBfVik7Ci0gICAgICBlbHNlCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZ3JheXNjYWxlIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAiZ3JleXNjYWxlIiwxKSkgewotICAgICAgLyogRm9yY2UgdG8gZ3JheXNjYWxlLiAqLwotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0gICAgICB0cmFuc2Zvcm1vcHRpb24uZm9yY2VfZ3JheXNjYWxlID0gVFJVRTsKLSNlbHNlCi0gICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9OT05FKTsJLyogZm9yY2UgYW4gZXJyb3IgKi8KLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXhtZW1vcnkiLCAzKSkgewotICAgICAgLyogTWF4aW11bSBtZW1vcnkgaW4gS2IgKG9yIE1iIHdpdGggJ20nKS4gKi8KLSAgICAgIGxvbmcgbHZhbDsKLSAgICAgIGNoYXIgY2ggPSAneCc7Ci0KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQotCXVzYWdlKCk7Ci0gICAgICBpZiAoY2ggPT0gJ20nIHx8IGNoID09ICdNJykKLQlsdmFsICo9IDEwMDBMOwotICAgICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBsdmFsICogMTAwMEw7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9wdGltaXplIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAib3B0aW1pc2UiLCAxKSkgewotICAgICAgLyogRW5hYmxlIGVudHJvcHkgcGFybSBvcHRpbWl6YXRpb24uICovCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gICAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsKLSNlbHNlCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgZW50cm9weSBvcHRpbWl6YXRpb24gd2FzIG5vdCBjb21waWxlZFxuIiwKLQkgICAgICBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7Ci0gICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KLSAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCi0JdXNhZ2UoKTsKLSAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicHJvZ3Jlc3NpdmUiLCAxKSkgewotICAgICAgLyogU2VsZWN0IHNpbXBsZSBwcm9ncmVzc2l2ZSBtb2RlLiAqLwotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBUUlVFOwotICAgICAgLyogV2UgbXVzdCBwb3N0cG9uZSBleGVjdXRpb24gdW50aWwgbnVtX2NvbXBvbmVudHMgaXMga25vd24uICovCi0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIHByb2dyZXNzaXZlIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAotCSAgICAgIHByb2duYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJyZXN0YXJ0IiwgMSkpIHsKLSAgICAgIC8qIFJlc3RhcnQgaW50ZXJ2YWwgaW4gTUNVIHJvd3MgKG9yIGluIE1DVXMgd2l0aCAnYicpLiAqLwotICAgICAgbG9uZyBsdmFsOwotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCi0JdXNhZ2UoKTsKLSAgICAgIGlmIChsdmFsIDwgMCB8fCBsdmFsID4gNjU1MzVMKQotCXVzYWdlKCk7Ci0gICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgewotCWNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgbHZhbDsKLQljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsgLyogZWxzZSBwcmlvciAnLXJlc3RhcnQgbicgb3ZlcnJpZGVzIG1lICovCi0gICAgICB9IGVsc2UgewotCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAoaW50KSBsdmFsOwotCS8qIHJlc3RhcnRfaW50ZXJ2YWwgd2lsbCBiZSBjb21wdXRlZCBkdXJpbmcgc3RhcnR1cCAqLwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJyb3RhdGUiLCAyKSkgewotICAgICAgLyogUm90YXRlIDkwLCAxODAsIG9yIDI3MCBkZWdyZWVzIChtZWFzdXJlZCBjbG9ja3dpc2UpLiAqLwotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICI5MCIsIDIpKQotCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF85MCk7Ci0gICAgICBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiMTgwIiwgMykpCi0Jc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fUk9UXzE4MCk7Ci0gICAgICBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiMjcwIiwgMykpCi0Jc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fUk9UXzI3MCk7Ci0gICAgICBlbHNlCi0JdXNhZ2UoKTsKLQotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbnMiLCAxKSkgewotICAgICAgLyogU2V0IHNjYW4gc2NyaXB0LiAqLwotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KLQl1c2FnZSgpOwotICAgICAgc2NhbnNhcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogV2UgbXVzdCBwb3N0cG9uZSByZWFkaW5nIHRoZSBmaWxlIGluIGNhc2UgLXByb2dyZXNzaXZlIGFwcGVhcnMuICovCi0jZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIG11bHRpLXNjYW4gb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRyYW5zcG9zZSIsIDEpKSB7Ci0gICAgICAvKiBUcmFuc3Bvc2UgKGFjcm9zcyBVTC10by1MUiBheGlzKS4gKi8KLSAgICAgIHNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1RSQU5TUE9TRSk7Ci0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRyYW5zdmVyc2UiLCA2KSkgewotICAgICAgLyogVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgKGFjcm9zcyBVUi10by1MTCBheGlzKS4gKi8KLSAgICAgIHNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1RSQU5TVkVSU0UpOwotCi0gICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmltIiwgMykpIHsKLSAgICAgIC8qIFRyaW0gb2ZmIGFueSBwYXJ0aWFsIGVkZ2UgTUNVcyB0aGF0IHRoZSB0cmFuc2Zvcm0gY2FuJ3QgaGFuZGxlLiAqLwotICAgICAgdHJhbnNmb3Jtb3B0aW9uLnRyaW0gPSBUUlVFOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCi0gICAgfQotICB9Ci0KLSAgLyogUG9zdC1zd2l0Y2gtc2Nhbm5pbmcgY2xlYW51cCAqLwotCi0gIGlmIChmb3JfcmVhbCkgewotCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICBpZiAoc2ltcGxlX3Byb2dyZXNzaXZlKQkvKiBwcm9jZXNzIC1wcm9ncmVzc2l2ZTsgLXNjYW5zIGNhbiBvdmVycmlkZSAqLwotICAgICAganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24oY2luZm8pOwotI2VuZGlmCi0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICBpZiAoc2NhbnNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtc2NhbnMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHJlYWRfc2Nhbl9zY3JpcHQoY2luZm8sIHNjYW5zYXJnKSkKLQl1c2FnZSgpOwotI2VuZGlmCi0gIH0KLQotICByZXR1cm4gYXJnbjsJCQkvKiByZXR1cm4gaW5kZXggb2YgbmV4dCBhcmcgKGZpbGUgbmFtZSkgKi8KLX0KLQotCi0vKgotICogVGhlIG1haW4gcHJvZ3JhbS4KLSAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3Qgc3JjaW5mbzsKLSAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGRzdGluZm87Ci0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqc3JjZXJyLCBqZHN0ZXJyOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciBwcm9ncmVzczsKLSNlbmRpZgotICBqdmlydF9iYXJyYXlfcHRyICogc3JjX2NvZWZfYXJyYXlzOwotICBqdmlydF9iYXJyYXlfcHRyICogZHN0X2NvZWZfYXJyYXlzOwotICBpbnQgZmlsZV9pbmRleDsKLSAgRklMRSAqIGlucHV0X2ZpbGU7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZTsKLQotICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLwotI2lmZGVmIFVTRV9DQ09NTUFORAotICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOwotI2VuZGlmCi0KLSAgcHJvZ25hbWUgPSBhcmd2WzBdOwotICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQotICAgIHByb2duYW1lID0gImpwZWd0cmFuIjsJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCi0gIHNyY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmpzcmNlcnIpOwotICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZzcmNpbmZvKTsKLSAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLwotICBkc3RpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZHN0ZXJyKTsKLSAganBlZ19jcmVhdGVfY29tcHJlc3MoJmRzdGluZm8pOwotCi0gIC8qIE5vdyBzYWZlIHRvIGVuYWJsZSBzaWduYWwgY2F0Y2hlci4KLSAgICogTm90ZTogd2UgYXNzdW1lIG9ubHkgdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IHdpbGwgaGF2ZSB2aXJ0dWFsIGFycmF5cy4KLSAgICovCi0jaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJnNyY2luZm8pOwotI2VuZGlmCi0KLSAgLyogU2NhbiBjb21tYW5kIGxpbmUgdG8gZmluZCBmaWxlIG5hbWVzLgotICAgKiBJdCBpcyBjb252ZW5pZW50IHRvIHVzZSBqdXN0IG9uZSBzd2l0Y2gtcGFyc2luZyByb3V0aW5lLCBidXQgdGhlIHN3aXRjaAotICAgKiB2YWx1ZXMgcmVhZCBoZXJlIGFyZSBtb3N0bHkgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyCi0gICAqIG9wZW5pbmcgdGhlIGlucHV0IGZpbGUuICBBbHNvIG5vdGUgdGhhdCBtb3N0IG9mIHRoZSBzd2l0Y2hlcyBhZmZlY3QgdGhlCi0gICAqIGRlc3RpbmF0aW9uIEpQRUcgb2JqZWN0LCBzbyB3ZSBwYXJzZSBpbnRvIHRoYXQgYW5kIHRoZW4gY29weSBvdmVyIHdoYXQKLSAgICogbmVlZHMgdG8gYWZmZWN0cyB0aGUgc291cmNlIHRvby4KLSAgICovCi0KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZkc3RpbmZvLCBhcmdjLCBhcmd2LCAwLCBGQUxTRSk7Ci0gIGpzcmNlcnIudHJhY2VfbGV2ZWwgPSBqZHN0ZXJyLnRyYWNlX2xldmVsOwotICBzcmNpbmZvLm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBkc3RpbmZvLm1lbS0+bWF4X21lbW9yeV90b191c2U7Ci0KLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICAvKiBNdXN0IGhhdmUgZWl0aGVyIC1vdXRmaWxlIHN3aXRjaCBvciBleHBsaWNpdCBvdXRwdXQgZmlsZSBuYW1lICovCi0gIGlmIChvdXRmaWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgaWYgKGZpbGVfaW5kZXggIT0gYXJnYy0yKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0gICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2ZpbGVfaW5kZXgrMV07Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpbGVfaW5kZXggIT0gYXJnYy0xKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCi0JICAgICAgcHJvZ25hbWUpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0gIH0KLSNlbHNlCi0gIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KLSAgaWYgKGZpbGVfaW5kZXggPCBhcmdjLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotI2VuZGlmIC8qIFRXT19GSUxFX0NPTU1BTkRMSU5FICovCi0KLSAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gKi8KLSAgaWYgKGZpbGVfaW5kZXggPCBhcmdjKSB7Ci0gICAgaWYgKChpbnB1dF9maWxlID0gZm9wZW4oYXJndltmaWxlX2luZGV4XSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndltmaWxlX2luZGV4XSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGRlZmF1bHQgaW5wdXQgZmlsZSBpcyBzdGRpbiAqLwotICAgIGlucHV0X2ZpbGUgPSByZWFkX3N0ZGluKCk7Ci0gIH0KLQotICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgaWYgKG91dGZpbGVuYW1lICE9IE5VTEwpIHsKLSAgICBpZiAoKG91dHB1dF9maWxlID0gZm9wZW4ob3V0ZmlsZW5hbWUsIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBvdXRmaWxlbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCi0gICAgb3V0cHV0X2ZpbGUgPSB3cml0ZV9zdGRvdXQoKTsKLSAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIHN0YXJ0X3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmRzdGluZm8sICZwcm9ncmVzcyk7Ci0jZW5kaWYKLQotICAvKiBTcGVjaWZ5IGRhdGEgc291cmNlIGZvciBkZWNvbXByZXNzaW9uICovCi0gIGpwZWdfc3RkaW9fc3JjKCZzcmNpbmZvLCBpbnB1dF9maWxlKTsKLQotICAvKiBFbmFibGUgc2F2aW5nIG9mIGV4dHJhIG1hcmtlcnMgdGhhdCB3ZSB3YW50IHRvIGNvcHkgKi8KLSAgamNvcHlfbWFya2Vyc19zZXR1cCgmc3JjaW5mbywgY29weW9wdGlvbik7Ci0KLSAgLyogUmVhZCBmaWxlIGhlYWRlciAqLwotICAodm9pZCkganBlZ19yZWFkX2hlYWRlcigmc3JjaW5mbywgVFJVRSk7Ci0KLSAgLyogQW55IHNwYWNlIG5lZWRlZCBieSBhIHRyYW5zZm9ybSBvcHRpb24gbXVzdCBiZSByZXF1ZXN0ZWQgYmVmb3JlCi0gICAqIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgc28gdGhhdCBtZW1vcnkgYWxsb2NhdGlvbiB3aWxsIGJlIGRvbmUgcmlnaHQuCi0gICAqLwotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0gIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UoJnNyY2luZm8sICZ0cmFuc2Zvcm1vcHRpb24pOwotI2VuZGlmCi0KLSAgLyogUmVhZCBzb3VyY2UgZmlsZSBhcyBEQ1QgY29lZmZpY2llbnRzICovCi0gIHNyY19jb2VmX2FycmF5cyA9IGpwZWdfcmVhZF9jb2VmZmljaWVudHMoJnNyY2luZm8pOwotCi0gIC8qIEluaXRpYWxpemUgZGVzdGluYXRpb24gY29tcHJlc3Npb24gcGFyYW1ldGVycyBmcm9tIHNvdXJjZSB2YWx1ZXMgKi8KLSAganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoJnNyY2luZm8sICZkc3RpbmZvKTsKLQotICAvKiBBZGp1c3QgZGVzdGluYXRpb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZCBieSB0cmFuc2Zvcm0gb3B0aW9uczsKLSAgICogYWxzbyBmaW5kIG91dCB3aGljaCBzZXQgb2YgY29lZmZpY2llbnQgYXJyYXlzIHdpbGwgaG9sZCB0aGUgb3V0cHV0LgotICAgKi8KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotICBkc3RfY29lZl9hcnJheXMgPSBqdHJhbnNmb3JtX2FkanVzdF9wYXJhbWV0ZXJzKCZzcmNpbmZvLCAmZHN0aW5mbywKLQkJCQkJCSBzcmNfY29lZl9hcnJheXMsCi0JCQkJCQkgJnRyYW5zZm9ybW9wdGlvbik7Ci0jZWxzZQotICBkc3RfY29lZl9hcnJheXMgPSBzcmNfY29lZl9hcnJheXM7Ci0jZW5kaWYKLQotICAvKiBBZGp1c3QgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KLSAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZkc3RpbmZvLCBhcmdjLCBhcmd2LCAwLCBUUlVFKTsKLQotICAvKiBTcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gZm9yIGNvbXByZXNzaW9uICovCi0gIGpwZWdfc3RkaW9fZGVzdCgmZHN0aW5mbywgb3V0cHV0X2ZpbGUpOwotCi0gIC8qIFN0YXJ0IGNvbXByZXNzb3IgKG5vdGUgbm8gaW1hZ2UgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIGhlcmUpICovCi0gIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCZkc3RpbmZvLCBkc3RfY29lZl9hcnJheXMpOwotCi0gIC8qIENvcHkgdG8gdGhlIG91dHB1dCBmaWxlIGFueSBleHRyYSBtYXJrZXJzIHRoYXQgd2Ugd2FudCB0byBwcmVzZXJ2ZSAqLwotICBqY29weV9tYXJrZXJzX2V4ZWN1dGUoJnNyY2luZm8sICZkc3RpbmZvLCBjb3B5b3B0aW9uKTsKLQotICAvKiBFeGVjdXRlIGltYWdlIHRyYW5zZm9ybWF0aW9uLCBpZiBhbnkgKi8KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotICBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24oJnNyY2luZm8sICZkc3RpbmZvLAotCQkJCSAgICBzcmNfY29lZl9hcnJheXMsCi0JCQkJICAgICZ0cmFuc2Zvcm1vcHRpb24pOwotI2VuZGlmCi0KLSAgLyogRmluaXNoIGNvbXByZXNzaW9uIGFuZCByZWxlYXNlIG1lbW9yeSAqLwotICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmZHN0aW5mbyk7Ci0gIGpwZWdfZGVzdHJveV9jb21wcmVzcygmZHN0aW5mbyk7Ci0gICh2b2lkKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZzcmNpbmZvKTsKLSAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJnNyY2luZm8pOwotCi0gIC8qIENsb3NlIGZpbGVzLCBpZiB3ZSBvcGVuZWQgdGhlbSAqLwotICBpZiAoaW5wdXRfZmlsZSAhPSBzdGRpbikKLSAgICBmY2xvc2UoaW5wdXRfZmlsZSk7Ci0gIGlmIChvdXRwdXRfZmlsZSAhPSBzdGRvdXQpCi0gICAgZmNsb3NlKG91dHB1dF9maWxlKTsKLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBlbmRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmZHN0aW5mbyk7Ci0jZW5kaWYKLQotICAvKiBBbGwgZG9uZS4gKi8KLSAgZXhpdChqc3JjZXJyLm51bV93YXJuaW5ncyArIGpkc3RlcnIubnVtX3dhcm5pbmdzID9FWElUX1dBUk5JTkc6RVhJVF9TVUNDRVNTKTsKLSAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCi19CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qcXVhbnQxLmMgYi9saWJqcGVndHdycC9qcXVhbnQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjk2YWEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvanF1YW50MS5jCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qCi0gKiBqcXVhbnQxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIChjb2xvciBtYXBwaW5nKSByb3V0aW5lcy4KLSAqIFRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgbWFwcGluZyB0byBhIGZpeGVkIGNvbG9yIG1hcCB1c2luZyBlcXVhbGx5IHNwYWNlZAotICogY29sb3IgdmFsdWVzLiAgT3B0aW9uYWwgRmxveWQtU3RlaW5iZXJnIG9yIG9yZGVyZWQgZGl0aGVyaW5nIGlzIGF2YWlsYWJsZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLSNpZmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQKLQotCi0vKgotICogVGhlIG1haW4gcHVycG9zZSBvZiAxLXBhc3MgcXVhbnRpemF0aW9uIGlzIHRvIHByb3ZpZGUgYSBmYXN0LCBpZiBub3QgdmVyeQotICogaGlnaCBxdWFsaXR5LCBjb2xvcm1hcHBlZCBvdXRwdXQgY2FwYWJpbGl0eS4gIEEgMi1wYXNzIHF1YW50aXplciB1c3VhbGx5Ci0gKiBnaXZlcyBiZXR0ZXIgdmlzdWFsIHF1YWxpdHk7IGhvd2V2ZXIsIGZvciBxdWFudGl6ZWQgZ3JheXNjYWxlIG91dHB1dCB0aGlzCi0gKiBxdWFudGl6ZXIgaXMgcGVyZmVjdGx5IGFkZXF1YXRlLiAgRGl0aGVyaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMKLSAqIHF1YW50aXplciwgdGhvdWdoIHlvdSBjYW4gdHVybiBpdCBvZmYgaWYgeW91IHJlYWxseSB3YW50IHRvLgotICoKLSAqIEluIDEtcGFzcyBxdWFudGl6YXRpb24gdGhlIGNvbG9ybWFwIG11c3QgYmUgY2hvc2VuIGluIGFkdmFuY2Ugb2Ygc2VlaW5nIHRoZQotICogaW1hZ2UuICBXZSB1c2UgYSBtYXAgY29uc2lzdGluZyBvZiBhbGwgY29tYmluYXRpb25zIG9mIE5jb2xvcnNbaV0gY29sb3IKLSAqIHZhbHVlcyBmb3IgdGhlIGkndGggY29tcG9uZW50LiAgVGhlIE5jb2xvcnNbXSB2YWx1ZXMgYXJlIGNob3NlbiBzbyB0aGF0Ci0gKiB0aGVpciBwcm9kdWN0LCB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbG9ycywgaXMgbm8gbW9yZSB0aGFuIHRoYXQgcmVxdWVzdGVkLgotICogKEluIG1vc3QgY2FzZXMsIHRoZSBwcm9kdWN0IHdpbGwgYmUgc29tZXdoYXQgbGVzcy4pCi0gKgotICogU2luY2UgdGhlIGNvbG9ybWFwIGlzIG9ydGhvZ29uYWwsIHRoZSByZXByZXNlbnRhdGl2ZSB2YWx1ZSBmb3IgZWFjaCBjb2xvcgotICogY29tcG9uZW50IGNhbiBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyIGNvbXBvbmVudHM7Ci0gKiB0aGVuIHRoZXNlIGluZGV4ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBjb2xvcm1hcCBpbmRleCBieSBhIHN0YW5kYXJkCi0gKiBOLWRpbWVuc2lvbmFsLWFycmF5LXN1YnNjcmlwdCBjYWxjdWxhdGlvbi4gIE1vc3Qgb2YgdGhlIGFyaXRobWV0aWMgaW52b2x2ZWQKLSAqIGNhbiBiZSBwcmVjYWxjdWxhdGVkIGFuZCBzdG9yZWQgaW4gdGhlIGxvb2t1cCB0YWJsZSBjb2xvcmluZGV4W10uCi0gKiBjb2xvcmluZGV4W2ldW2pdIG1hcHMgcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSB0byB0aGUgbmVhcmVzdAotICogcmVwcmVzZW50YXRpdmUgdmFsdWUgKGdyaWQgcGxhbmUpIGZvciB0aGF0IGNvbXBvbmVudDsgdGhpcyBpbmRleCBpcwotICogbXVsdGlwbGllZCBieSB0aGUgYXJyYXkgc3RyaWRlIGZvciBjb21wb25lbnQgaSwgc28gdGhhdCB0aGUKLSAqIGluZGV4IG9mIHRoZSBjb2xvcm1hcCBlbnRyeSBjbG9zZXN0IHRvIGEgZ2l2ZW4gcGl4ZWwgdmFsdWUgaXMganVzdAotICogICAgc3VtKCBjb2xvcmluZGV4W2NvbXBvbmVudC1udW1iZXJdW3BpeGVsLWNvbXBvbmVudC12YWx1ZV0gKQotICogQXNpZGUgZnJvbSBiZWluZyBmYXN0LCB0aGlzIHNjaGVtZSBhbGxvd3MgZm9yIHZhcmlhYmxlIHNwYWNpbmcgYmV0d2VlbgotICogcmVwcmVzZW50YXRpdmUgdmFsdWVzIHdpdGggbm8gYWRkaXRpb25hbCBsb29rdXAgY29zdC4KLSAqCi0gKiBJZiBnYW1tYSBjb3JyZWN0aW9uIGhhcyBiZWVuIGFwcGxpZWQgaW4gY29sb3IgY29udmVyc2lvbiwgaXQgbWlnaHQgYmUgd2lzZQotICogdG8gYWRqdXN0IHRoZSBjb2xvciBncmlkIHNwYWNpbmcgc28gdGhhdCB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3JzIGFyZQotICogZXF1aWRpc3RhbnQgaW4gbGluZWFyIHNwYWNlLiAgQXQgdGhpcyB3cml0aW5nLCBnYW1tYSBjb3JyZWN0aW9uIGlzIG5vdAotICogaW1wbGVtZW50ZWQgYnkgamRjb2xvciwgc28gbm90aGluZyBpcyBkb25lIGhlcmUuCi0gKi8KLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgotICoKLSAqIFdlIHVzZSBhIHN0YW5kYXJkIDE2eDE2IG9yZGVyZWQgZGl0aGVyIGFycmF5LiAgVGhlIGJhc2ljIGNvbmNlcHQgb2Ygb3JkZXJlZAotICogZGl0aGVyaW5nIGlzIGRlc2NyaWJlZCBpbiBtYW55IHJlZmVyZW5jZXMsIGZvciBpbnN0YW5jZSBEYWxlIFNjaHVtYWNoZXIncwotICogY2hhcHRlciBJSS4yIG9mIEdyYXBoaWNzIEdlbXMgSUkgKEphbWVzIEFydm8sIGVkLiBBY2FkZW1pYyBQcmVzcywgMTk5MSkuCi0gKiBJbiBwbGFjZSBvZiBTY2h1bWFjaGVyJ3MgY29tcGFyaXNvbnMgYWdhaW5zdCBhICJ0aHJlc2hvbGQiIHZhbHVlLCB3ZSBhZGQgYQotICogImRpdGhlciIgdmFsdWUgdG8gdGhlIGlucHV0IHBpeGVsIGFuZCB0aGVuIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIG5lYXJlc3QKLSAqIG91dHB1dCB2YWx1ZS4gIFRoZSBkaXRoZXIgdmFsdWUgaXMgZXF1aXZhbGVudCB0byAoMC41IC0gdGhyZXNob2xkKSB0aW1lcwotICogdGhlIGRpc3RhbmNlIGJldHdlZW4gb3V0cHV0IHZhbHVlcy4gIEZvciBvcmRlcmVkIGRpdGhlcmluZywgd2UgYXNzdW1lIHRoYXQKLSAqIHRoZSBvdXRwdXQgY29sb3JzIGFyZSBlcXVhbGx5IHNwYWNlZDsgaWYgbm90LCByZXN1bHRzIHdpbGwgcHJvYmFibHkgYmUKLSAqIHdvcnNlLCBzaW5jZSB0aGUgZGl0aGVyIG1heSBiZSB0b28gbXVjaCBvciB0b28gbGl0dGxlIGF0IGEgZ2l2ZW4gcG9pbnQuCi0gKgotICogVGhlIG5vcm1hbCBjYWxjdWxhdGlvbiB3b3VsZCBiZSB0byBmb3JtIHBpeGVsIHZhbHVlICsgZGl0aGVyLCByYW5nZS1saW1pdAotICogdGhpcyB0byAwLi5NQVhKU0FNUExFLCBhbmQgdGhlbiBpbmRleCBpbnRvIHRoZSBjb2xvcmluZGV4IHRhYmxlIGFzIHVzdWFsLgotICogV2UgY2FuIHNraXAgdGhlIHNlcGFyYXRlIHJhbmdlLWxpbWl0aW5nIHN0ZXAgYnkgZXh0ZW5kaW5nIHRoZSBjb2xvcmluZGV4Ci0gKiB0YWJsZSBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKi8KLQotI2RlZmluZSBPRElUSEVSX1NJWkUgIDE2CS8qIGRpbWVuc2lvbiBvZiBkaXRoZXIgbWF0cml4ICovCi0vKiBOQjogaWYgT0RJVEhFUl9TSVpFIGlzIG5vdCBhIHBvd2VyIG9mIDIsIE9ESVRIRVJfTUFTSyB1c2VzIHdpbGwgYnJlYWsgKi8KLSNkZWZpbmUgT0RJVEhFUl9DRUxMUyAoT0RJVEhFUl9TSVpFKk9ESVRIRVJfU0laRSkJLyogIyBjZWxscyBpbiBtYXRyaXggKi8KLSNkZWZpbmUgT0RJVEhFUl9NQVNLICAoT0RJVEhFUl9TSVpFLTEpIC8qIG1hc2sgZm9yIHdyYXBwaW5nIGFyb3VuZCBjb3VudGVycyAqLwotCi10eXBlZGVmIGludCBPRElUSEVSX01BVFJJWFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV07Ci10eXBlZGVmIGludCAoKk9ESVRIRVJfTUFUUklYX1BUUilbT0RJVEhFUl9TSVpFXTsKLQotc3RhdGljIGNvbnN0IFVJTlQ4IGJhc2VfZGl0aGVyX21hdHJpeFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV0gPSB7Ci0gIC8qIEJheWVyJ3Mgb3JkZXItNCBkaXRoZXIgYXJyYXkuICBHZW5lcmF0ZWQgYnkgdGhlIGNvZGUgZ2l2ZW4gaW4KLSAgICogU3RlcGhlbiBIYXdsZXkncyBhcnRpY2xlICJPcmRlcmVkIERpdGhlcmluZyIgaW4gR3JhcGhpY3MgR2VtcyBJLgotICAgKiBUaGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgbXVzdCByYW5nZSBmcm9tIDAgdG8gT0RJVEhFUl9DRUxMUy0xLgotICAgKi8KLSAgeyAgIDAsMTkyLCA0OCwyNDAsIDEyLDIwNCwgNjAsMjUyLCAgMywxOTUsIDUxLDI0MywgMTUsMjA3LCA2MywyNTUgfSwKLSAgeyAxMjgsIDY0LDE3NiwxMTIsMTQwLCA3NiwxODgsMTI0LDEzMSwgNjcsMTc5LDExNSwxNDMsIDc5LDE5MSwxMjcgfSwKLSAgeyAgMzIsMjI0LCAxNiwyMDgsIDQ0LDIzNiwgMjgsMjIwLCAzNSwyMjcsIDE5LDIxMSwgNDcsMjM5LCAzMSwyMjMgfSwKLSAgeyAxNjAsIDk2LDE0NCwgODAsMTcyLDEwOCwxNTYsIDkyLDE2MywgOTksMTQ3LCA4MywxNzUsMTExLDE1OSwgOTUgfSwKLSAgeyAgIDgsMjAwLCA1NiwyNDgsICA0LDE5NiwgNTIsMjQ0LCAxMSwyMDMsIDU5LDI1MSwgIDcsMTk5LCA1NSwyNDcgfSwKLSAgeyAxMzYsIDcyLDE4NCwxMjAsMTMyLCA2OCwxODAsMTE2LDEzOSwgNzUsMTg3LDEyMywxMzUsIDcxLDE4MywxMTkgfSwKLSAgeyAgNDAsMjMyLCAyNCwyMTYsIDM2LDIyOCwgMjAsMjEyLCA0MywyMzUsIDI3LDIxOSwgMzksMjMxLCAyMywyMTUgfSwKLSAgeyAxNjgsMTA0LDE1MiwgODgsMTY0LDEwMCwxNDgsIDg0LDE3MSwxMDcsMTU1LCA5MSwxNjcsMTAzLDE1MSwgODcgfSwKLSAgeyAgIDIsMTk0LCA1MCwyNDIsIDE0LDIwNiwgNjIsMjU0LCAgMSwxOTMsIDQ5LDI0MSwgMTMsMjA1LCA2MSwyNTMgfSwKLSAgeyAxMzAsIDY2LDE3OCwxMTQsMTQyLCA3OCwxOTAsMTI2LDEyOSwgNjUsMTc3LDExMywxNDEsIDc3LDE4OSwxMjUgfSwKLSAgeyAgMzQsMjI2LCAxOCwyMTAsIDQ2LDIzOCwgMzAsMjIyLCAzMywyMjUsIDE3LDIwOSwgNDUsMjM3LCAyOSwyMjEgfSwKLSAgeyAxNjIsIDk4LDE0NiwgODIsMTc0LDExMCwxNTgsIDk0LDE2MSwgOTcsMTQ1LCA4MSwxNzMsMTA5LDE1NywgOTMgfSwKLSAgeyAgMTAsMjAyLCA1OCwyNTAsICA2LDE5OCwgNTQsMjQ2LCAgOSwyMDEsIDU3LDI0OSwgIDUsMTk3LCA1MywyNDUgfSwKLSAgeyAxMzgsIDc0LDE4NiwxMjIsMTM0LCA3MCwxODIsMTE4LDEzNywgNzMsMTg1LDEyMSwxMzMsIDY5LDE4MSwxMTcgfSwKLSAgeyAgNDIsMjM0LCAyNiwyMTgsIDM4LDIzMCwgMjIsMjE0LCA0MSwyMzMsIDI1LDIxNywgMzcsMjI5LCAyMSwyMTMgfSwKLSAgeyAxNzAsMTA2LDE1NCwgOTAsMTY2LDEwMiwxNTAsIDg2LDE2OSwxMDUsMTUzLCA4OSwxNjUsMTAxLDE0OSwgODUgfQotfTsKLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCi0gKgotICogRXJyb3JzIGFyZSBhY2N1bXVsYXRlZCBpbnRvIHRoZSBhcnJheSBmc2Vycm9yc1tdLCBhdCBhIHJlc29sdXRpb24gb2YKLSAqIDEvMTZ0aCBvZiBhIHBpeGVsIGNvdW50LiAgVGhlIGVycm9yIGF0IGEgZ2l2ZW4gcGl4ZWwgaXMgcHJvcGFnYXRlZAotICogdG8gaXRzIG5vdC15ZXQtcHJvY2Vzc2VkIG5laWdoYm9ycyB1c2luZyB0aGUgc3RhbmRhcmQgRi1TIGZyYWN0aW9ucywKLSAqCQkuLi4JKGhlcmUpCTcvMTYKLSAqCQkzLzE2CTUvMTYJMS8xNgotICogV2Ugd29yayBsZWZ0LXRvLXJpZ2h0IG9uIGV2ZW4gcm93cywgcmlnaHQtdG8tbGVmdCBvbiBvZGQgcm93cy4KLSAqCi0gKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aCBhIHNpbmdsZSBhcnJheSAoaG9sZGluZyBvbmUgcm93J3Mgd29ydGggb2YgZXJyb3JzKQotICogYnkgdXNpbmcgaXQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgcm93J3MgZXJyb3JzIGF0IHBpeGVsIGNvbHVtbnMgbm90IHlldAotICogcHJvY2Vzc2VkLCBidXQgdGhlIG5leHQgcm93J3MgZXJyb3JzIGF0IGNvbHVtbnMgYWxyZWFkeSBwcm9jZXNzZWQuICBXZQotICogbmVlZCBvbmx5IGEgZmV3IGV4dHJhIHZhcmlhYmxlcyB0byBob2xkIHRoZSBlcnJvcnMgaW1tZWRpYXRlbHkgYXJvdW5kIHRoZQotICogY3VycmVudCBjb2x1bW4uICAoSWYgd2UgYXJlIGx1Y2t5LCB0aG9zZSB2YXJpYWJsZXMgYXJlIGluIHJlZ2lzdGVycywgYnV0Ci0gKiBldmVuIGlmIG5vdCwgdGhleSdyZSBwcm9iYWJseSBjaGVhcGVyIHRvIGFjY2VzcyB0aGFuIGFycmF5IGVsZW1lbnRzIGFyZS4pCi0gKgotICogVGhlIGZzZXJyb3JzW10gYXJyYXkgaXMgaW5kZXhlZCBbY29tcG9uZW50I11bcG9zaXRpb25dLgotICogV2UgcHJvdmlkZSAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzIHBlciBjb21wb25lbnQ7IHRoZSBleHRyYSBlbnRyeSBhdCBlYWNoCi0gKiBlbmQgc2F2ZXMgdXMgZnJvbSBzcGVjaWFsLWNhc2luZyB0aGUgZmlyc3QgYW5kIGxhc3QgcGl4ZWxzLgotICoKLSAqIE5vdGU6IG9uIGEgd2lkZSBpbWFnZSwgd2UgbWlnaHQgbm90IGhhdmUgZW5vdWdoIHJvb20gaW4gYSBQQydzIG5lYXIgZGF0YQotICogc2VnbWVudCB0byBob2xkIHRoZSBlcnJvciBhcnJheTsgc28gaXQgaXMgYWxsb2NhdGVkIHdpdGggYWxsb2NfbGFyZ2UuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci10eXBlZGVmIElOVDE2IEZTRVJST1I7CQkvKiAxNiBiaXRzIHNob3VsZCBiZSBlbm91Z2ggKi8KLXR5cGVkZWYgaW50IExPQ0ZTRVJST1I7CQkvKiB1c2UgJ2ludCcgZm9yIGNhbGN1bGF0aW9uIHRlbXBzICovCi0jZWxzZQotdHlwZWRlZiBJTlQzMiBGU0VSUk9SOwkJLyogbWF5IG5lZWQgbW9yZSB0aGFuIDE2IGJpdHMgKi8KLXR5cGVkZWYgSU5UMzIgTE9DRlNFUlJPUjsJLyogYmUgc3VyZSBjYWxjdWxhdGlvbiB0ZW1wcyBhcmUgYmlnIGVub3VnaCAqLwotI2VuZGlmCi0KLXR5cGVkZWYgRlNFUlJPUiBGQVIgKkZTRVJSUFRSOwkvKiBwb2ludGVyIHRvIGVycm9yIGFycmF5IChpbiBGQVIgc3RvcmFnZSEpICovCi0KLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotI2RlZmluZSBNQVhfUV9DT01QUyA0CQkvKiBtYXggY29tcG9uZW50cyBJIGNhbiBoYW5kbGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogSW5pdGlhbGx5IGFsbG9jYXRlZCBjb2xvcm1hcCBpcyBzYXZlZCBoZXJlICovCi0gIEpTQU1QQVJSQVkgc3ZfY29sb3JtYXA7CS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KLSAgaW50IHN2X2FjdHVhbDsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLwotCi0gIEpTQU1QQVJSQVkgY29sb3JpbmRleDsJLyogUHJlY29tcHV0ZWQgbWFwcGluZyBmb3Igc3BlZWQgKi8KLSAgLyogY29sb3JpbmRleFtpXVtqXSA9IGluZGV4IG9mIGNvbG9yIGNsb3Nlc3QgdG8gcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSwKLSAgICogcHJlbXVsdGlwbGllZCBhcyBkZXNjcmliZWQgYWJvdmUuICBTaW5jZSBjb2xvcm1hcCBpbmRleGVzIG11c3QgZml0IGludG8KLSAgICogSlNBTVBMRXMsIHRoZSBlbnRyaWVzIG9mIHRoaXMgYXJyYXkgd2lsbCB0b28uCi0gICAqLwotICBib29sZWFuIGlzX3BhZGRlZDsJCS8qIGlzIHRoZSBjb2xvcmluZGV4IHBhZGRlZCBmb3Igb2RpdGhlcj8gKi8KLQotICBpbnQgTmNvbG9yc1tNQVhfUV9DT01QU107CS8qICMgb2YgdmFsdWVzIGFsbG9jZWQgdG8gZWFjaCBjb21wb25lbnQgKi8KLQotICAvKiBWYXJpYWJsZXMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nICovCi0gIGludCByb3dfaW5kZXg7CQkvKiBjdXIgcm93J3MgdmVydGljYWwgaW5kZXggaW4gZGl0aGVyIG1hdHJpeCAqLwotICBPRElUSEVSX01BVFJJWF9QVFIgb2RpdGhlcltNQVhfUV9DT01QU107IC8qIG9uZSBkaXRoZXIgYXJyYXkgcGVyIGNvbXBvbmVudCAqLwotCi0gIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLwotICBGU0VSUlBUUiBmc2Vycm9yc1tNQVhfUV9DT01QU107IC8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLwotICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KLX0gbXlfY3F1YW50aXplcjsKLQotdHlwZWRlZiBteV9jcXVhbnRpemVyICogbXlfY3F1YW50aXplX3B0cjsKLQotCi0vKgotICogUG9saWN5LW1ha2luZyBzdWJyb3V0aW5lcyBmb3IgY3JlYXRlX2NvbG9ybWFwIGFuZCBjcmVhdGVfY29sb3JpbmRleC4KLSAqIFRoZXNlIHJvdXRpbmVzIGRldGVybWluZSB0aGUgY29sb3JtYXAgdG8gYmUgdXNlZC4gIFRoZSByZXN0IG9mIHRoZSBtb2R1bGUKLSAqIG9ubHkgYXNzdW1lcyB0aGF0IHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLgotICoKLSAqICAqIHNlbGVjdF9uY29sb3JzIGRlY2lkZXMgaG93IHRvIGRpdnZ5IHVwIHRoZSBhdmFpbGFibGUgY29sb3JzCi0gKiAgICBhbW9uZyB0aGUgY29tcG9uZW50cy4KLSAqICAqIG91dHB1dF92YWx1ZSBkZWZpbmVzIHRoZSBzZXQgb2YgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KLSAqICAqIGxhcmdlc3RfaW5wdXRfdmFsdWUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGlucHV0IHZhbHVlcyB0bwotICogICAgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KLSAqIE5vdGUgdGhhdCB0aGUgbGF0dGVyIHR3byByb3V0aW5lcyBtYXkgaW1wb3NlIGRpZmZlcmVudCBwb2xpY2llcyBmb3IKLSAqIGRpZmZlcmVudCBjb21wb25lbnRzLCB0aG91Z2ggdGhpcyBpcyBub3QgY3VycmVudGx5IGRvbmUuCi0gKi8KLQotCi1MT0NBTChpbnQpCi1zZWxlY3RfbmNvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IE5jb2xvcnNbXSkKLS8qIERldGVybWluZSBhbGxvY2F0aW9uIG9mIGRlc2lyZWQgY29sb3JzIHRvIGNvbXBvbmVudHMsICovCi0vKiBhbmQgZmlsbCBpbiBOY29sb3JzW10gYXJyYXkgdG8gaW5kaWNhdGUgY2hvaWNlLiAqLwotLyogUmV0dXJuIHZhbHVlIGlzIHRvdGFsIG51bWJlciBvZiBjb2xvcnMgKHByb2R1Y3Qgb2YgTmNvbG9yc1tdIHZhbHVlcykuICovCi17Ci0gIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgLyogbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgKi8KLSAgaW50IG1heF9jb2xvcnMgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwotICBpbnQgdG90YWxfY29sb3JzLCBpcm9vdCwgaSwgajsKLSAgYm9vbGVhbiBjaGFuZ2VkOwotICBsb25nIHRlbXA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUkdCX29yZGVyWzNdID0geyBSR0JfR1JFRU4sIFJHQl9SRUQsIFJHQl9CTFVFIH07Ci0KLSAgLyogV2UgY2FuIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBuYyd0aCByb290IG9mIG1heF9jb2xvcnMgcGVyIGNvbXBvbmVudC4gKi8KLSAgLyogQ29tcHV0ZSBmbG9vcihuYyd0aCByb290IG9mIG1heF9jb2xvcnMpLiAqLwotICBpcm9vdCA9IDE7Ci0gIGRvIHsKLSAgICBpcm9vdCsrOwotICAgIHRlbXAgPSBpcm9vdDsJCS8qIHNldCB0ZW1wID0gaXJvb3QgKiogbmMgKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgbmM7IGkrKykKLSAgICAgIHRlbXAgKj0gaXJvb3Q7Ci0gIH0gd2hpbGUgKHRlbXAgPD0gKGxvbmcpIG1heF9jb2xvcnMpOyAvKiByZXBlYXQgdGlsbCBpcm9vdCBleGNlZWRzIHJvb3QgKi8KLSAgaXJvb3QtLTsJCQkvKiBub3cgaXJvb3QgPSBmbG9vcihyb290KSAqLwotCi0gIC8qIE11c3QgaGF2ZSBhdCBsZWFzdCAyIGNvbG9yIHZhbHVlcyBwZXIgY29tcG9uZW50ICovCi0gIGlmIChpcm9vdCA8IDIpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgKGludCkgdGVtcCk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0byBpcm9vdCBjb2xvciB2YWx1ZXMgZm9yIGVhY2ggY29tcG9uZW50ICovCi0gIHRvdGFsX2NvbG9ycyA9IDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7Ci0gICAgTmNvbG9yc1tpXSA9IGlyb290OwotICAgIHRvdGFsX2NvbG9ycyAqPSBpcm9vdDsKLSAgfQotICAvKiBXZSBtYXkgYmUgYWJsZSB0byBpbmNyZW1lbnQgdGhlIGNvdW50IGZvciBvbmUgb3IgbW9yZSBjb21wb25lbnRzIHdpdGhvdXQKLSAgICogZXhjZWVkaW5nIG1heF9jb2xvcnMsIHRob3VnaCB3ZSBrbm93IG5vdCBhbGwgY2FuIGJlIGluY3JlbWVudGVkLgotICAgKiBTb21ldGltZXMsIHRoZSBmaXJzdCBjb21wb25lbnQgY2FuIGJlIGluY3JlbWVudGVkIG1vcmUgdGhhbiBvbmNlIQotICAgKiAoRXhhbXBsZTogZm9yIDE2IGNvbG9ycywgd2Ugc3RhcnQgYXQgMioyKjIsIGdvIHRvIDMqMioyLCB0aGVuIDQqMioyLikKLSAgICogSW4gUkdCIGNvbG9yc3BhY2UsIHRyeSB0byBpbmNyZW1lbnQgRyBmaXJzdCwgdGhlbiBSLCB0aGVuIEIuCi0gICAqLwotICBkbyB7Ci0gICAgY2hhbmdlZCA9IEZBTFNFOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7Ci0gICAgICBqID0gKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiA/IFJHQl9vcmRlcltpXSA6IGkpOwotICAgICAgLyogY2FsY3VsYXRlIG5ldyB0b3RhbF9jb2xvcnMgaWYgTmNvbG9yc1tqXSBpcyBpbmNyZW1lbnRlZCAqLwotICAgICAgdGVtcCA9IHRvdGFsX2NvbG9ycyAvIE5jb2xvcnNbal07Ci0gICAgICB0ZW1wICo9IE5jb2xvcnNbal0rMTsJLyogZG9uZSBpbiBsb25nIGFyaXRoIHRvIGF2b2lkIG9mbG8gKi8KLSAgICAgIGlmICh0ZW1wID4gKGxvbmcpIG1heF9jb2xvcnMpCi0JYnJlYWs7CQkJLyogd29uJ3QgZml0LCBkb25lIHdpdGggdGhpcyBwYXNzICovCi0gICAgICBOY29sb3JzW2pdKys7CQkvKiBPSywgYXBwbHkgdGhlIGluY3JlbWVudCAqLwotICAgICAgdG90YWxfY29sb3JzID0gKGludCkgdGVtcDsKLSAgICAgIGNoYW5nZWQgPSBUUlVFOwotICAgIH0KLSAgfSB3aGlsZSAoY2hhbmdlZCk7Ci0KLSAgcmV0dXJuIHRvdGFsX2NvbG9yczsKLX0KLQotCi1MT0NBTChpbnQpCi1vdXRwdXRfdmFsdWUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBjaSwgaW50IGosIGludCBtYXhqKQotLyogUmV0dXJuIGondGggb3V0cHV0IHZhbHVlLCB3aGVyZSBqIHdpbGwgcmFuZ2UgZnJvbSAwIHRvIG1heGogKi8KLS8qIFRoZSBvdXRwdXQgdmFsdWVzIG11c3QgZmFsbCBpbiAwLi5NQVhKU0FNUExFIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KLXsKLSAgLyogV2UgYWx3YXlzIHByb3ZpZGUgdmFsdWVzIDAgYW5kIE1BWEpTQU1QTEUgZm9yIGVhY2ggY29tcG9uZW50OwotICAgKiBhbnkgYWRkaXRpb25hbCB2YWx1ZXMgYXJlIGVxdWFsbHkgc3BhY2VkIGJldHdlZW4gdGhlc2UgbGltaXRzLgotICAgKiAoRm9yY2luZyB0aGUgdXBwZXIgYW5kIGxvd2VyIHZhbHVlcyB0byB0aGUgbGltaXRzIGVuc3VyZXMgdGhhdAotICAgKiBkaXRoZXJpbmcgY2FuJ3QgcHJvZHVjZSBhIGNvbG9yIG91dHNpZGUgdGhlIHNlbGVjdGVkIGdhbXV0LikKLSAgICovCi0gIHJldHVybiAoaW50KSAoKChJTlQzMikgaiAqIE1BWEpTQU1QTEUgKyBtYXhqLzIpIC8gbWF4aik7Ci19Ci0KLQotTE9DQUwoaW50KQotbGFyZ2VzdF9pbnB1dF92YWx1ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGNpLCBpbnQgaiwgaW50IG1heGopCi0vKiBSZXR1cm4gbGFyZ2VzdCBpbnB1dCB2YWx1ZSB0aGF0IHNob3VsZCBtYXAgdG8gaid0aCBvdXRwdXQgdmFsdWUgKi8KLS8qIE11c3QgaGF2ZSBsYXJnZXN0KGo9MCkgPj0gMCwgYW5kIGxhcmdlc3Qoaj1tYXhqKSA+PSBNQVhKU0FNUExFICovCi17Ci0gIC8qIEJyZWFrcG9pbnRzIGFyZSBoYWxmd2F5IGJldHdlZW4gdmFsdWVzIHJldHVybmVkIGJ5IG91dHB1dF92YWx1ZSAqLwotICByZXR1cm4gKGludCkgKCgoSU5UMzIpICgyKmogKyAxKSAqIE1BWEpTQU1QTEUgKyBtYXhqKSAvICgyKm1heGopKTsKLX0KLQotCi0vKgotICogQ3JlYXRlIHRoZSBjb2xvcm1hcC4KLSAqLwotCi1MT0NBTCh2b2lkKQotY3JlYXRlX2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogQ3JlYXRlZCBjb2xvcm1hcCAqLwotICBpbnQgdG90YWxfY29sb3JzOwkJLyogTnVtYmVyIG9mIGRpc3RpbmN0IG91dHB1dCBjb2xvcnMgKi8KLSAgaW50IGksaixrLCBuY2ksIGJsa3NpemUsIGJsa2Rpc3QsIHB0ciwgdmFsOwotCi0gIC8qIFNlbGVjdCBudW1iZXIgb2YgY29sb3JzIGZvciBlYWNoIGNvbXBvbmVudCAqLwotICB0b3RhbF9jb2xvcnMgPSBzZWxlY3RfbmNvbG9ycyhjaW5mbywgY3F1YW50aXplLT5OY29sb3JzKTsKLQotICAvKiBSZXBvcnQgc2VsZWN0ZWQgY29sb3IgY291bnRzICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKLSAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19RVUFOVF8zX05DT0xPUlMsCi0JICAgICB0b3RhbF9jb2xvcnMsIGNxdWFudGl6ZS0+TmNvbG9yc1swXSwKLQkgICAgIGNxdWFudGl6ZS0+TmNvbG9yc1sxXSwgY3F1YW50aXplLT5OY29sb3JzWzJdKTsKLSAgZWxzZQotICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1FVQU5UX05DT0xPUlMsIHRvdGFsX2NvbG9ycyk7Ci0KLSAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbG9ybWFwLiAqLwotICAvKiBUaGUgY29sb3JzIGFyZSBvcmRlcmVkIGluIHRoZSBtYXAgaW4gc3RhbmRhcmQgcm93LW1ham9yIG9yZGVyLCAqLwotICAvKiBpLmUuIHJpZ2h0bW9zdCAoaGlnaGVzdC1pbmRleGVkKSBjb2xvciBjaGFuZ2VzIG1vc3QgcmFwaWRseS4gKi8KLQotICBjb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgIChKRElNRU5TSU9OKSB0b3RhbF9jb2xvcnMsIChKRElNRU5TSU9OKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOwotCi0gIC8qIGJsa3NpemUgaXMgbnVtYmVyIG9mIGFkamFjZW50IHJlcGVhdGVkIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCi0gIC8qIGJsa2Rpc3QgaXMgZGlzdGFuY2UgYmV0d2VlbiBncm91cHMgb2YgaWRlbnRpY2FsIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCi0gIGJsa2Rpc3QgPSB0b3RhbF9jb2xvcnM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7Ci0gICAgLyogZmlsbCBpbiBjb2xvcm1hcCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLwotICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KLSAgICBibGtzaXplID0gYmxrZGlzdCAvIG5jaTsKLSAgICBmb3IgKGogPSAwOyBqIDwgbmNpOyBqKyspIHsKLSAgICAgIC8qIENvbXB1dGUgaid0aCBvdXRwdXQgdmFsdWUgKG91dCBvZiBuY2kpIGZvciBjb21wb25lbnQgKi8KLSAgICAgIHZhbCA9IG91dHB1dF92YWx1ZShjaW5mbywgaSwgaiwgbmNpLTEpOwotICAgICAgLyogRmlsbCBpbiBhbGwgY29sb3JtYXAgZW50cmllcyB0aGF0IGhhdmUgdGhpcyB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudCAqLwotICAgICAgZm9yIChwdHIgPSBqICogYmxrc2l6ZTsgcHRyIDwgdG90YWxfY29sb3JzOyBwdHIgKz0gYmxrZGlzdCkgewotCS8qIGZpbGwgaW4gYmxrc2l6ZSBlbnRyaWVzIGJlZ2lubmluZyBhdCBwdHIgKi8KLQlmb3IgKGsgPSAwOyBrIDwgYmxrc2l6ZTsgaysrKQotCSAgY29sb3JtYXBbaV1bcHRyK2tdID0gKEpTQU1QTEUpIHZhbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgYmxrZGlzdCA9IGJsa3NpemU7CQkvKiBibGtzaXplIG9mIHRoaXMgY29sb3IgaXMgYmxrZGlzdCBvZiBuZXh0ICovCi0gIH0KLQotICAvKiBTYXZlIHRoZSBjb2xvcm1hcCBpbiBwcml2YXRlIHN0b3JhZ2UsCi0gICAqIHdoZXJlIGl0IHdpbGwgc3Vydml2ZSBjb2xvciBxdWFudGl6YXRpb24gbW9kZSBjaGFuZ2VzLgotICAgKi8KLSAgY3F1YW50aXplLT5zdl9jb2xvcm1hcCA9IGNvbG9ybWFwOwotICBjcXVhbnRpemUtPnN2X2FjdHVhbCA9IHRvdGFsX2NvbG9yczsKLX0KLQotCi0vKgotICogQ3JlYXRlIHRoZSBjb2xvciBpbmRleCB0YWJsZS4KLSAqLwotCi1MT0NBTCh2b2lkKQotY3JlYXRlX2NvbG9yaW5kZXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIEpTQU1QUk9XIGluZGV4cHRyOwotICBpbnQgaSxqLGssIG5jaSwgYmxrc2l6ZSwgdmFsLCBwYWQ7Ci0KLSAgLyogRm9yIG9yZGVyZWQgZGl0aGVyLCB3ZSBwYWQgdGhlIGNvbG9yIGluZGV4IHRhYmxlcyBieSBNQVhKU0FNUExFIGluCi0gICAqIGVhY2ggZGlyZWN0aW9uIChpbnB1dCBpbmRleCB2YWx1ZXMgY2FuIGJlIC1NQVhKU0FNUExFIC4uIDIqTUFYSlNBTVBMRSkuCi0gICAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpbiB0aGUgb3RoZXIgZGl0aGVyaW5nIG1vZGVzLiAgSG93ZXZlciwgd2UKLSAgICogZmxhZyB3aGV0aGVyIGl0IHdhcyBkb25lIGluIGNhc2UgdXNlciBjaGFuZ2VzIGRpdGhlcmluZyBtb2RlLgotICAgKi8KLSAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX09SREVSRUQpIHsKLSAgICBwYWQgPSBNQVhKU0FNUExFKjI7Ci0gICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBUUlVFOwotICB9IGVsc2UgewotICAgIHBhZCA9IDA7Ci0gICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBGQUxTRTsKLSAgfQotCi0gIGNxdWFudGl6ZS0+Y29sb3JpbmRleCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgIChKRElNRU5TSU9OKSAoTUFYSlNBTVBMRSsxICsgcGFkKSwKLSAgICAgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7Ci0KLSAgLyogYmxrc2l6ZSBpcyBudW1iZXIgb2YgYWRqYWNlbnQgcmVwZWF0ZWQgZW50cmllcyBmb3IgYSBjb21wb25lbnQgKi8KLSAgYmxrc2l6ZSA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgewotICAgIC8qIGZpbGwgaW4gY29sb3JpbmRleCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLwotICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KLSAgICBibGtzaXplID0gYmxrc2l6ZSAvIG5jaTsKLQotICAgIC8qIGFkanVzdCBjb2xvcmluZGV4IHBvaW50ZXJzIHRvIHByb3ZpZGUgcGFkZGluZyBhdCBuZWdhdGl2ZSBpbmRleGVzLiAqLwotICAgIGlmIChwYWQpCi0gICAgICBjcXVhbnRpemUtPmNvbG9yaW5kZXhbaV0gKz0gTUFYSlNBTVBMRTsKLQotICAgIC8qIGluIGxvb3AsIHZhbCA9IGluZGV4IG9mIGN1cnJlbnQgb3V0cHV0IHZhbHVlLCAqLwotICAgIC8qIGFuZCBrID0gbGFyZ2VzdCBqIHRoYXQgbWFwcyB0byBjdXJyZW50IHZhbCAqLwotICAgIGluZGV4cHRyID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2ldOwotICAgIHZhbCA9IDA7Ci0gICAgayA9IGxhcmdlc3RfaW5wdXRfdmFsdWUoY2luZm8sIGksIDAsIG5jaS0xKTsKLSAgICBmb3IgKGogPSAwOyBqIDw9IE1BWEpTQU1QTEU7IGorKykgewotICAgICAgd2hpbGUgKGogPiBrKQkJLyogYWR2YW5jZSB2YWwgaWYgcGFzdCBib3VuZGFyeSAqLwotCWsgPSBsYXJnZXN0X2lucHV0X3ZhbHVlKGNpbmZvLCBpLCArK3ZhbCwgbmNpLTEpOwotICAgICAgLyogcHJlbXVsdGlwbHkgc28gdGhhdCBubyBtdWx0aXBsaWNhdGlvbiBuZWVkZWQgaW4gbWFpbiBwcm9jZXNzaW5nICovCi0gICAgICBpbmRleHB0cltqXSA9IChKU0FNUExFKSAodmFsICogYmxrc2l6ZSk7Ci0gICAgfQotICAgIC8qIFBhZCBhdCBib3RoIGVuZHMgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKHBhZCkKLSAgICAgIGZvciAoaiA9IDE7IGogPD0gTUFYSlNBTVBMRTsgaisrKSB7Ci0JaW5kZXhwdHJbLWpdID0gaW5kZXhwdHJbMF07Ci0JaW5kZXhwdHJbTUFYSlNBTVBMRStqXSA9IGluZGV4cHRyW01BWEpTQU1QTEVdOwotICAgICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSBhbiBvcmRlcmVkLWRpdGhlciBhcnJheSBmb3IgYSBjb21wb25lbnQgaGF2aW5nIG5jb2xvcnMKLSAqIGRpc3RpbmN0IG91dHB1dCB2YWx1ZXMuCi0gKi8KLQotTE9DQUwoT0RJVEhFUl9NQVRSSVhfUFRSKQotbWFrZV9vZGl0aGVyX2FycmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbmNvbG9ycykKLXsKLSAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7Ci0gIGludCBqLGs7Ci0gIElOVDMyIG51bSxkZW47Ci0KLSAgb2RpdGhlciA9IChPRElUSEVSX01BVFJJWF9QVFIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YoT0RJVEhFUl9NQVRSSVgpKTsKLSAgLyogVGhlIGludGVyLXZhbHVlIGRpc3RhbmNlIGZvciB0aGlzIGNvbG9yIGlzIE1BWEpTQU1QTEUvKG5jb2xvcnMtMSkuCi0gICAqIEhlbmNlIHRoZSBkaXRoZXIgdmFsdWUgZm9yIHRoZSBtYXRyaXggY2VsbCB3aXRoIGZpbGwgb3JkZXIgZgotICAgKiAoZj0wLi5OLTEpIHNob3VsZCBiZSAoTi0xLTIqZikvKDIqTikgKiBNQVhKU0FNUExFLyhuY29sb3JzLTEpLgotICAgKiBPbiAxNi1iaXQtaW50IG1hY2hpbmUsIGJlIGNhcmVmdWwgdG8gYXZvaWQgb3ZlcmZsb3cuCi0gICAqLwotICBkZW4gPSAyICogT0RJVEhFUl9DRUxMUyAqICgoSU5UMzIpIChuY29sb3JzIC0gMSkpOwotICBmb3IgKGogPSAwOyBqIDwgT0RJVEhFUl9TSVpFOyBqKyspIHsKLSAgICBmb3IgKGsgPSAwOyBrIDwgT0RJVEhFUl9TSVpFOyBrKyspIHsKLSAgICAgIG51bSA9ICgoSU5UMzIpIChPRElUSEVSX0NFTExTLTEgLSAyKigoaW50KWJhc2VfZGl0aGVyX21hdHJpeFtqXVtrXSkpKQotCSAgICAqIE1BWEpTQU1QTEU7Ci0gICAgICAvKiBFbnN1cmUgcm91bmQgdG93YXJkcyB6ZXJvIGRlc3BpdGUgQydzIGxhY2sgb2YgY29uc2lzdGVuY3kKLSAgICAgICAqIGFib3V0IHJvdW5kaW5nIG5lZ2F0aXZlIHZhbHVlcyBpbiBpbnRlZ2VyIGRpdmlzaW9uLi4uCi0gICAgICAgKi8KLSAgICAgIG9kaXRoZXJbal1ba10gPSAoaW50KSAobnVtPDAgPyAtKCgtbnVtKS9kZW4pIDogbnVtL2Rlbik7Ci0gICAgfQotICB9Ci0gIHJldHVybiBvZGl0aGVyOwotfQotCi0KLS8qCi0gKiBDcmVhdGUgdGhlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcy4KLSAqIENvbXBvbmVudHMgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiByZXByZXNlbnRhdGl2ZSBjb2xvcnMgbWF5IAotICogc2hhcmUgYSBkaXRoZXIgdGFibGUuCi0gKi8KLQotTE9DQUwodm9pZCkKLWNyZWF0ZV9vZGl0aGVyX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7Ci0gIGludCBpLCBqLCBuY2k7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7Ci0gICAgbmNpID0gY3F1YW50aXplLT5OY29sb3JzW2ldOyAvKiAjIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgdGhpcyBjb2xvciAqLwotICAgIG9kaXRoZXIgPSBOVUxMOwkJLyogc2VhcmNoIGZvciBtYXRjaGluZyBwcmlvciBjb21wb25lbnQgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0gICAgICBpZiAobmNpID09IGNxdWFudGl6ZS0+TmNvbG9yc1tqXSkgewotCW9kaXRoZXIgPSBjcXVhbnRpemUtPm9kaXRoZXJbal07Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChvZGl0aGVyID09IE5VTEwpCS8qIG5lZWQgYSBuZXcgdGFibGU/ICovCi0gICAgICBvZGl0aGVyID0gbWFrZV9vZGl0aGVyX2FycmF5KGNpbmZvLCBuY2kpOwotICAgIGNxdWFudGl6ZS0+b2RpdGhlcltpXSA9IG9kaXRoZXI7Ci0gIH0KLX0KLQotCi0vKgotICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWNvbG9yX3F1YW50aXplIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0vKiBHZW5lcmFsIGNhc2UsIG5vIGRpdGhlcmluZyAqLwotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBKU0FNUEFSUkFZIGNvbG9yaW5kZXggPSBjcXVhbnRpemUtPmNvbG9yaW5kZXg7Ci0gIHJlZ2lzdGVyIGludCBwaXhjb2RlLCBjaTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyaW4sIHB0cm91dDsKLSAgaW50IHJvdzsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICByZWdpc3RlciBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICBwdHJpbiA9IGlucHV0X2J1Zltyb3ddOwotICAgIHB0cm91dCA9IG91dHB1dF9idWZbcm93XTsKLSAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgcGl4Y29kZSA9IDA7Ci0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgewotCXBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4W2NpXVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOwotICAgICAgfQotICAgICAgKnB0cm91dCsrID0gKEpTQU1QTEUpIHBpeGNvZGU7Ci0gICAgfQotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1jb2xvcl9xdWFudGl6ZTMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0vKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCBubyBkaXRoZXJpbmcgKi8KLXsKLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgcmVnaXN0ZXIgaW50IHBpeGNvZGU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cmluLCBwdHJvdXQ7Ci0gIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOwotICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKLSAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07Ci0gIGludCByb3c7Ci0gIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIHB0cmluID0gaW5wdXRfYnVmW3Jvd107Ci0gICAgcHRyb3V0ID0gb3V0cHV0X2J1Zltyb3ddOwotICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICBwaXhjb2RlICA9IEdFVEpTQU1QTEUoY29sb3JpbmRleDBbR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKLSAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOwotICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7Ci0gICAgICAqcHRyb3V0KysgPSAoSlNBTVBMRSkgcGl4Y29kZTsKLSAgICB9Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXF1YW50aXplX29yZF9kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotLyogR2VuZXJhbCBjYXNlLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHV0X3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHV0X3B0cjsKLSAgSlNBTVBST1cgY29sb3JpbmRleF9jaTsKLSAgaW50ICogZGl0aGVyOwkJCS8qIHBvaW50cyB0byBhY3RpdmUgcm93IG9mIGRpdGhlciBtYXRyaXggKi8KLSAgaW50IHJvd19pbmRleCwgY29sX2luZGV4OwkvKiBjdXJyZW50IGluZGV4ZXMgaW50byBkaXRoZXIgbWF0cml4ICovCi0gIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLSAgaW50IGNpOwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICAvKiBJbml0aWFsaXplIG91dHB1dCB2YWx1ZXMgdG8gMCBzbyBjYW4gcHJvY2VzcyBjb21wb25lbnRzIHNlcGFyYXRlbHkgKi8KLSAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIG91dHB1dF9idWZbcm93XSwKLQkgICAgICAoc2l6ZV90KSAod2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKLSAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgewotICAgICAgaW5wdXRfcHRyID0gaW5wdXRfYnVmW3Jvd10gKyBjaTsKLSAgICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW3Jvd107Ci0gICAgICBjb2xvcmluZGV4X2NpID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2NpXTsKLSAgICAgIGRpdGhlciA9IGNxdWFudGl6ZS0+b2RpdGhlcltjaV1bcm93X2luZGV4XTsKLSAgICAgIGNvbF9pbmRleCA9IDA7Ci0KLSAgICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0JLyogRm9ybSBwaXhlbCB2YWx1ZSArIGRpdGhlciwgcmFuZ2UtbGltaXQgdG8gMC4uTUFYSlNBTVBMRSwKLQkgKiBzZWxlY3Qgb3V0cHV0IHZhbHVlLCBhY2N1bXVsYXRlIGludG8gb3V0cHV0IGNvZGUgZm9yIHRoaXMgcGl4ZWwuCi0JICogUmFuZ2UtbGltaXRpbmcgbmVlZCBub3QgYmUgZG9uZSBleHBsaWNpdGx5LCBhcyB3ZSBoYXZlIGV4dGVuZGVkCi0JICogdGhlIGNvbG9yaW5kZXggdGFibGUgdG8gcHJvZHVjZSB0aGUgcmlnaHQgYW5zd2VycyBmb3Igb3V0LW9mLXJhbmdlCi0JICogaW5wdXRzLiAgVGhlIG1heGltdW0gZGl0aGVyIGlzICstIE1BWEpTQU1QTEU7IHRoaXMgc2V0cyB0aGUKLQkgKiByZXF1aXJlZCBhbW91bnQgb2YgcGFkZGluZy4KLQkgKi8KLQkqb3V0cHV0X3B0ciArPSBjb2xvcmluZGV4X2NpW0dFVEpTQU1QTEUoKmlucHV0X3B0cikrZGl0aGVyW2NvbF9pbmRleF1dOwotCWlucHV0X3B0ciArPSBuYzsKLQlvdXRwdXRfcHRyKys7Ci0JY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOwotICAgICAgfQotICAgIH0KLSAgICAvKiBBZHZhbmNlIHJvdyBpbmRleCBmb3IgbmV4dCByb3cgKi8KLSAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7Ci0gICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXF1YW50aXplM19vcmRfZGl0aGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0vKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIHJlZ2lzdGVyIGludCBwaXhjb2RlOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB1dF9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB1dF9wdHI7Ci0gIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOwotICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKLSAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07Ci0gIGludCAqIGRpdGhlcjA7CQkvKiBwb2ludHMgdG8gYWN0aXZlIHJvdyBvZiBkaXRoZXIgbWF0cml4ICovCi0gIGludCAqIGRpdGhlcjE7Ci0gIGludCAqIGRpdGhlcjI7Ci0gIGludCByb3dfaW5kZXgsIGNvbF9pbmRleDsJLyogY3VycmVudCBpbmRleGVzIGludG8gZGl0aGVyIG1hdHJpeCAqLwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKLSAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XTsKLSAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltyb3ddOwotICAgIGRpdGhlcjAgPSBjcXVhbnRpemUtPm9kaXRoZXJbMF1bcm93X2luZGV4XTsKLSAgICBkaXRoZXIxID0gY3F1YW50aXplLT5vZGl0aGVyWzFdW3Jvd19pbmRleF07Ci0gICAgZGl0aGVyMiA9IGNxdWFudGl6ZS0+b2RpdGhlclsyXVtyb3dfaW5kZXhdOwotICAgIGNvbF9pbmRleCA9IDA7Ci0KLSAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgcGl4Y29kZSAgPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgwW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCi0JCQkJCWRpdGhlcjBbY29sX2luZGV4XV0pOwotICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgxW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCi0JCQkJCWRpdGhlcjFbY29sX2luZGV4XV0pOwotICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCi0JCQkJCWRpdGhlcjJbY29sX2luZGV4XV0pOwotICAgICAgKm91dHB1dF9wdHIrKyA9IChKU0FNUExFKSBwaXhjb2RlOwotICAgICAgY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOwotICAgIH0KLSAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7Ci0gICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXF1YW50aXplX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLS8qIEdlbmVyYWwgY2FzZSwgd2l0aCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIHJlZ2lzdGVyIExPQ0ZTRVJST1IgY3VyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCi0gIExPQ0ZTRVJST1IgYmVsb3dlcnI7CQkvKiBlcnJvciBmb3IgcGl4ZWwgYmVsb3cgY3VyICovCi0gIExPQ0ZTRVJST1IgYnByZXZlcnI7CQkvKiBlcnJvciBmb3IgYmVsb3cvcHJldiBjb2wgKi8KLSAgTE9DRlNFUlJPUiBibmV4dGVycjsJCS8qIGVycm9yIGZvciBiZWxvdy9uZXh0IGNvbCAqLwotICBMT0NGU0VSUk9SIGRlbHRhOwotICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdXRfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdXRfcHRyOwotICBKU0FNUFJPVyBjb2xvcmluZGV4X2NpOwotICBKU0FNUFJPVyBjb2xvcm1hcF9jaTsKLSAgaW50IHBpeGNvZGU7Ci0gIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLSAgaW50IGRpcjsJCQkvKiAxIGZvciBsZWZ0LXRvLXJpZ2h0LCAtMSBmb3IgcmlnaHQtdG8tbGVmdCAqLwotICBpbnQgZGlybmM7CQkJLyogZGlyICogbmMgKi8KLSAgaW50IGNpOwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKLSAgU0hJRlRfVEVNUFMKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IHZhbHVlcyB0byAwIHNvIGNhbiBwcm9jZXNzIGNvbXBvbmVudHMgc2VwYXJhdGVseSAqLwotICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgb3V0cHV0X2J1Zltyb3ddLAotCSAgICAgIChzaXplX3QpICh3aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7Ci0gICAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XSArIGNpOwotICAgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbcm93XTsKLSAgICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKLQkvKiB3b3JrIHJpZ2h0IHRvIGxlZnQgaW4gdGhpcyByb3cgKi8KLQlpbnB1dF9wdHIgKz0gKHdpZHRoLTEpICogbmM7IC8qIHNvIHBvaW50IHRvIHJpZ2h0bW9zdCBwaXhlbCAqLwotCW91dHB1dF9wdHIgKz0gd2lkdGgtMTsKLQlkaXIgPSAtMTsKLQlkaXJuYyA9IC1uYzsKLQllcnJvcnB0ciA9IGNxdWFudGl6ZS0+ZnNlcnJvcnNbY2ldICsgKHdpZHRoKzEpOyAvKiA9PiBlbnRyeSBhZnRlciBsYXN0IGNvbHVtbiAqLwotICAgICAgfSBlbHNlIHsKLQkvKiB3b3JrIGxlZnQgdG8gcmlnaHQgaW4gdGhpcyByb3cgKi8KLQlkaXIgPSAxOwotCWRpcm5jID0gbmM7Ci0JZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzW2NpXTsgLyogPT4gZW50cnkgYmVmb3JlIGZpcnN0IGNvbHVtbiAqLwotICAgICAgfQotICAgICAgY29sb3JpbmRleF9jaSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFtjaV07Ci0gICAgICBjb2xvcm1hcF9jaSA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXBbY2ldOwotICAgICAgLyogUHJlc2V0IGVycm9yIHZhbHVlczogbm8gZXJyb3IgcHJvcGFnYXRlZCB0byBmaXJzdCBwaXhlbCBmcm9tIGxlZnQgKi8KLSAgICAgIGN1ciA9IDA7Ci0gICAgICAvKiBhbmQgbm8gZXJyb3IgcHJvcGFnYXRlZCB0byByb3cgYmVsb3cgeWV0ICovCi0gICAgICBiZWxvd2VyciA9IGJwcmV2ZXJyID0gMDsKLQotICAgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLQkvKiBjdXIgaG9sZHMgdGhlIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcHJldmlvdXMgcGl4ZWwgb24gdGhlCi0JICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKLQkgKiB0byBmb3JtIHRoZSBjb21wbGV0ZSBlcnJvciBjb3JyZWN0aW9uIHRlcm0gZm9yIHRoaXMgcGl4ZWwsIGFuZAotCSAqIHJvdW5kIHRoZSBlcnJvciB0ZXJtICh3aGljaCBpcyBleHByZXNzZWQgKiAxNikgdG8gYW4gaW50ZWdlci4KLQkgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAotCSAqIGZvciBlaXRoZXIgc2lnbiBvZiB0aGUgZXJyb3IgdmFsdWUuCi0JICogTm90ZTogZXJyb3JwdHIgcG9pbnRzIHRvICpwcmV2aW91cyogY29sdW1uJ3MgYXJyYXkgZW50cnkuCi0JICovCi0JY3VyID0gUklHSFRfU0hJRlQoY3VyICsgZXJyb3JwdHJbZGlyXSArIDgsIDQpOwotCS8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCi0JICogVGhlIG1heGltdW0gZXJyb3IgaXMgKy0gTUFYSlNBTVBMRTsgdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplCi0JICogb2YgdGhlIHJhbmdlX2xpbWl0IGFycmF5LgotCSAqLwotCWN1ciArPSBHRVRKU0FNUExFKCppbnB1dF9wdHIpOwotCWN1ciA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyXSk7Ci0JLyogU2VsZWN0IG91dHB1dCB2YWx1ZSwgYWNjdW11bGF0ZSBpbnRvIG91dHB1dCBjb2RlIGZvciB0aGlzIHBpeGVsICovCi0JcGl4Y29kZSA9IEdFVEpTQU1QTEUoY29sb3JpbmRleF9jaVtjdXJdKTsKLQkqb3V0cHV0X3B0ciArPSAoSlNBTVBMRSkgcGl4Y29kZTsKLQkvKiBDb21wdXRlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBlcnJvciBhdCB0aGlzIHBpeGVsICovCi0JLyogTm90ZTogd2UgY2FuIGRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0aGUgZmluYWwgKi8KLQkvKiBwaXhlbCBjb2RlLCBiZWNhdXNlIHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLiAqLwotCWN1ciAtPSBHRVRKU0FNUExFKGNvbG9ybWFwX2NpW3BpeGNvZGVdKTsKLQkvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KLQkgKiBBZGQgdGhlc2UgaW50byB0aGUgcnVubmluZyBzdW1zLCBhbmQgc2ltdWx0YW5lb3VzbHkgc2hpZnQgdGhlCi0JICogbmV4dC1saW5lIGVycm9yIHN1bXMgbGVmdCBieSAxIGNvbHVtbi4KLQkgKi8KLQlibmV4dGVyciA9IGN1cjsKLQlkZWx0YSA9IGN1ciAqIDI7Ci0JY3VyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KLQllcnJvcnB0clswXSA9IChGU0VSUk9SKSAoYnByZXZlcnIgKyBjdXIpOwotCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCi0JYnByZXZlcnIgPSBiZWxvd2VyciArIGN1cjsKLQliZWxvd2VyciA9IGJuZXh0ZXJyOwotCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCi0JLyogQXQgdGhpcyBwb2ludCBjdXIgY29udGFpbnMgdGhlIDcvMTYgZXJyb3IgdmFsdWUgdG8gYmUgcHJvcGFnYXRlZAotCSAqIHRvIHRoZSBuZXh0IHBpeGVsIG9uIHRoZSBjdXJyZW50IGxpbmUsIGFuZCBhbGwgdGhlIGVycm9ycyBmb3IgdGhlCi0JICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuIFdlIGFyZSB0aGVyZWZvcmUgcmVhZHkgdG8gbW92ZSBvbi4KLQkgKi8KLQlpbnB1dF9wdHIgKz0gZGlybmM7CS8qIGFkdmFuY2UgaW5wdXQgcHRyIHRvIG5leHQgY29sdW1uICovCi0Jb3V0cHV0X3B0ciArPSBkaXI7CS8qIGFkdmFuY2Ugb3V0cHV0IHB0ciB0byBuZXh0IGNvbHVtbiAqLwotCWVycm9ycHRyICs9IGRpcjsJLyogYWR2YW5jZSBlcnJvcnB0ciB0byBjdXJyZW50IGNvbHVtbiAqLwotICAgICAgfQotICAgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZSBpbnRvIHRoZQotICAgICAgICogZmluYWwgZnNlcnJvcnNbXSBlbnRyeS4gIE5vdGUgd2UgbmVlZCBub3QgdW5sb2FkIGJlbG93ZXJyIGJlY2F1c2UKLSAgICAgICAqIGl0IGlzIGZvciB0aGUgZHVtbXkgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgYWN0dWFsIGFycmF5LgotICAgICAgICovCi0gICAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjsgLyogdW5sb2FkIHByZXYgZXJyIGludG8gYXJyYXkgKi8KLSAgICB9Ci0gICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gKGNxdWFudGl6ZS0+b25fb2RkX3JvdyA/IEZBTFNFIDogVFJVRSk7Ci0gIH0KLX0KLQotCi0vKgotICogQWxsb2NhdGUgd29ya3NwYWNlIGZvciBGbG95ZC1TdGVpbmJlcmcgZXJyb3JzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1hbGxvY19mc193b3Jrc3BhY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIHNpemVfdCBhcnJheXNpemU7Ci0gIGludCBpOwotCi0gIGFycmF5c2l6ZSA9IChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogU0laRU9GKEZTRVJST1IpKTsKLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7Ci0gICAgY3F1YW50aXplLT5mc2Vycm9yc1tpXSA9IChGU0VSUlBUUikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgYXJyYXlzaXplKTsKLSAgfQotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBvbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzXzFfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIHNpemVfdCBhcnJheXNpemU7Ci0gIGludCBpOwotCi0gIC8qIEluc3RhbGwgbXkgY29sb3JtYXAuICovCi0gIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7Ci0gIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOwotCi0gIC8qIEluaXRpYWxpemUgZm9yIGRlc2lyZWQgZGl0aGVyaW5nIG1vZGUuICovCi0gIHN3aXRjaCAoY2luZm8tPmRpdGhlcl9tb2RlKSB7Ci0gIGNhc2UgSkRJVEhFUl9OT05FOgotICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKLSAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemUzOwotICAgIGVsc2UKLSAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkRJVEhFUl9PUkRFUkVEOgotICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKLSAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcXVhbnRpemUzX29yZF9kaXRoZXI7Ci0gICAgZWxzZQotICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9vcmRfZGl0aGVyOwotICAgIGNxdWFudGl6ZS0+cm93X2luZGV4ID0gMDsJLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3Igb3JkZXJlZCBkaXRoZXIgKi8KLSAgICAvKiBJZiB1c2VyIGNoYW5nZWQgdG8gb3JkZXJlZCBkaXRoZXIgZnJvbSBhbm90aGVyIG1vZGUsCi0gICAgICogd2UgbXVzdCByZWNyZWF0ZSB0aGUgY29sb3IgaW5kZXggdGFibGUgd2l0aCBwYWRkaW5nLgotICAgICAqIFRoaXMgd2lsbCBjb3N0IGV4dHJhIHNwYWNlLCBidXQgcHJvYmFibHkgaXNuJ3QgdmVyeSBsaWtlbHkuCi0gICAgICovCi0gICAgaWYgKCEgY3F1YW50aXplLT5pc19wYWRkZWQpCi0gICAgICBjcmVhdGVfY29sb3JpbmRleChjaW5mbyk7Ci0gICAgLyogQ3JlYXRlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcyBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4gKi8KLSAgICBpZiAoY3F1YW50aXplLT5vZGl0aGVyWzBdID09IE5VTEwpCi0gICAgICBjcmVhdGVfb2RpdGhlcl90YWJsZXMoY2luZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpESVRIRVJfRlM6Ci0gICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9mc19kaXRoZXI7Ci0gICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7IC8qIGluaXRpYWxpemUgc3RhdGUgZm9yIEYtUyBkaXRoZXIgKi8KLSAgICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIGRpZG4ndCBhbHJlYWR5LiAqLwotICAgIGlmIChjcXVhbnRpemUtPmZzZXJyb3JzWzBdID09IE5VTEwpCi0gICAgICBhbGxvY19mc193b3Jrc3BhY2UoY2luZm8pOwotICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BhZ2F0ZWQgZXJyb3JzIHRvIHplcm8uICovCi0gICAgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiBTSVpFT0YoRlNFUlJPUikpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykKLSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9yc1tpXSwgYXJyYXlzaXplKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc18xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrIGluIDEtcGFzcyBjYXNlICovCi19Ci0KLQotLyoKLSAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCi0gKiBTaG91bGRuJ3QgZ2V0IHRvIHRoaXMgbW9kdWxlIQotICovCi0KLU1FVEhPRERFRih2b2lkKQotbmV3X2NvbG9yX21hcF8xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF8xcGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOwotCi0gIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2NxdWFudGl6ZXIpKTsKLSAgY2luZm8tPmNxdWFudGl6ZSA9IChzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKikgY3F1YW50aXplOwotICBjcXVhbnRpemUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc18xX3F1YW50OwotICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzXzFfcXVhbnQ7Ci0gIGNxdWFudGl6ZS0+cHViLm5ld19jb2xvcl9tYXAgPSBuZXdfY29sb3JfbWFwXzFfcXVhbnQ7Ci0gIGNxdWFudGl6ZS0+ZnNlcnJvcnNbMF0gPSBOVUxMOyAvKiBGbGFnIEZTIHdvcmtzcGFjZSBub3QgYWxsb2NhdGVkICovCi0gIGNxdWFudGl6ZS0+b2RpdGhlclswXSA9IE5VTEw7CS8qIEFsc28gZmxhZyBvZGl0aGVyIGFycmF5cyBub3QgYWxsb2NhdGVkICovCi0KLSAgLyogTWFrZSBzdXJlIG15IGludGVybmFsIGFycmF5cyB3b24ndCBvdmVyZmxvdyAqLwotICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID4gTUFYX1FfQ09NUFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfQ09NUE9ORU5UUywgTUFYX1FfQ09NUFMpOwotICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KLSAgaWYgKGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPiAoTUFYSlNBTVBMRSsxKSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgTUFYSlNBTVBMRSsxKTsKLQotICAvKiBDcmVhdGUgdGhlIGNvbG9ybWFwIGFuZCBjb2xvciBpbmRleCB0YWJsZS4gKi8KLSAgY3JlYXRlX2NvbG9ybWFwKGNpbmZvKTsKLSAgY3JlYXRlX2NvbG9yaW5kZXgoY2luZm8pOwotCi0gIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2Ugbm93IGlmIHJlcXVlc3RlZC4KLSAgICogV2UgZG8gdGhpcyBub3cgc2luY2UgaXQgaXMgRkFSIHN0b3JhZ2UgYW5kIG1heSBhZmZlY3QgdGhlIG1lbW9yeQotICAgKiBtYW5hZ2VyJ3Mgc3BhY2UgY2FsY3VsYXRpb25zLiAgSWYgdGhlIHVzZXIgY2hhbmdlcyB0byBGUyBkaXRoZXIKLSAgICogbW9kZSBpbiBhIGxhdGVyIHBhc3MsIHdlIHdpbGwgYWxsb2NhdGUgdGhlIHNwYWNlIHRoZW4sIGFuZCB3aWxsCi0gICAqIHBvc3NpYmx5IG92ZXJydW4gdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcuCi0gICAqLwotICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpCi0gICAgYWxsb2NfZnNfd29ya3NwYWNlKGNpbmZvKTsKLX0KLQotI2VuZGlmIC8qIFFVQU5UXzFQQVNTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvanF1YW50Mi5jIGIvbGlianBlZ3R3cnAvanF1YW50Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjYwMWUzLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2pxdWFudDIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTAgKzAsMCBAQAotLyoKLSAqIGpxdWFudDIuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKGNvbG9yIG1hcHBpbmcpIHJvdXRpbmVzLgotICogVGhlc2Ugcm91dGluZXMgcHJvdmlkZSBzZWxlY3Rpb24gb2YgYSBjdXN0b20gY29sb3IgbWFwIGZvciBhbiBpbWFnZSwKLSAqIGZvbGxvd2VkIGJ5IG1hcHBpbmcgb2YgdGhlIGltYWdlIHRvIHRoYXQgY29sb3IgbWFwLCB3aXRoIG9wdGlvbmFsCi0gKiBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgotICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UganVzdCB0aGUgc2Vjb25kIHBhc3MgdG8gbWFwIHRvIGFuIGFyYml0cmFyeQotICogZXh0ZXJuYWxseS1naXZlbiBjb2xvciBtYXAuCi0gKgotICogTm90ZTogb3JkZXJlZCBkaXRoZXJpbmcgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgdGhlcmUgaXNuJ3QgYW55IGZhc3QKLSAqIHdheSB0byBjb21wdXRlIGludGVyY29sb3IgZGlzdGFuY2VzOyBpdCdzIHVuY2xlYXIgdGhhdCBvcmRlcmVkIGRpdGhlcidzCi0gKiBmdW5kYW1lbnRhbCBhc3N1bXB0aW9ucyBldmVuIGhvbGQgd2l0aCBhbiBpcnJlZ3VsYXJseSBzcGFjZWQgY29sb3IgbWFwLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSB3ZWxsLWtub3duIEhlY2tiZXJ0IHBhcmFkaWdtIGZvciBjb2xvcgotICogcXVhbnRpemF0aW9uLiAgTW9zdCBvZiB0aGUgaWRlYXMgdXNlZCBoZXJlIGNhbiBiZSB0cmFjZWQgYmFjayB0bwotICogSGVja2JlcnQncyBzZW1pbmFsIHBhcGVyCi0gKiAgIEhlY2tiZXJ0LCBQYXVsLiAgIkNvbG9yIEltYWdlIFF1YW50aXphdGlvbiBmb3IgRnJhbWUgQnVmZmVyIERpc3BsYXkiLAotICogICBQcm9jLiBTSUdHUkFQSCAnODIsIENvbXB1dGVyIEdyYXBoaWNzIHYuMTYgIzMgKEp1bHkgMTk4MiksIHBwIDI5Ny0zMDQuCi0gKgotICogSW4gdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgaW1hZ2UsIHdlIGFjY3VtdWxhdGUgYSBoaXN0b2dyYW0gc2hvd2luZyB0aGUKLSAqIHVzYWdlIGNvdW50IG9mIGVhY2ggcG9zc2libGUgY29sb3IuICBUbyBrZWVwIHRoZSBoaXN0b2dyYW0gdG8gYSByZWFzb25hYmxlCi0gKiBzaXplLCB3ZSByZWR1Y2UgdGhlIHByZWNpc2lvbiBvZiB0aGUgaW5wdXQ7IHR5cGljYWwgcHJhY3RpY2UgaXMgdG8gcmV0YWluCi0gKiA1IG9yIDYgYml0cyBwZXIgY29sb3IsIHNvIHRoYXQgOCBvciA0IGRpZmZlcmVudCBpbnB1dCB2YWx1ZXMgYXJlIGNvdW50ZWQKLSAqIGluIHRoZSBzYW1lIGhpc3RvZ3JhbSBjZWxsLgotICoKLSAqIE5leHQsIHRoZSBjb2xvci1zZWxlY3Rpb24gc3RlcCBiZWdpbnMgd2l0aCBhIGJveCByZXByZXNlbnRpbmcgdGhlIHdob2xlCi0gKiBjb2xvciBzcGFjZSwgYW5kIHJlcGVhdGVkbHkgc3BsaXRzIHRoZSAibGFyZ2VzdCIgcmVtYWluaW5nIGJveCB1bnRpbCB3ZQotICogaGF2ZSBhcyBtYW55IGJveGVzIGFzIGRlc2lyZWQgY29sb3JzLiAgVGhlbiB0aGUgbWVhbiBjb2xvciBpbiBlYWNoCi0gKiByZW1haW5pbmcgYm94IGJlY29tZXMgb25lIG9mIHRoZSBwb3NzaWJsZSBvdXRwdXQgY29sb3JzLgotICogCi0gKiBUaGUgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgaW1hZ2UgbWFwcyBlYWNoIGlucHV0IHBpeGVsIHRvIHRoZSBjbG9zZXN0IG91dHB1dAotICogY29sb3IgKG9wdGlvbmFsbHkgYWZ0ZXIgYXBwbHlpbmcgYSBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGNvcnJlY3Rpb24pLgotICogVGhpcyBtYXBwaW5nIGlzIGxvZ2ljYWxseSB0cml2aWFsLCBidXQgbWFraW5nIGl0IGdvIGZhc3QgZW5vdWdoIHJlcXVpcmVzCi0gKiBjb25zaWRlcmFibGUgY2FyZS4KLSAqCi0gKiBIZWNrYmVydC1zdHlsZSBxdWFudGl6ZXJzIHZhcnkgYSBnb29kIGRlYWwgaW4gdGhlaXIgcG9saWNpZXMgZm9yIGNob29zaW5nCi0gKiB0aGUgImxhcmdlc3QiIGJveCBhbmQgZGVjaWRpbmcgd2hlcmUgdG8gY3V0IGl0LiAgVGhlIHBhcnRpY3VsYXIgcG9saWNpZXMKLSAqIHVzZWQgaGVyZSBoYXZlIHByb3ZlZCBvdXQgd2VsbCBpbiBleHBlcmltZW50YWwgY29tcGFyaXNvbnMsIGJ1dCBiZXR0ZXIgb25lcwotICogbWF5IHlldCBiZSBmb3VuZC4KLSAqCi0gKiBJbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSwgdGhpcyBtb2R1bGUgcXVhbnRpemVkIGluIFlDYkNyIGNvbG9yCi0gKiBzcGFjZSwgcHJvY2Vzc2luZyB0aGUgcmF3IHVwc2FtcGxlZCBkYXRhIHdpdGhvdXQgYSBjb2xvciBjb252ZXJzaW9uIHN0ZXAuCi0gKiBUaGlzIGFsbG93ZWQgdGhlIGNvbG9yIGNvbnZlcnNpb24gbWF0aCB0byBiZSBkb25lIG9ubHkgb25jZSBwZXIgY29sb3JtYXAKLSAqIGVudHJ5LCBub3Qgb25jZSBwZXIgcGl4ZWwuICBIb3dldmVyLCB0aGF0IG9wdGltaXphdGlvbiBwcmVjbHVkZWQgb3RoZXIKLSAqIHVzZWZ1bCBvcHRpbWl6YXRpb25zIChzdWNoIGFzIG1lcmdpbmcgY29sb3IgY29udmVyc2lvbiB3aXRoIHVwc2FtcGxpbmcpCi0gKiBhbmQgaXQgYWxzbyBpbnRlcmZlcmVkIHdpdGggZGVzaXJlZCBjYXBhYmlsaXRpZXMgc3VjaCBhcyBxdWFudGl6aW5nIHRvIGFuCi0gKiBleHRlcm5hbGx5LXN1cHBsaWVkIGNvbG9ybWFwLiAgV2UgaGF2ZSB0aGVyZWZvcmUgYWJhbmRvbmVkIHRoYXQgYXBwcm9hY2guCi0gKiBUaGUgcHJlc2VudCBjb2RlIHdvcmtzIGluIHRoZSBwb3N0LWNvbnZlcnNpb24gY29sb3Igc3BhY2UsIHR5cGljYWxseSBSR0IuCi0gKgotICogVG8gaW1wcm92ZSB0aGUgdmlzdWFsIHF1YWxpdHkgb2YgdGhlIHJlc3VsdHMsIHdlIGFjdHVhbGx5IHdvcmsgaW4gc2NhbGVkCi0gKiBSR0Igc3BhY2UsIGdpdmluZyBHIGRpc3RhbmNlcyBtb3JlIHdlaWdodCB0aGFuIFIsIGFuZCBSIGluIHR1cm4gbW9yZSB0aGFuCi0gKiBCLiAgVG8gZG8gZXZlcnl0aGluZyBpbiBpbnRlZ2VyIG1hdGgsIHdlIG11c3QgdXNlIGludGVnZXIgc2NhbGUgZmFjdG9ycy4KLSAqIFRoZSAyLzMvMSBzY2FsZSBmYWN0b3JzIHVzZWQgaGVyZSBjb3JyZXNwb25kIGxvb3NlbHkgdG8gdGhlIHJlbGF0aXZlCi0gKiB3ZWlnaHRzIG9mIHRoZSBjb2xvcnMgaW4gdGhlIE5UU0MgZ3JheXNjYWxlIGVxdWF0aW9uLgotICogSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29kZSB0byBxdWFudGl6ZSBhIG5vbi1SR0IgY29sb3Igc3BhY2UsIHlvdSdsbAotICogcHJvYmFibHkgbmVlZCB0byBjaGFuZ2UgdGhlc2Ugc2NhbGUgZmFjdG9ycy4KLSAqLwotCi0jZGVmaW5lIFJfU0NBTEUgMgkJLyogc2NhbGUgUiBkaXN0YW5jZXMgYnkgdGhpcyBtdWNoICovCi0jZGVmaW5lIEdfU0NBTEUgMwkJLyogc2NhbGUgRyBkaXN0YW5jZXMgYnkgdGhpcyBtdWNoICovCi0jZGVmaW5lIEJfU0NBTEUgMQkJLyogYW5kIEIgYnkgdGhpcyBtdWNoICovCi0KLS8qIFJlbGFiZWwgUi9HL0IgYXMgY29tcG9uZW50cyAwLzEvMiwgcmVzcGVjdGluZyB0aGUgUkdCIG9yZGVyaW5nIGRlZmluZWQKLSAqIGluIGptb3JlY2ZnLmguICBBcyB0aGUgY29kZSBzdGFuZHMsIGl0IHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBSLEcsQgotICogYW5kIEIsRyxSIG9yZGVycy4gIElmIHlvdSBkZWZpbmUgc29tZSBvdGhlciB3ZWlyZCBvcmRlciBpbiBqbW9yZWNmZy5oLAotICogeW91J2xsIGdldCBjb21waWxlIGVycm9ycyB1bnRpbCB5b3UgZXh0ZW5kIHRoaXMgbG9naWMuICBJbiB0aGF0IGNhc2UKLSAqIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHR3ZWFrIHRoZSBoaXN0b2dyYW0gc2l6ZXMgdG9vLgotICovCi0KLSNpZiBSR0JfUkVEID09IDAKLSNkZWZpbmUgQzBfU0NBTEUgUl9TQ0FMRQotI2VuZGlmCi0jaWYgUkdCX0JMVUUgPT0gMAotI2RlZmluZSBDMF9TQ0FMRSBCX1NDQUxFCi0jZW5kaWYKLSNpZiBSR0JfR1JFRU4gPT0gMQotI2RlZmluZSBDMV9TQ0FMRSBHX1NDQUxFCi0jZW5kaWYKLSNpZiBSR0JfUkVEID09IDIKLSNkZWZpbmUgQzJfU0NBTEUgUl9TQ0FMRQotI2VuZGlmCi0jaWYgUkdCX0JMVUUgPT0gMgotI2RlZmluZSBDMl9TQ0FMRSBCX1NDQUxFCi0jZW5kaWYKLQotCi0vKgotICogRmlyc3Qgd2UgaGF2ZSB0aGUgaGlzdG9ncmFtIGRhdGEgc3RydWN0dXJlIGFuZCByb3V0aW5lcyBmb3IgY3JlYXRpbmcgaXQuCi0gKgotICogVGhlIG51bWJlciBvZiBiaXRzIG9mIHByZWNpc2lvbiBjYW4gYmUgYWRqdXN0ZWQgYnkgY2hhbmdpbmcgdGhlc2Ugc3ltYm9scy4KLSAqIFdlIHJlY29tbWVuZCBrZWVwaW5nIDYgYml0cyBmb3IgRyBhbmQgNSBlYWNoIGZvciBSIGFuZCBCLgotICogSWYgeW91IGhhdmUgcGxlbnR5IG9mIG1lbW9yeSBhbmQgY3ljbGVzLCA2IGJpdHMgYWxsIGFyb3VuZCBnaXZlcyBtYXJnaW5hbGx5Ci0gKiBiZXR0ZXIgcmVzdWx0czsgaWYgeW91IGFyZSBzaG9ydCBvZiBtZW1vcnksIDUgYml0cyBhbGwgYXJvdW5kIHdpbGwgc2F2ZQotICogc29tZSBzcGFjZSBidXQgZGVncmFkZSB0aGUgcmVzdWx0cy4KLSAqIFRvIG1haW50YWluIGEgZnVsbHkgYWNjdXJhdGUgaGlzdG9ncmFtLCB3ZSdkIG5lZWQgdG8gYWxsb2NhdGUgYSAibG9uZyIKLSAqIChwcmVmZXJhYmx5IHVuc2lnbmVkIGxvbmcpIGZvciBlYWNoIGNlbGwuICBJbiBwcmFjdGljZSB0aGlzIGlzIG92ZXJraWxsOwotICogd2UgY2FuIGdldCBieSB3aXRoIDE2IGJpdHMgcGVyIGNlbGwuICBGZXcgb2YgdGhlIGNlbGwgY291bnRzIHdpbGwgb3ZlcmZsb3csCi0gKiBhbmQgY2xhbXBpbmcgdGhvc2UgdGhhdCBkbyBvdmVyZmxvdyB0byB0aGUgbWF4aW11bSB2YWx1ZSB3aWxsIGdpdmUgY2xvc2UtCi0gKiBlbm91Z2ggcmVzdWx0cy4gIFRoaXMgcmVkdWNlcyB0aGUgcmVjb21tZW5kZWQgaGlzdG9ncmFtIHNpemUgZnJvbSAyNTZLYgotICogdG8gMTI4S2IsIHdoaWNoIGlzIGEgdXNlZnVsIHNhdmluZ3Mgb24gUEMtY2xhc3MgbWFjaGluZXMuCi0gKiAoSW4gdGhlIHNlY29uZCBwYXNzIHRoZSBoaXN0b2dyYW0gc3BhY2UgaXMgcmUtdXNlZCBmb3IgcGl4ZWwgbWFwcGluZyBkYXRhOwotICogaW4gdGhhdCBjYXBhY2l0eSwgZWFjaCBjZWxsIG11c3QgYmUgYWJsZSB0byBzdG9yZSB6ZXJvIHRvIHRoZSBudW1iZXIgb2YKLSAqIGRlc2lyZWQgY29sb3JzLiAgMTYgYml0cy9jZWxsIGlzIHBsZW50eSBmb3IgdGhhdCB0b28uKQotICogU2luY2UgdGhlIEpQRUcgY29kZSBpcyBpbnRlbmRlZCB0byBydW4gaW4gc21hbGwgbWVtb3J5IG1vZGVsIG9uIDgweDg2Ci0gKiBtYWNoaW5lcywgd2UgY2FuJ3QganVzdCBhbGxvY2F0ZSB0aGUgaGlzdG9ncmFtIGluIG9uZSBjaHVuay4gIEluc3RlYWQKLSAqIG9mIGEgdHJ1ZSAzLUQgYXJyYXksIHdlIHVzZSBhIHJvdyBvZiBwb2ludGVycyB0byAyLUQgYXJyYXlzLiAgRWFjaAotICogcG9pbnRlciBjb3JyZXNwb25kcyB0byBhIEMwIHZhbHVlICh0eXBpY2FsbHkgMl41ID0gMzIgcG9pbnRlcnMpIGFuZAotICogZWFjaCAyLUQgYXJyYXkgaGFzIDJeNioyXjUgPSAyMDQ4IG9yIDJeNioyXjYgPSA0MDk2IGVudHJpZXMuICBOb3RlIHRoYXQKLSAqIG9uIDgweDg2IG1hY2hpbmVzLCB0aGUgcG9pbnRlciByb3cgaXMgaW4gbmVhciBtZW1vcnkgYnV0IHRoZSBhY3R1YWwKLSAqIGFycmF5cyBhcmUgaW4gZmFyIG1lbW9yeSAoc2FtZSBhcnJhbmdlbWVudCBhcyB3ZSB1c2UgZm9yIGltYWdlIGFycmF5cykuCi0gKi8KLQotI2RlZmluZSBNQVhOVU1DT0xPUlMgIChNQVhKU0FNUExFKzEpIC8qIG1heGltdW0gc2l6ZSBvZiBjb2xvcm1hcCAqLwotCi0vKiBUaGVzZSB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBmb3IgZWl0aGVyIFIsRyxCIG9yIEIsRyxSIGNvbG9yIG9yZGVyLAotICogYnV0IHlvdSBtYXkgbm90IGxpa2UgdGhlIHJlc3VsdHMgZm9yIG90aGVyIGNvbG9yIG9yZGVycy4KLSAqLwotI2RlZmluZSBISVNUX0MwX0JJVFMgIDUJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIFIvQiBoaXN0b2dyYW0gKi8KLSNkZWZpbmUgSElTVF9DMV9CSVRTICA2CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBHIGhpc3RvZ3JhbSAqLwotI2RlZmluZSBISVNUX0MyX0JJVFMgIDUJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIEIvUiBoaXN0b2dyYW0gKi8KLQotLyogTnVtYmVyIG9mIGVsZW1lbnRzIGFsb25nIGhpc3RvZ3JhbSBheGVzLiAqLwotI2RlZmluZSBISVNUX0MwX0VMRU1TICAoMTw8SElTVF9DMF9CSVRTKQotI2RlZmluZSBISVNUX0MxX0VMRU1TICAoMTw8SElTVF9DMV9CSVRTKQotI2RlZmluZSBISVNUX0MyX0VMRU1TICAoMTw8SElTVF9DMl9CSVRTKQotCi0vKiBUaGVzZSBhcmUgdGhlIGFtb3VudHMgdG8gc2hpZnQgYW4gaW5wdXQgdmFsdWUgdG8gZ2V0IGEgaGlzdG9ncmFtIGluZGV4LiAqLwotI2RlZmluZSBDMF9TSElGVCAgKEJJVFNfSU5fSlNBTVBMRS1ISVNUX0MwX0JJVFMpCi0jZGVmaW5lIEMxX1NISUZUICAoQklUU19JTl9KU0FNUExFLUhJU1RfQzFfQklUUykKLSNkZWZpbmUgQzJfU0hJRlQgIChCSVRTX0lOX0pTQU1QTEUtSElTVF9DMl9CSVRTKQotCi0KLXR5cGVkZWYgVUlOVDE2IGhpc3RjZWxsOwkvKiBoaXN0b2dyYW0gY2VsbDsgcHJlZmVyIGFuIHVuc2lnbmVkIHR5cGUgKi8KLQotdHlwZWRlZiBoaXN0Y2VsbCBGQVIgKiBoaXN0cHRyOwkvKiBmb3IgcG9pbnRlcnMgdG8gaGlzdG9ncmFtIGNlbGxzICovCi0KLXR5cGVkZWYgaGlzdGNlbGwgaGlzdDFkW0hJU1RfQzJfRUxFTVNdOyAvKiB0eXBlZGVmcyBmb3IgdGhlIGFycmF5ICovCi10eXBlZGVmIGhpc3QxZCBGQVIgKiBoaXN0MmQ7CS8qIHR5cGUgZm9yIHRoZSAybmQtbGV2ZWwgcG9pbnRlcnMgKi8KLXR5cGVkZWYgaGlzdDJkICogaGlzdDNkOwkvKiB0eXBlIGZvciB0b3AtbGV2ZWwgcG9pbnRlciAqLwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZy4KLSAqCi0gKiBFcnJvcnMgYXJlIGFjY3VtdWxhdGVkIGludG8gdGhlIGFycmF5IGZzZXJyb3JzW10sIGF0IGEgcmVzb2x1dGlvbiBvZgotICogMS8xNnRoIG9mIGEgcGl4ZWwgY291bnQuICBUaGUgZXJyb3IgYXQgYSBnaXZlbiBwaXhlbCBpcyBwcm9wYWdhdGVkCi0gKiB0byBpdHMgbm90LXlldC1wcm9jZXNzZWQgbmVpZ2hib3JzIHVzaW5nIHRoZSBzdGFuZGFyZCBGLVMgZnJhY3Rpb25zLAotICoJCS4uLgkoaGVyZSkJNy8xNgotICoJCTMvMTYJNS8xNgkxLzE2Ci0gKiBXZSB3b3JrIGxlZnQtdG8tcmlnaHQgb24gZXZlbiByb3dzLCByaWdodC10by1sZWZ0IG9uIG9kZCByb3dzLgotICoKLSAqIFdlIGNhbiBnZXQgYXdheSB3aXRoIGEgc2luZ2xlIGFycmF5IChob2xkaW5nIG9uZSByb3cncyB3b3J0aCBvZiBlcnJvcnMpCi0gKiBieSB1c2luZyBpdCB0byBzdG9yZSB0aGUgY3VycmVudCByb3cncyBlcnJvcnMgYXQgcGl4ZWwgY29sdW1ucyBub3QgeWV0Ci0gKiBwcm9jZXNzZWQsIGJ1dCB0aGUgbmV4dCByb3cncyBlcnJvcnMgYXQgY29sdW1ucyBhbHJlYWR5IHByb2Nlc3NlZC4gIFdlCi0gKiBuZWVkIG9ubHkgYSBmZXcgZXh0cmEgdmFyaWFibGVzIHRvIGhvbGQgdGhlIGVycm9ycyBpbW1lZGlhdGVseSBhcm91bmQgdGhlCi0gKiBjdXJyZW50IGNvbHVtbi4gIChJZiB3ZSBhcmUgbHVja3ksIHRob3NlIHZhcmlhYmxlcyBhcmUgaW4gcmVnaXN0ZXJzLCBidXQKLSAqIGV2ZW4gaWYgbm90LCB0aGV5J3JlIHByb2JhYmx5IGNoZWFwZXIgdG8gYWNjZXNzIHRoYW4gYXJyYXkgZWxlbWVudHMgYXJlLikKLSAqCi0gKiBUaGUgZnNlcnJvcnNbXSBhcnJheSBoYXMgKCNjb2x1bW5zICsgMikgZW50cmllczsgdGhlIGV4dHJhIGVudHJ5IGF0Ci0gKiBlYWNoIGVuZCBzYXZlcyB1cyBmcm9tIHNwZWNpYWwtY2FzaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBwaXhlbHMuCi0gKiBFYWNoIGVudHJ5IGlzIHRocmVlIHZhbHVlcyBsb25nLCBvbmUgdmFsdWUgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgotICoKLSAqIE5vdGU6IG9uIGEgd2lkZSBpbWFnZSwgd2UgbWlnaHQgbm90IGhhdmUgZW5vdWdoIHJvb20gaW4gYSBQQydzIG5lYXIgZGF0YQotICogc2VnbWVudCB0byBob2xkIHRoZSBlcnJvciBhcnJheTsgc28gaXQgaXMgYWxsb2NhdGVkIHdpdGggYWxsb2NfbGFyZ2UuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci10eXBlZGVmIElOVDE2IEZTRVJST1I7CQkvKiAxNiBiaXRzIHNob3VsZCBiZSBlbm91Z2ggKi8KLXR5cGVkZWYgaW50IExPQ0ZTRVJST1I7CQkvKiB1c2UgJ2ludCcgZm9yIGNhbGN1bGF0aW9uIHRlbXBzICovCi0jZWxzZQotdHlwZWRlZiBJTlQzMiBGU0VSUk9SOwkJLyogbWF5IG5lZWQgbW9yZSB0aGFuIDE2IGJpdHMgKi8KLXR5cGVkZWYgSU5UMzIgTE9DRlNFUlJPUjsJLyogYmUgc3VyZSBjYWxjdWxhdGlvbiB0ZW1wcyBhcmUgYmlnIGVub3VnaCAqLwotI2VuZGlmCi0KLXR5cGVkZWYgRlNFUlJPUiBGQVIgKkZTRVJSUFRSOwkvKiBwb2ludGVyIHRvIGVycm9yIGFycmF5IChpbiBGQVIgc3RvcmFnZSEpICovCi0KLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogU3BhY2UgZm9yIHRoZSBldmVudHVhbGx5IGNyZWF0ZWQgY29sb3JtYXAgaXMgc3Rhc2hlZCBoZXJlICovCi0gIEpTQU1QQVJSQVkgc3ZfY29sb3JtYXA7CS8qIGNvbG9ybWFwIGFsbG9jYXRlZCBhdCBpbml0IHRpbWUgKi8KLSAgaW50IGRlc2lyZWQ7CQkJLyogZGVzaXJlZCAjIG9mIGNvbG9ycyA9IHNpemUgb2YgY29sb3JtYXAgKi8KLQotICAvKiBWYXJpYWJsZXMgZm9yIGFjY3VtdWxhdGluZyBpbWFnZSBzdGF0aXN0aWNzICovCi0gIGhpc3QzZCBoaXN0b2dyYW07CQkvKiBwb2ludGVyIHRvIHRoZSBoaXN0b2dyYW0gKi8KLQotICBib29sZWFuIG5lZWRzX3plcm9lZDsJCS8qIFRSVUUgaWYgbmV4dCBwYXNzIG11c3QgemVybyBoaXN0b2dyYW0gKi8KLQotICAvKiBWYXJpYWJsZXMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgKi8KLSAgRlNFUlJQVFIgZnNlcnJvcnM7CQkvKiBhY2N1bXVsYXRlZCBlcnJvcnMgKi8KLSAgYm9vbGVhbiBvbl9vZGRfcm93OwkJLyogZmxhZyB0byByZW1lbWJlciB3aGljaCByb3cgd2UgYXJlIG9uICovCi0gIGludCAqIGVycm9yX2xpbWl0ZXI7CQkvKiB0YWJsZSBmb3IgY2xhbXBpbmcgdGhlIGFwcGxpZWQgZXJyb3IgKi8KLX0gbXlfY3F1YW50aXplcjsKLQotdHlwZWRlZiBteV9jcXVhbnRpemVyICogbXlfY3F1YW50aXplX3B0cjsKLQotCi0vKgotICogUHJlc2NhbiBzb21lIHJvd3Mgb2YgcGl4ZWxzLgotICogSW4gdGhpcyBtb2R1bGUgdGhlIHByZXNjYW4gc2ltcGx5IHVwZGF0ZXMgdGhlIGhpc3RvZ3JhbSwgd2hpY2ggaGFzIGJlZW4KLSAqIGluaXRpYWxpemVkIHRvIHplcm9lcyBieSBzdGFydF9wYXNzLgotICogQW4gb3V0cHV0X2J1ZiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgYnkgdGhlIG1ldGhvZCBzaWduYXR1cmUsIGJ1dCBubyBkYXRhCi0gKiBpcyBhY3R1YWxseSBvdXRwdXQgKGluIGZhY3QgdGhlIGJ1ZmZlciBjb250cm9sbGVyIGlzIHByb2JhYmx5IHBhc3NpbmcgYQotICogTlVMTCBwb2ludGVyKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByZXNjYW5fcXVhbnRpemUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAotCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIGhpc3RwdHIgaGlzdHA7Ci0gIHJlZ2lzdGVyIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKLSAgaW50IHJvdzsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotCi0gIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7Ci0gICAgcHRyID0gaW5wdXRfYnVmW3Jvd107Ci0gICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgIC8qIGdldCBwaXhlbCB2YWx1ZSBhbmQgaW5kZXggaW50byB0aGUgaGlzdG9ncmFtICovCi0gICAgICBoaXN0cCA9ICYgaGlzdG9ncmFtW0dFVEpTQU1QTEUocHRyWzBdKSA+PiBDMF9TSElGVF0KLQkJCSBbR0VUSlNBTVBMRShwdHJbMV0pID4+IEMxX1NISUZUXQotCQkJIFtHRVRKU0FNUExFKHB0clsyXSkgPj4gQzJfU0hJRlRdOwotICAgICAgLyogaW5jcmVtZW50LCBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIHVuZG8gaW5jcmVtZW50IGlmIHNvLiAqLwotICAgICAgaWYgKCsrKCpoaXN0cCkgPD0gMCkKLQkoKmhpc3RwKS0tOwotICAgICAgcHRyICs9IDM7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIE5leHQgd2UgaGF2ZSB0aGUgcmVhbGx5IGludGVyZXN0aW5nIHJvdXRpbmVzOiBzZWxlY3Rpb24gb2YgYSBjb2xvcm1hcAotICogZ2l2ZW4gdGhlIGNvbXBsZXRlZCBoaXN0b2dyYW0uCi0gKiBUaGVzZSByb3V0aW5lcyB3b3JrIHdpdGggYSBsaXN0IG9mICJib3hlcyIsIGVhY2ggcmVwcmVzZW50aW5nIGEgcmVjdGFuZ3VsYXIKLSAqIHN1YnNldCBvZiB0aGUgaW5wdXQgY29sb3Igc3BhY2UgKHRvIGhpc3RvZ3JhbSBwcmVjaXNpb24pLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhlIGJvdW5kcyBvZiB0aGUgYm94IChpbmNsdXNpdmUpOyBleHByZXNzZWQgYXMgaGlzdG9ncmFtIGluZGV4ZXMgKi8KLSAgaW50IGMwbWluLCBjMG1heDsKLSAgaW50IGMxbWluLCBjMW1heDsKLSAgaW50IGMybWluLCBjMm1heDsKLSAgLyogVGhlIHZvbHVtZSAoYWN0dWFsbHkgMi1ub3JtKSBvZiB0aGUgYm94ICovCi0gIElOVDMyIHZvbHVtZTsKLSAgLyogVGhlIG51bWJlciBvZiBub256ZXJvIGhpc3RvZ3JhbSBjZWxscyB3aXRoaW4gdGhpcyBib3ggKi8KLSAgbG9uZyBjb2xvcmNvdW50OwotfSBib3g7Ci0KLXR5cGVkZWYgYm94ICogYm94cHRyOwotCi0KLUxPQ0FMKGJveHB0cikKLWZpbmRfYmlnZ2VzdF9jb2xvcl9wb3AgKGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMpCi0vKiBGaW5kIHRoZSBzcGxpdHRhYmxlIGJveCB3aXRoIHRoZSBsYXJnZXN0IGNvbG9yIHBvcHVsYXRpb24gKi8KLS8qIFJldHVybnMgTlVMTCBpZiBubyBzcGxpdHRhYmxlIGJveGVzIHJlbWFpbiAqLwotewotICByZWdpc3RlciBib3hwdHIgYm94cDsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIGxvbmcgbWF4YyA9IDA7Ci0gIGJveHB0ciB3aGljaCA9IE5VTEw7Ci0gIAotICBmb3IgKGkgPSAwLCBib3hwID0gYm94bGlzdDsgaSA8IG51bWJveGVzOyBpKyssIGJveHArKykgewotICAgIGlmIChib3hwLT5jb2xvcmNvdW50ID4gbWF4YyAmJiBib3hwLT52b2x1bWUgPiAwKSB7Ci0gICAgICB3aGljaCA9IGJveHA7Ci0gICAgICBtYXhjID0gYm94cC0+Y29sb3Jjb3VudDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHdoaWNoOwotfQotCi0KLUxPQ0FMKGJveHB0cikKLWZpbmRfYmlnZ2VzdF92b2x1bWUgKGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMpCi0vKiBGaW5kIHRoZSBzcGxpdHRhYmxlIGJveCB3aXRoIHRoZSBsYXJnZXN0IChzY2FsZWQpIHZvbHVtZSAqLwotLyogUmV0dXJucyBOVUxMIGlmIG5vIHNwbGl0dGFibGUgYm94ZXMgcmVtYWluICovCi17Ci0gIHJlZ2lzdGVyIGJveHB0ciBib3hwOwotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgSU5UMzIgbWF4diA9IDA7Ci0gIGJveHB0ciB3aGljaCA9IE5VTEw7Ci0gIAotICBmb3IgKGkgPSAwLCBib3hwID0gYm94bGlzdDsgaSA8IG51bWJveGVzOyBpKyssIGJveHArKykgewotICAgIGlmIChib3hwLT52b2x1bWUgPiBtYXh2KSB7Ci0gICAgICB3aGljaCA9IGJveHA7Ci0gICAgICBtYXh2ID0gYm94cC0+dm9sdW1lOwotICAgIH0KLSAgfQotICByZXR1cm4gd2hpY2g7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXVwZGF0ZV9ib3ggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hwKQotLyogU2hyaW5rIHRoZSBtaW4vbWF4IGJvdW5kcyBvZiBhIGJveCB0byBlbmNsb3NlIG9ubHkgbm9uemVybyBlbGVtZW50cywgKi8KLS8qIGFuZCByZWNvbXB1dGUgaXRzIHZvbHVtZSBhbmQgcG9wdWxhdGlvbiAqLwotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07Ci0gIGhpc3RwdHIgaGlzdHA7Ci0gIGludCBjMCxjMSxjMjsKLSAgaW50IGMwbWluLGMwbWF4LGMxbWluLGMxbWF4LGMybWluLGMybWF4OwotICBJTlQzMiBkaXN0MCxkaXN0MSxkaXN0MjsKLSAgbG9uZyBjY291bnQ7Ci0gIAotICBjMG1pbiA9IGJveHAtPmMwbWluOyAgYzBtYXggPSBib3hwLT5jMG1heDsKLSAgYzFtaW4gPSBib3hwLT5jMW1pbjsgIGMxbWF4ID0gYm94cC0+YzFtYXg7Ci0gIGMybWluID0gYm94cC0+YzJtaW47ICBjMm1heCA9IGJveHAtPmMybWF4OwotICAKLSAgaWYgKGMwbWF4ID4gYzBtaW4pCi0gICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykKLSAgICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKLQloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOwotCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCi0JICBpZiAoKmhpc3RwKysgIT0gMCkgewotCSAgICBib3hwLT5jMG1pbiA9IGMwbWluID0gYzA7Ci0JICAgIGdvdG8gaGF2ZV9jMG1pbjsKLQkgIH0KLSAgICAgIH0KLSBoYXZlX2MwbWluOgotICBpZiAoYzBtYXggPiBjMG1pbikKLSAgICBmb3IgKGMwID0gYzBtYXg7IGMwID49IGMwbWluOyBjMC0tKQotICAgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgewotCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07Ci0JZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKLQkgIGlmICgqaGlzdHArKyAhPSAwKSB7Ci0JICAgIGJveHAtPmMwbWF4ID0gYzBtYXggPSBjMDsKLQkgICAgZ290byBoYXZlX2MwbWF4OwotCSAgfQotICAgICAgfQotIGhhdmVfYzBtYXg6Ci0gIGlmIChjMW1heCA+IGMxbWluKQotICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspCi0gICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7Ci0JaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKLQlmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQotCSAgaWYgKCpoaXN0cCsrICE9IDApIHsKLQkgICAgYm94cC0+YzFtaW4gPSBjMW1pbiA9IGMxOwotCSAgICBnb3RvIGhhdmVfYzFtaW47Ci0JICB9Ci0gICAgICB9Ci0gaGF2ZV9jMW1pbjoKLSAgaWYgKGMxbWF4ID4gYzFtaW4pCi0gICAgZm9yIChjMSA9IGMxbWF4OyBjMSA+PSBjMW1pbjsgYzEtLSkKLSAgICAgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspIHsKLQloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOwotCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCi0JICBpZiAoKmhpc3RwKysgIT0gMCkgewotCSAgICBib3hwLT5jMW1heCA9IGMxbWF4ID0gYzE7Ci0JICAgIGdvdG8gaGF2ZV9jMW1heDsKLQkgIH0KLSAgICAgIH0KLSBoYXZlX2MxbWF4OgotICBpZiAoYzJtYXggPiBjMm1pbikKLSAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQotICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgewotCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxbWluXVtjMl07Ci0JZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKywgaGlzdHAgKz0gSElTVF9DMl9FTEVNUykKLQkgIGlmICgqaGlzdHAgIT0gMCkgewotCSAgICBib3hwLT5jMm1pbiA9IGMybWluID0gYzI7Ci0JICAgIGdvdG8gaGF2ZV9jMm1pbjsKLQkgIH0KLSAgICAgIH0KLSBoYXZlX2MybWluOgotICBpZiAoYzJtYXggPiBjMm1pbikKLSAgICBmb3IgKGMyID0gYzJtYXg7IGMyID49IGMybWluOyBjMi0tKQotICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgewotCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxbWluXVtjMl07Ci0JZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKywgaGlzdHAgKz0gSElTVF9DMl9FTEVNUykKLQkgIGlmICgqaGlzdHAgIT0gMCkgewotCSAgICBib3hwLT5jMm1heCA9IGMybWF4ID0gYzI7Ci0JICAgIGdvdG8gaGF2ZV9jMm1heDsKLQkgIH0KLSAgICAgIH0KLSBoYXZlX2MybWF4OgotCi0gIC8qIFVwZGF0ZSBib3ggdm9sdW1lLgotICAgKiBXZSB1c2UgMi1ub3JtIHJhdGhlciB0aGFuIHJlYWwgdm9sdW1lIGhlcmU7IHRoaXMgYmlhc2VzIHRoZSBtZXRob2QKLSAgICogYWdhaW5zdCBtYWtpbmcgbG9uZyBuYXJyb3cgYm94ZXMsIGFuZCBpdCBoYXMgdGhlIHNpZGUgYmVuZWZpdCB0aGF0Ci0gICAqIGEgYm94IGlzIHNwbGl0dGFibGUgaWZmIG5vcm0gPiAwLgotICAgKiBTaW5jZSB0aGUgZGlmZmVyZW5jZXMgYXJlIGV4cHJlc3NlZCBpbiBoaXN0b2dyYW0tY2VsbCB1bml0cywKLSAgICogd2UgaGF2ZSB0byBzaGlmdCBiYWNrIHRvIEpTQU1QTEUgdW5pdHMgdG8gZ2V0IGNvbnNpc3RlbnQgZGlzdGFuY2VzOwotICAgKiBhZnRlciB3aGljaCwgd2Ugc2NhbGUgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBkaXN0YW5jZSBzY2FsZSBmYWN0b3JzLgotICAgKi8KLSAgZGlzdDAgPSAoKGMwbWF4IC0gYzBtaW4pIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFOwotICBkaXN0MSA9ICgoYzFtYXggLSBjMW1pbikgPDwgQzFfU0hJRlQpICogQzFfU0NBTEU7Ci0gIGRpc3QyID0gKChjMm1heCAtIGMybWluKSA8PCBDMl9TSElGVCkgKiBDMl9TQ0FMRTsKLSAgYm94cC0+dm9sdW1lID0gZGlzdDAqZGlzdDAgKyBkaXN0MSpkaXN0MSArIGRpc3QyKmRpc3QyOwotICAKLSAgLyogTm93IHNjYW4gcmVtYWluaW5nIHZvbHVtZSBvZiBib3ggYW5kIGNvbXB1dGUgcG9wdWxhdGlvbiAqLwotICBjY291bnQgPSAwOwotICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQotICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKLSAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07Ci0gICAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrLCBoaXN0cCsrKQotCWlmICgqaGlzdHAgIT0gMCkgewotCSAgY2NvdW50Kys7Ci0JfQotICAgIH0KLSAgYm94cC0+Y29sb3Jjb3VudCA9IGNjb3VudDsKLX0KLQotCi1MT0NBTChpbnQpCi1tZWRpYW5fY3V0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib3hwdHIgYm94bGlzdCwgaW50IG51bWJveGVzLAotCSAgICBpbnQgZGVzaXJlZF9jb2xvcnMpCi0vKiBSZXBlYXRlZGx5IHNlbGVjdCBhbmQgc3BsaXQgdGhlIGxhcmdlc3QgYm94IHVudGlsIHdlIGhhdmUgZW5vdWdoIGJveGVzICovCi17Ci0gIGludCBuLGxiOwotICBpbnQgYzAsYzEsYzIsY21heDsKLSAgcmVnaXN0ZXIgYm94cHRyIGIxLGIyOwotCi0gIHdoaWxlIChudW1ib3hlcyA8IGRlc2lyZWRfY29sb3JzKSB7Ci0gICAgLyogU2VsZWN0IGJveCB0byBzcGxpdC4KLSAgICAgKiBDdXJyZW50IGFsZ29yaXRobTogYnkgcG9wdWxhdGlvbiBmb3IgZmlyc3QgaGFsZiwgdGhlbiBieSB2b2x1bWUuCi0gICAgICovCi0gICAgaWYgKG51bWJveGVzKjIgPD0gZGVzaXJlZF9jb2xvcnMpIHsKLSAgICAgIGIxID0gZmluZF9iaWdnZXN0X2NvbG9yX3BvcChib3hsaXN0LCBudW1ib3hlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGIxID0gZmluZF9iaWdnZXN0X3ZvbHVtZShib3hsaXN0LCBudW1ib3hlcyk7Ci0gICAgfQotICAgIGlmIChiMSA9PSBOVUxMKQkJLyogbm8gc3BsaXR0YWJsZSBib3hlcyBsZWZ0ISAqLwotICAgICAgYnJlYWs7Ci0gICAgYjIgPSAmYm94bGlzdFtudW1ib3hlc107CS8qIHdoZXJlIG5ldyBib3ggd2lsbCBnbyAqLwotICAgIC8qIENvcHkgdGhlIGNvbG9yIGJvdW5kcyB0byB0aGUgbmV3IGJveC4gKi8KLSAgICBiMi0+YzBtYXggPSBiMS0+YzBtYXg7IGIyLT5jMW1heCA9IGIxLT5jMW1heDsgYjItPmMybWF4ID0gYjEtPmMybWF4OwotICAgIGIyLT5jMG1pbiA9IGIxLT5jMG1pbjsgYjItPmMxbWluID0gYjEtPmMxbWluOyBiMi0+YzJtaW4gPSBiMS0+YzJtaW47Ci0gICAgLyogQ2hvb3NlIHdoaWNoIGF4aXMgdG8gc3BsaXQgdGhlIGJveCBvbi4KLSAgICAgKiBDdXJyZW50IGFsZ29yaXRobTogbG9uZ2VzdCBzY2FsZWQgYXhpcy4KLSAgICAgKiBTZWUgbm90ZXMgaW4gdXBkYXRlX2JveCBhYm91dCBzY2FsaW5nIGRpc3RhbmNlcy4KLSAgICAgKi8KLSAgICBjMCA9ICgoYjEtPmMwbWF4IC0gYjEtPmMwbWluKSA8PCBDMF9TSElGVCkgKiBDMF9TQ0FMRTsKLSAgICBjMSA9ICgoYjEtPmMxbWF4IC0gYjEtPmMxbWluKSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRTsKLSAgICBjMiA9ICgoYjEtPmMybWF4IC0gYjEtPmMybWluKSA8PCBDMl9TSElGVCkgKiBDMl9TQ0FMRTsKLSAgICAvKiBXZSB3YW50IHRvIGJyZWFrIGFueSB0aWVzIGluIGZhdm9yIG9mIGdyZWVuLCB0aGVuIHJlZCwgYmx1ZSBsYXN0LgotICAgICAqIFRoaXMgY29kZSBkb2VzIHRoZSByaWdodCB0aGluZyBmb3IgUixHLEIgb3IgQixHLFIgY29sb3Igb3JkZXJzIG9ubHkuCi0gICAgICovCi0jaWYgUkdCX1JFRCA9PSAwCi0gICAgY21heCA9IGMxOyBuID0gMTsKLSAgICBpZiAoYzAgPiBjbWF4KSB7IGNtYXggPSBjMDsgbiA9IDA7IH0KLSAgICBpZiAoYzIgPiBjbWF4KSB7IG4gPSAyOyB9Ci0jZWxzZQotICAgIGNtYXggPSBjMTsgbiA9IDE7Ci0gICAgaWYgKGMyID4gY21heCkgeyBjbWF4ID0gYzI7IG4gPSAyOyB9Ci0gICAgaWYgKGMwID4gY21heCkgeyBuID0gMDsgfQotI2VuZGlmCi0gICAgLyogQ2hvb3NlIHNwbGl0IHBvaW50IGFsb25nIHNlbGVjdGVkIGF4aXMsIGFuZCB1cGRhdGUgYm94IGJvdW5kcy4KLSAgICAgKiBDdXJyZW50IGFsZ29yaXRobTogc3BsaXQgYXQgaGFsZndheSBwb2ludC4KLSAgICAgKiAoU2luY2UgdGhlIGJveCBoYXMgYmVlbiBzaHJ1bmsgdG8gbWluaW11bSB2b2x1bWUsCi0gICAgICogYW55IHNwbGl0IHdpbGwgcHJvZHVjZSB0d28gbm9uZW1wdHkgc3ViYm94ZXMuKQotICAgICAqIE5vdGUgdGhhdCBsYiB2YWx1ZSBpcyBtYXggZm9yIGxvd2VyIGJveCwgc28gbXVzdCBiZSA8IG9sZCBtYXguCi0gICAgICovCi0gICAgc3dpdGNoIChuKSB7Ci0gICAgY2FzZSAwOgotICAgICAgbGIgPSAoYjEtPmMwbWF4ICsgYjEtPmMwbWluKSAvIDI7Ci0gICAgICBiMS0+YzBtYXggPSBsYjsKLSAgICAgIGIyLT5jMG1pbiA9IGxiKzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBsYiA9IChiMS0+YzFtYXggKyBiMS0+YzFtaW4pIC8gMjsKLSAgICAgIGIxLT5jMW1heCA9IGxiOwotICAgICAgYjItPmMxbWluID0gbGIrMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGxiID0gKGIxLT5jMm1heCArIGIxLT5jMm1pbikgLyAyOwotICAgICAgYjEtPmMybWF4ID0gbGI7Ci0gICAgICBiMi0+YzJtaW4gPSBsYisxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIFVwZGF0ZSBzdGF0cyBmb3IgYm94ZXMgKi8KLSAgICB1cGRhdGVfYm94KGNpbmZvLCBiMSk7Ci0gICAgdXBkYXRlX2JveChjaW5mbywgYjIpOwotICAgIG51bWJveGVzKys7Ci0gIH0KLSAgcmV0dXJuIG51bWJveGVzOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1jb21wdXRlX2NvbG9yIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib3hwdHIgYm94cCwgaW50IGljb2xvcikKLS8qIENvbXB1dGUgcmVwcmVzZW50YXRpdmUgY29sb3IgZm9yIGEgYm94LCBwdXQgaXQgaW4gY29sb3JtYXBbaWNvbG9yXSAqLwotewotICAvKiBDdXJyZW50IGFsZ29yaXRobTogbWVhbiB3ZWlnaHRlZCBieSBwaXhlbHMgKG5vdCBjb2xvcnMpICovCi0gIC8qIE5vdGUgaXQgaXMgaW1wb3J0YW50IHRvIGdldCB0aGUgcm91bmRpbmcgY29ycmVjdCEgKi8KLSAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKLSAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOwotICBoaXN0cHRyIGhpc3RwOwotICBpbnQgYzAsYzEsYzI7Ci0gIGludCBjMG1pbixjMG1heCxjMW1pbixjMW1heCxjMm1pbixjMm1heDsKLSAgbG9uZyBjb3VudDsKLSAgbG9uZyB0b3RhbCA9IDA7Ci0gIGxvbmcgYzB0b3RhbCA9IDA7Ci0gIGxvbmcgYzF0b3RhbCA9IDA7Ci0gIGxvbmcgYzJ0b3RhbCA9IDA7Ci0gIAotICBjMG1pbiA9IGJveHAtPmMwbWluOyAgYzBtYXggPSBib3hwLT5jMG1heDsKLSAgYzFtaW4gPSBib3hwLT5jMW1pbjsgIGMxbWF4ID0gYm94cC0+YzFtYXg7Ci0gIGMybWluID0gYm94cC0+YzJtaW47ICBjMm1heCA9IGJveHAtPmMybWF4OwotICAKLSAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykKLSAgICBmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrKSB7Ci0gICAgICBoaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOwotICAgICAgZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykgewotCWlmICgoY291bnQgPSAqaGlzdHArKykgIT0gMCkgewotCSAgdG90YWwgKz0gY291bnQ7Ci0JICBjMHRvdGFsICs9ICgoYzAgPDwgQzBfU0hJRlQpICsgKCgxPDxDMF9TSElGVCk+PjEpKSAqIGNvdW50OwotCSAgYzF0b3RhbCArPSAoKGMxIDw8IEMxX1NISUZUKSArICgoMTw8QzFfU0hJRlQpPj4xKSkgKiBjb3VudDsKLQkgIGMydG90YWwgKz0gKChjMiA8PCBDMl9TSElGVCkgKyAoKDE8PEMyX1NISUZUKT4+MSkpICogY291bnQ7Ci0JfQotICAgICAgfQotICAgIH0KLSAgCi0gIGNpbmZvLT5jb2xvcm1hcFswXVtpY29sb3JdID0gKEpTQU1QTEUpICgoYzB0b3RhbCArICh0b3RhbD4+MSkpIC8gdG90YWwpOwotICBjaW5mby0+Y29sb3JtYXBbMV1baWNvbG9yXSA9IChKU0FNUExFKSAoKGMxdG90YWwgKyAodG90YWw+PjEpKSAvIHRvdGFsKTsKLSAgY2luZm8tPmNvbG9ybWFwWzJdW2ljb2xvcl0gPSAoSlNBTVBMRSkgKChjMnRvdGFsICsgKHRvdGFsPj4xKSkgLyB0b3RhbCk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXNlbGVjdF9jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkX2NvbG9ycykKLS8qIE1hc3RlciByb3V0aW5lIGZvciBjb2xvciBzZWxlY3Rpb24gKi8KLXsKLSAgYm94cHRyIGJveGxpc3Q7Ci0gIGludCBudW1ib3hlczsKLSAgaW50IGk7Ci0KLSAgLyogQWxsb2NhdGUgd29ya3NwYWNlIGZvciBib3ggbGlzdCAqLwotICBib3hsaXN0ID0gKGJveHB0cikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBkZXNpcmVkX2NvbG9ycyAqIFNJWkVPRihib3gpKTsKLSAgLyogSW5pdGlhbGl6ZSBvbmUgYm94IGNvbnRhaW5pbmcgd2hvbGUgc3BhY2UgKi8KLSAgbnVtYm94ZXMgPSAxOwotICBib3hsaXN0WzBdLmMwbWluID0gMDsKLSAgYm94bGlzdFswXS5jMG1heCA9IE1BWEpTQU1QTEUgPj4gQzBfU0hJRlQ7Ci0gIGJveGxpc3RbMF0uYzFtaW4gPSAwOwotICBib3hsaXN0WzBdLmMxbWF4ID0gTUFYSlNBTVBMRSA+PiBDMV9TSElGVDsKLSAgYm94bGlzdFswXS5jMm1pbiA9IDA7Ci0gIGJveGxpc3RbMF0uYzJtYXggPSBNQVhKU0FNUExFID4+IEMyX1NISUZUOwotICAvKiBTaHJpbmsgaXQgdG8gYWN0dWFsbHktdXNlZCB2b2x1bWUgYW5kIHNldCBpdHMgc3RhdGlzdGljcyAqLwotICB1cGRhdGVfYm94KGNpbmZvLCAmIGJveGxpc3RbMF0pOwotICAvKiBQZXJmb3JtIG1lZGlhbi1jdXQgdG8gcHJvZHVjZSBmaW5hbCBib3ggbGlzdCAqLwotICBudW1ib3hlcyA9IG1lZGlhbl9jdXQoY2luZm8sIGJveGxpc3QsIG51bWJveGVzLCBkZXNpcmVkX2NvbG9ycyk7Ci0gIC8qIENvbXB1dGUgdGhlIHJlcHJlc2VudGF0aXZlIGNvbG9yIGZvciBlYWNoIGJveCwgZmlsbCBjb2xvcm1hcCAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtYm94ZXM7IGkrKykKLSAgICBjb21wdXRlX2NvbG9yKGNpbmZvLCAmIGJveGxpc3RbaV0sIGkpOwotICBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMgPSBudW1ib3hlczsKLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfUVVBTlRfU0VMRUNURUQsIG51bWJveGVzKTsKLX0KLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHRoZSB0aW1lLWNyaXRpY2FsIHRhc2sgb2YgbWFwcGluZyBpbnB1dAotICogY29sb3JzIHRvIHRoZSBuZWFyZXN0IGNvbG9yIGluIHRoZSBzZWxlY3RlZCBjb2xvcm1hcC4KLSAqCi0gKiBXZSByZS11c2UgdGhlIGhpc3RvZ3JhbSBzcGFjZSBhcyBhbiAiaW52ZXJzZSBjb2xvciBtYXAiLCBlc3NlbnRpYWxseSBhCi0gKiBjYWNoZSBmb3IgdGhlIHJlc3VsdHMgb2YgbmVhcmVzdC1jb2xvciBzZWFyY2hlcy4gIEFsbCBjb2xvcnMgd2l0aGluIGEKLSAqIGhpc3RvZ3JhbSBjZWxsIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBzYW1lIGNvbG9ybWFwIGVudHJ5LCBuYW1lbHkgdGhlIG9uZQotICogY2xvc2VzdCB0byB0aGUgY2VsbCdzIGNlbnRlci4gIFRoaXMgbWF5IG5vdCBiZSBxdWl0ZSB0aGUgY2xvc2VzdCBlbnRyeSB0bwotICogdGhlIGFjdHVhbCBpbnB1dCBjb2xvciwgYnV0IGl0J3MgYWxtb3N0IGFzIGdvb2QuICBBIHplcm8gaW4gdGhlIGNhY2hlCi0gKiBpbmRpY2F0ZXMgd2UgaGF2ZW4ndCBmb3VuZCB0aGUgbmVhcmVzdCBjb2xvciBmb3IgdGhhdCBjZWxsIHlldDsgdGhlIGFycmF5Ci0gKiBpcyBjbGVhcmVkIHRvIHplcm9lcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG1hcHBpbmcgcGFzcy4gIFdoZW4gd2UgZmluZCB0aGUKLSAqIG5lYXJlc3QgY29sb3IgZm9yIGEgY2VsbCwgaXRzIGNvbG9ybWFwIGluZGV4IHBsdXMgb25lIGlzIHJlY29yZGVkIGluIHRoZQotICogY2FjaGUgZm9yIGZ1dHVyZSB1c2UuICBUaGUgcGFzczIgc2Nhbm5pbmcgcm91dGluZXMgY2FsbCBmaWxsX2ludmVyc2VfY21hcAotICogd2hlbiB0aGV5IG5lZWQgdG8gdXNlIGFuIHVuZmlsbGVkIGVudHJ5IGluIHRoZSBjYWNoZS4KLSAqCi0gKiBPdXIgbWV0aG9kIG9mIGVmZmljaWVudGx5IGZpbmRpbmcgbmVhcmVzdCBjb2xvcnMgaXMgYmFzZWQgb24gdGhlICJsb2NhbGx5Ci0gKiBzb3J0ZWQgc2VhcmNoIiBpZGVhIGRlc2NyaWJlZCBieSBIZWNrYmVydCBhbmQgb24gdGhlIGluY3JlbWVudGFsIGRpc3RhbmNlCi0gKiBjYWxjdWxhdGlvbiBkZXNjcmliZWQgYnkgU3BlbmNlciBXLiBUaG9tYXMgaW4gY2hhcHRlciBJSUkuMSBvZiBHcmFwaGljcwotICogR2VtcyBJSSAoSmFtZXMgQXJ2bywgZWQuICBBY2FkZW1pYyBQcmVzcywgMTk5MSkuICBUaG9tYXMgcG9pbnRzIG91dCB0aGF0Ci0gKiB0aGUgZGlzdGFuY2VzIGZyb20gYSBnaXZlbiBjb2xvcm1hcCBlbnRyeSB0byBlYWNoIGNlbGwgb2YgdGhlIGhpc3RvZ3JhbSBjYW4KLSAqIGJlIGNvbXB1dGVkIHF1aWNrbHkgdXNpbmcgYW4gaW5jcmVtZW50YWwgbWV0aG9kOiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgotICogZGlzdGFuY2VzIHRvIGFkamFjZW50IGNlbGxzIHRoZW1zZWx2ZXMgZGlmZmVyIGJ5IGEgY29uc3RhbnQuICBUaGlzIGFsbG93cyBhCi0gKiBmYWlybHkgZmFzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgImJydXRlIGZvcmNlIiBhcHByb2FjaCBvZiBjb21wdXRpbmcgdGhlCi0gKiBkaXN0YW5jZSBmcm9tIGV2ZXJ5IGNvbG9ybWFwIGVudHJ5IHRvIGV2ZXJ5IGhpc3RvZ3JhbSBjZWxsLiAgVW5mb3J0dW5hdGVseSwKLSAqIGl0IG5lZWRzIGEgd29yayBhcnJheSB0byBob2xkIHRoZSBiZXN0LWRpc3RhbmNlLXNvLWZhciBmb3IgZWFjaCBoaXN0b2dyYW0KLSAqIGNlbGwgKGJlY2F1c2UgdGhlIGlubmVyIGxvb3AgaGFzIHRvIGJlIG92ZXIgY2VsbHMsIG5vdCBjb2xvcm1hcCBlbnRyaWVzKS4KLSAqIFRoZSB3b3JrIGFycmF5IGVsZW1lbnRzIGhhdmUgdG8gYmUgSU5UMzJzLCBzbyB0aGUgd29yayBhcnJheSB3b3VsZCBuZWVkCi0gKiAyNTZLYiBhdCBvdXIgcmVjb21tZW5kZWQgcHJlY2lzaW9uLiAgVGhpcyBpcyBub3QgZmVhc2libGUgaW4gRE9TIG1hY2hpbmVzLgotICoKLSAqIFRvIGdldCBhcm91bmQgdGhlc2UgcHJvYmxlbXMsIHdlIGFwcGx5IFRob21hcycgbWV0aG9kIHRvIGNvbXB1dGUgdGhlCi0gKiBuZWFyZXN0IGNvbG9ycyBmb3Igb25seSB0aGUgY2VsbHMgd2l0aGluIGEgc21hbGwgc3ViYm94IG9mIHRoZSBoaXN0b2dyYW0uCi0gKiBUaGUgd29yayBhcnJheSBuZWVkIGJlIG9ubHkgYXMgYmlnIGFzIHRoZSBzdWJib3gsIHNvIHRoZSBtZW1vcnkgdXNhZ2UKLSAqIHByb2JsZW0gaXMgc29sdmVkLiAgRnVydGhlcm1vcmUsIHdlIG5lZWQgbm90IGZpbGwgc3ViYm94ZXMgdGhhdCBhcmUgbmV2ZXIKLSAqIHJlZmVyZW5jZWQgaW4gcGFzczI7IG1hbnkgaW1hZ2VzIHVzZSBvbmx5IHBhcnQgb2YgdGhlIGNvbG9yIGdhbXV0LCBzbyBhCi0gKiBmYWlyIGFtb3VudCBvZiB3b3JrIGlzIHNhdmVkLiAgQW4gYWRkaXRpb25hbCBhZHZhbnRhZ2Ugb2YgdGhpcwotICogYXBwcm9hY2ggaXMgdGhhdCB3ZSBjYW4gYXBwbHkgSGVja2JlcnQncyBsb2NhbGl0eSBjcml0ZXJpb24gdG8gcXVpY2tseQotICogZWxpbWluYXRlIGNvbG9ybWFwIGVudHJpZXMgdGhhdCBhcmUgZmFyIGF3YXkgZnJvbSB0aGUgc3ViYm94OyB0eXBpY2FsbHkKLSAqIHRocmVlLWZvdXJ0aHMgb2YgdGhlIGNvbG9ybWFwIGVudHJpZXMgYXJlIHJlamVjdGVkIGJ5IEhlY2tiZXJ0J3MgY3JpdGVyaW9uLAotICogYW5kIHdlIG5lZWQgbm90IGNvbXB1dGUgdGhlaXIgZGlzdGFuY2VzIHRvIGluZGl2aWR1YWwgY2VsbHMgaW4gdGhlIHN1YmJveC4KLSAqIFRoZSBzcGVlZCBvZiB0aGlzIGFwcHJvYWNoIGlzIGhlYXZpbHkgaW5mbHVlbmNlZCBieSB0aGUgc3ViYm94IHNpemU6IHRvbwotICogc21hbGwgbWVhbnMgdG9vIG11Y2ggb3ZlcmhlYWQsIHRvbyBiaWcgbG9zZXMgYmVjYXVzZSBIZWNrYmVydCdzIGNyaXRlcmlvbgotICogY2FuJ3QgZWxpbWluYXRlIGFzIG1hbnkgY29sb3JtYXAgZW50cmllcy4gIEVtcGlyaWNhbGx5IHRoZSBiZXN0IHN1YmJveAotICogc2l6ZSBzZWVtcyB0byBiZSBhYm91dCAxLzUxMnRoIG9mIHRoZSBoaXN0b2dyYW0gKDEvOHRoIGluIGVhY2ggZGlyZWN0aW9uKS4KLSAqCi0gKiBUaG9tYXMnIGFydGljbGUgYWxzbyBkZXNjcmliZXMgYSByZWZpbmVkIG1ldGhvZCB3aGljaCBpcyBhc3ltcHRvdGljYWxseQotICogZmFzdGVyIHRoYW4gdGhlIGJydXRlLWZvcmNlIG1ldGhvZCwgYnV0IGl0IGlzIGFsc28gZmFyIG1vcmUgY29tcGxleCBhbmQKLSAqIGNhbm5vdCBlZmZpY2llbnRseSBiZSBhcHBsaWVkIHRvIHNtYWxsIHN1YmJveGVzLiAgSXQgaXMgdGhlcmVmb3JlIG5vdAotICogdXNlZnVsIGZvciBwcm9ncmFtcyBpbnRlbmRlZCB0byBiZSBwb3J0YWJsZSB0byBET1MgbWFjaGluZXMuICBPbiBtYWNoaW5lcwotICogd2l0aCBwbGVudHkgb2YgbWVtb3J5LCBmaWxsaW5nIHRoZSB3aG9sZSBoaXN0b2dyYW0gaW4gb25lIHNob3Qgd2l0aCBUaG9tYXMnCi0gKiByZWZpbmVkIG1ldGhvZCBtaWdodCBiZSBmYXN0ZXIgdGhhbiB0aGUgcHJlc2VudCBjb2RlIC0tLSBidXQgdGhlbiBhZ2FpbiwKLSAqIGl0IG1pZ2h0IG5vdCBiZSBhbnkgZmFzdGVyLCBhbmQgaXQncyBjZXJ0YWlubHkgbW9yZSBjb21wbGljYXRlZC4KLSAqLwotCi0KLS8qIGxvZzIoaGlzdG9ncmFtIGNlbGxzIGluIHVwZGF0ZSBib3gpIGZvciBlYWNoIGF4aXM7IHRoaXMgY2FuIGJlIGFkanVzdGVkICovCi0jZGVmaW5lIEJPWF9DMF9MT0cgIChISVNUX0MwX0JJVFMtMykKLSNkZWZpbmUgQk9YX0MxX0xPRyAgKEhJU1RfQzFfQklUUy0zKQotI2RlZmluZSBCT1hfQzJfTE9HICAoSElTVF9DMl9CSVRTLTMpCi0KLSNkZWZpbmUgQk9YX0MwX0VMRU1TICAoMTw8Qk9YX0MwX0xPRykgLyogIyBvZiBoaXN0IGNlbGxzIGluIHVwZGF0ZSBib3ggKi8KLSNkZWZpbmUgQk9YX0MxX0VMRU1TICAoMTw8Qk9YX0MxX0xPRykKLSNkZWZpbmUgQk9YX0MyX0VMRU1TICAoMTw8Qk9YX0MyX0xPRykKLQotI2RlZmluZSBCT1hfQzBfU0hJRlQgIChDMF9TSElGVCArIEJPWF9DMF9MT0cpCi0jZGVmaW5lIEJPWF9DMV9TSElGVCAgKEMxX1NISUZUICsgQk9YX0MxX0xPRykKLSNkZWZpbmUgQk9YX0MyX1NISUZUICAoQzJfU0hJRlQgKyBCT1hfQzJfTE9HKQotCi0KLS8qCi0gKiBUaGUgbmV4dCB0aHJlZSByb3V0aW5lcyBpbXBsZW1lbnQgaW52ZXJzZSBjb2xvcm1hcCBmaWxsaW5nLiAgVGhleSBjb3VsZAotICogYWxsIGJlIGZvbGRlZCBpbnRvIG9uZSBiaWcgcm91dGluZSwgYnV0IHNwbGl0dGluZyB0aGVtIHVwIHRoaXMgd2F5IHNhdmVzCi0gKiBzb21lIHN0YWNrIHNwYWNlICh0aGUgbWluZGlzdFtdIGFuZCBiZXN0ZGlzdFtdIGFycmF5cyBuZWVkIG5vdCBjb2V4aXN0KQotICogYW5kIG1heSBhbGxvdyBzb21lIGNvbXBpbGVycyB0byBwcm9kdWNlIGJldHRlciBjb2RlIGJ5IHJlZ2lzdGVyaXppbmcgbW9yZQotICogaW5uZXItbG9vcCB2YXJpYWJsZXMuCi0gKi8KLQotTE9DQUwoaW50KQotZmluZF9uZWFyYnlfY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWluYzAsIGludCBtaW5jMSwgaW50IG1pbmMyLAotCQkgICAgSlNBTVBMRSBjb2xvcmxpc3RbXSkKLS8qIExvY2F0ZSB0aGUgY29sb3JtYXAgZW50cmllcyBjbG9zZSBlbm91Z2ggdG8gYW4gdXBkYXRlIGJveCB0byBiZSBjYW5kaWRhdGVzCi0gKiBmb3IgdGhlIG5lYXJlc3QgZW50cnkgdG8gc29tZSBjZWxsKHMpIGluIHRoZSB1cGRhdGUgYm94LiAgVGhlIHVwZGF0ZSBib3gKLSAqIGlzIHNwZWNpZmllZCBieSB0aGUgY2VudGVyIGNvb3JkaW5hdGVzIG9mIGl0cyBmaXJzdCBjZWxsLiAgVGhlIG51bWJlciBvZgotICogY2FuZGlkYXRlIGNvbG9ybWFwIGVudHJpZXMgaXMgcmV0dXJuZWQsIGFuZCB0aGVpciBjb2xvcm1hcCBpbmRleGVzIGFyZQotICogcGxhY2VkIGluIGNvbG9ybGlzdFtdLgotICogVGhpcyByb3V0aW5lIHVzZXMgSGVja2JlcnQncyAibG9jYWxseSBzb3J0ZWQgc2VhcmNoIiBjcml0ZXJpb24gdG8gc2VsZWN0Ci0gKiB0aGUgY29sb3JzIHRoYXQgbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24uCi0gKi8KLXsKLSAgaW50IG51bWNvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKLSAgaW50IG1heGMwLCBtYXhjMSwgbWF4YzI7Ci0gIGludCBjZW50ZXJjMCwgY2VudGVyYzEsIGNlbnRlcmMyOwotICBpbnQgaSwgeCwgbmNvbG9yczsKLSAgSU5UMzIgbWlubWF4ZGlzdCwgbWluX2Rpc3QsIG1heF9kaXN0LCB0ZGlzdDsKLSAgSU5UMzIgbWluZGlzdFtNQVhOVU1DT0xPUlNdOwkvKiBtaW4gZGlzdGFuY2UgdG8gY29sb3JtYXAgZW50cnkgaSAqLwotCi0gIC8qIENvbXB1dGUgdHJ1ZSBjb29yZGluYXRlcyBvZiB1cGRhdGUgYm94J3MgdXBwZXIgY29ybmVyIGFuZCBjZW50ZXIuCi0gICAqIEFjdHVhbGx5IHdlIGNvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHVwcGVyLWNvcm5lcgotICAgKiBoaXN0b2dyYW0gY2VsbCwgd2hpY2ggYXJlIHRoZSB1cHBlciBib3VuZHMgb2YgdGhlIHZvbHVtZSB3ZSBjYXJlIGFib3V0LgotICAgKiBOb3RlIHRoYXQgc2luY2UgIj4+IiByb3VuZHMgZG93biwgdGhlICJjZW50ZXIiIHZhbHVlcyBtYXkgYmUgY2xvc2VyIHRvCi0gICAqIG1pbiB0aGFuIHRvIG1heDsgaGVuY2UgY29tcGFyaXNvbnMgdG8gdGhlbSBtdXN0IGJlICI8PSIsIG5vdCAiPCIuCi0gICAqLwotICBtYXhjMCA9IG1pbmMwICsgKCgxIDw8IEJPWF9DMF9TSElGVCkgLSAoMSA8PCBDMF9TSElGVCkpOwotICBjZW50ZXJjMCA9IChtaW5jMCArIG1heGMwKSA+PiAxOwotICBtYXhjMSA9IG1pbmMxICsgKCgxIDw8IEJPWF9DMV9TSElGVCkgLSAoMSA8PCBDMV9TSElGVCkpOwotICBjZW50ZXJjMSA9IChtaW5jMSArIG1heGMxKSA+PiAxOwotICBtYXhjMiA9IG1pbmMyICsgKCgxIDw8IEJPWF9DMl9TSElGVCkgLSAoMSA8PCBDMl9TSElGVCkpOwotICBjZW50ZXJjMiA9IChtaW5jMiArIG1heGMyKSA+PiAxOwotCi0gIC8qIEZvciBlYWNoIGNvbG9yIGluIGNvbG9ybWFwLCBmaW5kOgotICAgKiAgMS4gaXRzIG1pbmltdW0gc3F1YXJlZC1kaXN0YW5jZSB0byBhbnkgcG9pbnQgaW4gdGhlIHVwZGF0ZSBib3gKLSAgICogICAgICh6ZXJvIGlmIGNvbG9yIGlzIHdpdGhpbiB1cGRhdGUgYm94KTsKLSAgICogIDIuIGl0cyBtYXhpbXVtIHNxdWFyZWQtZGlzdGFuY2UgdG8gYW55IHBvaW50IGluIHRoZSB1cGRhdGUgYm94LgotICAgKiBCb3RoIG9mIHRoZXNlIGNhbiBiZSBmb3VuZCBieSBjb25zaWRlcmluZyBvbmx5IHRoZSBjb3JuZXJzIG9mIHRoZSBib3guCi0gICAqIFdlIHNhdmUgdGhlIG1pbmltdW0gZGlzdGFuY2UgZm9yIGVhY2ggY29sb3IgaW4gbWluZGlzdFtdOwotICAgKiBvbmx5IHRoZSBzbWFsbGVzdCBtYXhpbXVtIGRpc3RhbmNlIGlzIG9mIGludGVyZXN0LgotICAgKi8KLSAgbWlubWF4ZGlzdCA9IDB4N0ZGRkZGRkZMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgewotICAgIC8qIFdlIGNvbXB1dGUgdGhlIHNxdWFyZWQtYzAtZGlzdGFuY2UgdGVybSwgdGhlbiBhZGQgaW4gdGhlIG90aGVyIHR3by4gKi8KLSAgICB4ID0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMF1baV0pOwotICAgIGlmICh4IDwgbWluYzApIHsKLSAgICAgIHRkaXN0ID0gKHggLSBtaW5jMCkgKiBDMF9TQ0FMRTsKLSAgICAgIG1pbl9kaXN0ID0gdGRpc3QqdGRpc3Q7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWF4YzApICogQzBfU0NBTEU7Ci0gICAgICBtYXhfZGlzdCA9IHRkaXN0KnRkaXN0OwotICAgIH0gZWxzZSBpZiAoeCA+IG1heGMwKSB7Ci0gICAgICB0ZGlzdCA9ICh4IC0gbWF4YzApICogQzBfU0NBTEU7Ci0gICAgICBtaW5fZGlzdCA9IHRkaXN0KnRkaXN0OwotICAgICAgdGRpc3QgPSAoeCAtIG1pbmMwKSAqIEMwX1NDQUxFOwotICAgICAgbWF4X2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKLSAgICB9IGVsc2UgewotICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCi0gICAgICBtaW5fZGlzdCA9IDA7Ci0gICAgICBpZiAoeCA8PSBjZW50ZXJjMCkgewotCXRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKLQltYXhfZGlzdCA9IHRkaXN0KnRkaXN0OwotICAgICAgfSBlbHNlIHsKLQl0ZGlzdCA9ICh4IC0gbWluYzApICogQzBfU0NBTEU7Ci0JbWF4X2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB4ID0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMV1baV0pOwotICAgIGlmICh4IDwgbWluYzEpIHsKLSAgICAgIHRkaXN0ID0gKHggLSBtaW5jMSkgKiBDMV9TQ0FMRTsKLSAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OwotICAgICAgdGRpc3QgPSAoeCAtIG1heGMxKSAqIEMxX1NDQUxFOwotICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgfSBlbHNlIGlmICh4ID4gbWF4YzEpIHsKLSAgICAgIHRkaXN0ID0gKHggLSBtYXhjMSkgKiBDMV9TQ0FMRTsKLSAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OwotICAgICAgdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOwotICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHdpdGhpbiBjZWxsIHJhbmdlIHNvIG5vIGNvbnRyaWJ1dGlvbiB0byBtaW5fZGlzdCAqLwotICAgICAgaWYgKHggPD0gY2VudGVyYzEpIHsKLQl0ZGlzdCA9ICh4IC0gbWF4YzEpICogQzFfU0NBTEU7Ci0JbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgICB9IGVsc2UgewotCXRkaXN0ID0gKHggLSBtaW5jMSkgKiBDMV9TQ0FMRTsKLQltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB4ID0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMl1baV0pOwotICAgIGlmICh4IDwgbWluYzIpIHsKLSAgICAgIHRkaXN0ID0gKHggLSBtaW5jMikgKiBDMl9TQ0FMRTsKLSAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OwotICAgICAgdGRpc3QgPSAoeCAtIG1heGMyKSAqIEMyX1NDQUxFOwotICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgfSBlbHNlIGlmICh4ID4gbWF4YzIpIHsKLSAgICAgIHRkaXN0ID0gKHggLSBtYXhjMikgKiBDMl9TQ0FMRTsKLSAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OwotICAgICAgdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOwotICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHdpdGhpbiBjZWxsIHJhbmdlIHNvIG5vIGNvbnRyaWJ1dGlvbiB0byBtaW5fZGlzdCAqLwotICAgICAgaWYgKHggPD0gY2VudGVyYzIpIHsKLQl0ZGlzdCA9ICh4IC0gbWF4YzIpICogQzJfU0NBTEU7Ci0JbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7Ci0gICAgICB9IGVsc2UgewotCXRkaXN0ID0gKHggLSBtaW5jMikgKiBDMl9TQ0FMRTsKLQltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBtaW5kaXN0W2ldID0gbWluX2Rpc3Q7CS8qIHNhdmUgYXdheSB0aGUgcmVzdWx0cyAqLwotICAgIGlmIChtYXhfZGlzdCA8IG1pbm1heGRpc3QpCi0gICAgICBtaW5tYXhkaXN0ID0gbWF4X2Rpc3Q7Ci0gIH0KLQotICAvKiBOb3cgd2Uga25vdyB0aGF0IG5vIGNlbGwgaW4gdGhlIHVwZGF0ZSBib3ggaXMgbW9yZSB0aGFuIG1pbm1heGRpc3QKLSAgICogYXdheSBmcm9tIHNvbWUgY29sb3JtYXAgZW50cnkuICBUaGVyZWZvcmUsIG9ubHkgY29sb3JzIHRoYXQgYXJlCi0gICAqIHdpdGhpbiBtaW5tYXhkaXN0IG9mIHNvbWUgcGFydCBvZiB0aGUgYm94IG5lZWQgYmUgY29uc2lkZXJlZC4KLSAgICovCi0gIG5jb2xvcnMgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtY29sb3JzOyBpKyspIHsKLSAgICBpZiAobWluZGlzdFtpXSA8PSBtaW5tYXhkaXN0KQotICAgICAgY29sb3JsaXN0W25jb2xvcnMrK10gPSAoSlNBTVBMRSkgaTsKLSAgfQotICByZXR1cm4gbmNvbG9yczsKLX0KLQotCi1MT0NBTCh2b2lkKQotZmluZF9iZXN0X2NvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1pbmMwLCBpbnQgbWluYzEsIGludCBtaW5jMiwKLQkJICBpbnQgbnVtY29sb3JzLCBKU0FNUExFIGNvbG9ybGlzdFtdLCBKU0FNUExFIGJlc3Rjb2xvcltdKQotLyogRmluZCB0aGUgY2xvc2VzdCBjb2xvcm1hcCBlbnRyeSBmb3IgZWFjaCBjZWxsIGluIHRoZSB1cGRhdGUgYm94LAotICogZ2l2ZW4gdGhlIGxpc3Qgb2YgY2FuZGlkYXRlIGNvbG9ycyBwcmVwYXJlZCBieSBmaW5kX25lYXJieV9jb2xvcnMuCi0gKiBSZXR1cm4gdGhlIGluZGV4ZXMgb2YgdGhlIGNsb3Nlc3QgZW50cmllcyBpbiB0aGUgYmVzdGNvbG9yW10gYXJyYXkuCi0gKiBUaGlzIHJvdXRpbmUgdXNlcyBUaG9tYXMnIGluY3JlbWVudGFsIGRpc3RhbmNlIGNhbGN1bGF0aW9uIG1ldGhvZCB0bwotICogZmluZCB0aGUgZGlzdGFuY2UgZnJvbSBhIGNvbG9ybWFwIGVudHJ5IHRvIHN1Y2Nlc3NpdmUgY2VsbHMgaW4gdGhlIGJveC4KLSAqLwotewotICBpbnQgaWMwLCBpYzEsIGljMjsKLSAgaW50IGksIGljb2xvcjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBicHRyOwkvKiBwb2ludGVyIGludG8gYmVzdGRpc3RbXSBhcnJheSAqLwotICBKU0FNUExFICogY3B0cjsJCS8qIHBvaW50ZXIgaW50byBiZXN0Y29sb3JbXSBhcnJheSAqLwotICBJTlQzMiBkaXN0MCwgZGlzdDE7CQkvKiBpbml0aWFsIGRpc3RhbmNlIHZhbHVlcyAqLwotICByZWdpc3RlciBJTlQzMiBkaXN0MjsJCS8qIGN1cnJlbnQgZGlzdGFuY2UgaW4gaW5uZXIgbG9vcCAqLwotICBJTlQzMiB4eDAsIHh4MTsJCS8qIGRpc3RhbmNlIGluY3JlbWVudHMgKi8KLSAgcmVnaXN0ZXIgSU5UMzIgeHgyOwotICBJTlQzMiBpbmMwLCBpbmMxLCBpbmMyOwkvKiBpbml0aWFsIHZhbHVlcyBmb3IgaW5jcmVtZW50cyAqLwotICAvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBkaXN0YW5jZSB0byB0aGUgbmVhcmVzdC1zby1mYXIgY29sb3IgZm9yIGVhY2ggY2VsbCAqLwotICBJTlQzMiBiZXN0ZGlzdFtCT1hfQzBfRUxFTVMgKiBCT1hfQzFfRUxFTVMgKiBCT1hfQzJfRUxFTVNdOwotCi0gIC8qIEluaXRpYWxpemUgYmVzdC1kaXN0YW5jZSBmb3IgZWFjaCBjZWxsIG9mIHRoZSB1cGRhdGUgYm94ICovCi0gIGJwdHIgPSBiZXN0ZGlzdDsKLSAgZm9yIChpID0gQk9YX0MwX0VMRU1TKkJPWF9DMV9FTEVNUypCT1hfQzJfRUxFTVMtMTsgaSA+PSAwOyBpLS0pCi0gICAgKmJwdHIrKyA9IDB4N0ZGRkZGRkZMOwotICAKLSAgLyogRm9yIGVhY2ggY29sb3Igc2VsZWN0ZWQgYnkgZmluZF9uZWFyYnlfY29sb3JzLAotICAgKiBjb21wdXRlIGl0cyBkaXN0YW5jZSB0byB0aGUgY2VudGVyIG9mIGVhY2ggY2VsbCBpbiB0aGUgYm94LgotICAgKiBJZiB0aGF0J3MgbGVzcyB0aGFuIGJlc3Qtc28tZmFyLCB1cGRhdGUgYmVzdCBkaXN0YW5jZSBhbmQgY29sb3IgbnVtYmVyLgotICAgKi8KLSAgCi0gIC8qIE5vbWluYWwgc3RlcHMgYmV0d2VlbiBjZWxsIGNlbnRlcnMgKCJ4IiBpbiBUaG9tYXMgYXJ0aWNsZSkgKi8KLSNkZWZpbmUgU1RFUF9DMCAgKCgxIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFKQotI2RlZmluZSBTVEVQX0MxICAoKDEgPDwgQzFfU0hJRlQpICogQzFfU0NBTEUpCi0jZGVmaW5lIFNURVBfQzIgICgoMSA8PCBDMl9TSElGVCkgKiBDMl9TQ0FMRSkKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgewotICAgIGljb2xvciA9IEdFVEpTQU1QTEUoY29sb3JsaXN0W2ldKTsKLSAgICAvKiBDb21wdXRlIChzcXVhcmUgb2YpIGRpc3RhbmNlIGZyb20gbWluYzAvYzEvYzIgdG8gdGhpcyBjb2xvciAqLwotICAgIGluYzAgPSAobWluYzAgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpY29sb3JdKSkgKiBDMF9TQ0FMRTsKLSAgICBkaXN0MCA9IGluYzAqaW5jMDsKLSAgICBpbmMxID0gKG1pbmMxIC0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMV1baWNvbG9yXSkpICogQzFfU0NBTEU7Ci0gICAgZGlzdDAgKz0gaW5jMSppbmMxOwotICAgIGluYzIgPSAobWluYzIgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpY29sb3JdKSkgKiBDMl9TQ0FMRTsKLSAgICBkaXN0MCArPSBpbmMyKmluYzI7Ci0gICAgLyogRm9ybSB0aGUgaW5pdGlhbCBkaWZmZXJlbmNlIGluY3JlbWVudHMgKi8KLSAgICBpbmMwID0gaW5jMCAqICgyICogU1RFUF9DMCkgKyBTVEVQX0MwICogU1RFUF9DMDsKLSAgICBpbmMxID0gaW5jMSAqICgyICogU1RFUF9DMSkgKyBTVEVQX0MxICogU1RFUF9DMTsKLSAgICBpbmMyID0gaW5jMiAqICgyICogU1RFUF9DMikgKyBTVEVQX0MyICogU1RFUF9DMjsKLSAgICAvKiBOb3cgbG9vcCBvdmVyIGFsbCBjZWxscyBpbiBib3gsIHVwZGF0aW5nIGRpc3RhbmNlIHBlciBUaG9tYXMgbWV0aG9kICovCi0gICAgYnB0ciA9IGJlc3RkaXN0OwotICAgIGNwdHIgPSBiZXN0Y29sb3I7Ci0gICAgeHgwID0gaW5jMDsKLSAgICBmb3IgKGljMCA9IEJPWF9DMF9FTEVNUy0xOyBpYzAgPj0gMDsgaWMwLS0pIHsKLSAgICAgIGRpc3QxID0gZGlzdDA7Ci0gICAgICB4eDEgPSBpbmMxOwotICAgICAgZm9yIChpYzEgPSBCT1hfQzFfRUxFTVMtMTsgaWMxID49IDA7IGljMS0tKSB7Ci0JZGlzdDIgPSBkaXN0MTsKLQl4eDIgPSBpbmMyOwotCWZvciAoaWMyID0gQk9YX0MyX0VMRU1TLTE7IGljMiA+PSAwOyBpYzItLSkgewotCSAgaWYgKGRpc3QyIDwgKmJwdHIpIHsKLQkgICAgKmJwdHIgPSBkaXN0MjsKLQkgICAgKmNwdHIgPSAoSlNBTVBMRSkgaWNvbG9yOwotCSAgfQotCSAgZGlzdDIgKz0geHgyOwotCSAgeHgyICs9IDIgKiBTVEVQX0MyICogU1RFUF9DMjsKLQkgIGJwdHIrKzsKLQkgIGNwdHIrKzsKLQl9Ci0JZGlzdDEgKz0geHgxOwotCXh4MSArPSAyICogU1RFUF9DMSAqIFNURVBfQzE7Ci0gICAgICB9Ci0gICAgICBkaXN0MCArPSB4eDA7Ci0gICAgICB4eDAgKz0gMiAqIFNURVBfQzAgKiBTVEVQX0MwOwotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1maWxsX2ludmVyc2VfY21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGMwLCBpbnQgYzEsIGludCBjMikKLS8qIEZpbGwgdGhlIGludmVyc2UtY29sb3JtYXAgZW50cmllcyBpbiB0aGUgdXBkYXRlIGJveCB0aGF0IGNvbnRhaW5zICovCi0vKiBoaXN0b2dyYW0gY2VsbCBjMC9jMS9jMi4gIChPbmx5IHRoYXQgb25lIGNlbGwgTVVTVCBiZSBmaWxsZWQsIGJ1dCAqLwotLyogd2UgY2FuIGZpbGwgYXMgbWFueSBvdGhlcnMgYXMgd2Ugd2lzaC4pICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKLSAgaW50IG1pbmMwLCBtaW5jMSwgbWluYzI7CS8qIGxvd2VyIGxlZnQgY29ybmVyIG9mIHVwZGF0ZSBib3ggKi8KLSAgaW50IGljMCwgaWMxLCBpYzI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKiBjcHRyOwkvKiBwb2ludGVyIGludG8gYmVzdGNvbG9yW10gYXJyYXkgKi8KLSAgcmVnaXN0ZXIgaGlzdHB0ciBjYWNoZXA7CS8qIHBvaW50ZXIgaW50byBtYWluIGNhY2hlIGFycmF5ICovCi0gIC8qIFRoaXMgYXJyYXkgbGlzdHMgdGhlIGNhbmRpZGF0ZSBjb2xvcm1hcCBpbmRleGVzLiAqLwotICBKU0FNUExFIGNvbG9ybGlzdFtNQVhOVU1DT0xPUlNdOwotICBpbnQgbnVtY29sb3JzOwkJLyogbnVtYmVyIG9mIGNhbmRpZGF0ZSBjb2xvcnMgKi8KLSAgLyogVGhpcyBhcnJheSBob2xkcyB0aGUgYWN0dWFsbHkgY2xvc2VzdCBjb2xvcm1hcCBpbmRleCBmb3IgZWFjaCBjZWxsLiAqLwotICBKU0FNUExFIGJlc3Rjb2xvcltCT1hfQzBfRUxFTVMgKiBCT1hfQzFfRUxFTVMgKiBCT1hfQzJfRUxFTVNdOwotCi0gIC8qIENvbnZlcnQgY2VsbCBjb29yZGluYXRlcyB0byB1cGRhdGUgYm94IElEICovCi0gIGMwID4+PSBCT1hfQzBfTE9HOwotICBjMSA+Pj0gQk9YX0MxX0xPRzsKLSAgYzIgPj49IEJPWF9DMl9MT0c7Ci0KLSAgLyogQ29tcHV0ZSB0cnVlIGNvb3JkaW5hdGVzIG9mIHVwZGF0ZSBib3gncyBvcmlnaW4gY29ybmVyLgotICAgKiBBY3R1YWxseSB3ZSBjb21wdXRlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSBjb3JuZXIKLSAgICogaGlzdG9ncmFtIGNlbGwsIHdoaWNoIGFyZSB0aGUgbG93ZXIgYm91bmRzIG9mIHRoZSB2b2x1bWUgd2UgY2FyZSBhYm91dC4KLSAgICovCi0gIG1pbmMwID0gKGMwIDw8IEJPWF9DMF9TSElGVCkgKyAoKDEgPDwgQzBfU0hJRlQpID4+IDEpOwotICBtaW5jMSA9IChjMSA8PCBCT1hfQzFfU0hJRlQpICsgKCgxIDw8IEMxX1NISUZUKSA+PiAxKTsKLSAgbWluYzIgPSAoYzIgPDwgQk9YX0MyX1NISUZUKSArICgoMSA8PCBDMl9TSElGVCkgPj4gMSk7Ci0gIAotICAvKiBEZXRlcm1pbmUgd2hpY2ggY29sb3JtYXAgZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIGJlIGNhbmRpZGF0ZXMKLSAgICogZm9yIHRoZSBuZWFyZXN0IGVudHJ5IHRvIHNvbWUgY2VsbCBpbiB0aGUgdXBkYXRlIGJveC4KLSAgICovCi0gIG51bWNvbG9ycyA9IGZpbmRfbmVhcmJ5X2NvbG9ycyhjaW5mbywgbWluYzAsIG1pbmMxLCBtaW5jMiwgY29sb3JsaXN0KTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbGx5IG5lYXJlc3QgY29sb3JzLiAqLwotICBmaW5kX2Jlc3RfY29sb3JzKGNpbmZvLCBtaW5jMCwgbWluYzEsIG1pbmMyLCBudW1jb2xvcnMsIGNvbG9ybGlzdCwKLQkJICAgYmVzdGNvbG9yKTsKLQotICAvKiBTYXZlIHRoZSBiZXN0IGNvbG9yIG51bWJlcnMgKHBsdXMgMSkgaW4gdGhlIG1haW4gY2FjaGUgYXJyYXkgKi8KLSAgYzAgPDw9IEJPWF9DMF9MT0c7CQkvKiBjb252ZXJ0IElEIGJhY2sgdG8gYmFzZSBjZWxsIGluZGV4ZXMgKi8KLSAgYzEgPDw9IEJPWF9DMV9MT0c7Ci0gIGMyIDw8PSBCT1hfQzJfTE9HOwotICBjcHRyID0gYmVzdGNvbG9yOwotICBmb3IgKGljMCA9IDA7IGljMCA8IEJPWF9DMF9FTEVNUzsgaWMwKyspIHsKLSAgICBmb3IgKGljMSA9IDA7IGljMSA8IEJPWF9DMV9FTEVNUzsgaWMxKyspIHsKLSAgICAgIGNhY2hlcCA9ICYgaGlzdG9ncmFtW2MwK2ljMF1bYzEraWMxXVtjMl07Ci0gICAgICBmb3IgKGljMiA9IDA7IGljMiA8IEJPWF9DMl9FTEVNUzsgaWMyKyspIHsKLQkqY2FjaGVwKysgPSAoaGlzdGNlbGwpIChHRVRKU0FNUExFKCpjcHRyKyspICsgMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIE1hcCBzb21lIHJvd3Mgb2YgcGl4ZWxzIHRvIHRoZSBvdXRwdXQgY29sb3JtYXBwZWQgcmVwcmVzZW50YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wYXNzMl9ub19kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0vKiBUaGlzIHZlcnNpb24gcGVyZm9ybXMgbm8gZGl0aGVyaW5nICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgaGlzdHB0ciBjYWNoZXA7Ci0gIHJlZ2lzdGVyIGludCBjMCwgYzEsIGMyOwotICBpbnQgcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICBpbnB0ciA9IGlucHV0X2J1Zltyb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9idWZbcm93XTsKLSAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgLyogZ2V0IHBpeGVsIHZhbHVlIGFuZCBpbmRleCBpbnRvIHRoZSBjYWNoZSAqLwotICAgICAgYzAgPSBHRVRKU0FNUExFKCppbnB0cisrKSA+PiBDMF9TSElGVDsKLSAgICAgIGMxID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgPj4gQzFfU0hJRlQ7Ci0gICAgICBjMiA9IEdFVEpTQU1QTEUoKmlucHRyKyspID4+IEMyX1NISUZUOwotICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMl07Ci0gICAgICAvKiBJZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgY29sb3IgYmVmb3JlLCBmaW5kIG5lYXJlc3QgY29sb3JtYXAgZW50cnkgKi8KLSAgICAgIC8qIGFuZCB1cGRhdGUgdGhlIGNhY2hlICovCi0gICAgICBpZiAoKmNhY2hlcCA9PSAwKQotCWZpbGxfaW52ZXJzZV9jbWFwKGNpbmZvLCBjMCxjMSxjMik7Ci0gICAgICAvKiBOb3cgZW1pdCB0aGUgY29sb3JtYXAgaW5kZXggZm9yIHRoaXMgY2VsbCAqLwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgqY2FjaGVwIC0gMSk7Ci0gICAgfQotICB9Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1wYXNzMl9mc19kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi0vKiBUaGlzIHZlcnNpb24gcGVyZm9ybXMgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLwotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07Ci0gIHJlZ2lzdGVyIExPQ0ZTRVJST1IgY3VyMCwgY3VyMSwgY3VyMjsJLyogY3VycmVudCBlcnJvciBvciBwaXhlbCB2YWx1ZSAqLwotICBMT0NGU0VSUk9SIGJlbG93ZXJyMCwgYmVsb3dlcnIxLCBiZWxvd2VycjI7IC8qIGVycm9yIGZvciBwaXhlbCBiZWxvdyBjdXIgKi8KLSAgTE9DRlNFUlJPUiBicHJldmVycjAsIGJwcmV2ZXJyMSwgYnByZXZlcnIyOyAvKiBlcnJvciBmb3IgYmVsb3cvcHJldiBjb2wgKi8KLSAgcmVnaXN0ZXIgRlNFUlJQVFIgZXJyb3JwdHI7CS8qID0+IGZzZXJyb3JzW10gYXQgY29sdW1uIGJlZm9yZSBjdXJyZW50ICovCi0gIEpTQU1QUk9XIGlucHRyOwkJLyogPT4gY3VycmVudCBpbnB1dCBwaXhlbCAqLwotICBKU0FNUFJPVyBvdXRwdHI7CQkvKiA9PiBjdXJyZW50IG91dHB1dCBwaXhlbCAqLwotICBoaXN0cHRyIGNhY2hlcDsKLSAgaW50IGRpcjsJCQkvKiArMSBvciAtMSBkZXBlbmRpbmcgb24gZGlyZWN0aW9uICovCi0gIGludCBkaXIzOwkJCS8qIDMqZGlyLCBmb3IgYWR2YW5jaW5nIGlucHRyICYgZXJyb3JwdHIgKi8KLSAgaW50IHJvdzsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqZXJyb3JfbGltaXQgPSBjcXVhbnRpemUtPmVycm9yX2xpbWl0ZXI7Ci0gIEpTQU1QUk9XIGNvbG9ybWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgSlNBTVBST1cgY29sb3JtYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOwotICBKU0FNUFJPVyBjb2xvcm1hcDIgPSBjaW5mby0+Y29sb3JtYXBbMl07Ci0gIFNISUZUX1RFTVBTCi0KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICBpbnB0ciA9IGlucHV0X2J1Zltyb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9idWZbcm93XTsKLSAgICBpZiAoY3F1YW50aXplLT5vbl9vZGRfcm93KSB7Ci0gICAgICAvKiB3b3JrIHJpZ2h0IHRvIGxlZnQgaW4gdGhpcyByb3cgKi8KLSAgICAgIGlucHRyICs9ICh3aWR0aC0xKSAqIDM7CS8qIHNvIHBvaW50IHRvIHJpZ2h0bW9zdCBwaXhlbCAqLwotICAgICAgb3V0cHRyICs9IHdpZHRoLTE7Ci0gICAgICBkaXIgPSAtMTsKLSAgICAgIGRpcjMgPSAtMzsKLSAgICAgIGVycm9ycHRyID0gY3F1YW50aXplLT5mc2Vycm9ycyArICh3aWR0aCsxKSozOyAvKiA9PiBlbnRyeSBhZnRlciBsYXN0IGNvbHVtbiAqLwotICAgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7IC8qIGZsaXAgZm9yIG5leHQgdGltZSAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiB3b3JrIGxlZnQgdG8gcmlnaHQgaW4gdGhpcyByb3cgKi8KLSAgICAgIGRpciA9IDE7Ci0gICAgICBkaXIzID0gMzsKLSAgICAgIGVycm9ycHRyID0gY3F1YW50aXplLT5mc2Vycm9yczsgLyogPT4gZW50cnkgYmVmb3JlIGZpcnN0IHJlYWwgY29sdW1uICovCi0gICAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBUUlVFOyAvKiBmbGlwIGZvciBuZXh0IHRpbWUgKi8KLSAgICB9Ci0gICAgLyogUHJlc2V0IGVycm9yIHZhbHVlczogbm8gZXJyb3IgcHJvcGFnYXRlZCB0byBmaXJzdCBwaXhlbCBmcm9tIGxlZnQgKi8KLSAgICBjdXIwID0gY3VyMSA9IGN1cjIgPSAwOwotICAgIC8qIGFuZCBubyBlcnJvciBwcm9wYWdhdGVkIHRvIHJvdyBiZWxvdyB5ZXQgKi8KLSAgICBiZWxvd2VycjAgPSBiZWxvd2VycjEgPSBiZWxvd2VycjIgPSAwOwotICAgIGJwcmV2ZXJyMCA9IGJwcmV2ZXJyMSA9IGJwcmV2ZXJyMiA9IDA7Ci0KLSAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICAgLyogY3VyTiBob2xkcyB0aGUgZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBwaXhlbCBvbiB0aGUKLSAgICAgICAqIGN1cnJlbnQgbGluZS4gIEFkZCB0aGUgZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lCi0gICAgICAgKiB0byBmb3JtIHRoZSBjb21wbGV0ZSBlcnJvciBjb3JyZWN0aW9uIHRlcm0gZm9yIHRoaXMgcGl4ZWwsIGFuZAotICAgICAgICogcm91bmQgdGhlIGVycm9yIHRlcm0gKHdoaWNoIGlzIGV4cHJlc3NlZCAqIDE2KSB0byBhbiBpbnRlZ2VyLgotICAgICAgICogUklHSFRfU0hJRlQgcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHksIHNvIGFkZGluZyA4IGlzIGNvcnJlY3QKLSAgICAgICAqIGZvciBlaXRoZXIgc2lnbiBvZiB0aGUgZXJyb3IgdmFsdWUuCi0gICAgICAgKiBOb3RlOiBlcnJvcnB0ciBwb2ludHMgdG8gKnByZXZpb3VzKiBjb2x1bW4ncyBhcnJheSBlbnRyeS4KLSAgICAgICAqLwotICAgICAgY3VyMCA9IFJJR0hUX1NISUZUKGN1cjAgKyBlcnJvcnB0cltkaXIzKzBdICsgOCwgNCk7Ci0gICAgICBjdXIxID0gUklHSFRfU0hJRlQoY3VyMSArIGVycm9ycHRyW2RpcjMrMV0gKyA4LCA0KTsKLSAgICAgIGN1cjIgPSBSSUdIVF9TSElGVChjdXIyICsgZXJyb3JwdHJbZGlyMysyXSArIDgsIDQpOwotICAgICAgLyogTGltaXQgdGhlIGVycm9yIHVzaW5nIHRyYW5zZmVyIGZ1bmN0aW9uIHNldCBieSBpbml0X2Vycm9yX2xpbWl0LgotICAgICAgICogU2VlIGNvbW1lbnRzIHdpdGggaW5pdF9lcnJvcl9saW1pdCBmb3IgcmF0aW9uYWxlLgotICAgICAgICovCi0gICAgICBjdXIwID0gZXJyb3JfbGltaXRbY3VyMF07Ci0gICAgICBjdXIxID0gZXJyb3JfbGltaXRbY3VyMV07Ci0gICAgICBjdXIyID0gZXJyb3JfbGltaXRbY3VyMl07Ci0gICAgICAvKiBGb3JtIHBpeGVsIHZhbHVlICsgZXJyb3IsIGFuZCByYW5nZS1saW1pdCB0byAwLi5NQVhKU0FNUExFLgotICAgICAgICogVGhlIG1heGltdW0gZXJyb3IgaXMgKy0gTUFYSlNBTVBMRSAob3IgbGVzcyB3aXRoIGVycm9yIGxpbWl0aW5nKTsKLSAgICAgICAqIHRoaXMgc2V0cyB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgcmFuZ2VfbGltaXQgYXJyYXkuCi0gICAgICAgKi8KLSAgICAgIGN1cjAgKz0gR0VUSlNBTVBMRShpbnB0clswXSk7Ci0gICAgICBjdXIxICs9IEdFVEpTQU1QTEUoaW5wdHJbMV0pOwotICAgICAgY3VyMiArPSBHRVRKU0FNUExFKGlucHRyWzJdKTsKLSAgICAgIGN1cjAgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cjBdKTsKLSAgICAgIGN1cjEgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cjFdKTsKLSAgICAgIGN1cjIgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cjJdKTsKLSAgICAgIC8qIEluZGV4IGludG8gdGhlIGNhY2hlIHdpdGggYWRqdXN0ZWQgcGl4ZWwgdmFsdWUgKi8KLSAgICAgIGNhY2hlcCA9ICYgaGlzdG9ncmFtW2N1cjA+PkMwX1NISUZUXVtjdXIxPj5DMV9TSElGVF1bY3VyMj4+QzJfU0hJRlRdOwotICAgICAgLyogSWYgd2UgaGF2ZSBub3Qgc2VlbiB0aGlzIGNvbG9yIGJlZm9yZSwgZmluZCBuZWFyZXN0IGNvbG9ybWFwICovCi0gICAgICAvKiBlbnRyeSBhbmQgdXBkYXRlIHRoZSBjYWNoZSAqLwotICAgICAgaWYgKCpjYWNoZXAgPT0gMCkKLQlmaWxsX2ludmVyc2VfY21hcChjaW5mbywgY3VyMD4+QzBfU0hJRlQsY3VyMT4+QzFfU0hJRlQsY3VyMj4+QzJfU0hJRlQpOwotICAgICAgLyogTm93IGVtaXQgdGhlIGNvbG9ybWFwIGluZGV4IGZvciB0aGlzIGNlbGwgKi8KLSAgICAgIHsgcmVnaXN0ZXIgaW50IHBpeGNvZGUgPSAqY2FjaGVwIC0gMTsKLQkqb3V0cHRyID0gKEpTQU1QTEUpIHBpeGNvZGU7Ci0JLyogQ29tcHV0ZSByZXByZXNlbnRhdGlvbiBlcnJvciBmb3IgdGhpcyBwaXhlbCAqLwotCWN1cjAgLT0gR0VUSlNBTVBMRShjb2xvcm1hcDBbcGl4Y29kZV0pOwotCWN1cjEgLT0gR0VUSlNBTVBMRShjb2xvcm1hcDFbcGl4Y29kZV0pOwotCWN1cjIgLT0gR0VUSlNBTVBMRShjb2xvcm1hcDJbcGl4Y29kZV0pOwotICAgICAgfQotICAgICAgLyogQ29tcHV0ZSBlcnJvciBmcmFjdGlvbnMgdG8gYmUgcHJvcGFnYXRlZCB0byBhZGphY2VudCBwaXhlbHMuCi0gICAgICAgKiBBZGQgdGhlc2UgaW50byB0aGUgcnVubmluZyBzdW1zLCBhbmQgc2ltdWx0YW5lb3VzbHkgc2hpZnQgdGhlCi0gICAgICAgKiBuZXh0LWxpbmUgZXJyb3Igc3VtcyBsZWZ0IGJ5IDEgY29sdW1uLgotICAgICAgICovCi0gICAgICB7IHJlZ2lzdGVyIExPQ0ZTRVJST1IgYm5leHRlcnIsIGRlbHRhOwotCi0JYm5leHRlcnIgPSBjdXIwOwkvKiBQcm9jZXNzIGNvbXBvbmVudCAwICovCi0JZGVsdGEgPSBjdXIwICogMjsKLQljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KLQllcnJvcnB0clswXSA9IChGU0VSUk9SKSAoYnByZXZlcnIwICsgY3VyMCk7Ci0JY3VyMCArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCi0JYnByZXZlcnIwID0gYmVsb3dlcnIwICsgY3VyMDsKLQliZWxvd2VycjAgPSBibmV4dGVycjsKLQljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KLQlibmV4dGVyciA9IGN1cjE7CS8qIFByb2Nlc3MgY29tcG9uZW50IDEgKi8KLQlkZWx0YSA9IGN1cjEgKiAyOwotCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLwotCWVycm9ycHRyWzFdID0gKEZTRVJST1IpIChicHJldmVycjEgKyBjdXIxKTsKLQljdXIxICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KLQlicHJldmVycjEgPSBiZWxvd2VycjEgKyBjdXIxOwotCWJlbG93ZXJyMSA9IGJuZXh0ZXJyOwotCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLwotCWJuZXh0ZXJyID0gY3VyMjsJLyogUHJvY2VzcyBjb21wb25lbnQgMiAqLwotCWRlbHRhID0gY3VyMiAqIDI7Ci0JY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCi0JZXJyb3JwdHJbMl0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyMiArIGN1cjIpOwotCWN1cjIgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLwotCWJwcmV2ZXJyMiA9IGJlbG93ZXJyMiArIGN1cjI7Ci0JYmVsb3dlcnIyID0gYm5leHRlcnI7Ci0JY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCi0gICAgICB9Ci0gICAgICAvKiBBdCB0aGlzIHBvaW50IGN1ck4gY29udGFpbnMgdGhlIDcvMTYgZXJyb3IgdmFsdWUgdG8gYmUgcHJvcGFnYXRlZAotICAgICAgICogdG8gdGhlIG5leHQgcGl4ZWwgb24gdGhlIGN1cnJlbnQgbGluZSwgYW5kIGFsbCB0aGUgZXJyb3JzIGZvciB0aGUKLSAgICAgICAqIG5leHQgbGluZSBoYXZlIGJlZW4gc2hpZnRlZCBvdmVyLiAgV2UgYXJlIHRoZXJlZm9yZSByZWFkeSB0byBtb3ZlIG9uLgotICAgICAgICovCi0gICAgICBpbnB0ciArPSBkaXIzOwkJLyogQWR2YW5jZSBwaXhlbCBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgICAgb3V0cHRyICs9IGRpcjsKLSAgICAgIGVycm9ycHRyICs9IGRpcjM7CQkvKiBhZHZhbmNlIGVycm9ycHRyIHRvIGN1cnJlbnQgY29sdW1uICovCi0gICAgfQotICAgIC8qIFBvc3QtbG9vcCBjbGVhbnVwOiB3ZSBtdXN0IHVubG9hZCB0aGUgZmluYWwgZXJyb3IgdmFsdWVzIGludG8gdGhlCi0gICAgICogZmluYWwgZnNlcnJvcnNbXSBlbnRyeS4gIE5vdGUgd2UgbmVlZCBub3QgdW5sb2FkIGJlbG93ZXJyTiBiZWNhdXNlCi0gICAgICogaXQgaXMgZm9yIHRoZSBkdW1teSBjb2x1bW4gYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3R1YWwgYXJyYXkuCi0gICAgICovCi0gICAgZXJyb3JwdHJbMF0gPSAoRlNFUlJPUikgYnByZXZlcnIwOyAvKiB1bmxvYWQgcHJldiBlcnJzIGludG8gYXJyYXkgKi8KLSAgICBlcnJvcnB0clsxXSA9IChGU0VSUk9SKSBicHJldmVycjE7Ci0gICAgZXJyb3JwdHJbMl0gPSAoRlNFUlJPUikgYnByZXZlcnIyOwotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGVycm9yLWxpbWl0aW5nIHRyYW5zZmVyIGZ1bmN0aW9uIChsb29rdXAgdGFibGUpLgotICogVGhlIHJhdyBGLVMgZXJyb3IgY29tcHV0YXRpb24gY2FuIHBvdGVudGlhbGx5IGNvbXB1dGUgZXJyb3IgdmFsdWVzIG9mIHVwIHRvCi0gKiArLSBNQVhKU0FNUExFLiAgQnV0IHdlIHdhbnQgdGhlIG1heGltdW0gY29ycmVjdGlvbiBhcHBsaWVkIHRvIGEgcGl4ZWwgdG8gYmUKLSAqIG11Y2ggbGVzcywgb3RoZXJ3aXNlIG9idmlvdXNseSB3cm9uZyBwaXhlbHMgd2lsbCBiZSBjcmVhdGVkLiAgKFR5cGljYWwKLSAqIGVmZmVjdHMgaW5jbHVkZSB3ZWlyZCBmcmluZ2VzIGF0IGNvbG9yLWFyZWEgYm91bmRhcmllcywgaXNvbGF0ZWQgYnJpZ2h0Ci0gKiBwaXhlbHMgaW4gYSBkYXJrIGFyZWEsIGV0Yy4pICBUaGUgc3RhbmRhcmQgYWR2aWNlIGZvciBhdm9pZGluZyB0aGlzIHByb2JsZW0KLSAqIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSAiY29ybmVycyIgb2YgdGhlIGNvbG9yIGN1YmUgYXJlIGFsbG9jYXRlZCBhcyBvdXRwdXQKLSAqIGNvbG9yczsgdGhlbiByZXBlYXRlZCBlcnJvcnMgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGNhbm5vdCBjYXVzZSBjYXNjYWRpbmcKLSAqIGVycm9yIGJ1aWxkdXAuICBIb3dldmVyLCB0aGF0IG9ubHkgcHJldmVudHMgdGhlIGVycm9yIGZyb20gZ2V0dGluZwotICogY29tcGxldGVseSBvdXQgb2YgaGFuZDsgQWFyb24gR2lsZXMgcmVwb3J0cyB0aGF0IGVycm9yIGxpbWl0aW5nIGltcHJvdmVzCi0gKiB0aGUgcmVzdWx0cyBldmVuIHdpdGggY29ybmVyIGNvbG9ycyBhbGxvY2F0ZWQuCi0gKiBBIHNpbXBsZSBjbGFtcGluZyBvZiB0aGUgZXJyb3IgdmFsdWVzIHRvIGFib3V0ICstIE1BWEpTQU1QTEUvOCB3b3JrcyBwcmV0dHkKLSAqIHdlbGwsIGJ1dCB0aGUgc21vb3RoZXIgdHJhbnNmZXIgZnVuY3Rpb24gdXNlZCBiZWxvdyBpcyBldmVuIGJldHRlci4gIFRoYW5rcwotICogdG8gQWFyb24gR2lsZXMgZm9yIHRoaXMgaWRlYS4KLSAqLwotCi1MT0NBTCh2b2lkKQotaW5pdF9lcnJvcl9saW1pdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBlcnJvcl9saW1pdGVyIHRhYmxlICovCi17Ci0gIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7Ci0gIGludCAqIHRhYmxlOwotICBpbnQgaW4sIG91dDsKLQotICB0YWJsZSA9IChpbnQgKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCAoTUFYSlNBTVBMRSoyKzEpICogU0laRU9GKGludCkpOwotICB0YWJsZSArPSBNQVhKU0FNUExFOwkJLyogc28gY2FuIGluZGV4IC1NQVhKU0FNUExFIC4uICtNQVhKU0FNUExFICovCi0gIGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9IHRhYmxlOwotCi0jZGVmaW5lIFNURVBTSVpFICgoTUFYSlNBTVBMRSsxKS8xNikKLSAgLyogTWFwIGVycm9ycyAxOjEgdXAgdG8gKy0gTUFYSlNBTVBMRS8xNiAqLwotICBvdXQgPSAwOwotICBmb3IgKGluID0gMDsgaW4gPCBTVEVQU0laRTsgaW4rKywgb3V0KyspIHsKLSAgICB0YWJsZVtpbl0gPSBvdXQ7IHRhYmxlWy1pbl0gPSAtb3V0OwotICB9Ci0gIC8qIE1hcCBlcnJvcnMgMToyIHVwIHRvICstIDMqTUFYSlNBTVBMRS8xNiAqLwotICBmb3IgKDsgaW4gPCBTVEVQU0laRSozOyBpbisrLCBvdXQgKz0gKGluJjEpID8gMCA6IDEpIHsKLSAgICB0YWJsZVtpbl0gPSBvdXQ7IHRhYmxlWy1pbl0gPSAtb3V0OwotICB9Ci0gIC8qIENsYW1wIHRoZSByZXN0IHRvIGZpbmFsIG91dCB2YWx1ZSAod2hpY2ggaXMgKE1BWEpTQU1QTEUrMSkvOCkgKi8KLSAgZm9yICg7IGluIDw9IE1BWEpTQU1QTEU7IGluKyspIHsKLSAgICB0YWJsZVtpbl0gPSBvdXQ7IHRhYmxlWy1pbl0gPSAtb3V0OwotICB9Ci0jdW5kZWYgU1RFUFNJWkUKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgZWFjaCBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3MxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotCi0gIC8qIFNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3JzIGFuZCBmaWxsIGluIGNpbmZvLT5jb2xvcm1hcCAqLwotICBjaW5mby0+Y29sb3JtYXAgPSBjcXVhbnRpemUtPnN2X2NvbG9ybWFwOwotICBzZWxlY3RfY29sb3JzKGNpbmZvLCBjcXVhbnRpemUtPmRlc2lyZWQpOwotICAvKiBGb3JjZSBuZXh0IHBhc3MgdG8gemVybyB0aGUgY29sb3IgaW5kZXggdGFibGUgKi8KLSAgY3F1YW50aXplLT5uZWVkc196ZXJvZWQgPSBUUlVFOwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3MyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGVhY2ggcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc18yX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3ByZV9zY2FuKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07Ci0gIGludCBpOwotCi0gIC8qIE9ubHkgRi1TIGRpdGhlcmluZyBvciBubyBkaXRoZXJpbmcgaXMgc3VwcG9ydGVkLiAqLwotICAvKiBJZiB1c2VyIGFza3MgZm9yIG9yZGVyZWQgZGl0aGVyLCBnaXZlIGhpbSBGLVMuICovCi0gIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgIT0gSkRJVEhFUl9OT05FKQotICAgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7Ci0KLSAgaWYgKGlzX3ByZV9zY2FuKSB7Ci0gICAgLyogU2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLwotICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcHJlc2Nhbl9xdWFudGl6ZTsKLSAgICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzMTsKLSAgICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7IC8qIEFsd2F5cyB6ZXJvIGhpc3RvZ3JhbSAqLwotICB9IGVsc2UgewotICAgIC8qIFNldCB1cCBtZXRob2QgcG9pbnRlcnMgKi8KLSAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpCi0gICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHBhc3MyX2ZzX2RpdGhlcjsKLSAgICBlbHNlCi0gICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHBhc3MyX25vX2RpdGhlcjsKLSAgICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzMjsKLQotICAgIC8qIE1ha2Ugc3VyZSBjb2xvciBjb3VudCBpcyBhY2NlcHRhYmxlICovCi0gICAgaSA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKLSAgICBpZiAoaSA8IDEpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAxKTsKLSAgICBpZiAoaSA+IE1BWE5VTUNPTE9SUykKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhOVU1DT0xPUlMpOwotCi0gICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKSB7Ci0gICAgICBzaXplX3QgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKgotCQkJCSAgICgzICogU0laRU9GKEZTRVJST1IpKSk7Ci0gICAgICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLwotICAgICAgaWYgKGNxdWFudGl6ZS0+ZnNlcnJvcnMgPT0gTlVMTCkKLQljcXVhbnRpemUtPmZzZXJyb3JzID0gKEZTRVJSUFRSKSAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKQotCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgYXJyYXlzaXplKTsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BhZ2F0ZWQgZXJyb3JzIHRvIHplcm8uICovCi0gICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNxdWFudGl6ZS0+ZnNlcnJvcnMsIGFycmF5c2l6ZSk7Ci0gICAgICAvKiBNYWtlIHRoZSBlcnJvci1saW1pdCB0YWJsZSBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4gKi8KLSAgICAgIGlmIChjcXVhbnRpemUtPmVycm9yX2xpbWl0ZXIgPT0gTlVMTCkKLQlpbml0X2Vycm9yX2xpbWl0KGNpbmZvKTsKLSAgICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IEZBTFNFOwotICAgIH0KLQotICB9Ci0gIC8qIFplcm8gdGhlIGhpc3RvZ3JhbSBvciBpbnZlcnNlIGNvbG9yIG1hcCwgaWYgbmVjZXNzYXJ5ICovCi0gIGlmIChjcXVhbnRpemUtPm5lZWRzX3plcm9lZCkgewotICAgIGZvciAoaSA9IDA7IGkgPCBISVNUX0MwX0VMRU1TOyBpKyspIHsKLSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgaGlzdG9ncmFtW2ldLAotCQlISVNUX0MxX0VMRU1TKkhJU1RfQzJfRUxFTVMgKiBTSVpFT0YoaGlzdGNlbGwpKTsKLSAgICB9Ci0gICAgY3F1YW50aXplLT5uZWVkc196ZXJvZWQgPSBGQUxTRTsKLSAgfQotfQotCi0KLS8qCi0gKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotbmV3X2NvbG9yX21hcF8yX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOwotCi0gIC8qIFJlc2V0IHRoZSBpbnZlcnNlIGNvbG9yIG1hcCAqLwotICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfMnBhc3NfcXVhbnRpemVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZTsKLSAgaW50IGk7Ci0KLSAgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY3F1YW50aXplcikpOwotICBjaW5mby0+Y3F1YW50aXplID0gKHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqKSBjcXVhbnRpemU7Ci0gIGNxdWFudGl6ZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzXzJfcXVhbnQ7Ci0gIGNxdWFudGl6ZS0+cHViLm5ld19jb2xvcl9tYXAgPSBuZXdfY29sb3JfbWFwXzJfcXVhbnQ7Ci0gIGNxdWFudGl6ZS0+ZnNlcnJvcnMgPSBOVUxMOwkvKiBmbGFnIG9wdGlvbmFsIGFycmF5cyBub3QgYWxsb2NhdGVkICovCi0gIGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9IE5VTEw7Ci0KLSAgLyogTWFrZSBzdXJlIGpkbWFzdGVyIGRpZG4ndCBnaXZlIG1lIGEgY2FzZSBJIGNhbid0IGhhbmRsZSAqLwotICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgaGlzdG9ncmFtL2ludmVyc2UgY29sb3JtYXAgc3RvcmFnZSAqLwotICBjcXVhbnRpemUtPmhpc3RvZ3JhbSA9IChoaXN0M2QpICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgSElTVF9DMF9FTEVNUyAqIFNJWkVPRihoaXN0MmQpKTsKLSAgZm9yIChpID0gMDsgaSA8IEhJU1RfQzBfRUxFTVM7IGkrKykgewotICAgIGNxdWFudGl6ZS0+aGlzdG9ncmFtW2ldID0gKGhpc3QyZCkgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgSElTVF9DMV9FTEVNUypISVNUX0MyX0VMRU1TICogU0laRU9GKGhpc3RjZWxsKSk7Ci0gIH0KLSAgY3F1YW50aXplLT5uZWVkc196ZXJvZWQgPSBUUlVFOyAvKiBoaXN0b2dyYW0gaXMgZ2FyYmFnZSBub3cgKi8KLQotICAvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciB0aGUgY29tcGxldGVkIGNvbG9ybWFwLCBpZiByZXF1aXJlZC4KLSAgICogV2UgZG8gdGhpcyBub3cgc2luY2UgaXQgaXMgRkFSIHN0b3JhZ2UgYW5kIG1heSBhZmZlY3QKLSAgICogdGhlIG1lbW9yeSBtYW5hZ2VyJ3Mgc3BhY2UgY2FsY3VsYXRpb25zLgotICAgKi8KLSAgaWYgKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKLSAgICAvKiBNYWtlIHN1cmUgY29sb3IgY291bnQgaXMgYWNjZXB0YWJsZSAqLwotICAgIGludCBkZXNpcmVkID0gY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsKLSAgICAvKiBMb3dlciBib3VuZCBvbiAjIG9mIGNvbG9ycyAuLi4gc29tZXdoYXQgYXJiaXRyYXJ5IGFzIGxvbmcgYXMgPiAwICovCi0gICAgaWYgKGRlc2lyZWQgPCA4KQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgOCk7Ci0gICAgLyogTWFrZSBzdXJlIGNvbG9ybWFwIGluZGV4ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IEpTQU1QTEVzICovCi0gICAgaWYgKGRlc2lyZWQgPiBNQVhOVU1DT0xPUlMpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgTUFYTlVNQ09MT1JTKTsKLSAgICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sSlBPT0xfSU1BR0UsIChKRElNRU5TSU9OKSBkZXNpcmVkLCAoSkRJTUVOU0lPTikgMyk7Ci0gICAgY3F1YW50aXplLT5kZXNpcmVkID0gZGVzaXJlZDsKLSAgfSBlbHNlCi0gICAgY3F1YW50aXplLT5zdl9jb2xvcm1hcCA9IE5VTEw7Ci0KLSAgLyogT25seSBGLVMgZGl0aGVyaW5nIG9yIG5vIGRpdGhlcmluZyBpcyBzdXBwb3J0ZWQuICovCi0gIC8qIElmIHVzZXIgYXNrcyBmb3Igb3JkZXJlZCBkaXRoZXIsIGdpdmUgaGltIEYtUy4gKi8KLSAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpCi0gICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKLQotICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIG5lY2Vzc2FyeS4KLSAgICogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVkIHVudGlsIHBhc3MgMiwgYnV0IGFnYWluIGl0IGlzIEZBUiBzdG9yYWdlLgotICAgKiBBbHRob3VnaCB3ZSB3aWxsIGNvcGUgd2l0aCBhIGxhdGVyIGNoYW5nZSBpbiBkaXRoZXJfbW9kZSwKLSAgICogd2UgZG8gbm90IHByb21pc2UgdG8gaG9ub3IgbWF4X21lbW9yeV90b191c2UgaWYgZGl0aGVyX21vZGUgY2hhbmdlcy4KLSAgICovCi0gIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykgewotICAgIGNxdWFudGl6ZS0+ZnNlcnJvcnMgPSAoRlNFUlJQVFIpICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogKDMgKiBTSVpFT0YoRlNFUlJPUikpKSk7Ci0gICAgLyogTWlnaHQgYXMgd2VsbCBjcmVhdGUgdGhlIGVycm9yLWxpbWl0aW5nIHRhYmxlIHRvby4gKi8KLSAgICBpbml0X2Vycm9yX2xpbWl0KGNpbmZvKTsKLSAgfQotfQotCi0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9qdXRpbHMuYyBiL2xpYmpwZWd0d3JwL2p1dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZhZDA1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2p1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBqdXRpbHMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRhYmxlcyBhbmQgbWlzY2VsbGFuZW91cyB1dGlsaXR5IHJvdXRpbmVzIG5lZWRlZAotICogZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCi0gKiBOb3RlIHdlIHByZWZpeCBhbGwgZ2xvYmFsIG5hbWVzIHdpdGggImoiIHRvIG1pbmltaXplIGNvbmZsaWN0cyB3aXRoCi0gKiBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICoganBlZ196aWd6YWdfb3JkZXJbaV0gaXMgdGhlIHppZ3phZy1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50Ci0gKiBvZiBhIERDVCBibG9jayByZWFkIGluIG5hdHVyYWwgb3JkZXIgKGxlZnQgdG8gcmlnaHQsIHRvcCB0byBib3R0b20pLgotICovCi0KLSNpZiAwCQkJCS8qIFRoaXMgdGFibGUgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBpbiB2NmEgKi8KLQotY29uc3QgaW50IGpwZWdfemlnemFnX29yZGVyW0RDVFNJWkUyXSA9IHsKLSAgIDAsICAxLCAgNSwgIDYsIDE0LCAxNSwgMjcsIDI4LAotICAgMiwgIDQsICA3LCAxMywgMTYsIDI2LCAyOSwgNDIsCi0gICAzLCAgOCwgMTIsIDE3LCAyNSwgMzAsIDQxLCA0MywKLSAgIDksIDExLCAxOCwgMjQsIDMxLCA0MCwgNDQsIDUzLAotICAxMCwgMTksIDIzLCAzMiwgMzksIDQ1LCA1MiwgNTQsCi0gIDIwLCAyMiwgMzMsIDM4LCA0NiwgNTEsIDU1LCA2MCwKLSAgMjEsIDM0LCAzNywgNDcsIDUwLCA1NiwgNTksIDYxLAotICAzNSwgMzYsIDQ4LCA0OSwgNTcsIDU4LCA2MiwgNjMKLX07Ci0KLSNlbmRpZgotCi0vKgotICoganBlZ19uYXR1cmFsX29yZGVyW2ldIGlzIHRoZSBuYXR1cmFsLW9yZGVyIHBvc2l0aW9uIG9mIHRoZSBpJ3RoIGVsZW1lbnQKLSAqIG9mIHppZ3phZyBvcmRlci4KLSAqCi0gKiBXaGVuIHJlYWRpbmcgY29ycnVwdGVkIGRhdGEsIHRoZSBIdWZmbWFuIGRlY29kZXJzIGNvdWxkIGF0dGVtcHQKLSAqIHRvIHJlZmVyZW5jZSBhbiBlbnRyeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzIGFycmF5IChpZiB0aGUgZGVjb2RlZAotICogemVybyBydW4gbGVuZ3RoIHJlYWNoZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBibG9jaykuICBUbyBwcmV2ZW50Ci0gKiB3aWxkIHN0b3JlcyB3aXRob3V0IGFkZGluZyBhbiBpbm5lci1sb29wIHRlc3QsIHdlIHB1dCBzb21lIGV4dHJhCi0gKiAiNjMicyBhZnRlciB0aGUgcmVhbCBlbnRyaWVzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBleHRyYSBjb2VmZmljaWVudAotICogdG8gYmUgc3RvcmVkIGluIGxvY2F0aW9uIDYzIG9mIHRoZSBibG9jaywgbm90IHNvbWV3aGVyZSByYW5kb20uCi0gKiBUaGUgd29yc3QgY2FzZSB3b3VsZCBiZSBhIHJ1bi1sZW5ndGggb2YgMTUsIHdoaWNoIG1lYW5zIHdlIG5lZWQgMTYKLSAqIGZha2UgZW50cmllcy4KLSAqLwotCi1jb25zdCBpbnQganBlZ19uYXR1cmFsX29yZGVyW0RDVFNJWkUyKzE2XSA9IHsKLSAgMCwgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsCi0gMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgIDQsICA1LAotIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwKLSAyNywgMjAsIDEzLCAgNiwgIDcsIDE0LCAyMSwgMjgsCi0gMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAotIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKLSA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCi0gNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzLAotIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgLyogZXh0cmEgZW50cmllcyBmb3Igc2FmZXR5IGluIGRlY29kZXIgKi8KLSA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMKLX07Ci0KLQotLyoKLSAqIEFyaXRobWV0aWMgdXRpbGl0aWVzCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qZGl2X3JvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKLS8qIENvbXB1dGUgYS9iIHJvdW5kZWQgdXAgdG8gbmV4dCBpbnRlZ2VyLCBpZSwgY2VpbChhL2IpICovCi0vKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KLXsKLSAgcmV0dXJuIChhICsgYiAtIDFMKSAvIGI7Ci19Ci0KLQotR0xPQkFMKGxvbmcpCi1qcm91bmRfdXAgKGxvbmcgYSwgbG9uZyBiKQotLyogQ29tcHV0ZSBhIHJvdW5kZWQgdXAgdG8gbmV4dCBtdWx0aXBsZSBvZiBiLCBpZSwgY2VpbChhL2IpKmIgKi8KLS8qIEFzc3VtZXMgYSA+PSAwLCBiID4gMCAqLwotewotICBhICs9IGIgLSAxTDsKLSAgcmV0dXJuIGEgLSAoYSAlIGIpOwotfQotCi1HTE9CQUwobG9uZykKLWptaW4gKGxvbmcgYSwgbG9uZyBiKQotewotICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotCi0vKiBPbiBub3JtYWwgbWFjaGluZXMgd2UgY2FuIGFwcGx5IE1FTUNPUFkoKSBhbmQgTUVNWkVSTygpIHRvIHNhbXBsZSBhcnJheXMKLSAqIGFuZCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMuICBUaGlzIHdvbid0IHdvcmsgb24gODB4ODYgYmVjYXVzZSB0aGUgYXJyYXlzCi0gKiBhcmUgRkFSIGFuZCB3ZSdyZSBhc3N1bWluZyBhIHNtYWxsLXBvaW50ZXIgbWVtb3J5IG1vZGVsLiAgSG93ZXZlciwgc29tZQotICogRE9TIGNvbXBpbGVycyBwcm92aWRlIGZhci1wb2ludGVyIHZlcnNpb25zIG9mIG1lbWNweSgpIGFuZCBtZW1zZXQoKSBldmVuCi0gKiBpbiB0aGUgc21hbGwtbW9kZWwgbGlicmFyaWVzLiAgVGhlc2Ugd2lsbCBiZSB1c2VkIGlmIFVTRV9GTUVNIGlzIGRlZmluZWQuCi0gKiBPdGhlcndpc2UsIHRoZSByb3V0aW5lcyBiZWxvdyBkbyBpdCB0aGUgaGFyZCB3YXkuICAoVGhlIHBlcmZvcm1hbmNlIGNvc3QKLSAqIGlzIG5vdCBhbGwgdGhhdCBncmVhdCwgYmVjYXVzZSB0aGVzZSByb3V0aW5lcyBhcmVuJ3QgdmVyeSBoZWF2aWx5IHVzZWQuKQotICovCi0KLSNpZm5kZWYgTkVFRF9GQVJfUE9JTlRFUlMJLyogbm9ybWFsIGNhc2UsIHNhbWUgYXMgcmVndWxhciBtYWNyb3MgKi8KLSNkZWZpbmUgRk1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJTUVNQ09QWShkZXN0LHNyYyxzaXplKQotI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJTUVNWkVSTyh0YXJnZXQsc2l6ZSkKLSNlbHNlCQkJCS8qIDgweDg2IGNhc2UsIGRlZmluZSBpZiB3ZSBjYW4gKi8KLSNpZmRlZiBVU0VfRk1FTQotI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlfZm1lbWNweSgodm9pZCBGQVIgKikoZGVzdCksIChjb25zdCB2b2lkIEZBUiAqKShzcmMpLCAoc2l6ZV90KShzaXplKSkKLSNkZWZpbmUgRk1FTVpFUk8odGFyZ2V0LHNpemUpCV9mbWVtc2V0KCh2b2lkIEZBUiAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKLSNlbmRpZgotI2VuZGlmCi0KLQotR0xPQkFMKHZvaWQpCi1qY29weV9zYW1wbGVfcm93cyAoSlNBTVBBUlJBWSBpbnB1dF9hcnJheSwgaW50IHNvdXJjZV9yb3csCi0JCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2FycmF5LCBpbnQgZGVzdF9yb3csCi0JCSAgIGludCBudW1fcm93cywgSkRJTUVOU0lPTiBudW1fY29scykKLS8qIENvcHkgc29tZSByb3dzIG9mIHNhbXBsZXMgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4KLSAqIG51bV9yb3dzIHJvd3MgYXJlIGNvcGllZCBmcm9tIGlucHV0X2FycmF5W3NvdXJjZV9yb3crK10KLSAqIHRvIG91dHB1dF9hcnJheVtkZXN0X3JvdysrXTsgdGhlc2UgYXJlYXMgbWF5IG92ZXJsYXAgZm9yIGR1cGxpY2F0aW9uLgotICogVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJyYXlzIG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBudW1fY29scy4KLSAqLwotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotI2lmZGVmIEZNRU1DT1BZCi0gIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IChzaXplX3QpIChudW1fY29scyAqIFNJWkVPRihKU0FNUExFKSk7Ci0jZWxzZQotICByZWdpc3RlciBKRElNRU5TSU9OIGNvdW50OwotI2VuZGlmCi0gIHJlZ2lzdGVyIGludCByb3c7Ci0KLSAgaW5wdXRfYXJyYXkgKz0gc291cmNlX3JvdzsKLSAgb3V0cHV0X2FycmF5ICs9IGRlc3Rfcm93OwotCi0gIGZvciAocm93ID0gbnVtX3Jvd3M7IHJvdyA+IDA7IHJvdy0tKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYXJyYXkrKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2FycmF5Kys7Ci0jaWZkZWYgRk1FTUNPUFkKLSAgICBGTUVNQ09QWShvdXRwdHIsIGlucHRyLCBjb3VudCk7Ci0jZWxzZQotICAgIGZvciAoY291bnQgPSBudW1fY29sczsgY291bnQgPiAwOyBjb3VudC0tKQotICAgICAgKm91dHB0cisrID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSNlbmRpZgotICB9Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1qY29weV9ibG9ja19yb3cgKEpCTE9DS1JPVyBpbnB1dF9yb3csIEpCTE9DS1JPVyBvdXRwdXRfcm93LAotCQkgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQotLyogQ29weSBhIHJvdyBvZiBjb2VmZmljaWVudCBibG9ja3MgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4gKi8KLXsKLSNpZmRlZiBGTUVNQ09QWQotICBGTUVNQ09QWShvdXRwdXRfcm93LCBpbnB1dF9yb3csIG51bV9ibG9ja3MgKiAoRENUU0laRTIgKiBTSVpFT0YoSkNPRUYpKSk7Ci0jZWxzZQotICByZWdpc3RlciBKQ09FRlBUUiBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBsb25nIGNvdW50OwotCi0gIGlucHRyID0gKEpDT0VGUFRSKSBpbnB1dF9yb3c7Ci0gIG91dHB0ciA9IChKQ09FRlBUUikgb3V0cHV0X3JvdzsKLSAgZm9yIChjb3VudCA9IChsb25nKSBudW1fYmxvY2tzICogRENUU0laRTI7IGNvdW50ID4gMDsgY291bnQtLSkgewotICAgICpvdXRwdHIrKyA9ICppbnB0cisrOwotICB9Ci0jZW5kaWYKLX0KLQotCi1HTE9CQUwodm9pZCkKLWp6ZXJvX2ZhciAodm9pZCBGQVIgKiB0YXJnZXQsIHNpemVfdCBieXRlc3RvemVybykKLS8qIFplcm8gb3V0IGEgY2h1bmsgb2YgRkFSIG1lbW9yeS4gKi8KLS8qIFRoaXMgbWlnaHQgYmUgc2FtcGxlLWFycmF5IGRhdGEsIGJsb2NrLWFycmF5IGRhdGEsIG9yIGFsbG9jX2xhcmdlIGRhdGEuICovCi17Ci0jaWZkZWYgRk1FTVpFUk8KLSAgRk1FTVpFUk8odGFyZ2V0LCBieXRlc3RvemVybyk7Ci0jZWxzZQotICByZWdpc3RlciBjaGFyIEZBUiAqIHB0ciA9IChjaGFyIEZBUiAqKSB0YXJnZXQ7Ci0gIHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKLQotICBmb3IgKGNvdW50ID0gYnl0ZXN0b3plcm87IGNvdW50ID4gMDsgY291bnQtLSkgewotICAgICpwdHIrKyA9IDA7Ci0gIH0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvanZlcnNpb24uaCBiL2xpYmpwZWd0d3JwL2p2ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzJjNTguLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvanZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBqdmVyc2lvbi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc29mdHdhcmUgdmVyc2lvbiBpZGVudGlmaWNhdGlvbi4KLSAqLwotCi0KLSNkZWZpbmUgSlZFUlNJT04JIjZiICAyNy1NYXItMTk5OCIKLQotI2RlZmluZSBKQ09QWVJJR0hUCSJDb3B5cmlnaHQgKEMpIDE5OTgsIFRob21hcyBHLiBMYW5lIgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbGlianBlZy5kb2MgYi9saWJqcGVndHdycC9saWJqcGVnLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5YjIwNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9saWJqcGVnLmRvYworKysgL2Rldi9udWxsCkBAIC0xLDMwMDYgKzAsMCBAQAotVVNJTkcgVEhFIElKRyBKUEVHIExJQlJBUlkKLQotQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLQotCi1UaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIElKRyBKUEVHIGxpYnJhcnkgd2l0aGluIGFuIGFwcGxpY2F0aW9uCi1wcm9ncmFtLiAgUmVhZCBpdCBpZiB5b3Ugd2FudCB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBsaWJyYXJ5LgotCi1UaGUgZmlsZSBleGFtcGxlLmMgcHJvdmlkZXMgaGVhdmlseSBjb21tZW50ZWQgc2tlbGV0b24gY29kZSBmb3IgY2FsbGluZyB0aGUKLUpQRUcgbGlicmFyeS4gIEFsc28gc2VlIGpwZWdsaWIuaCAodGhlIGluY2x1ZGUgZmlsZSB0byBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uCi1wcm9ncmFtcykgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0cy4KLVRoZSBsaWJyYXJ5IHNvdXJjZSBjb2RlLCBvZiBjb3Vyc2UsIGlzIHRoZSB1bHRpbWF0ZSByZWZlcmVuY2UuCi0KLU5vdGUgdGhhdCB0aGVyZSBoYXZlIGJlZW4gKm1ham9yKiBjaGFuZ2VzIGZyb20gdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZQotcHJlc2VudGVkIGJ5IElKRyB2ZXJzaW9uIDQgYW5kIGVhcmxpZXIgdmVyc2lvbnMuICBUaGUgb2xkIGRlc2lnbiBoYWQgc2V2ZXJhbAotaW5oZXJlbnQgbGltaXRhdGlvbnMsIGFuZCBpdCBoYWQgYWNjdW11bGF0ZWQgYSBsb3Qgb2YgY3J1ZnQgYXMgd2UgYWRkZWQKLWZlYXR1cmVzIHdoaWxlIHRyeWluZyB0byBtaW5pbWl6ZSBhcHBsaWNhdGlvbi1pbnRlcmZhY2UgY2hhbmdlcy4gIFdlIGhhdmUKLXNhY3JpZmljZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiB0aGUgdmVyc2lvbiA1IHJld3JpdGUsIGJ1dCB3ZSB0aGluayB0aGUKLWltcHJvdmVtZW50cyBqdXN0aWZ5IHRoaXMuCi0KLQotVEFCTEUgT0YgQ09OVEVOVFMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU92ZXJ2aWV3OgotCUZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgbGlicmFyeQotCU91dGxpbmUgb2YgdHlwaWNhbCB1c2FnZQotQmFzaWMgbGlicmFyeSB1c2FnZToKLQlEYXRhIGZvcm1hdHMKLQlDb21wcmVzc2lvbiBkZXRhaWxzCi0JRGVjb21wcmVzc2lvbiBkZXRhaWxzCi0JTWVjaGFuaWNzIG9mIHVzYWdlOiBpbmNsdWRlIGZpbGVzLCBsaW5raW5nLCBldGMKLUFkdmFuY2VkIGZlYXR1cmVzOgotCUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLQlEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLQlTcGVjaWFsIGNvbG9yIHNwYWNlcwotCUVycm9yIGhhbmRsaW5nCi0JQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIChzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzKQotCUkvTyBzdXNwZW5zaW9uCi0JUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0Ci0JQnVmZmVyZWQtaW1hZ2UgbW9kZQotCUFiYnJldmlhdGVkIGRhdGFzdHJlYW1zIGFuZCBtdWx0aXBsZSBpbWFnZXMKLQlTcGVjaWFsIG1hcmtlcnMKLQlSYXcgKGRvd25zYW1wbGVkKSBpbWFnZSBkYXRhCi0JUmVhbGx5IHJhdyBkYXRhOiBEQ1QgY29lZmZpY2llbnRzCi0JUHJvZ3Jlc3MgbW9uaXRvcmluZwotCU1lbW9yeSBtYW5hZ2VtZW50Ci0JTWVtb3J5IHVzYWdlCi0JTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucwotCVBvcnRhYmlsaXR5IGNvbnNpZGVyYXRpb25zCi0JTm90ZXMgZm9yIE1TLURPUyBpbXBsZW1lbnRvcnMKLQotWW91IHNob3VsZCByZWFkIGF0IGxlYXN0IHRoZSBvdmVydmlldyBhbmQgYmFzaWMgdXNhZ2Ugc2VjdGlvbnMgYmVmb3JlIHRyeWluZwotdG8gcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LiAgVGhlIHNlY3Rpb25zIG9uIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSByZWFkCi1pZiBhbmQgd2hlbiB5b3UgbmVlZCB0aGVtLgotCi0KLU9WRVJWSUVXCi09PT09PT09PQotCi1GdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSUpHIEpQRUcgbGlicmFyeSBwcm92aWRlcyBDIGNvZGUgdG8gcmVhZCBhbmQgd3JpdGUgSlBFRy1jb21wcmVzc2VkIGltYWdlCi1maWxlcy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBwcm9ncmFtIHJlY2VpdmVzIG9yIHN1cHBsaWVzIGltYWdlIGRhdGEgYQotc2NhbmxpbmUgYXQgYSB0aW1lLCB1c2luZyBhIHN0cmFpZ2h0Zm9yd2FyZCB1bmNvbXByZXNzZWQgaW1hZ2UgZm9ybWF0LiAgQWxsCi1kZXRhaWxzIG9mIGNvbG9yIGNvbnZlcnNpb24gYW5kIG90aGVyIHByZXByb2Nlc3NpbmcvcG9zdHByb2Nlc3NpbmcgY2FuIGJlCi1oYW5kbGVkIGJ5IHRoZSBsaWJyYXJ5LgotCi1UaGUgbGlicmFyeSBpbmNsdWRlcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBjb2RlIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgdGhlCi1KUEVHIHN0YW5kYXJkIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIHR5cGljYWwgYXBwbGljYXRpb25zIG9mIEpQRUcuICBUaGVzZQotZnVuY3Rpb25zIHByZXByb2Nlc3MgdGhlIGltYWdlIGJlZm9yZSBKUEVHIGNvbXByZXNzaW9uIG9yIHBvc3Rwcm9jZXNzIGl0IGFmdGVyCi1kZWNvbXByZXNzaW9uLiAgVGhleSBpbmNsdWRlIGNvbG9yc3BhY2UgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nL3Vwc2FtcGxpbmcsCi1hbmQgY29sb3IgcXVhbnRpemF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGluZGlyZWN0bHkgc2VsZWN0cyB1c2Ugb2YgdGhpcyBjb2RlCi1ieSBzcGVjaWZ5aW5nIHRoZSBmb3JtYXQgaW4gd2hpY2ggaXQgd2lzaGVzIHRvIHN1cHBseSBvciByZWNlaXZlIGltYWdlIGRhdGEuCi1Gb3IgZXhhbXBsZSwgaWYgY29sb3JtYXBwZWQgb3V0cHV0IGlzIHJlcXVlc3RlZCwgdGhlbiB0aGUgZGVjb21wcmVzc2lvbgotbGlicmFyeSBhdXRvbWF0aWNhbGx5IGludm9rZXMgY29sb3IgcXVhbnRpemF0aW9uLgotCi1BIHdpZGUgcmFuZ2Ugb2YgcXVhbGl0eSB2cy4gc3BlZWQgdHJhZGVvZmZzIGFyZSBwb3NzaWJsZSBpbiBKUEVHIHByb2Nlc3NpbmcsCi1hbmQgZXZlbiBtb3JlIHNvIGluIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5Ci1wcm92aWRlcyBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjb3ZlciBtb3N0IG9mIHRoZSB1c2VmdWwgdHJhZGVvZmZzLAotcmFuZ2luZyBmcm9tIHZlcnktaGlnaC1xdWFsaXR5IGRvd24gdG8gZmFzdC1wcmV2aWV3IG9wZXJhdGlvbi4gIE9uIHRoZQotY29tcHJlc3Npb24gc2lkZSB3ZSBoYXZlIGdlbmVyYWxseSBub3QgcHJvdmlkZWQgbG93LXF1YWxpdHkgY2hvaWNlcywgc2luY2UKLWNvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGxlc3MgdGltZS1jcml0aWNhbC4gIEl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdGhlCi1sb3ctcXVhbGl0eSBtb2RlcyBtYXkgbm90IG1lZXQgdGhlIEpQRUcgc3RhbmRhcmQncyBhY2N1cmFjeSByZXF1aXJlbWVudHM7Ci1ub25ldGhlbGVzcywgdGhleSBhcmUgdXNlZnVsIGZvciB2aWV3ZXJzLgotCi1BIHdvcmQgYWJvdXQgZnVuY3Rpb25zICpub3QqIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5LiAgV2UgaGFuZGxlIGEgc3Vic2V0IG9mCi10aGUgSVNPIEpQRUcgc3RhbmRhcmQ7IG1vc3QgYmFzZWxpbmUsIGV4dGVuZGVkLXNlcXVlbnRpYWwsIGFuZCBwcm9ncmVzc2l2ZQotSlBFRyBwcm9jZXNzZXMgYXJlIHN1cHBvcnRlZC4gIChPdXIgc3Vic2V0IGluY2x1ZGVzIGFsbCBmZWF0dXJlcyBub3cgaW4gY29tbW9uCi11c2UuKSAgVW5zdXBwb3J0ZWQgSVNPIG9wdGlvbnMgaW5jbHVkZToKLQkqIEhpZXJhcmNoaWNhbCBzdG9yYWdlCi0JKiBMb3NzbGVzcyBKUEVHCi0JKiBBcml0aG1ldGljIGVudHJvcHkgY29kaW5nICh1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucykKLQkqIEROTCBtYXJrZXIKLQkqIE5vbmludGVncmFsIHN1YnNhbXBsaW5nIHJhdGlvcwotV2Ugc3VwcG9ydCBib3RoIDgtIGFuZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGJ1dCB0aGlzIGlzIGEgY29tcGlsZS10aW1lCi1jaG9pY2UgcmF0aGVyIHRoYW4gYSBydW4tdGltZSBjaG9pY2U7IGhlbmNlIGl0IGlzIGRpZmZpY3VsdCB0byB1c2UgYm90aAotcHJlY2lzaW9ucyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbi4KLQotQnkgaXRzZWxmLCB0aGUgbGlicmFyeSBoYW5kbGVzIG9ubHkgaW50ZXJjaGFuZ2UgSlBFRyBkYXRhc3RyZWFtcyAtLS0gaW4KLXBhcnRpY3VsYXIgdGhlIHdpZGVseSB1c2VkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCBieQotc3Vycm91bmRpbmcgY29kZSB0byBwcm9jZXNzIGludGVyY2hhbmdlIG9yIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMgdGhhdAotYXJlIGVtYmVkZGVkIGluIG1vcmUgY29tcGxleCBmaWxlIGZvcm1hdHMuICAoRm9yIGV4YW1wbGUsIHRoaXMgbGlicmFyeSBpcwotdXNlZCBieSB0aGUgZnJlZSBMSUJUSUZGIGxpYnJhcnkgdG8gc3VwcG9ydCBKUEVHIGNvbXByZXNzaW9uIGluIFRJRkYuKQotCi0KLU91dGxpbmUgb2YgdHlwaWNhbCB1c2FnZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSByb3VnaCBvdXRsaW5lIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvcGVyYXRpb24gaXM6Ci0KLQlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0JU3BlY2lmeSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpCi0JU2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uLCBpbmNsdWRpbmcgaW1hZ2Ugc2l6ZSAmIGNvbG9yc3BhY2UKLQlqcGVnX3N0YXJ0X2NvbXByZXNzKC4uLik7Ci0Jd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pCi0JCWpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7Ci0JanBlZ19maW5pc2hfY29tcHJlc3MoLi4uKTsKLQlSZWxlYXNlIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAotCi1BIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGhvbGRzIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgc3RhdGUgZm9yIHRoZSBKUEVHCi1saWJyYXJ5LiAgV2UgbWFrZSBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiB0aGUgb2JqZWN0IHNlcGFyYXRlIGZyb20gc3RhcnRpbmcKLW9yIGZpbmlzaGluZyBjb21wcmVzc2lvbiBvZiBhbiBpbWFnZTsgdGhlIHNhbWUgb2JqZWN0IGNhbiBiZSByZS11c2VkIGZvciBhCi1zZXJpZXMgb2YgaW1hZ2UgY29tcHJlc3Npb24gb3BlcmF0aW9ucy4gIFRoaXMgbWFrZXMgaXQgZWFzeSB0byByZS11c2UgdGhlCi1zYW1lIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgYSBzZXF1ZW5jZSBvZiBpbWFnZXMuICBSZS11c2Ugb2YgYSBKUEVHIG9iamVjdAotYWxzbyBoYXMgaW1wb3J0YW50IGltcGxpY2F0aW9ucyBmb3IgcHJvY2Vzc2luZyBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLAotYXMgZGlzY3Vzc2VkIGxhdGVyLgotCi1UaGUgaW1hZ2UgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHN1cHBsaWVkIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgZnJvbQotaW4tbWVtb3J5IGJ1ZmZlcnMuICBJZiB0aGUgYXBwbGljYXRpb24gaXMgZG9pbmcgZmlsZS10by1maWxlIGNvbXByZXNzaW9uLAotcmVhZGluZyBpbWFnZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBmaWxlIGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5LgotVGhlIGxpYnJhcnkgZW1pdHMgY29tcHJlc3NlZCBkYXRhIGJ5IGNhbGxpbmcgYSAiZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIiwKLXdoaWNoIHR5cGljYWxseSB3aWxsIHdyaXRlIHRoZSBkYXRhIGludG8gYSBmaWxlOyBidXQgdGhlIGFwcGxpY2F0aW9uIGNhbgotcHJvdmlkZSBpdHMgb3duIGRlc3RpbmF0aW9uIG1hbmFnZXIgdG8gZG8gc29tZXRoaW5nIGVsc2UuCi0KLVNpbWlsYXJseSwgdGhlIHJvdWdoIG91dGxpbmUgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uIGlzOgotCi0JQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0Ci0JU3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpCi0JQ2FsbCBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gb2J0YWluIGltYWdlIGluZm8KLQlTZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbgotCWpwZWdfc3RhcnRfZGVjb21wcmVzcyguLi4pOwotCXdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKQotCQlqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7Ci0JanBlZ19maW5pc2hfZGVjb21wcmVzcyguLi4pOwotCVJlbGVhc2UgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKLQotVGhpcyBpcyBjb21wYXJhYmxlIHRvIHRoZSBjb21wcmVzc2lvbiBvdXRsaW5lIGV4Y2VwdCB0aGF0IHJlYWRpbmcgdGhlCi1kYXRhc3RyZWFtIGhlYWRlciBpcyBhIHNlcGFyYXRlIHN0ZXAuICBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIGltYWdlJ3Mgc2l6ZSwgY29sb3JzcGFjZSwgZXRjIGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBhcHBsaWNhdGlvbgotc2VsZWN0cyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZSwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjaG9vc2UgYW4KLW91dHB1dCBzY2FsaW5nIHJhdGlvIHRoYXQgd2lsbCBmaXQgdGhlIGltYWdlIGludG8gdGhlIGF2YWlsYWJsZSBzY3JlZW4gc2l6ZS4KLQotVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYnRhaW5zIGNvbXByZXNzZWQgZGF0YSBieSBjYWxsaW5nIGEgZGF0YSBzb3VyY2UKLW1hbmFnZXIsIHdoaWNoIHR5cGljYWxseSB3aWxsIHJlYWQgdGhlIGRhdGEgZnJvbSBhIGZpbGU7IGJ1dCBvdGhlciBiZWhhdmlvcnMKLWNhbiBiZSBvYnRhaW5lZCB3aXRoIGEgY3VzdG9tIHNvdXJjZSBtYW5hZ2VyLiAgRGVjb21wcmVzc2VkIGRhdGEgaXMgZGVsaXZlcmVkCi1pbnRvIGluLW1lbW9yeSBidWZmZXJzIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCi0KLUl0IGlzIHBvc3NpYmxlIHRvIGFib3J0IGFuIGluY29tcGxldGUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24KLWJ5IGNhbGxpbmcganBlZ19hYm9ydCgpOyBvciwgaWYgeW91IGRvIG5vdCBuZWVkIHRvIHJldGFpbiB0aGUgSlBFRyBvYmplY3QsCi1zaW1wbHkgcmVsZWFzZSBpdCBieSBjYWxsaW5nIGpwZWdfZGVzdHJveSgpLgotCi1KUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMgYXJlIHR3byBzZXBhcmF0ZSBzdHJ1Y3QgdHlwZXMuCi1Ib3dldmVyLCB0aGV5IHNoYXJlIHNvbWUgY29tbW9uIGZpZWxkcywgYW5kIGNlcnRhaW4gcm91dGluZXMgc3VjaCBhcwotanBlZ19kZXN0cm95KCkgY2FuIHdvcmsgb24gZWl0aGVyIHR5cGUgb2Ygb2JqZWN0LgotCi1UaGUgSlBFRyBsaWJyYXJ5IGhhcyBubyBzdGF0aWMgdmFyaWFibGVzOiBhbGwgc3RhdGUgaXMgaW4gdGhlIGNvbXByZXNzaW9uCi1vciBkZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byBwcm9jZXNzIG11bHRpcGxlCi1jb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zIGNvbmN1cnJlbnRseSwgdXNpbmcgbXVsdGlwbGUgSlBFRwotb2JqZWN0cy4KLQotQm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhbiBpbmNyZW1lbnRhbCBtZW1vcnktdG8tCi1tZW1vcnkgZmFzaGlvbiwgaWYgc3VpdGFibGUgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIGFyZSB1c2VkLiAgU2VlIHRoZQotc2VjdGlvbiBvbiAiSS9PIHN1c3BlbnNpb24iIGZvciBtb3JlIGRldGFpbHMuCi0KLQotQkFTSUMgTElCUkFSWSBVU0FHRQotPT09PT09PT09PT09PT09PT09PQotCi1EYXRhIGZvcm1hdHMKLS0tLS0tLS0tLS0tLQotCi1CZWZvcmUgZGl2aW5nIGludG8gcHJvY2VkdXJhbCBkZXRhaWxzLCBpdCBpcyBoZWxwZnVsIHRvIHVuZGVyc3RhbmQgdGhlCi1pbWFnZSBkYXRhIGZvcm1hdCB0aGF0IHRoZSBKUEVHIGxpYnJhcnkgZXhwZWN0cyBvciByZXR1cm5zLgotCi1UaGUgc3RhbmRhcmQgaW5wdXQgaW1hZ2UgZm9ybWF0IGlzIGEgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgcGl4ZWxzLCB3aXRoIGVhY2gKLXBpeGVsIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgImNvbXBvbmVudCIgb3IgInNhbXBsZSIgdmFsdWVzIChjb2xvcgotY2hhbm5lbHMpLiAgWW91IG11c3Qgc3BlY2lmeSBob3cgbWFueSBjb21wb25lbnRzIHRoZXJlIGFyZSBhbmQgdGhlIGNvbG9yc3BhY2UKLWludGVycHJldGF0aW9uIG9mIHRoZSBjb21wb25lbnRzLiAgTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgUkdCIGRhdGEKLSh0aHJlZSBjb21wb25lbnRzIHBlciBwaXhlbCkgb3IgZ3JheXNjYWxlIGRhdGEgKG9uZSBjb21wb25lbnQgcGVyIHBpeGVsKS4KLVBMRUFTRSBOT1RFIFRIQVQgUkdCIERBVEEgSVMgVEhSRUUgU0FNUExFUyBQRVIgUElYRUwsIEdSQVlTQ0FMRSBPTkxZIE9ORS4KLUEgcmVtYXJrYWJsZSBudW1iZXIgb2YgcGVvcGxlIG1hbmFnZSB0byBtaXNzIHRoaXMsIG9ubHkgdG8gZmluZCB0aGF0IHRoZWlyCi1wcm9ncmFtcyBkb24ndCB3b3JrIHdpdGggZ3JheXNjYWxlIEpQRUcgZmlsZXMuCi0KLVRoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgY29sb3JtYXBwZWQgaW5wdXQuICBKUEVHIGZpbGVzIGFyZSBhbHdheXMgZnVsbC1jb2xvcgotb3IgZnVsbCBncmF5c2NhbGUgKG9yIHNvbWV0aW1lcyBhbm90aGVyIGNvbG9yc3BhY2Ugc3VjaCBhcyBDTVlLKS4gIFlvdSBjYW4KLWZlZWQgaW4gYSBjb2xvcm1hcHBlZCBpbWFnZSBieSBleHBhbmRpbmcgaXQgdG8gZnVsbC1jb2xvciBmb3JtYXQuICBIb3dldmVyCi1KUEVHIG9mdGVuIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwgd2l0aCBzb3VyY2UgZGF0YSB0aGF0IGhhcyBiZWVuIGNvbG9ybWFwcGVkLAotYmVjYXVzZSBvZiBkaXRoZXJpbmcgbm9pc2UuICBUaGlzIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgSlBFRyBGQVEKLWFuZCB0aGUgb3RoZXIgcmVmZXJlbmNlcyBtZW50aW9uZWQgaW4gdGhlIFJFQURNRSBmaWxlLgotCi1QaXhlbHMgYXJlIHN0b3JlZCBieSBzY2FubGluZXMsIHdpdGggZWFjaCBzY2FubGluZSBydW5uaW5nIGZyb20gbGVmdCB0bwotcmlnaHQuICBUaGUgY29tcG9uZW50IHZhbHVlcyBmb3IgZWFjaCBwaXhlbCBhcmUgYWRqYWNlbnQgaW4gdGhlIHJvdzsgZm9yCi1leGFtcGxlLCBSLEcsQixSLEcsQixSLEcsQiwuLi4gZm9yIDI0LWJpdCBSR0IgY29sb3IuICBFYWNoIHNjYW5saW5lIGlzIGFuCi1hcnJheSBvZiBkYXRhIHR5cGUgSlNBTVBMRSAtLS0gd2hpY2ggaXMgdHlwaWNhbGx5ICJ1bnNpZ25lZCBjaGFyIiwgdW5sZXNzCi15b3UndmUgY2hhbmdlZCBqbW9yZWNmZy5oLiAgKFlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIFJHQiBwaXhlbCBsYXlvdXQsIHNheQotdG8gQixHLFIgb3JkZXIsIGJ5IG1vZGlmeWluZyBqbW9yZWNmZy5oLiAgQnV0IHNlZSB0aGUgcmVzdHJpY3Rpb25zIGxpc3RlZCBpbgotdGhhdCBmaWxlIGJlZm9yZSBkb2luZyBzby4pCi0KLUEgMi1EIGFycmF5IG9mIHBpeGVscyBpcyBmb3JtZWQgYnkgbWFraW5nIGEgbGlzdCBvZiBwb2ludGVycyB0byB0aGUgc3RhcnRzIG9mCi1zY2FubGluZXM7IHNvIHRoZSBzY2FubGluZXMgbmVlZCBub3QgYmUgcGh5c2ljYWxseSBhZGphY2VudCBpbiBtZW1vcnkuICBFdmVuCi1pZiB5b3UgcHJvY2VzcyBqdXN0IG9uZSBzY2FubGluZSBhdCBhIHRpbWUsIHlvdSBtdXN0IG1ha2UgYSBvbmUtZWxlbWVudAotcG9pbnRlciBhcnJheSB0byBjb25mb3JtIHRvIHRoaXMgc3RydWN0dXJlLiAgUG9pbnRlcnMgdG8gSlNBTVBMRSByb3dzIGFyZSBvZgotdHlwZSBKU0FNUFJPVywgYW5kIHRoZSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIGFycmF5IGlzIG9mIHR5cGUgSlNBTVBBUlJBWS4KLQotVGhlIGxpYnJhcnkgYWNjZXB0cyBvciBzdXBwbGllcyBvbmUgb3IgbW9yZSBjb21wbGV0ZSBzY2FubGluZXMgcGVyIGNhbGwuCi1JdCBpcyBub3QgcG9zc2libGUgdG8gcHJvY2VzcyBwYXJ0IG9mIGEgcm93IGF0IGEgdGltZS4gIFNjYW5saW5lcyBhcmUgYWx3YXlzCi1wcm9jZXNzZWQgdG9wLXRvLWJvdHRvbS4gIFlvdSBjYW4gcHJvY2VzcyBhbiBlbnRpcmUgaW1hZ2UgaW4gb25lIGNhbGwgaWYgeW91Ci1oYXZlIGl0IGFsbCBpbiBtZW1vcnksIGJ1dCB1c3VhbGx5IGl0J3Mgc2ltcGxlc3QgdG8gcHJvY2VzcyBvbmUgc2NhbmxpbmUgYXQKLWEgdGltZS4KLQotRm9yIGJlc3QgcmVzdWx0cywgc291cmNlIGRhdGEgdmFsdWVzIHNob3VsZCBoYXZlIHRoZSBwcmVjaXNpb24gc3BlY2lmaWVkIGJ5Ci1CSVRTX0lOX0pTQU1QTEUgKG5vcm1hbGx5IDggYml0cykuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBjaG9vc2UgdG8gY29tcHJlc3MKLWRhdGEgdGhhdCdzIG9ubHkgNiBiaXRzL2NoYW5uZWwsIHlvdSBzaG91bGQgbGVmdC1qdXN0aWZ5IGVhY2ggdmFsdWUgaW4gYQotYnl0ZSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgY29tcHJlc3Nvci4gIElmIHlvdSBuZWVkIHRvIGNvbXByZXNzIGRhdGEKLXRoYXQgaGFzIG1vcmUgdGhhbiA4IGJpdHMvY2hhbm5lbCwgY29tcGlsZSB3aXRoIEJJVFNfSU5fSlNBTVBMRSA9IDEyLgotKFNlZSAiTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucyIsIGxhdGVyLikKLQotCi1UaGUgZGF0YSBmb3JtYXQgcmV0dXJuZWQgYnkgdGhlIGRlY29tcHJlc3NvciBpcyB0aGUgc2FtZSBpbiBhbGwgZGV0YWlscywKLWV4Y2VwdCB0aGF0IGNvbG9ybWFwcGVkIG91dHB1dCBpcyBzdXBwb3J0ZWQuICAoQWdhaW4sIGEgSlBFRyBmaWxlIGlzIG5ldmVyCi1jb2xvcm1hcHBlZC4gIEJ1dCB5b3UgY2FuIGFzayB0aGUgZGVjb21wcmVzc29yIHRvIHBlcmZvcm0gb24tdGhlLWZseSBjb2xvcgotcXVhbnRpemF0aW9uIHRvIGRlbGl2ZXIgY29sb3JtYXBwZWQgb3V0cHV0LikgIElmIHlvdSByZXF1ZXN0IGNvbG9ybWFwcGVkCi1vdXRwdXQgdGhlbiB0aGUgcmV0dXJuZWQgZGF0YSBhcnJheSBjb250YWlucyBhIHNpbmdsZSBKU0FNUExFIHBlciBwaXhlbDsKLWl0cyB2YWx1ZSBpcyBhbiBpbmRleCBpbnRvIGEgY29sb3IgbWFwLiAgVGhlIGNvbG9yIG1hcCBpcyByZXByZXNlbnRlZCBhcwotYSAyLUQgSlNBTVBBUlJBWSBpbiB3aGljaCBlYWNoIHJvdyBob2xkcyB0aGUgdmFsdWVzIG9mIG9uZSBjb2xvciBjb21wb25lbnQsCi10aGF0IGlzLCBjb2xvcm1hcFtpXVtqXSBpcyB0aGUgdmFsdWUgb2YgdGhlIGkndGggY29sb3IgY29tcG9uZW50IGZvciBwaXhlbAotdmFsdWUgKG1hcCBpbmRleCkgai4gIE5vdGUgdGhhdCBzaW5jZSB0aGUgY29sb3JtYXAgaW5kZXhlcyBhcmUgc3RvcmVkIGluCi1KU0FNUExFcywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyBpcyBsaW1pdGVkIGJ5IHRoZSBzaXplIG9mIEpTQU1QTEUKLShpZSwgYXQgbW9zdCAyNTYgY29sb3JzIGZvciBhbiA4LWJpdCBKUEVHIGxpYnJhcnkpLgotCi0KLUNvbXByZXNzaW9uIGRldGFpbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSGVyZSB3ZSByZXZpc2l0IHRoZSBKUEVHIGNvbXByZXNzaW9uIG91dGxpbmUgZ2l2ZW4gaW4gdGhlIG92ZXJ2aWV3LgotCi0xLiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LgotCi1BIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGlzIGEgInN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCIuICAoSXQgYWxzbyBoYXMKLWEgYnVuY2ggb2Ygc3Vic2lkaWFyeSBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBhbGxvY2F0ZWQgdmlhIG1hbGxvYygpLCBidXQgdGhlCi1hcHBsaWNhdGlvbiBkb2Vzbid0IGNvbnRyb2wgdGhvc2UgZGlyZWN0bHkuKSAgVGhpcyBzdHJ1Y3QgY2FuIGJlIGp1c3QgYSBsb2NhbAotdmFyaWFibGUgaW4gdGhlIGNhbGxpbmcgcm91dGluZSwgaWYgYSBzaW5nbGUgcm91dGluZSBpcyBnb2luZyB0byBleGVjdXRlIHRoZQotd2hvbGUgSlBFRyBjb21wcmVzc2lvbiBzZXF1ZW5jZS4gIE90aGVyd2lzZSBpdCBjYW4gYmUgc3RhdGljIG9yIGFsbG9jYXRlZAotZnJvbSBtYWxsb2MoKS4KLQotWW91IHdpbGwgYWxzbyBuZWVkIGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIEpQRUcgZXJyb3IgaGFuZGxlci4gIFRoZSBwYXJ0Ci1vZiB0aGlzIHRoYXQgdGhlIGxpYnJhcnkgY2FyZXMgYWJvdXQgaXMgYSAic3RydWN0IGpwZWdfZXJyb3JfbWdyIi4gIElmIHlvdQotYXJlIHByb3ZpZGluZyB5b3VyIG93biBlcnJvciBoYW5kbGVyLCB5b3UnbGwgdHlwaWNhbGx5IHdhbnQgdG8gZW1iZWQgdGhlCi1qcGVnX2Vycm9yX21nciBzdHJ1Y3QgaW4gYSBsYXJnZXIgc3RydWN0dXJlOyB0aGlzIGlzIGRpc2N1c3NlZCBsYXRlciB1bmRlcgotIkVycm9yIGhhbmRsaW5nIi4gIEZvciBub3cgd2UnbGwgYXNzdW1lIHlvdSBhcmUganVzdCB1c2luZyB0aGUgZGVmYXVsdCBlcnJvcgotaGFuZGxlci4gIFRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgd2lsbCBwcmludCBKUEVHIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMKLW9uIHN0ZGVyciwgYW5kIGl0IHdpbGwgY2FsbCBleGl0KCkgaWYgYSBmYXRhbCBlcnJvciBvY2N1cnMuCi0KLVlvdSBtdXN0IGluaXRpYWxpemUgdGhlIGVycm9yIGhhbmRsZXIgc3RydWN0dXJlLCBzdG9yZSBhIHBvaW50ZXIgdG8gaXQgaW50bwotdGhlIEpQRUcgb2JqZWN0J3MgImVyciIgZmllbGQsIGFuZCB0aGVuIGNhbGwganBlZ19jcmVhdGVfY29tcHJlc3MoKSB0bwotaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgSlBFRyBvYmplY3QuCi0KLVR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwLCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIsIGlzCi0KLQlzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0Jc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JLi4uCi0JY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0KLWpwZWdfY3JlYXRlX2NvbXByZXNzIGFsbG9jYXRlcyBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnksIHNvIGl0IGNvdWxkIGZhaWwKLWlmIHlvdSBhcmUgb3V0IG9mIG1lbW9yeS4gIEluIHRoYXQgY2FzZSBpdCB3aWxsIGV4aXQgdmlhIHRoZSBlcnJvciBoYW5kbGVyOwotdGhhdCdzIHdoeSB0aGUgZXJyb3IgaGFuZGxlciBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0LgotCi0KLTIuIFNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKS4KLQotQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIHRoZSBKUEVHIGxpYnJhcnkgZGVsaXZlcnMgY29tcHJlc3NlZCBkYXRhIHRvIGEKLSJkYXRhIGRlc3RpbmF0aW9uIiBtb2R1bGUuICBUaGUgbGlicmFyeSBpbmNsdWRlcyBvbmUgZGF0YSBkZXN0aW5hdGlvbgotbW9kdWxlIHdoaWNoIGtub3dzIGhvdyB0byB3cml0ZSB0byBhIHN0ZGlvIHN0cmVhbS4gIFlvdSBjYW4gdXNlIHlvdXIgb3duCi1kZXN0aW5hdGlvbiBtb2R1bGUgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGVsc2UsIGFzIGRpc2N1c3NlZCBsYXRlci4KLQotSWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gbW9kdWxlLCB5b3UgbXVzdCBvcGVuIHRoZSB0YXJnZXQgc3RkaW8KLXN0cmVhbSBiZWZvcmVoYW5kLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgbG9va3MgbGlrZToKLQotCUZJTEUgKiBvdXRmaWxlOwotCS4uLgotCWlmICgob3V0ZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKSkgPT0gTlVMTCkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JanBlZ19zdGRpb19kZXN0KCZjaW5mbywgb3V0ZmlsZSk7Ci0KLXdoZXJlIHRoZSBsYXN0IGxpbmUgaW52b2tlcyB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gbW9kdWxlLgotCi1XQVJOSU5HOiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBiaW5hcnkgY29tcHJlc3NlZCBkYXRhIGJlIGRlbGl2ZXJlZCB0byB0aGUKLW91dHB1dCBmaWxlIHVuY2hhbmdlZC4gIE9uIG5vbi1Vbml4IHN5c3RlbXMgdGhlIHN0ZGlvIGxpYnJhcnkgbWF5IHBlcmZvcm0KLW5ld2xpbmUgdHJhbnNsYXRpb24gb3Igb3RoZXJ3aXNlIGNvcnJ1cHQgYmluYXJ5IGRhdGEuICBUbyBzdXBwcmVzcyB0aGlzCi1iZWhhdmlvciwgeW91IG1heSBuZWVkIHRvIHVzZSBhICJiIiBvcHRpb24gdG8gZm9wZW4gKGFzIHNob3duIGFib3ZlKSwgb3IgdXNlCi1zZXRtb2RlKCkgb3IgYW5vdGhlciByb3V0aW5lIHRvIHB1dCB0aGUgc3RkaW8gc3RyZWFtIGluIGJpbmFyeSBtb2RlLiAgU2VlCi1janBlZy5jIGFuZCBkanBlZy5jIGZvciBjb2RlIHRoYXQgaGFzIGJlZW4gZm91bmQgdG8gd29yayBvbiBtYW55IHN5c3RlbXMuCi0KLVlvdSBjYW4gc2VsZWN0IHRoZSBkYXRhIGRlc3RpbmF0aW9uIGFmdGVyIHNldHRpbmcgb3RoZXIgcGFyYW1ldGVycyAoc3RlcCAzKSwKLWlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuICBZb3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIGJldHdlZW4KLWNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgotCi0KLTMuIFNldCBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2lvbiwgaW5jbHVkaW5nIGltYWdlIHNpemUgJiBjb2xvcnNwYWNlLgotCi1Zb3UgbXVzdCBzdXBwbHkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBpbWFnZSBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcKLWZpZWxkcyBpbiB0aGUgSlBFRyBvYmplY3QgKGNpbmZvIHN0cnVjdHVyZSk6Ci0KLQlpbWFnZV93aWR0aAkJV2lkdGggb2YgaW1hZ2UsIGluIHBpeGVscwotCWltYWdlX2hlaWdodAkJSGVpZ2h0IG9mIGltYWdlLCBpbiBwaXhlbHMKLQlpbnB1dF9jb21wb25lbnRzCU51bWJlciBvZiBjb2xvciBjaGFubmVscyAoc2FtcGxlcyBwZXIgcGl4ZWwpCi0JaW5fY29sb3Jfc3BhY2UJCUNvbG9yIHNwYWNlIG9mIHNvdXJjZSBpbWFnZQotCi1UaGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUsIGhvcGVmdWxseSwgb2J2aW91cy4gIEpQRUcgc3VwcG9ydHMgaW1hZ2UgZGltZW5zaW9ucwotb2YgMSB0byA2NEsgcGl4ZWxzIGluIGVpdGhlciBkaXJlY3Rpb24uICBUaGUgaW5wdXQgY29sb3Igc3BhY2UgaXMgdHlwaWNhbGx5Ci1SR0Igb3IgZ3JheXNjYWxlLCBhbmQgaW5wdXRfY29tcG9uZW50cyBpcyAzIG9yIDEgYWNjb3JkaW5nbHkuICAoU2VlICJTcGVjaWFsCi1jb2xvciBzcGFjZXMiLCBsYXRlciwgZm9yIG1vcmUgaW5mby4pICBUaGUgaW5fY29sb3Jfc3BhY2UgZmllbGQgbXVzdCBiZQotYXNzaWduZWQgb25lIG9mIHRoZSBKX0NPTE9SX1NQQUNFIGVudW0gY29uc3RhbnRzLCB0eXBpY2FsbHkgSkNTX1JHQiBvcgotSkNTX0dSQVlTQ0FMRS4KLQotSlBFRyBoYXMgYSBsYXJnZSBudW1iZXIgb2YgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IGRldGVybWluZSBob3cgdGhlCi1pbWFnZSBpcyBlbmNvZGVkLiAgTW9zdCBhcHBsaWNhdGlvbnMgZG9uJ3QgbmVlZCBvciB3YW50IHRvIGtub3cgYWJvdXQgYWxsCi10aGVzZSBwYXJhbWV0ZXJzLiAgWW91IGNhbiBzZXQgYWxsIHRoZSBwYXJhbWV0ZXJzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgYnkKLWNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKTsgdGhlbiwgaWYgdGhlcmUgYXJlIHBhcnRpY3VsYXIgdmFsdWVzIHlvdSB3YW50Ci10byBjaGFuZ2UsIHlvdSBjYW4gZG8gc28gYWZ0ZXIgdGhhdC4gIFRoZSAiQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbiIKLXNlY3Rpb24gdGVsbHMgYWJvdXQgYWxsIHRoZSBwYXJhbWV0ZXJzLgotCi1Zb3UgbXVzdCBzZXQgaW5fY29sb3Jfc3BhY2UgY29ycmVjdGx5IGJlZm9yZSBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCksCi1iZWNhdXNlIHRoZSBkZWZhdWx0cyBkZXBlbmQgb24gdGhlIHNvdXJjZSBpbWFnZSBjb2xvcnNwYWNlLiAgSG93ZXZlciB0aGUKLW90aGVyIHRocmVlIHNvdXJjZSBpbWFnZSBwYXJhbWV0ZXJzIG5lZWQgbm90IGJlIHZhbGlkIHVudGlsIHlvdSBjYWxsCi1qcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBUaGVyZSdzIG5vIGhhcm0gaW4gY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIG1vcmUKLXRoYW4gb25jZSwgaWYgdGhhdCBoYXBwZW5zIHRvIGJlIGNvbnZlbmllbnQuCi0KLVR5cGljYWwgY29kZSBmb3IgYSAyNC1iaXQgUkdCIHNvdXJjZSBpbWFnZSBpcwotCi0JY2luZm8uaW1hZ2Vfd2lkdGggPSBXaWR0aDsgCS8qIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscyAqLwotCWNpbmZvLmltYWdlX2hlaWdodCA9IEhlaWdodDsKLQljaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbCAqLwotCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLwotCi0JanBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLQkvKiBNYWtlIG9wdGlvbmFsIHBhcmFtZXRlciBzZXR0aW5ncyBoZXJlICovCi0KLQotNC4ganBlZ19zdGFydF9jb21wcmVzcyguLi4pOwotCi1BZnRlciB5b3UgaGF2ZSBlc3RhYmxpc2hlZCB0aGUgZGF0YSBkZXN0aW5hdGlvbiBhbmQgc2V0IGFsbCB0aGUgbmVjZXNzYXJ5Ci1zb3VyY2UgaW1hZ2UgaW5mbyBhbmQgb3RoZXIgcGFyYW1ldGVycywgY2FsbCBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgdG8gYmVnaW4KLWEgY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZSwgYWxsb2NhdGUgd29ya2luZwotc3RvcmFnZSwgYW5kIGVtaXQgdGhlIGZpcnN0IGZldyBieXRlcyBvZiB0aGUgSlBFRyBkYXRhc3RyZWFtIGhlYWRlci4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOwotCi1UaGUgIlRSVUUiIHBhcmFtZXRlciBlbnN1cmVzIHRoYXQgYSBjb21wbGV0ZSBKUEVHIGludGVyY2hhbmdlIGRhdGFzdHJlYW0KLXdpbGwgYmUgd3JpdHRlbi4gIFRoaXMgaXMgYXBwcm9wcmlhdGUgaW4gbW9zdCBjYXNlcy4gIElmIHlvdSB0aGluayB5b3UgbWlnaHQKLXdhbnQgdG8gdXNlIGFuIGFiYnJldmlhdGVkIGRhdGFzdHJlYW0sIHJlYWQgdGhlIHNlY3Rpb24gb24gYWJicmV2aWF0ZWQKLWRhdGFzdHJlYW1zLCBiZWxvdy4KLQotT25jZSB5b3UgaGF2ZSBjYWxsZWQganBlZ19zdGFydF9jb21wcmVzcygpLCB5b3UgbWF5IG5vdCBhbHRlciBhbnkgSlBFRwotcGFyYW1ldGVycyBvciBvdGhlciBmaWVsZHMgb2YgdGhlIEpQRUcgb2JqZWN0IHVudGlsIHlvdSBoYXZlIGNvbXBsZXRlZAotdGhlIGNvbXByZXNzaW9uIGN5Y2xlLgotCi0KLTUuIHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKQotCWpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7Ci0KLU5vdyB3cml0ZSBhbGwgdGhlIHJlcXVpcmVkIGltYWdlIGRhdGEgYnkgY2FsbGluZyBqcGVnX3dyaXRlX3NjYW5saW5lcygpCi1vbmUgb3IgbW9yZSB0aW1lcy4gIFlvdSBjYW4gcGFzcyBvbmUgb3IgbW9yZSBzY2FubGluZXMgaW4gZWFjaCBjYWxsLCB1cAotdG8gdGhlIHRvdGFsIGltYWdlIGhlaWdodC4gIEluIG1vc3QgYXBwbGljYXRpb25zIGl0IGlzIGNvbnZlbmllbnQgdG8gcGFzcwotanVzdCBvbmUgb3IgYSBmZXcgc2NhbmxpbmVzIGF0IGEgdGltZS4gIFRoZSBleHBlY3RlZCBmb3JtYXQgZm9yIHRoZSBwYXNzZWQKLWRhdGEgaXMgZGlzY3Vzc2VkIHVuZGVyICJEYXRhIGZvcm1hdHMiLCBhYm92ZS4KLQotSW1hZ2UgZGF0YSBzaG91bGQgYmUgd3JpdHRlbiBpbiB0b3AtdG8tYm90dG9tIHNjYW5saW5lIG9yZGVyLiAgVGhlIEpQRUcgc3BlYwotY29udGFpbnMgc29tZSB3ZWFzZWwgd29yZGluZyBhYm91dCBob3cgdG9wIGFuZCBib3R0b20gYXJlIGFwcGxpY2F0aW9uLWRlZmluZWQKLXRlcm1zIChhIGN1cmlvdXMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIEVuZ2xpc2ggbGFuZ3VhZ2UuLi4pIGJ1dCBpZiB5b3Ugd2FudAoteW91ciBmaWxlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggZXZlcnlvbmUgZWxzZSdzLCB5b3UgV0lMTCB1c2UgdG9wLXRvLWJvdHRvbQotb3JkZXIuICBJZiB0aGUgc291cmNlIGRhdGEgbXVzdCBiZSByZWFkIGluIGJvdHRvbS10by10b3Agb3JkZXIsIHlvdSBjYW4gdXNlCi10aGUgSlBFRyBsaWJyYXJ5J3MgdmlydHVhbCBhcnJheSBtZWNoYW5pc20gdG8gaW52ZXJ0IHRoZSBkYXRhIGVmZmljaWVudGx5LgotRXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBjanBlZy4KLQotVGhlIGxpYnJhcnkgbWFpbnRhaW5zIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBzY2FubGluZXMgd3JpdHRlbiBzbyBmYXIKLWluIHRoZSBuZXh0X3NjYW5saW5lIGZpZWxkIG9mIHRoZSBKUEVHIG9iamVjdC4gIFVzdWFsbHkgeW91IGNhbiBqdXN0IHVzZQotdGhpcyB2YXJpYWJsZSBhcyB0aGUgbG9vcCBjb3VudGVyLCBzbyB0aGF0IHRoZSBsb29wIHRlc3QgbG9va3MgbGlrZQotIndoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSIuCi0KLUNvZGUgZm9yIHRoaXMgc3RlcCBkZXBlbmRzIGhlYXZpbHkgb24gdGhlIHdheSB0aGF0IHlvdSBzdG9yZSB0aGUgc291cmNlIGRhdGEuCi1leGFtcGxlLmMgc2hvd3MgdGhlIGZvbGxvd2luZyBjb2RlIGZvciB0aGUgY2FzZSBvZiBhIGZ1bGwtc2l6ZSAyLUQgc291cmNlCi1hcnJheSBjb250YWluaW5nIDMtYnl0ZSBSR0IgcGl4ZWxzOgotCi0JSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CS8qIHBvaW50ZXIgdG8gYSBzaW5nbGUgcm93ICovCi0JaW50IHJvd19zdHJpZGU7CQkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIGJ1ZmZlciAqLwotCi0Jcm93X3N0cmlkZSA9IGltYWdlX3dpZHRoICogMzsJLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBpbWFnZV9idWZmZXIgKi8KLQotCXdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7Ci0JICAgIHJvd19wb2ludGVyWzBdID0gJiBpbWFnZV9idWZmZXJbY2luZm8ubmV4dF9zY2FubGluZSAqIHJvd19zdHJpZGVdOwotCSAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd19wb2ludGVyLCAxKTsKLQl9Ci0KLWpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSB3cml0dGVuLgotVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgcGFzc2VkIGluLCBzbyB5b3UgY2FuIHVzdWFsbHkKLWlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLiAgSXQgaXMgZGlmZmVyZW50IGluIGp1c3QgdHdvIGNhc2VzOgotICAqIElmIHlvdSB0cnkgdG8gd3JpdGUgbW9yZSBzY2FubGluZXMgdGhhbiB0aGUgZGVjbGFyZWQgaW1hZ2UgaGVpZ2h0LAotICAgIHRoZSBhZGRpdGlvbmFsIHNjYW5saW5lcyBhcmUgaWdub3JlZC4KLSAgKiBJZiB5b3UgdXNlIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIsIG91dHB1dCBidWZmZXIgb3ZlcnJ1bgotICAgIHdpbGwgY2F1c2UgdGhlIGNvbXByZXNzb3IgdG8gcmV0dXJuIGJlZm9yZSBhY2NlcHRpbmcgYWxsIHRoZSBwYXNzZWQgbGluZXMuCi0gICAgVGhpcyBmZWF0dXJlIGlzIGRpc2N1c3NlZCB1bmRlciAiSS9PIHN1c3BlbnNpb24iLCBiZWxvdy4gIFRoZSBub3JtYWwKLSAgICBzdGRpbyBkZXN0aW5hdGlvbiBtYW5hZ2VyIHdpbGwgTk9UIGNhdXNlIHRoaXMgdG8gaGFwcGVuLgotSW4gYW55IGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGNoYW5nZSBpbiB0aGUgdmFsdWUgb2YKLW5leHRfc2NhbmxpbmUuCi0KLQotNi4ganBlZ19maW5pc2hfY29tcHJlc3MoLi4uKTsKLQotQWZ0ZXIgYWxsIHRoZSBpbWFnZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sIGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSB0bwotY29tcGxldGUgdGhlIGNvbXByZXNzaW9uIGN5Y2xlLiAgVGhpcyBzdGVwIGlzIEVTU0VOVElBTCB0byBlbnN1cmUgdGhhdCB0aGUKLWxhc3QgYnVmZmVybG9hZCBvZiBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIGRhdGEgZGVzdGluYXRpb24uCi1qcGVnX2ZpbmlzaF9jb21wcmVzcygpIGFsc28gcmVsZWFzZXMgd29ya2luZyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEVHCi1vYmplY3QuCi0KLVR5cGljYWwgY29kZToKLQotCWpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7Ci0KLUlmIHVzaW5nIHRoZSBzdGRpbyBkZXN0aW5hdGlvbiBtYW5hZ2VyLCBkb24ndCBmb3JnZXQgdG8gY2xvc2UgdGhlIG91dHB1dAotc3RkaW8gc3RyZWFtIChpZiBuZWNlc3NhcnkpIGFmdGVyd2FyZHMuCi0KLUlmIHlvdSBoYXZlIHJlcXVlc3RlZCBhIG11bHRpLXBhc3Mgb3BlcmF0aW5nIG1vZGUsIHN1Y2ggYXMgSHVmZm1hbiBjb2RlCi1vcHRpbWl6YXRpb24sIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgd2lsbCBwZXJmb3JtIHRoZSBhZGRpdGlvbmFsIHBhc3NlcyB1c2luZwotZGF0YSBidWZmZXJlZCBieSB0aGUgZmlyc3QgcGFzcy4gIEluIHRoaXMgY2FzZSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIG1heSB0YWtlCi1xdWl0ZSBhIHdoaWxlIHRvIGNvbXBsZXRlLiAgV2l0aCB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLCB0aGlzIHdpbGwKLW5vdCBoYXBwZW4uCi0KLUl0IGlzIGFuIGVycm9yIHRvIGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSBiZWZvcmUgd3JpdGluZyB0aGUgbmVjZXNzYXJ5Ci10b3RhbCBudW1iZXIgb2Ygc2NhbmxpbmVzLiAgSWYgeW91IHdpc2ggdG8gYWJvcnQgY29tcHJlc3Npb24sIGNhbGwKLWpwZWdfYWJvcnQoKSBhcyBkaXNjdXNzZWQgYmVsb3cuCi0KLUFmdGVyIGNvbXBsZXRpbmcgYSBjb21wcmVzc2lvbiBjeWNsZSwgeW91IG1heSBkaXNwb3NlIG9mIHRoZSBKUEVHIG9iamVjdAotYXMgZGlzY3Vzc2VkIG5leHQsIG9yIHlvdSBtYXkgdXNlIGl0IHRvIGNvbXByZXNzIGFub3RoZXIgaW1hZ2UuICBJbiB0aGF0IGNhc2UKLXJldHVybiB0byBzdGVwIDIsIDMsIG9yIDQgYXMgYXBwcm9wcmlhdGUuICBJZiB5b3UgZG8gbm90IGNoYW5nZSB0aGUKLWRlc3RpbmF0aW9uIG1hbmFnZXIsIHRoZSBuZXcgZGF0YXN0cmVhbSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgdGFyZ2V0LgotSWYgeW91IGRvIG5vdCBjaGFuZ2UgYW55IEpQRUcgcGFyYW1ldGVycywgdGhlIG5ldyBkYXRhc3RyZWFtIHdpbGwgYmUgd3JpdHRlbgotd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGJlZm9yZS4gIE5vdGUgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgaW5wdXQgaW1hZ2UKLWRpbWVuc2lvbnMgZnJlZWx5IGJldHdlZW4gY3ljbGVzLCBidXQgaWYgeW91IGNoYW5nZSB0aGUgaW5wdXQgY29sb3JzcGFjZSwgeW91Ci1zaG91bGQgY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpIHRvIGFkanVzdCBmb3IgdGhlIG5ldyBjb2xvcnNwYWNlOyBhbmQgdGhlbgoteW91J2xsIG5lZWQgdG8gcmVwZWF0IGFsbCBvZiBzdGVwIDMuCi0KLQotNy4gUmVsZWFzZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCi0KLVdoZW4geW91IGFyZSBkb25lIHdpdGggYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCwgZGVzdHJveSBpdCBieSBjYWxsaW5nCi1qcGVnX2Rlc3Ryb3lfY29tcHJlc3MoKS4gIFRoaXMgd2lsbCBmcmVlIGFsbCBzdWJzaWRpYXJ5IG1lbW9yeSAocmVnYXJkbGVzcyBvZgotdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBvYmplY3QpLiAgT3IgeW91IGNhbiBjYWxsIGpwZWdfZGVzdHJveSgpLCB3aGljaAotd29ya3MgZm9yIGVpdGhlciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9iamVjdHMgLS0tIHRoaXMgbWF5IGJlIG1vcmUKLWNvbnZlbmllbnQgaWYgeW91IGFyZSBzaGFyaW5nIGNvZGUgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotY2FzZXMuICAoQWN0dWFsbHksIHRoZXNlIHJvdXRpbmVzIGFyZSBlcXVpdmFsZW50IGV4Y2VwdCBmb3IgdGhlIGRlY2xhcmVkIHR5cGUKLW9mIHRoZSBwYXNzZWQgcG9pbnRlci4gIFRvIGF2b2lkIGdyaXBlcyBmcm9tIEFOU0kgQyBjb21waWxlcnMsIGpwZWdfZGVzdHJveSgpCi1zaG91bGQgYmUgcGFzc2VkIGEgal9jb21tb25fcHRyLikKLQotSWYgeW91IGFsbG9jYXRlZCB0aGUganBlZ19jb21wcmVzc19zdHJ1Y3Qgc3RydWN0dXJlIGZyb20gbWFsbG9jKCksIGZyZWVpbmcKLWl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgLS0tIGpwZWdfZGVzdHJveSgpIHdvbid0LiAgRGl0dG8gZm9yIHRoZSBlcnJvcgotaGFuZGxlciBzdHJ1Y3R1cmUuCi0KLVR5cGljYWwgY29kZToKLQotCWpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOwotCi0KLTguIEFib3J0aW5nLgotCi1JZiB5b3UgZGVjaWRlIHRvIGFib3J0IGEgY29tcHJlc3Npb24gY3ljbGUgYmVmb3JlIGZpbmlzaGluZywgeW91IGNhbiBjbGVhbiB1cAotaW4gZWl0aGVyIG9mIHR3byB3YXlzOgotCi0qIElmIHlvdSBkb24ndCBuZWVkIHRoZSBKUEVHIG9iamVjdCBhbnkgbW9yZSwganVzdCBjYWxsCi0gIGpwZWdfZGVzdHJveV9jb21wcmVzcygpIG9yIGpwZWdfZGVzdHJveSgpIHRvIHJlbGVhc2UgbWVtb3J5LiAgVGhpcyBpcwotICBsZWdpdGltYXRlIGF0IGFueSBwb2ludCBhZnRlciBjYWxsaW5nIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgLS0tIGluIGZhY3QsCi0gIGl0J3Mgc2FmZSBldmVuIGlmIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgZmFpbHMuCi0KLSogSWYgeW91IHdhbnQgdG8gcmUtdXNlIHRoZSBKUEVHIG9iamVjdCwgY2FsbCBqcGVnX2Fib3J0X2NvbXByZXNzKCksIG9yIGNhbGwKLSAganBlZ19hYm9ydCgpIHdoaWNoIHdvcmtzIG9uIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cy4KLSAgVGhpcyB3aWxsIHJldHVybiB0aGUgb2JqZWN0IHRvIGFuIGlkbGUgc3RhdGUsIHJlbGVhc2luZyBhbnkgd29ya2luZyBtZW1vcnkuCi0gIGpwZWdfYWJvcnQoKSBpcyBhbGxvd2VkIGF0IGFueSB0aW1lIGFmdGVyIHN1Y2Nlc3NmdWwgb2JqZWN0IGNyZWF0aW9uLgotCi1Ob3RlIHRoYXQgY2xlYW5pbmcgdXAgdGhlIGRhdGEgZGVzdGluYXRpb24sIGlmIHJlcXVpcmVkLCBpcyB5b3VyCi1yZXNwb25zaWJpbGl0eTsgbmVpdGhlciBvZiB0aGVzZSByb3V0aW5lcyB3aWxsIGNhbGwgdGVybV9kZXN0aW5hdGlvbigpLgotKFNlZSAiQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIiwgYmVsb3csIGZvciBtb3JlIGFib3V0IHRoYXQuKQotCi1qcGVnX2Rlc3Ryb3koKSBhbmQganBlZ19hYm9ydCgpIGFyZSB0aGUgb25seSBzYWZlIGNhbGxzIHRvIG1ha2Ugb24gYSBKUEVHCi1vYmplY3QgdGhhdCBoYXMgcmVwb3J0ZWQgYW4gZXJyb3IgYnkgY2FsbGluZyBlcnJvcl9leGl0IChzZWUgIkVycm9yIGhhbmRsaW5nIgotZm9yIG1vcmUgaW5mbykuICBUaGUgaW50ZXJuYWwgc3RhdGUgb2Ygc3VjaCBhbiBvYmplY3QgaXMgbGlrZWx5IHRvIGJlIG91dCBvZgotd2hhY2suICBFaXRoZXIgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgdG8gYSBrbm93biBzdGF0ZS4KLQotCi1EZWNvbXByZXNzaW9uIGRldGFpbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IZXJlIHdlIHJldmlzaXQgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvdXRsaW5lIGdpdmVuIGluIHRoZSBvdmVydmlldy4KLQotMS4gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgotCi1UaGlzIGlzIGp1c3QgbGlrZSBpbml0aWFsaXphdGlvbiBmb3IgY29tcHJlc3Npb24sIGFzIGRpc2N1c3NlZCBhYm92ZSwKLWV4Y2VwdCB0aGF0IHRoZSBvYmplY3QgaXMgYSAic3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QiIGFuZCB5b3UKLWNhbGwganBlZ19jcmVhdGVfZGVjb21wcmVzcygpLiAgRXJyb3IgaGFuZGxpbmcgaXMgZXhhY3RseSB0aGUgc2FtZS4KLQotVHlwaWNhbCBjb2RlOgotCi0Jc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0Jc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JLi4uCi0JY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOwotCWpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKLQotKEJvdGggaGVyZSBhbmQgaW4gdGhlIElKRyBjb2RlLCB3ZSB1c3VhbGx5IHVzZSB2YXJpYWJsZSBuYW1lICJjaW5mbyIgZm9yCi1ib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMuKQotCi0KLTIuIFNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKS4KLQotQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIHRoZSBKUEVHIGxpYnJhcnkgcmVhZHMgY29tcHJlc3NlZCBkYXRhIGZyb20gYSAiZGF0YQotc291cmNlIiBtb2R1bGUuICBUaGUgbGlicmFyeSBpbmNsdWRlcyBvbmUgZGF0YSBzb3VyY2UgbW9kdWxlIHdoaWNoIGtub3dzIGhvdwotdG8gcmVhZCBmcm9tIGEgc3RkaW8gc3RyZWFtLiAgWW91IGNhbiB1c2UgeW91ciBvd24gc291cmNlIG1vZHVsZSBpZiB5b3Ugd2FudAotdG8gZG8gc29tZXRoaW5nIGVsc2UsIGFzIGRpc2N1c3NlZCBsYXRlci4KLQotSWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgc291cmNlIG1vZHVsZSwgeW91IG11c3Qgb3BlbiB0aGUgc291cmNlIHN0ZGlvIHN0cmVhbQotYmVmb3JlaGFuZC4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGxvb2tzIGxpa2U6Ci0KLQlGSUxFICogaW5maWxlOwotCS4uLgotCWlmICgoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwotCSAgICBleGl0KDEpOwotCX0KLQlqcGVnX3N0ZGlvX3NyYygmY2luZm8sIGluZmlsZSk7Ci0KLXdoZXJlIHRoZSBsYXN0IGxpbmUgaW52b2tlcyB0aGUgc3RhbmRhcmQgc291cmNlIG1vZHVsZS4KLQotV0FSTklORzogaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgYmluYXJ5IGNvbXByZXNzZWQgZGF0YSBiZSByZWFkIHVuY2hhbmdlZC4KLU9uIG5vbi1Vbml4IHN5c3RlbXMgdGhlIHN0ZGlvIGxpYnJhcnkgbWF5IHBlcmZvcm0gbmV3bGluZSB0cmFuc2xhdGlvbiBvcgotb3RoZXJ3aXNlIGNvcnJ1cHQgYmluYXJ5IGRhdGEuICBUbyBzdXBwcmVzcyB0aGlzIGJlaGF2aW9yLCB5b3UgbWF5IG5lZWQgdG8gdXNlCi1hICJiIiBvcHRpb24gdG8gZm9wZW4gKGFzIHNob3duIGFib3ZlKSwgb3IgdXNlIHNldG1vZGUoKSBvciBhbm90aGVyIHJvdXRpbmUgdG8KLXB1dCB0aGUgc3RkaW8gc3RyZWFtIGluIGJpbmFyeSBtb2RlLiAgU2VlIGNqcGVnLmMgYW5kIGRqcGVnLmMgZm9yIGNvZGUgdGhhdAotaGFzIGJlZW4gZm91bmQgdG8gd29yayBvbiBtYW55IHN5c3RlbXMuCi0KLVlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZGF0YSBzb3VyY2UgYmV0d2VlbiBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIoKSBhbmQKLWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4gIElmIHlvdSB3aXNoIHRvIHJlYWQgYSBzZXJpZXMgb2YgSlBFRyBpbWFnZXMgZnJvbQotYSBzaW5nbGUgc291cmNlIGZpbGUsIHlvdSBzaG91bGQgcmVwZWF0IHRoZSBqcGVnX3JlYWRfaGVhZGVyKCkgdG8KLWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBzZXF1ZW5jZSB3aXRob3V0IHJlaW5pdGlhbGl6aW5nIGVpdGhlciB0aGUgSlBFRwotb2JqZWN0IG9yIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGU7IHRoaXMgcHJldmVudHMgYnVmZmVyZWQgaW5wdXQgZGF0YSBmcm9tCi1iZWluZyBkaXNjYXJkZWQuCi0KLQotMy4gQ2FsbCBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gb2J0YWluIGltYWdlIGluZm8uCi0KLVR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGlzIGp1c3QKLQotCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKLQotVGhpcyB3aWxsIHJlYWQgdGhlIHNvdXJjZSBkYXRhc3RyZWFtIGhlYWRlciBtYXJrZXJzLCB1cCB0byB0aGUgYmVnaW5uaW5nCi1vZiB0aGUgY29tcHJlc3NlZCBkYXRhIHByb3Blci4gIE9uIHJldHVybiwgdGhlIGltYWdlIGRpbWVuc2lvbnMgYW5kIG90aGVyCi1pbmZvIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIEpQRUcgb2JqZWN0LiAgVGhlIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvCi1jb25zdWx0IHRoaXMgaW5mb3JtYXRpb24gYmVmb3JlIHNlbGVjdGluZyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCi0KLU1vcmUgY29tcGxleCBjb2RlIGlzIG5lY2Vzc2FyeSBpZgotICAqIEEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIC0tLSBpbiB0aGF0IGNhc2UganBlZ19yZWFkX2hlYWRlcigpCi0gICAgbWF5IHJldHVybiBiZWZvcmUgaXQgaGFzIHJlYWQgYWxsIHRoZSBoZWFkZXIgZGF0YS4gIFNlZSAiSS9PIHN1c3BlbnNpb24iLAotICAgIGJlbG93LiAgVGhlIG5vcm1hbCBzdGRpbyBzb3VyY2UgbWFuYWdlciB3aWxsIE5PVCBjYXVzZSB0aGlzIHRvIGhhcHBlbi4KLSAgKiBBYmJyZXZpYXRlZCBKUEVHIGZpbGVzIGFyZSB0byBiZSBwcm9jZXNzZWQgLS0tIHNlZSB0aGUgc2VjdGlvbiBvbgotICAgIGFiYnJldmlhdGVkIGRhdGFzdHJlYW1zLiAgU3RhbmRhcmQgYXBwbGljYXRpb25zIHRoYXQgZGVhbCBvbmx5IGluCi0gICAgaW50ZXJjaGFuZ2UgSlBFRyBmaWxlcyBuZWVkIG5vdCBiZSBjb25jZXJuZWQgd2l0aCB0aGlzIGNhc2UgZWl0aGVyLgotCi1JdCBpcyBwZXJtaXNzaWJsZSB0byBzdG9wIGF0IHRoaXMgcG9pbnQgaWYgeW91IGp1c3Qgd2FudGVkIHRvIGZpbmQgb3V0IHRoZQotaW1hZ2UgZGltZW5zaW9ucyBhbmQgb3RoZXIgaGVhZGVyIGluZm8gZm9yIGEgSlBFRyBmaWxlLiAgSW4gdGhhdCBjYXNlLAotY2FsbCBqcGVnX2Rlc3Ryb3koKSB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZSBKUEVHIG9iamVjdCwgb3IgY2FsbAotanBlZ19hYm9ydCgpIHRvIHJldHVybiBpdCB0byBhbiBpZGxlIHN0YXRlIGJlZm9yZSBzZWxlY3RpbmcgYSBuZXcgZGF0YQotc291cmNlIGFuZCByZWFkaW5nIGFub3RoZXIgaGVhZGVyLgotCi0KLTQuIFNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uLgotCi1qcGVnX3JlYWRfaGVhZGVyKCkgc2V0cyBhcHByb3ByaWF0ZSBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBiYXNlZCBvbgotdGhlIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlIChpbiBwYXJ0aWN1bGFyLCBpdHMgY29sb3JzcGFjZSkuICBIb3dldmVyLCB5b3UKLW1heSB3ZWxsIHdhbnQgdG8gYWx0ZXIgdGhlc2UgZGVmYXVsdHMgYmVmb3JlIGJlZ2lubmluZyB0aGUgZGVjb21wcmVzc2lvbi4KLUZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBpcyB0byBwcm9kdWNlIGZ1bGwgY29sb3Igb3V0cHV0IGZyb20gYSBjb2xvciBmaWxlLgotSWYgeW91IHdhbnQgY29sb3JtYXBwZWQgb3V0cHV0IHlvdSBtdXN0IGFzayBmb3IgaXQuICBPdGhlciBvcHRpb25zIGFsbG93IHRoZQotcmV0dXJuZWQgaW1hZ2UgdG8gYmUgc2NhbGVkIGFuZCBhbGxvdyB2YXJpb3VzIHNwZWVkL3F1YWxpdHkgdHJhZGVvZmZzIHRvIGJlCi1zZWxlY3RlZC4gICJEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24iLCBiZWxvdywgZ2l2ZXMgZGV0YWlscy4KLQotSWYgdGhlIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSwgbm90aGluZyBuZWVkIGJlIGRvbmUgYXQgdGhpcyBzdGVwLgotCi1Ob3RlIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgYnkgZWFjaCBjYWxsIHRvIGpwZWdfcmVhZF9oZWFkZXIoKS4KLUlmIHlvdSByZXVzZSBhIGRlY29tcHJlc3Npb24gb2JqZWN0LCB5b3UgY2Fubm90IGV4cGVjdCB5b3VyIHBhcmFtZXRlcgotc2V0dGluZ3MgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBjeWNsZXMsIGFzIHlvdSBjYW4gZm9yIGNvbXByZXNzaW9uLgotWW91IG11c3Qgc2V0IGRlc2lyZWQgcGFyYW1ldGVyIHZhbHVlcyBlYWNoIHRpbWUuCi0KLQotNS4ganBlZ19zdGFydF9kZWNvbXByZXNzKC4uLik7Ci0KLU9uY2UgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHNhdGlzZmFjdG9yeSwgY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB0bwotYmVnaW4gZGVjb21wcmVzc2lvbi4gIFRoaXMgd2lsbCBpbml0aWFsaXplIGludGVybmFsIHN0YXRlLCBhbGxvY2F0ZSB3b3JraW5nCi1tZW1vcnksIGFuZCBwcmVwYXJlIGZvciByZXR1cm5pbmcgZGF0YS4KLQotVHlwaWNhbCBjb2RlIGlzIGp1c3QKLQotCWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotCi1JZiB5b3UgaGF2ZSByZXF1ZXN0ZWQgYSBtdWx0aS1wYXNzIG9wZXJhdGluZyBtb2RlLCBzdWNoIGFzIDItcGFzcyBjb2xvcgotcXVhbnRpemF0aW9uLCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB3aWxsIGRvIGV2ZXJ5dGhpbmcgbmVlZGVkIGJlZm9yZSBkYXRhCi1vdXRwdXQgY2FuIGJlZ2luLiAgSW4gdGhpcyBjYXNlIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIG1heSB0YWtlIHF1aXRlIGEgd2hpbGUKLXRvIGNvbXBsZXRlLiAgV2l0aCBhIHNpbmdsZS1zY2FuIChub24gcHJvZ3Jlc3NpdmUpIEpQRUcgZmlsZSBhbmQgZGVmYXVsdAotZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLCB0aGlzIHdpbGwgbm90IGhhcHBlbjsganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2lsbAotcmV0dXJuIHF1aWNrbHkuCi0KLUFmdGVyIHRoaXMgY2FsbCwgdGhlIGZpbmFsIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zLCBpbmNsdWRpbmcgYW55IHJlcXVlc3RlZAotc2NhbGluZywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgSlBFRyBvYmplY3Q7IHNvIGlzIHRoZSBzZWxlY3RlZCBjb2xvcm1hcCwgaWYKLWNvbG9ybWFwcGVkIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQuICBVc2VmdWwgZmllbGRzIGluY2x1ZGUKLQotCW91dHB1dF93aWR0aAkJaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCwgYXMgc2NhbGVkCi0Jb3V0cHV0X2hlaWdodAotCW91dF9jb2xvcl9jb21wb25lbnRzCSMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UKLQlvdXRwdXRfY29tcG9uZW50cwkjIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQgcGVyIHBpeGVsCi0JY29sb3JtYXAJCXRoZSBzZWxlY3RlZCBjb2xvcm1hcCwgaWYgYW55Ci0JYWN0dWFsX251bWJlcl9vZl9jb2xvcnMJCW51bWJlciBvZiBlbnRyaWVzIGluIGNvbG9ybWFwCi0KLW91dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7IG90aGVyd2lzZSBpdAotZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLiAgSXQgaXMgdGhlIG51bWJlciBvZiBKU0FNUExFIHZhbHVlcyB0aGF0IHdpbGwgYmUKLWVtaXR0ZWQgcGVyIHBpeGVsIGluIHRoZSBvdXRwdXQgYXJyYXlzLgotCi1UeXBpY2FsbHkgeW91IHdpbGwgbmVlZCB0byBhbGxvY2F0ZSBkYXRhIGJ1ZmZlcnMgdG8gaG9sZCB0aGUgaW5jb21pbmcgaW1hZ2UuCi1Zb3Ugd2lsbCBuZWVkIG91dHB1dF93aWR0aCAqIG91dHB1dF9jb21wb25lbnRzIEpTQU1QTEVzIHBlciBzY2FubGluZSBpbiB5b3VyCi1vdXRwdXQgYnVmZmVyLCBhbmQgYSB0b3RhbCBvZiBvdXRwdXRfaGVpZ2h0IHNjYW5saW5lcyB3aWxsIGJlIHJldHVybmVkLgotCi1Ob3RlOiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZQotZGF0YSBidWZmZXJzIChhcyBkanBlZyBkb2VzKSwgdGhlbiB0aGUgbWFuYWdlcidzIHByb3RvY29sIHJlcXVpcmVzIHRoYXQgeW91Ci1yZXF1ZXN0IGxhcmdlIGJ1ZmZlcnMgKmJlZm9yZSogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIFRoaXMgaXMgYQotbGl0dGxlIHRyaWNreSBzaW5jZSB0aGUgb3V0cHV0X1hYWCBmaWVsZHMgYXJlIG5vdCBub3JtYWxseSB2YWxpZCB0aGVuLiAgWW91Ci1jYW4gbWFrZSB0aGVtIHZhbGlkIGJ5IGNhbGxpbmcganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkgYWZ0ZXIgc2V0dGluZyB0aGUKLXJlbGV2YW50IHBhcmFtZXRlcnMgKHNjYWxpbmcsIG91dHB1dCBjb2xvciBzcGFjZSwgYW5kIHF1YW50aXphdGlvbiBmbGFnKS4KLQotCi02LiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkKLQlqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7Ci0KLU5vdyB5b3UgY2FuIHJlYWQgdGhlIGRlY29tcHJlc3NlZCBpbWFnZSBkYXRhIGJ5IGNhbGxpbmcganBlZ19yZWFkX3NjYW5saW5lcygpCi1vbmUgb3IgbW9yZSB0aW1lcy4gIEF0IGVhY2ggY2FsbCwgeW91IHBhc3MgaW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYW5saW5lcwotdG8gYmUgcmVhZCAoaWUsIHRoZSBoZWlnaHQgb2YgeW91ciB3b3JraW5nIGJ1ZmZlcik7IGpwZWdfcmVhZF9zY2FubGluZXMoKQotd2lsbCByZXR1cm4gdXAgdG8gdGhhdCBtYW55IGxpbmVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzCi1hY3R1YWxseSByZWFkLiAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgZGF0YSBpcyBkaXNjdXNzZWQgdW5kZXIgIkRhdGEKLWZvcm1hdHMiLCBhYm92ZS4gIERvbid0IGZvcmdldCB0aGF0IGdyYXlzY2FsZSBhbmQgY29sb3IgSlBFR3Mgd2lsbCByZXR1cm4KLWRpZmZlcmVudCBkYXRhIGZvcm1hdHMhCi0KLUltYWdlIGRhdGEgaXMgcmV0dXJuZWQgaW4gdG9wLXRvLWJvdHRvbSBzY2FubGluZSBvcmRlci4gIElmIHlvdSBtdXN0IHdyaXRlCi1vdXQgdGhlIGltYWdlIGluIGJvdHRvbS10by10b3Agb3JkZXIsIHlvdSBjYW4gdXNlIHRoZSBKUEVHIGxpYnJhcnkncyB2aXJ0dWFsCi1hcnJheSBtZWNoYW5pc20gdG8gaW52ZXJ0IHRoZSBkYXRhIGVmZmljaWVudGx5LiAgRXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUKLWZvdW5kIGluIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gZGpwZWcuCi0KLVRoZSBsaWJyYXJ5IG1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIHJldHVybmVkIHNvIGZhcgotaW4gdGhlIG91dHB1dF9zY2FubGluZSBmaWVsZCBvZiB0aGUgSlBFRyBvYmplY3QuICBVc3VhbGx5IHlvdSBjYW4ganVzdCB1c2UKLXRoaXMgdmFyaWFibGUgYXMgdGhlIGxvb3AgY291bnRlciwgc28gdGhhdCB0aGUgbG9vcCB0ZXN0IGxvb2tzIGxpa2UKLSJ3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkiLiAgKE5vdGUgdGhhdCB0aGUgdGVzdAotc2hvdWxkIE5PVCBiZSBhZ2FpbnN0IGltYWdlX2hlaWdodCwgdW5sZXNzIHlvdSBuZXZlciB1c2Ugc2NhbGluZy4gIFRoZQotaW1hZ2VfaGVpZ2h0IGZpZWxkIGlzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsIHVuc2NhbGVkIGltYWdlLikKLVRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGVxdWFscyB0aGUgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiBvdXRwdXRfc2NhbmxpbmUuCi0KLUlmIHlvdSBkb24ndCB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0Ci1qcGVnX3JlYWRfc2NhbmxpbmVzKCkgcmVhZHMgYXQgbGVhc3Qgb25lIHNjYW5saW5lIHBlciBjYWxsLCB1bnRpbCB0aGUKLWJvdHRvbSBvZiB0aGUgaW1hZ2UgaGFzIGJlZW4gcmVhY2hlZC4KLQotSWYgeW91IHVzZSBhIGJ1ZmZlciBsYXJnZXIgdGhhbiBvbmUgc2NhbmxpbmUsIGl0IGlzIE5PVCBzYWZlIHRvIGFzc3VtZSB0aGF0Ci1qcGVnX3JlYWRfc2NhbmxpbmVzKCkgZmlsbHMgaXQuICAoVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBvbmx5IGEKLWZldyBzY2FubGluZXMgcGVyIGNhbGwsIG5vIG1hdHRlciBob3cgbGFyZ2UgYSBidWZmZXIgeW91IHBhc3MuKSAgU28geW91IG11c3QKLWFsd2F5cyBwcm92aWRlIGEgbG9vcCB0aGF0IGNhbGxzIGpwZWdfcmVhZF9zY2FubGluZXMoKSByZXBlYXRlZGx5IHVudGlsIHRoZQotd2hvbGUgaW1hZ2UgaGFzIGJlZW4gcmVhZC4KLQotCi03LiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKC4uLik7Ci0KLUFmdGVyIGFsbCB0aGUgaW1hZ2UgZGF0YSBoYXMgYmVlbiByZWFkLCBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB0bwotY29tcGxldGUgdGhlIGRlY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIGNhdXNlcyB3b3JraW5nIG1lbW9yeSBhc3NvY2lhdGVkCi13aXRoIHRoZSBKUEVHIG9iamVjdCB0byBiZSByZWxlYXNlZC4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOwotCi1JZiB1c2luZyB0aGUgc3RkaW8gc291cmNlIG1hbmFnZXIsIGRvbid0IGZvcmdldCB0byBjbG9zZSB0aGUgc291cmNlIHN0ZGlvCi1zdHJlYW0gaWYgbmVjZXNzYXJ5LgotCi1JdCBpcyBhbiBlcnJvciB0byBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBiZWZvcmUgcmVhZGluZyB0aGUgY29ycmVjdAotdG90YWwgbnVtYmVyIG9mIHNjYW5saW5lcy4gIElmIHlvdSB3aXNoIHRvIGFib3J0IGRlY29tcHJlc3Npb24sIGNhbGwKLWpwZWdfYWJvcnQoKSBhcyBkaXNjdXNzZWQgYmVsb3cuCi0KLUFmdGVyIGNvbXBsZXRpbmcgYSBkZWNvbXByZXNzaW9uIGN5Y2xlLCB5b3UgbWF5IGRpc3Bvc2Ugb2YgdGhlIEpQRUcgb2JqZWN0IGFzCi1kaXNjdXNzZWQgbmV4dCwgb3IgeW91IG1heSB1c2UgaXQgdG8gZGVjb21wcmVzcyBhbm90aGVyIGltYWdlLiAgSW4gdGhhdCBjYXNlCi1yZXR1cm4gdG8gc3RlcCAyIG9yIDMgYXMgYXBwcm9wcmlhdGUuICBJZiB5b3UgZG8gbm90IGNoYW5nZSB0aGUgc291cmNlCi1tYW5hZ2VyLCB0aGUgbmV4dCBpbWFnZSB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgc2FtZSBzb3VyY2UuCi0KLQotOC4gUmVsZWFzZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdC4KLQotV2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QsIGRlc3Ryb3kgaXQgYnkgY2FsbGluZwotanBlZ19kZXN0cm95X2RlY29tcHJlc3MoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIFRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mCi1kZXN0cm95aW5nIGNvbXByZXNzaW9uIG9iamVjdHMgYXBwbGllcyBoZXJlIHRvby4KLQotVHlwaWNhbCBjb2RlOgotCi0JanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLQotCi05LiBBYm9ydGluZy4KLQotWW91IGNhbiBhYm9ydCBhIGRlY29tcHJlc3Npb24gY3ljbGUgYnkgY2FsbGluZyBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpIG9yCi1qcGVnX2Rlc3Ryb3koKSBpZiB5b3UgZG9uJ3QgbmVlZCB0aGUgSlBFRyBvYmplY3QgYW55IG1vcmUsIG9yCi1qcGVnX2Fib3J0X2RlY29tcHJlc3MoKSBvciBqcGVnX2Fib3J0KCkgaWYgeW91IHdhbnQgdG8gcmV1c2UgdGhlIG9iamVjdC4KLVRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mIGFib3J0aW5nIGNvbXByZXNzaW9uIGN5Y2xlcyBhcHBsaWVzIGhlcmUgdG9vLgotCi0KLU1lY2hhbmljcyBvZiB1c2FnZTogaW5jbHVkZSBmaWxlcywgbGlua2luZywgZXRjCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BcHBsaWNhdGlvbnMgdXNpbmcgdGhlIEpQRUcgbGlicmFyeSBzaG91bGQgaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUganBlZ2xpYi5oCi10byBvYnRhaW4gZGVjbGFyYXRpb25zIG9mIGRhdGEgdHlwZXMgYW5kIHJvdXRpbmVzLiAgQmVmb3JlIGluY2x1ZGluZwotanBlZ2xpYi5oLCBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzIHRoYXQgZGVmaW5lIGF0IGxlYXN0IHRoZSB0eXBlZGVmcyBGSUxFIGFuZAotc2l6ZV90LiAgT24gQU5TSS1jb25mb3JtaW5nIHN5c3RlbXMsIGluY2x1ZGluZyA8c3RkaW8uaD4gaXMgc3VmZmljaWVudDsgb24KLW9sZGVyIFVuaXggc3lzdGVtcywgeW91IG1heSBuZWVkIDxzeXMvdHlwZXMuaD4gdG8gZGVmaW5lIHNpemVfdC4KLQotSWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZmVyIHRvIGluZGl2aWR1YWwgSlBFRyBsaWJyYXJ5IGVycm9yIGNvZGVzLCBhbHNvCi1pbmNsdWRlIGplcnJvci5oIHRvIGRlZmluZSB0aG9zZSBzeW1ib2xzLgotCi1qcGVnbGliLmggaW5kaXJlY3RseSBpbmNsdWRlcyB0aGUgZmlsZXMgamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oLiAgSWYgeW91IGFyZQotaW5zdGFsbGluZyB0aGUgSlBFRyBoZWFkZXIgZmlsZXMgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5LCB5b3Ugd2lsbCB3YW50IHRvCi1pbnN0YWxsIGFsbCBmb3VyIGZpbGVzOiBqcGVnbGliLmgsIGplcnJvci5oLCBqY29uZmlnLmgsIGptb3JlY2ZnLmguCi0KLVRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIGluY2x1ZGUgdGhlIEpQRUcgY29kZSBpbnRvIHlvdXIgZXhlY3V0YWJsZSBwcm9ncmFtCi1pcyB0byBwcmVwYXJlIGEgbGlicmFyeSBmaWxlICgibGlianBlZy5hIiwgb3IgYSBjb3JyZXNwb25kaW5nIG5hbWUgb24gbm9uLVVuaXgKLW1hY2hpbmVzKSBhbmQgcmVmZXJlbmNlIGl0IGF0IHlvdXIgbGluayBzdGVwLiAgSWYgeW91IHVzZSBvbmx5IGhhbGYgb2YgdGhlCi1saWJyYXJ5IChvbmx5IGNvbXByZXNzaW9uIG9yIG9ubHkgZGVjb21wcmVzc2lvbiksIG9ubHkgdGhhdCBtdWNoIGNvZGUgd2lsbCBiZQotaW5jbHVkZWQgZnJvbSB0aGUgbGlicmFyeSwgdW5sZXNzIHlvdXIgbGlua2VyIGlzIGhvcGVsZXNzbHkgYnJhaW4tZGFtYWdlZC4KLVRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYnVpbGQgbGlianBlZy5hIGF1dG9tYXRpY2FsbHkgKHNlZSBpbnN0YWxsLmRvYykuCi0KLVdoaWxlIHlvdSBjYW4gYnVpbGQgdGhlIEpQRUcgbGlicmFyeSBhcyBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSB3aGltIHN0cmlrZXMKLXlvdSwgd2UgZG9uJ3QgcmVhbGx5IHJlY29tbWVuZCBpdC4gIFRoZSB0cm91YmxlIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpcyB0aGF0Ci1hdCBzb21lIHBvaW50IHlvdSdsbCBwcm9iYWJseSB0cnkgdG8gc3Vic3RpdHV0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5Ci13aXRob3V0IHJlY29tcGlsaW5nIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9ucy4gIFRoYXQgZ2VuZXJhbGx5IGRvZXNuJ3Qgd29yawotYmVjYXVzZSB0aGUgcGFyYW1ldGVyIHN0cnVjdCBkZWNsYXJhdGlvbnMgdXN1YWxseSBjaGFuZ2Ugd2l0aCBlYWNoIG5ldwotdmVyc2lvbi4gIEluIG90aGVyIHdvcmRzLCB0aGUgbGlicmFyeSdzIEFQSSBpcyAqbm90KiBndWFyYW50ZWVkIGJpbmFyeQotY29tcGF0aWJsZSBhY3Jvc3MgdmVyc2lvbnM7IHdlIG9ubHkgdHJ5IHRvIGVuc3VyZSBzb3VyY2UtY29kZSBjb21wYXRpYmlsaXR5LgotKEluIGhpbmRzaWdodCwgaXQgbWlnaHQgaGF2ZSBiZWVuIHNtYXJ0ZXIgdG8gaGlkZSB0aGUgcGFyYW1ldGVyIHN0cnVjdHMgZnJvbQotYXBwbGljYXRpb25zIGFuZCBpbnRyb2R1Y2UgYSB0b24gb2YgYWNjZXNzIGZ1bmN0aW9ucyBpbnN0ZWFkLiAgVG9vIGxhdGUgbm93LAotaG93ZXZlci4pCi0KLU9uIHNvbWUgc3lzdGVtcyB5b3VyIGFwcGxpY2F0aW9uIG1heSBuZWVkIHRvIHNldCB1cCBhIHNpZ25hbCBoYW5kbGVyIHRvIGVuc3VyZQotdGhhdCB0ZW1wb3JhcnkgZmlsZXMgYXJlIGRlbGV0ZWQgaWYgdGhlIHByb2dyYW0gaXMgaW50ZXJydXB0ZWQuICBUaGlzIGlzIG1vc3QKLWNyaXRpY2FsIGlmIHlvdSBhcmUgb24gTVMtRE9TIGFuZCB1c2UgdGhlIGptZW1kb3MuYyBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZDsKLWl0IHdpbGwgdHJ5IHRvIGdyYWIgZXh0ZW5kZWQgbWVtb3J5IGZvciB0ZW1wIGZpbGVzLCBhbmQgdGhhdCBzcGFjZSB3aWxsIE5PVCBiZQotZnJlZWQgYXV0b21hdGljYWxseS4gIFNlZSBjanBlZy5jIG9yIGRqcGVnLmMgZm9yIGFuIGV4YW1wbGUgc2lnbmFsIGhhbmRsZXIuCi0KLUl0IG1heSBiZSB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCB0aGUgY29yZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgYWN0dWFsbHkKLXJlcXVpcmUgdGhlIHN0ZGlvIGxpYnJhcnk6IG9ubHkgdGhlIGRlZmF1bHQgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIGFuZAotZXJyb3IgaGFuZGxlciBuZWVkIGl0LiAgWW91IGNhbiB1c2UgdGhlIGxpYnJhcnkgaW4gYSBzdGRpby1sZXNzIGVudmlyb25tZW50Ci1pZiB5b3UgcmVwbGFjZSB0aG9zZSBtb2R1bGVzIGFuZCB1c2Ugam1lbW5vYnMuYyAob3IgYW5vdGhlciBtZW1vcnkgbWFuYWdlciBvZgoteW91ciBvd24gZGV2aXNpbmcpLiAgTW9yZSBpbmZvIGFib3V0IHRoZSBtaW5pbXVtIHN5c3RlbSBsaWJyYXJ5IHJlcXVpcmVtZW50cwotbWF5IGJlIGZvdW5kIGluIGppbmNsdWRlLmguCi0KLQotQURWQU5DRUQgRkVBVFVSRVMKLT09PT09PT09PT09PT09PT09Ci0KLUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhbGwgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgeW91IGNhbiBzZXQgZm9yIEpQRUcKLWNvbXByZXNzaW9uLCBhcyB3ZWxsIGFzIHRoZSAiaGVscGVyIiByb3V0aW5lcyBwcm92aWRlZCB0byBhc3Npc3QgaW4gdGhpcwotdGFzay4gIFByb3BlciBzZXR0aW5nIG9mIHNvbWUgcGFyYW1ldGVycyByZXF1aXJlcyBkZXRhaWxlZCB1bmRlcnN0YW5kaW5nCi1vZiB0aGUgSlBFRyBzdGFuZGFyZDsgaWYgeW91IGRvbid0IGtub3cgd2hhdCBhIHBhcmFtZXRlciBpcyBmb3IsIGl0J3MgYmVzdAotbm90IHRvIG1lc3Mgd2l0aCBpdCEgIFNlZSBSRUZFUkVOQ0VTIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgcG9pbnRlcnMgdG8KLW1vcmUgaW5mbyBhYm91dCBKUEVHLgotCi1JdCdzIGEgZ29vZCBpZGVhIHRvIGNhbGwganBlZ19zZXRfZGVmYXVsdHMoKSBmaXJzdCwgZXZlbiBpZiB5b3UgcGxhbiB0byBzZXQKLWFsbCB0aGUgcGFyYW1ldGVyczsgdGhhdCB3YXkgeW91ciBjb2RlIGlzIG1vcmUgbGlrZWx5IHRvIHdvcmsgd2l0aCBmdXR1cmUgSlBFRwotbGlicmFyaWVzIHRoYXQgaGF2ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSByZWNvbW1lbmQKLXlvdSB1c2UgYSBoZWxwZXIgcm91dGluZSB3aGVyZSBvbmUgaXMgcHJvdmlkZWQsIGluIHByZWZlcmVuY2UgdG8gdHdpZGRsaW5nCi1jaW5mbyBmaWVsZHMgZGlyZWN0bHkuCi0KLVRoZSBoZWxwZXIgcm91dGluZXMgYXJlOgotCi1qcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JVGhpcyByb3V0aW5lIHNldHMgYWxsIEpQRUcgcGFyYW1ldGVycyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB1c2luZwotCW9ubHkgdGhlIGlucHV0IGltYWdlJ3MgY29sb3Igc3BhY2UgKGZpZWxkIGluX2NvbG9yX3NwYWNlLCB3aGljaCBtdXN0Ci0JYWxyZWFkeSBiZSBzZXQgaW4gY2luZm8pLiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBvbmx5IG5lZWQgdG8gdXNlCi0JdGhpcyByb3V0aW5lIGFuZCBwZXJoYXBzIGpwZWdfc2V0X3F1YWxpdHkoKS4KLQotanBlZ19zZXRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkKLQlTZXRzIHRoZSBKUEVHIGZpbGUncyBjb2xvcnNwYWNlIChmaWVsZCBqcGVnX2NvbG9yX3NwYWNlKSBhcyBzcGVjaWZpZWQsCi0JYW5kIHNldHMgb3RoZXIgY29sb3Itc3BhY2UtZGVwZW5kZW50IHBhcmFtZXRlcnMgYXBwcm9wcmlhdGVseS4gIFNlZQotCSJTcGVjaWFsIGNvbG9yIHNwYWNlcyIsIGJlbG93LCBiZWZvcmUgdXNpbmcgdGhpcy4gIEEgbGFyZ2UgbnVtYmVyIG9mCi0JcGFyYW1ldGVycywgaW5jbHVkaW5nIGFsbCBwZXItY29tcG9uZW50IHBhcmFtZXRlcnMsIGFyZSBzZXQgYnkgdGhpcwotCXJvdXRpbmU7IGlmIHlvdSB3YW50IHRvIHR3aWRkbGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIHlvdSBzaG91bGQgY2FsbAotCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBiZWZvcmUgcmF0aGVyIHRoYW4gYWZ0ZXIuCi0KLWpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLQlTZWxlY3RzIGFuIGFwcHJvcHJpYXRlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBjaW5mby0+aW5fY29sb3Jfc3BhY2UsCi0JYW5kIGNhbGxzIGpwZWdfc2V0X2NvbG9yc3BhY2UoKS4gIFRoaXMgaXMgYWN0dWFsbHkgYSBzdWJyb3V0aW5lIG9mCi0JanBlZ19zZXRfZGVmYXVsdHMoKS4gIEl0J3MgYnJva2VuIG91dCBpbiBjYXNlIHlvdSB3YW50IHRvIGNoYW5nZQotCWp1c3QgdGhlIGNvbG9yc3BhY2UtZGVwZW5kZW50IEpQRUcgcGFyYW1ldGVycy4KLQotanBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotCUNvbnN0cnVjdHMgSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFwcHJvcHJpYXRlIGZvciB0aGUgaW5kaWNhdGVkCi0JcXVhbGl0eSBzZXR0aW5nLiAgVGhlIHF1YWxpdHkgdmFsdWUgaXMgZXhwcmVzc2VkIG9uIHRoZSAwLi4xMDAgc2NhbGUKLQlyZWNvbW1lbmRlZCBieSBJSkcgKGNqcGVnJ3MgIi1xdWFsaXR5IiBzd2l0Y2ggdXNlcyB0aGlzIHJvdXRpbmUpLgotCU5vdGUgdGhhdCB0aGUgZXhhY3QgbWFwcGluZyBmcm9tIHF1YWxpdHkgdmFsdWVzIHRvIHRhYmxlcyBtYXkgY2hhbmdlCi0JaW4gZnV0dXJlIElKRyByZWxlYXNlcyBhcyBtb3JlIGlzIGxlYXJuZWQgYWJvdXQgRENUIHF1YW50aXphdGlvbi4KLQlJZiB0aGUgZm9yY2VfYmFzZWxpbmUgcGFyYW1ldGVyIGlzIFRSVUUsIHRoZW4gdGhlIHF1YW50aXphdGlvbiB0YWJsZQotCWVudHJpZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAxLi4yNTUgZm9yIGZ1bGwgSlBFRyBiYXNlbGluZQotCWNvbXBhdGliaWxpdHkuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBvbmx5IG1ha2VzIGEKLQlkaWZmZXJlbmNlIGZvciBxdWFsaXR5IHNldHRpbmdzIGJlbG93IDI1LCBhbmQgaXQgZWZmZWN0aXZlbHkgcHJldmVudHMKLQl2ZXJ5IHNtYWxsL2xvdyBxdWFsaXR5IGZpbGVzIGZyb20gYmVpbmcgZ2VuZXJhdGVkLiAgVGhlIElKRyBkZWNvZGVyCi0JaXMgY2FwYWJsZSBvZiByZWFkaW5nIHRoZSBub24tYmFzZWxpbmUgZmlsZXMgZ2VuZXJhdGVkIGF0IGxvdyBxdWFsaXR5Ci0Jc2V0dGluZ3Mgd2hlbiBmb3JjZV9iYXNlbGluZSBpcyBGQUxTRSwgYnV0IG90aGVyIGRlY29kZXJzIG1heSBub3QgYmUuCi0KLWpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKLQkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotCVNhbWUgYXMganBlZ19zZXRfcXVhbGl0eSgpIGV4Y2VwdCB0aGF0IHRoZSBnZW5lcmF0ZWQgdGFibGVzIGFyZSB0aGUKLQlzYW1wbGUgdGFibGVzIGdpdmVuIGluIHRoZSBKUEVDIHNwZWMgc2VjdGlvbiBLLjEsIG11bHRpcGxpZWQgYnkgdGhlCi0Jc3BlY2lmaWVkIHNjYWxlIGZhY3RvciAod2hpY2ggaXMgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZTsgdGh1cwotCXNjYWxlX2ZhY3RvciA9IDEwMCByZXByb2R1Y2VzIHRoZSBzcGVjJ3MgdGFibGVzKS4gIE5vdGUgdGhhdCBsYXJnZXIKLQlzY2FsZSBmYWN0b3JzIGdpdmUgbG93ZXIgcXVhbGl0eS4gIFRoaXMgZW50cnkgcG9pbnQgaXMgdXNlZnVsIGZvcgotCWNvbmZvcm1pbmcgdG8gdGhlIEFkb2JlIFBvc3RTY3JpcHQgRENUIGNvbnZlbnRpb25zLCBidXQgd2UgZG8gbm90Ci0JcmVjb21tZW5kIGxpbmVhciBzY2FsaW5nIGFzIGEgdXNlci12aXNpYmxlIHF1YWxpdHkgc2NhbGUgb3RoZXJ3aXNlLgotCWZvcmNlX2Jhc2VsaW5lIGFnYWluIGNvbnN0cmFpbnMgdGhlIGNvbXB1dGVkIHRhYmxlIGVudHJpZXMgdG8gMS4uMjU1LgotCi1pbnQganBlZ19xdWFsaXR5X3NjYWxpbmcgKGludCBxdWFsaXR5KQotCUNvbnZlcnRzIGEgdmFsdWUgb24gdGhlIElKRy1yZWNvbW1lbmRlZCBxdWFsaXR5IHNjYWxlIHRvIGEgbGluZWFyCi0Jc2NhbGluZyBwZXJjZW50YWdlLiAgTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgY2hhbmdlIG9yIGdvIGF3YXkKLQlpbiBmdXR1cmUgcmVsZWFzZXMgLS0tIElKRyBtYXkgY2hvb3NlIHRvIGFkb3B0IGEgc2NhbGluZyBtZXRob2QgdGhhdAotCWNhbid0IGJlIGV4cHJlc3NlZCBhcyBhIHNpbXBsZSBzY2FsYXIgbXVsdGlwbGllciwgaW4gd2hpY2ggY2FzZSB0aGUKLQlwcmVtaXNlIG9mIHRoaXMgcm91dGluZSBjb2xsYXBzZXMuICBDYXZlYXQgdXNlci4KLQotanBlZ19hZGRfcXVhbnRfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAotCQkgICAgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotCUFsbG93cyBhbiBhcmJpdHJhcnkgcXVhbnRpemF0aW9uIHRhYmxlIHRvIGJlIGNyZWF0ZWQuICB3aGljaF90YmwKLQlpbmRpY2F0ZXMgd2hpY2ggdGFibGUgc2xvdCB0byBmaWxsLiAgYmFzaWNfdGFibGUgcG9pbnRzIHRvIGFuIGFycmF5Ci0Jb2YgNjQgdW5zaWduZWQgaW50cyBnaXZlbiBpbiBub3JtYWwgYXJyYXkgb3JkZXIuICBUaGVzZSB2YWx1ZXMgYXJlCi0JbXVsdGlwbGllZCBieSBzY2FsZV9mYWN0b3IvMTAwIGFuZCB0aGVuIGNsYW1wZWQgdG8gdGhlIHJhbmdlIDEuLjY1NTM1Ci0JKG9yIHRvIDEuLjI1NSBpZiBmb3JjZV9iYXNlbGluZSBpcyBUUlVFKS4KLQlDQVVUSU9OOiBwcmlvciB0byBsaWJyYXJ5IHZlcnNpb24gNmEsIGpwZWdfYWRkX3F1YW50X3RhYmxlIGV4cGVjdGVkCi0JdGhlIGJhc2ljIHRhYmxlIHRvIGJlIGdpdmVuIGluIEpQRUcgemlnemFnIG9yZGVyLiAgSWYgeW91IG5lZWQgdG8KLQl3cml0ZSBjb2RlIHRoYXQgd29ya3Mgd2l0aCBlaXRoZXIgb2xkZXIgb3IgbmV3ZXIgdmVyc2lvbnMgb2YgdGhpcwotCXJvdXRpbmUsIHlvdSBtdXN0IGNoZWNrIHRoZSBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyLiAgU29tZXRoaW5nIGxpa2UKLQkiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjEiIGlzIHRoZSByaWdodCB0ZXN0LgotCi1qcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCi0JR2VuZXJhdGVzIGEgZGVmYXVsdCBzY2FuIHNjcmlwdCBmb3Igd3JpdGluZyBhIHByb2dyZXNzaXZlLUpQRUcgZmlsZS4KLQlUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYSBwcm9ncmVzc2l2ZSBmaWxlLAotCXVubGVzcyB5b3Ugd2FudCB0byBtYWtlIGEgY3VzdG9tIHNjYW4gc2VxdWVuY2UuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAotCXRoZSBKUEVHIGNvbG9yIHNwYWNlIGlzIHNldCBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgotCi0KLUNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKGNpbmZvIGZpZWxkcykgaW5jbHVkZToKLQotSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2QKLQlTZWxlY3RzIHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIERDVCBzdGVwLiAgQ2hvaWNlcyBhcmU6Ci0JCUpEQ1RfSVNMT1c6IHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtCi0JCUpEQ1RfSUZBU1Q6IGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZAotCQlKRENUX0ZMT0FUOiBmbG9hdGluZy1wb2ludCBtZXRob2QKLQkJSkRDVF9ERUZBVUxUOiBkZWZhdWx0IG1ldGhvZCAobm9ybWFsbHkgSkRDVF9JU0xPVykKLQkJSkRDVF9GQVNURVNUOiBmYXN0ZXN0IG1ldGhvZCAobm9ybWFsbHkgSkRDVF9JRkFTVCkKLQlUaGUgRkxPQVQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBJU0xPVyBtZXRob2QsCi0JYnV0IG1heSBnaXZlIGRpZmZlcmVudCByZXN1bHRzIG9uIGRpZmZlcmVudCBtYWNoaW5lcyBkdWUgdG8gdmFyeWluZwotCXJvdW5kb2ZmIGJlaGF2aW9yLiAgVGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzCi0Jb24gYWxsIG1hY2hpbmVzLiAgT24gbWFjaGluZXMgd2l0aCBzdWZmaWNpZW50bHkgZmFzdCBGUCBoYXJkd2FyZSwgdGhlCi0JZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSBhbHNvIGJlIHRoZSBmYXN0ZXN0LiAgVGhlIElGQVNUIG1ldGhvZCBpcwotCWNvbnNpZGVyYWJseSBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3bzsgaXRzIHVzZSBpcyBub3QKLQlyZWNvbW1lbmRlZCBpZiBoaWdoIHF1YWxpdHkgaXMgYSBjb25jZXJuLiAgSkRDVF9ERUZBVUxUIGFuZAotCUpEQ1RfRkFTVEVTVCBhcmUgbWFjcm9zIGNvbmZpZ3VyYWJsZSBieSBlYWNoIGluc3RhbGxhdGlvbi4KLQotSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlCi1pbnQgbnVtX2NvbXBvbmVudHMKLQlUaGUgSlBFRyBjb2xvciBzcGFjZSBhbmQgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY29tcG9uZW50czsgc2VlCi0JIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGZvciBtb3JlIGluZm8uICBXZSByZWNvbW1lbmQgdXNpbmcKLQlqcGVnX3NldF9jb2xvcl9zcGFjZSgpIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVzZS4KLQotYm9vbGVhbiBvcHRpbWl6ZV9jb2RpbmcKLQlUUlVFIGNhdXNlcyB0aGUgY29tcHJlc3NvciB0byBjb21wdXRlIG9wdGltYWwgSHVmZm1hbiBjb2RpbmcgdGFibGVzCi0JZm9yIHRoZSBpbWFnZS4gIFRoaXMgcmVxdWlyZXMgYW4gZXh0cmEgcGFzcyBvdmVyIHRoZSBkYXRhIGFuZAotCXRoZXJlZm9yZSBjb3N0cyBhIGdvb2QgZGVhbCBvZiBzcGFjZSBhbmQgdGltZS4gIFRoZSBkZWZhdWx0IGlzCi0JRkFMU0UsIHdoaWNoIHRlbGxzIHRoZSBjb21wcmVzc29yIHRvIHVzZSB0aGUgc3VwcGxpZWQgb3IgZGVmYXVsdAotCUh1ZmZtYW4gdGFibGVzLiAgSW4gbW9zdCBjYXNlcyBvcHRpbWFsIHRhYmxlcyBzYXZlIG9ubHkgYSBmZXcgcGVyY2VudAotCW9mIGZpbGUgc2l6ZSBjb21wYXJlZCB0byB0aGUgZGVmYXVsdCB0YWJsZXMuICBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzCi0JVFJVRSwgeW91IG5lZWQgbm90IHN1cHBseSBIdWZmbWFuIHRhYmxlcyBhdCBhbGwsIGFuZCBhbnkgeW91IGRvCi0Jc3VwcGx5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCi0KLXVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsCi1pbnQgcmVzdGFydF9pbl9yb3dzCi0JVG8gZW1pdCByZXN0YXJ0IG1hcmtlcnMgaW4gdGhlIEpQRUcgZmlsZSwgc2V0IG9uZSBvZiB0aGVzZSBub256ZXJvLgotCVNldCByZXN0YXJ0X2ludGVydmFsIHRvIHNwZWNpZnkgdGhlIGV4YWN0IGludGVydmFsIGluIE1DVSBibG9ja3MuCi0JU2V0IHJlc3RhcnRfaW5fcm93cyB0byBzcGVjaWZ5IHRoZSBpbnRlcnZhbCBpbiBNQ1Ugcm93cy4gIChJZgotCXJlc3RhcnRfaW5fcm93cyBpcyBub3QgMCwgdGhlbiByZXN0YXJ0X2ludGVydmFsIGlzIHNldCBhZnRlciB0aGUKLQlpbWFnZSB3aWR0aCBpbiBNQ1VzIGlzIGNvbXB1dGVkLikgIERlZmF1bHRzIGFyZSB6ZXJvIChubyByZXN0YXJ0cykuCi0JT25lIHJlc3RhcnQgbWFya2VyIHBlciBNQ1Ugcm93IGlzIG9mdGVuIGEgZ29vZCBjaG9pY2UuCi0JTk9URTogdGhlIG92ZXJoZWFkIG9mIHJlc3RhcnQgbWFya2VycyBpcyBoaWdoZXIgaW4gZ3JheXNjYWxlIEpQRUcKLQlmaWxlcyB0aGFuIGluIGNvbG9yIGZpbGVzLCBhbmQgTVVDSCBoaWdoZXIgaW4gcHJvZ3Jlc3NpdmUgSlBFR3MuCi0JSWYgeW91IHVzZSByZXN0YXJ0cywgeW91IG1heSB3YW50IHRvIHVzZSBsYXJnZXIgaW50ZXJ2YWxzIGluIHRob3NlCi0JY2FzZXMuCi0KLWNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvCi1pbnQgbnVtX3NjYW5zCi0JQnkgZGVmYXVsdCwgc2Nhbl9pbmZvIGlzIE5VTEw7IHRoaXMgY2F1c2VzIHRoZSBjb21wcmVzc29yIHRvIHdyaXRlIGEKLQlzaW5nbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIElmIG5vdCBOVUxMLCBzY2FuX2luZm8gcG9pbnRzIHRvCi0JYW4gYXJyYXkgb2Ygc2NhbiBkZWZpbml0aW9uIHJlY29yZHMgb2YgbGVuZ3RoIG51bV9zY2Fucy4gIFRoZQotCWNvbXByZXNzb3Igd2lsbCB0aGVuIHdyaXRlIGEgSlBFRyBmaWxlIGhhdmluZyBvbmUgc2NhbiBmb3IgZWFjaCBzY2FuCi0JZGVmaW5pdGlvbiByZWNvcmQuICBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgbm9uaW50ZXJsZWF2ZWQgb3IKLQlwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLiAgVGhlIGxpYnJhcnkgY2hlY2tzIHRoYXQgdGhlIHNjYW4gYXJyYXkKLQlkZWZpbmVzIGEgdmFsaWQgSlBFRyBzY2FuIHNlcXVlbmNlLiAgKGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGNyZWF0ZXMKLQlhIHN1aXRhYmxlIHNjYW4gZGVmaW5pdGlvbiBhcnJheSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGlzIGlzCi0JZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIlByb2dyZXNzaXZlIEpQRUcgc3VwcG9ydCIuCi0KLWludCBzbW9vdGhpbmdfZmFjdG9yCi0JSWYgbm9uLXplcm8sIHRoZSBpbnB1dCBpbWFnZSBpcyBzbW9vdGhlZDsgdGhlIHZhbHVlIHNob3VsZCBiZSAxIGZvcgotCW1pbmltYWwgc21vb3RoaW5nIHRvIDEwMCBmb3IgbWF4aW11bSBzbW9vdGhpbmcuICBDb25zdWx0IGpjc2FtcGxlLmMKLQlmb3IgZGV0YWlscyBvZiB0aGUgc21vb3RoaW5nIGFsZ29yaXRobS4gIFRoZSBkZWZhdWx0IGlzIHplcm8uCi0KLWJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXIKLQlJZiBUUlVFLCBhIEpGSUYgQVBQMCBtYXJrZXIgaXMgZW1pdHRlZC4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgYW5kCi0JanBlZ19zZXRfY29sb3JzcGFjZSgpIHNldCB0aGlzIFRSVUUgaWYgYSBKRklGLWxlZ2FsIEpQRUcgY29sb3Igc3BhY2UKLQkoaWUsIFlDYkNyIG9yIGdyYXlzY2FsZSkgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBGQUxTRS4KLQotVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uCi1VSU5UOCBKRklGX21pbm9yX3ZlcnNpb24KLQlUaGUgdmVyc2lvbiBudW1iZXIgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBKRklGIG1hcmtlci4KLQlqcGVnX3NldF9kZWZhdWx0cygpIGluaXRpYWxpemVzIHRoZSB2ZXJzaW9uIHRvIDEuMDEgKG1ham9yPW1pbm9yPTEpLgotCVlvdSBzaG91bGQgc2V0IGl0IHRvIDEuMDIgKG1ham9yPTEsIG1pbm9yPTIpIGlmIHlvdSBwbGFuIHRvIHdyaXRlCi0JYW55IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2Vycy4KLQotVUlOVDggZGVuc2l0eV91bml0Ci1VSU5UMTYgWF9kZW5zaXR5Ci1VSU5UMTYgWV9kZW5zaXR5Ci0JVGhlIHJlc29sdXRpb24gaW5mb3JtYXRpb24gdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBKRklGIG1hcmtlcjsKLQlub3QgdXNlZCBvdGhlcndpc2UuICBkZW5zaXR5X3VuaXQgbWF5IGJlIDAgZm9yIHVua25vd24sCi0JMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSAwLDEsMQotCWluZGljYXRpbmcgc3F1YXJlIHBpeGVscyBvZiB1bmtub3duIHNpemUuCi0KLWJvb2xlYW4gd3JpdGVfQWRvYmVfbWFya2VyCi0JSWYgVFJVRSwgYW4gQWRvYmUgQVBQMTQgbWFya2VyIGlzIGVtaXR0ZWQuICBqcGVnX3NldF9kZWZhdWx0cygpIGFuZAotCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBzZXQgdGhpcyBUUlVFIGlmIEpQRUcgY29sb3Igc3BhY2UgUkdCLCBDTVlLLAotCW9yIFlDQ0sgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBGQUxTRS4gIEl0IGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhCi0JdG8gc2V0IGJvdGggd3JpdGVfSkZJRl9oZWFkZXIgYW5kIHdyaXRlX0Fkb2JlX21hcmtlci4gIEluIGZhY3QsCi0JeW91IHByb2JhYmx5IHNob3VsZG4ndCBjaGFuZ2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXQgYWxsIC0tLSB0aGUKLQlkZWZhdWx0IGJlaGF2aW9yIGVuc3VyZXMgdGhhdCB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgY2FuIGJlCi0JcmVjb2duaXplZCBieSB0aGUgZGVjb2Rlci4KLQotSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXQotCVBvaW50ZXJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9uZSBwZXIgdGFibGUgc2xvdCwKLQlvciBOVUxMIGlmIG5vIHRhYmxlIGlzIGRlZmluZWQgZm9yIGEgc2xvdC4gIFVzdWFsbHkgdGhlc2Ugc2hvdWxkCi0JYmUgc2V0IHZpYSBvbmUgb2YgdGhlIGFib3ZlIGhlbHBlciByb3V0aW5lczsganBlZ19hZGRfcXVhbnRfdGFibGUoKQotCWlzIGdlbmVyYWwgZW5vdWdoIHRvIGRlZmluZSBhbnkgcXVhbnRpemF0aW9uIHRhYmxlLiAgVGhlIG90aGVyCi0Jcm91dGluZXMgd2lsbCBzZXQgdXAgdGFibGUgc2xvdCAwIGZvciBsdW1pbmFuY2UgcXVhbGl0eSBhbmQgdGFibGUKLQlzbG90IDEgZm9yIGNocm9taW5hbmNlLgotCi1KSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdCi1KSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdCi0JUG9pbnRlcnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvbmUgcGVyIHRhYmxlIHNsb3QsIG9yIE5VTEwgaWYKLQlubyB0YWJsZSBpcyBkZWZpbmVkIGZvciBhIHNsb3QuICBTbG90cyAwIGFuZCAxIGFyZSBmaWxsZWQgd2l0aCB0aGUKLQlKUEVHIHNhbXBsZSB0YWJsZXMgYnkganBlZ19zZXRfZGVmYXVsdHMoKS4gIElmIHlvdSBuZWVkIHRvIGFsbG9jYXRlCi0JbW9yZSB0YWJsZSBzdHJ1Y3R1cmVzLCBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKSBtYXkgYmUgdXNlZC4KLQlOb3RlIHRoYXQgb3B0aW1hbCBIdWZmbWFuIHRhYmxlcyBjYW4gYmUgY29tcHV0ZWQgZm9yIGFuIGltYWdlCi0JYnkgc2V0dGluZyBvcHRpbWl6ZV9jb2RpbmcsIGFzIGRpc2N1c3NlZCBhYm92ZTsgdGhlcmUncyBzZWxkb20KLQlhbnkgbmVlZCB0byBtZXNzIHdpdGggcHJvdmlkaW5nIHlvdXIgb3duIEh1ZmZtYW4gdGFibGVzLgotCi1UaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIGNpbmZvIGZpZWxkcyB3aGljaCBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZQotYmVjYXVzZSB5b3UgY3VycmVudGx5IGNhbid0IGNoYW5nZSB0aGVtOyBmb3IgZXhhbXBsZSwgeW91IGNhbid0IHNldAotYXJpdGhfY29kZSBUUlVFIGJlY2F1c2UgYXJpdGhtZXRpYyBjb2RpbmcgaXMgdW5zdXBwb3J0ZWQuCi0KLQotUGVyLWNvbXBvbmVudCBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIHN0cnVjdCBjaW5mby5jb21wX2luZm9baV0gZm9yCi1jb21wb25lbnQgbnVtYmVyIGkuICBOb3RlIHRoYXQgY29tcG9uZW50cyBoZXJlIHJlZmVyIHRvIGNvbXBvbmVudHMgb2YgdGhlCi1KUEVHIGNvbG9yIHNwYWNlLCAqbm90KiB0aGUgc291cmNlIGltYWdlIGNvbG9yIHNwYWNlLiAgQSBzdWl0YWJseSBsYXJnZQotY29tcF9pbmZvW10gYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IGpwZWdfc2V0X2RlZmF1bHRzKCk7IGlmIHlvdSBjaG9vc2Ugbm90Ci10byB1c2UgdGhhdCByb3V0aW5lLCBpdCdzIHVwIHRvIHlvdSB0byBhbGxvY2F0ZSB0aGUgYXJyYXkuCi0KLWludCBjb21wb25lbnRfaWQKLQlUaGUgb25lLWJ5dGUgaWRlbnRpZmllciBjb2RlIHRvIGJlIHJlY29yZGVkIGluIHRoZSBKUEVHIGZpbGUgZm9yCi0JdGhpcyBjb21wb25lbnQuICBGb3IgdGhlIHN0YW5kYXJkIGNvbG9yIHNwYWNlcywgd2UgcmVjb21tZW5kIHlvdQotCWxlYXZlIHRoZSBkZWZhdWx0IHZhbHVlcyBhbG9uZS4KLQotaW50IGhfc2FtcF9mYWN0b3IKLWludCB2X3NhbXBfZmFjdG9yCi0JSG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2FtcGxpbmcgZmFjdG9ycyBmb3IgdGhlIGNvbXBvbmVudDsgbXVzdAotCWJlIDEuLjQgYWNjb3JkaW5nIHRvIHRoZSBKUEVHIHN0YW5kYXJkLiAgTm90ZSB0aGF0IGxhcmdlciBzYW1wbGluZwotCWZhY3RvcnMgaW5kaWNhdGUgYSBoaWdoZXItcmVzb2x1dGlvbiBjb21wb25lbnQ7IG1hbnkgcGVvcGxlIGZpbmQKLQl0aGlzIGJlaGF2aW9yIHF1aXRlIHVuaW50dWl0aXZlLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSAyLDIgZm9yCi0JbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEsMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cywgZXhjZXB0Ci0JZm9yIGdyYXlzY2FsZSB3aGVyZSAxLDEgaXMgdXNlZC4KLQotaW50IHF1YW50X3RibF9ubwotCVF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIgZm9yIGNvbXBvbmVudC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0JMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCi0KLWludCBkY190Ymxfbm8KLWludCBhY190Ymxfbm8KLQlEQyBhbmQgQUMgZW50cm9weSBjb2RpbmcgdGFibGUgbnVtYmVycy4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUKLQkwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KLQotaW50IGNvbXBvbmVudF9pbmRleAotCU11c3QgZXF1YWwgdGhlIGNvbXBvbmVudCdzIGluZGV4IGluIGNvbXBfaW5mb1tdLiAgKEJlZ2lubmluZyBpbgotCXJlbGVhc2UgdjYsIHRoZSBjb21wcmVzc29yIGxpYnJhcnkgd2lsbCBmaWxsIHRoaXMgaW4gYXV0b21hdGljYWxseTsKLQl5b3UgZG9uJ3QgaGF2ZSB0by4pCi0KLQotRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uIGlzIHNvbWV3aGF0IHNpbXBsZXIgdGhhbiBjb21wcmVzc2lvbgotcGFyYW1ldGVyIHNlbGVjdGlvbiwgc2luY2UgYWxsIG9mIHRoZSBKUEVHIGludGVybmFsIHBhcmFtZXRlcnMgYXJlCi1yZWNvcmRlZCBpbiB0aGUgc291cmNlIGZpbGUgYW5kIG5lZWQgbm90IGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLShVbmxlc3MgeW91IGFyZSB3b3JraW5nIHdpdGggYWJicmV2aWF0ZWQgZmlsZXMsIGluIHdoaWNoIGNhc2Ugc2VlCi0iQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMiLCBiZWxvdy4pICBEZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgY29udHJvbAotdGhlIHBvc3Rwcm9jZXNzaW5nIGRvbmUgb24gdGhlIGltYWdlIHRvIGRlbGl2ZXIgaXQgaW4gYSBmb3JtYXQgc3VpdGFibGUKLWZvciB0aGUgYXBwbGljYXRpb24ncyB1c2UuICBNYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGNvbnRyb2wgc3BlZWQvcXVhbGl0eQotdHJhZGVvZmZzLCBpbiB3aGljaCBmYXN0ZXIgZGVjb21wcmVzc2lvbiBtYXkgYmUgb2J0YWluZWQgYXQgdGhlIHByaWNlIG9mCi1hIHBvb3Jlci1xdWFsaXR5IGltYWdlLiAgVGhlIGRlZmF1bHRzIHNlbGVjdCB0aGUgaGlnaGVzdCBxdWFsaXR5IChzbG93ZXN0KQotcHJvY2Vzc2luZy4KLQotVGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gdGhlIEpQRUcgb2JqZWN0IGFyZSBzZXQgYnkganBlZ19yZWFkX2hlYWRlcigpIGFuZAotbWF5IGJlIHVzZWZ1bCB0byB0aGUgYXBwbGljYXRpb24gaW4gY2hvb3NpbmcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzOgotCi1KRElNRU5TSU9OIGltYWdlX3dpZHRoCQkJV2lkdGggYW5kIGhlaWdodCBvZiBpbWFnZQotSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQKLWludCBudW1fY29tcG9uZW50cwkJCU51bWJlciBvZiBjb2xvciBjb21wb25lbnRzCi1KX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2UJCUNvbG9yc3BhY2Ugb2YgaW1hZ2UKLWJvb2xlYW4gc2F3X0pGSUZfbWFya2VyCQkJVFJVRSBpZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIHNlZW4KLSAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uCQlWZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gSkZJRiBtYXJrZXIKLSAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uCi0gIFVJTlQ4IGRlbnNpdHlfdW5pdAkJCVJlc29sdXRpb24gZGF0YSBmcm9tIEpGSUYgbWFya2VyCi0gIFVJTlQxNiBYX2RlbnNpdHkKLSAgVUlOVDE2IFlfZGVuc2l0eQotYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyCQlUUlVFIGlmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgc2VlbgotICBVSU5UOCBBZG9iZV90cmFuc2Zvcm0JCQlDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlcgotCi1UaGUgSlBFRyBjb2xvciBzcGFjZSwgdW5mb3J0dW5hdGVseSwgaXMgc29tZXRoaW5nIG9mIGEgZ3Vlc3Mgc2luY2UgdGhlIEpQRUcKLXN0YW5kYXJkIHByb3BlciBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIHJlY29yZCBpdC4gIEluIHByYWN0aWNlIG1vc3QgZmlsZXMKLWFkaGVyZSB0byB0aGUgSkZJRiBvciBBZG9iZSBjb252ZW50aW9ucywgYW5kIHRoZSBkZWNvZGVyIHdpbGwgcmVjb2duaXplIHRoZXNlCi1jb3JyZWN0bHkuICBTZWUgIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGZvciBtb3JlIGluZm8uCi0KLQotVGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IGRldGVybWluZSB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUKLXJldHVybmVkIGltYWdlIGFyZToKLQotSl9DT0xPUl9TUEFDRSBvdXRfY29sb3Jfc3BhY2UKLQlPdXRwdXQgY29sb3Igc3BhY2UuICBqcGVnX3JlYWRfaGVhZGVyKCkgc2V0cyBhbiBhcHByb3ByaWF0ZSBkZWZhdWx0Ci0JYmFzZWQgb24ganBlZ19jb2xvcl9zcGFjZTsgdHlwaWNhbGx5IGl0IHdpbGwgYmUgUkdCIG9yIGdyYXlzY2FsZS4KLQlUaGUgYXBwbGljYXRpb24gY2FuIGNoYW5nZSB0aGlzIGZpZWxkIHRvIHJlcXVlc3Qgb3V0cHV0IGluIGEgZGlmZmVyZW50Ci0JY29sb3JzcGFjZS4gIEZvciBleGFtcGxlLCBzZXQgaXQgdG8gSkNTX0dSQVlTQ0FMRSB0byBnZXQgZ3JheXNjYWxlCi0Jb3V0cHV0IGZyb20gYSBjb2xvciBmaWxlLiAgKFRoaXMgaXMgdXNlZnVsIGZvciBwcmV2aWV3aW5nOiBncmF5c2NhbGUKLQlvdXRwdXQgaXMgZmFzdGVyIHRoYW4gZnVsbCBjb2xvciBzaW5jZSB0aGUgY29sb3IgY29tcG9uZW50cyBuZWVkIG5vdAotCWJlIHByb2Nlc3NlZC4pICBOb3RlIHRoYXQgbm90IGFsbCBwb3NzaWJsZSBjb2xvciBzcGFjZSB0cmFuc2Zvcm1zIGFyZQotCWN1cnJlbnRseSBpbXBsZW1lbnRlZDsgeW91IG1heSBuZWVkIHRvIGV4dGVuZCBqZGNvbG9yLmMgaWYgeW91IHdhbnQgYW4KLQl1bnVzdWFsIGNvbnZlcnNpb24uCi0KLXVuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tCi0JU2NhbGUgdGhlIGltYWdlIGJ5IHRoZSBmcmFjdGlvbiBzY2FsZV9udW0vc2NhbGVfZGVub20uICBEZWZhdWx0IGlzCi0JMS8xLCBvciBubyBzY2FsaW5nLiAgQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgc2NhbGluZyByYXRpb3MKLQlhcmUgMS8xLCAxLzIsIDEvNCwgYW5kIDEvOC4gIChUaGUgbGlicmFyeSBkZXNpZ24gYWxsb3dzIGZvciBhcmJpdHJhcnkKLQlzY2FsaW5nIHJhdGlvcyBidXQgdGhpcyBpcyBub3QgbGlrZWx5IHRvIGJlIGltcGxlbWVudGVkIGFueSB0aW1lIHNvb24uKQotCVNtYWxsZXIgc2NhbGluZyByYXRpb3MgcGVybWl0IHNpZ25pZmljYW50bHkgZmFzdGVyIGRlY29kaW5nIHNpbmNlCi0JZmV3ZXIgcGl4ZWxzIG5lZWQgYmUgcHJvY2Vzc2VkIGFuZCBhIHNpbXBsZXIgSURDVCBtZXRob2QgY2FuIGJlIHVzZWQuCi0KLWJvb2xlYW4gcXVhbnRpemVfY29sb3JzCi0JSWYgc2V0IFRSVUUsIGNvbG9ybWFwcGVkIG91dHB1dCB3aWxsIGJlIGRlbGl2ZXJlZC4gIERlZmF1bHQgaXMgRkFMU0UsCi0JbWVhbmluZyB0aGF0IGZ1bGwtY29sb3Igb3V0cHV0IHdpbGwgYmUgZGVsaXZlcmVkLgotCi1UaGUgbmV4dCB0aHJlZSBwYXJhbWV0ZXJzIGFyZSByZWxldmFudCBvbmx5IGlmIHF1YW50aXplX2NvbG9ycyBpcyBUUlVFLgotCi1pbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzCi0JTWF4aW11bSBudW1iZXIgb2YgY29sb3JzIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGEgbGlicmFyeS1zdXBwbGllZCBjb2xvcgotCW1hcCAodGhlIGFjdHVhbCBudW1iZXIgb2YgY29sb3JzIGlzIHJldHVybmVkIGluIGEgZGlmZmVyZW50IGZpZWxkKS4KLQlEZWZhdWx0IDI1Ni4gIElnbm9yZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZXMgaXRzIG93biBjb2xvciBtYXAuCi0KLWJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemUKLQlJZiBUUlVFLCBhbiBleHRyYSBwYXNzIG92ZXIgdGhlIGltYWdlIGlzIG1hZGUgdG8gc2VsZWN0IGEgY3VzdG9tIGNvbG9yCi0JbWFwIGZvciB0aGUgaW1hZ2UuICBUaGlzIHVzdWFsbHkgbG9va3MgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIG9uZS1zaXplLQotCWZpdHMtYWxsIGNvbG9ybWFwIHRoYXQgaXMgdXNlZCBvdGhlcndpc2UuICBEZWZhdWx0IGlzIFRSVUUuICBJZ25vcmVkCi0Jd2hlbiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZXMgaXRzIG93biBjb2xvciBtYXAuCi0KLUpfRElUSEVSX01PREUgZGl0aGVyX21vZGUKLQlTZWxlY3RzIGNvbG9yIGRpdGhlcmluZyBtZXRob2QuICBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKLQkJSkRJVEhFUl9OT05FCW5vIGRpdGhlcmluZzogZmFzdCwgdmVyeSBsb3cgcXVhbGl0eQotCQlKRElUSEVSX09SREVSRUQJb3JkZXJlZCBkaXRoZXI6IG1vZGVyYXRlIHNwZWVkIGFuZCBxdWFsaXR5Ci0JCUpESVRIRVJfRlMJRmxveWQtU3RlaW5iZXJnIGRpdGhlcjogc2xvdywgaGlnaCBxdWFsaXR5Ci0JRGVmYXVsdCBpcyBKRElUSEVSX0ZTLiAgKEF0IHByZXNlbnQsIG9yZGVyZWQgZGl0aGVyIGlzIGltcGxlbWVudGVkCi0Jb25seSBpbiB0aGUgc2luZ2xlLXBhc3MsIHN0YW5kYXJkLWNvbG9ybWFwIGNhc2UuICBJZiB5b3UgYXNrIGZvcgotCW9yZGVyZWQgZGl0aGVyIHdoZW4gdHdvX3Bhc3NfcXVhbnRpemUgaXMgVFJVRSBvciB3aGVuIHlvdSBzdXBwbHkKLQlhbiBleHRlcm5hbCBjb2xvciBtYXAsIHlvdSdsbCBnZXQgRi1TIGRpdGhlcmluZy4pCi0KLVdoZW4gcXVhbnRpemVfY29sb3JzIGlzIFRSVUUsIHRoZSB0YXJnZXQgY29sb3IgbWFwIGlzIGRlc2NyaWJlZCBieSB0aGUgbmV4dAotdHdvIGZpZWxkcy4gIGNvbG9ybWFwIGlzIHNldCB0byBOVUxMIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gIFRoZSBhcHBsaWNhdGlvbgotY2FuIHN1cHBseSBhIGNvbG9yIG1hcCBieSBzZXR0aW5nIGNvbG9ybWFwIG5vbi1OVUxMIGFuZCBzZXR0aW5nCi1hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyB0byB0aGUgbWFwIHNpemUuICBPdGhlcndpc2UsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpCi1zZWxlY3RzIGEgc3VpdGFibGUgY29sb3IgbWFwIGFuZCBzZXRzIHRoZXNlIHR3byBmaWVsZHMgaXRzZWxmLgotW0ltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uOiBhdCBwcmVzZW50LCBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbG9ybWFwIGlzCi1vbmx5IGFjY2VwdGVkIGZvciAzLWNvbXBvbmVudCBvdXRwdXQgY29sb3Igc3BhY2VzLl0KLQotSlNBTVBBUlJBWSBjb2xvcm1hcAotCVRoZSBjb2xvciBtYXAsIHJlcHJlc2VudGVkIGFzIGEgMi1EIHBpeGVsIGFycmF5IG9mIG91dF9jb2xvcl9jb21wb25lbnRzCi0Jcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4gIElnbm9yZWQgaWYgbm90IHF1YW50aXppbmcuCi0JQ0FVVElPTjogaWYgdGhlIEpQRUcgbGlicmFyeSBjcmVhdGVzIGl0cyBvd24gY29sb3JtYXAsIHRoZSBzdG9yYWdlCi0JcG9pbnRlZCB0byBieSB0aGlzIGZpZWxkIGlzIHJlbGVhc2VkIGJ5IGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KLQlDb3B5IHRoZSBjb2xvcm1hcCBzb21ld2hlcmUgZWxzZSBmaXJzdCwgaWYgeW91IHdhbnQgdG8gc2F2ZSBpdC4KLQotaW50IGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzCi0JVGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIGNvbG9yIG1hcC4KLQotQWRkaXRpb25hbCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdGhhdCB0aGUgYXBwbGljYXRpb24gbWF5IHNldCBpbmNsdWRlOgotCi1KX0RDVF9NRVRIT0QgZGN0X21ldGhvZAotCVNlbGVjdHMgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgRENUIHN0ZXAuICBDaG9pY2VzIGFyZSB0aGUgc2FtZQotCWFzIGRlc2NyaWJlZCBhYm92ZSBmb3IgY29tcHJlc3Npb24uCi0KLWJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZwotCUlmIFRSVUUsIGRvIGNhcmVmdWwgdXBzYW1wbGluZyBvZiBjaHJvbWEgY29tcG9uZW50cy4gIElmIEZBTFNFLAotCWEgZmFzdGVyIGJ1dCBzbG9wcGllciBtZXRob2QgaXMgdXNlZC4gIERlZmF1bHQgaXMgVFJVRS4gIFRoZSB2aXN1YWwKLQlpbXBhY3Qgb2YgdGhlIHNsb3BwaWVyIG1ldGhvZCBpcyBvZnRlbiB2ZXJ5IHNtYWxsLgotCi1ib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZwotCUlmIFRSVUUsIGludGVyYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpZWQgaW4gZWFybHkgc3RhZ2VzIG9mIGRlY29kaW5nCi0JcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlczsgaWYgRkFMU0UsIG5vdC4gIERlZmF1bHQgaXMgVFJVRS4gIEVhcmx5Ci0JcHJvZ3Jlc3Npb24gc3RhZ2VzIGxvb2sgImZ1enp5IiB3aXRoIHNtb290aGluZywgImJsb2NreSIgd2l0aG91dC4KLQlJbiBhbnkgY2FzZSwgYmxvY2sgc21vb3RoaW5nIGNlYXNlcyB0byBiZSBhcHBsaWVkIGFmdGVyIHRoZSBmaXJzdCBmZXcKLQlBQyBjb2VmZmljaWVudHMgYXJlIGtub3duIHRvIGZ1bGwgYWNjdXJhY3ksIHNvIGl0IGlzIHJlbGV2YW50IG9ubHkKLQl3aGVuIHVzaW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUgZm9yIHByb2dyZXNzaXZlIGltYWdlcy4KLQotYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQKLWJvb2xlYW4gZW5hYmxlX2V4dGVybmFsX3F1YW50Ci1ib29sZWFuIGVuYWJsZV8ycGFzc19xdWFudAotCVRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHdoaWNoIGlzCi0JZGVzY3JpYmVkIGluIGl0cyBvd24gc2VjdGlvbiBiZWxvdy4KLQotCi1UaGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYXJlIGdpdmVuIGJ5IHRoZSBmb2xsb3dpbmcgZmllbGRzLiAgVGhlc2UgYXJlCi1jb21wdXRlZCBmcm9tIHRoZSBzb3VyY2UgaW1hZ2UgZGltZW5zaW9ucyBhbmQgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycwotYnkganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBZb3UgY2FuIGFsc28gY2FsbCBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKQotdG8gb2J0YWluIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXR0aW5ncy4KLVRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgYXJlIHRyeWluZyB0byBwaWNrIGEgc2NhbGluZyByYXRpbyB0aGF0IHdpbGwgZ2V0Ci1jbG9zZSB0byBhIGRlc2lyZWQgdGFyZ2V0IHNpemUuICBJdCdzIGFsc28gaW1wb3J0YW50IGlmIHlvdSBhcmUgdXNpbmcgdGhlCi1KUEVHIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIHNwYWNlLCBiZWNhdXNlIHlvdQotYXJlIHN1cHBvc2VkIHRvIHJlcXVlc3Qgc3VjaCBidWZmZXJzICpiZWZvcmUqIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotCi1KRElNRU5TSU9OIG91dHB1dF93aWR0aAkJQWN0dWFsIGRpbWVuc2lvbnMgb2Ygb3V0cHV0IGltYWdlLgotSkRJTUVOU0lPTiBvdXRwdXRfaGVpZ2h0Ci1pbnQgb3V0X2NvbG9yX2NvbXBvbmVudHMJTnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlLgotaW50IG91dHB1dF9jb21wb25lbnRzCQlOdW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZC4KLWludCByZWNfb3V0YnVmX2hlaWdodAkJUmVjb21tZW5kZWQgaGVpZ2h0IG9mIHNjYW5saW5lIGJ1ZmZlci4KLQotV2hlbiBxdWFudGl6aW5nIGNvbG9ycywgb3V0cHV0X2NvbXBvbmVudHMgaXMgMSwgaW5kaWNhdGluZyBhIHNpbmdsZSBjb2xvciBtYXAKLWluZGV4IHBlciBwaXhlbC4gIE90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuICBUaGUgb3V0cHV0IGFycmF5cwotYXJlIHJlcXVpcmVkIHRvIGJlIG91dHB1dF93aWR0aCAqIG91dHB1dF9jb21wb25lbnRzIEpTQU1QTEVzIHdpZGUuCi0KLXJlY19vdXRidWZfaGVpZ2h0IGlzIHRoZSByZWNvbW1lbmRlZCBtaW5pbXVtIGhlaWdodCAoaW4gc2NhbmxpbmVzKSBvZiB0aGUKLWJ1ZmZlciBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpLiAgSWYgdGhlIGJ1ZmZlciBpcyBzbWFsbGVyLCB0aGUKLWxpYnJhcnkgd2lsbCBzdGlsbCB3b3JrLCBidXQgdGltZSB3aWxsIGJlIHdhc3RlZCBkdWUgdG8gdW5uZWNlc3NhcnkgZGF0YQotY29weWluZy4gIEluIGhpZ2gtcXVhbGl0eSBtb2RlcywgcmVjX291dGJ1Zl9oZWlnaHQgaXMgYWx3YXlzIDEsIGJ1dCBzb21lCi1mYXN0ZXIsIGxvd2VyLXF1YWxpdHkgbW9kZXMgc2V0IGl0IHRvIGxhcmdlciB2YWx1ZXMgKHR5cGljYWxseSAyIHRvIDQpLgotSWYgeW91IGFyZSBnb2luZyB0byBhc2sgZm9yIGEgaGlnaC1zcGVlZCBwcm9jZXNzaW5nIG1vZGUsIHlvdSBtYXkgYXMgd2VsbAotZ28gdG8gdGhlIHRyb3VibGUgb2YgaG9ub3JpbmcgcmVjX291dGJ1Zl9oZWlnaHQgc28gYXMgdG8gYXZvaWQgZGF0YSBjb3B5aW5nLgotKEFuIG91dHB1dCBidWZmZXIgbGFyZ2VyIHRoYW4gcmVjX291dGJ1Zl9oZWlnaHQgbGluZXMgaXMgT0ssIGJ1dCB3b24ndAotcHJvdmlkZSBhbnkgbWF0ZXJpYWwgc3BlZWQgaW1wcm92ZW1lbnQgb3ZlciB0aGF0IGhlaWdodC4pCi0KLQotU3BlY2lhbCBjb2xvciBzcGFjZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBKUEVHIHN0YW5kYXJkIGl0c2VsZiBpcyAiY29sb3IgYmxpbmQiIGFuZCBkb2Vzbid0IHNwZWNpZnkgYW55IHBhcnRpY3VsYXIKLWNvbG9yIHNwYWNlLiAgSXQgaXMgY3VzdG9tYXJ5IHRvIGNvbnZlcnQgY29sb3IgZGF0YSB0byBhIGx1bWluYW5jZS9jaHJvbWluYW5jZQotY29sb3Igc3BhY2UgYmVmb3JlIGNvbXByZXNzaW5nLCBzaW5jZSB0aGlzIHBlcm1pdHMgZ3JlYXRlciBjb21wcmVzc2lvbi4gIFRoZQotZXhpc3RpbmcgZGUtZmFjdG8gSlBFRyBmaWxlIGZvcm1hdCBzdGFuZGFyZHMgc3BlY2lmeSBZQ2JDciBvciBncmF5c2NhbGUgZGF0YQotKEpGSUYpLCBvciBncmF5c2NhbGUsIFJHQiwgWUNiQ3IsIENNWUssIG9yIFlDQ0sgKEFkb2JlKS4gIEZvciBzcGVjaWFsCi1hcHBsaWNhdGlvbnMgc3VjaCBhcyBtdWx0aXNwZWN0cmFsIGltYWdlcywgb3RoZXIgY29sb3Igc3BhY2VzIGNhbiBiZSB1c2VkLAotYnV0IGl0IG11c3QgYmUgdW5kZXJzdG9vZCB0aGF0IHN1Y2ggZmlsZXMgd2lsbCBiZSB1bnBvcnRhYmxlLgotCi1UaGUgSlBFRyBsaWJyYXJ5IGNhbiBoYW5kbGUgdGhlIG1vc3QgY29tbW9uIGNvbG9yc3BhY2UgY29udmVyc2lvbnMgKG5hbWVseQotUkdCIDw9PiBZQ2JDciBhbmQgQ01ZSyA8PT4gWUNDSykuICBJdCBjYW4gYWxzbyBkZWFsIHdpdGggZGF0YSBvZiBhbiB1bmtub3duCi1jb2xvciBzcGFjZSwgcGFzc2luZyBpdCB0aHJvdWdoIHdpdGhvdXQgY29udmVyc2lvbi4gIElmIHlvdSBkZWFsIGV4dGVuc2l2ZWx5Ci13aXRoIGFuIHVudXN1YWwgY29sb3Igc3BhY2UsIHlvdSBjYW4gZWFzaWx5IGV4dGVuZCB0aGUgbGlicmFyeSB0byB1bmRlcnN0YW5kCi1hZGRpdGlvbmFsIGNvbG9yIHNwYWNlcyBhbmQgcGVyZm9ybSBhcHByb3ByaWF0ZSBjb252ZXJzaW9ucy4KLQotRm9yIGNvbXByZXNzaW9uLCB0aGUgc291cmNlIGRhdGEncyBjb2xvciBzcGFjZSBpcyBzcGVjaWZpZWQgYnkgZmllbGQKLWluX2NvbG9yX3NwYWNlLiAgVGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgZ2l2ZW4KLWJ5IGpwZWdfY29sb3Jfc3BhY2UuICBqcGVnX3NldF9kZWZhdWx0cygpIGNob29zZXMgYSByZWFzb25hYmxlIEpQRUcgY29sb3IKLXNwYWNlIGRlcGVuZGluZyBvbiBpbl9jb2xvcl9zcGFjZSwgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSBjYWxsaW5nCi1qcGVnX3NldF9jb2xvcnNwYWNlKCkuICBPZiBjb3Vyc2UgeW91IG11c3Qgc2VsZWN0IGEgc3VwcG9ydGVkIHRyYW5zZm9ybWF0aW9uLgotamNjb2xvci5jIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9uczoKLQlSR0IgPT4gWUNiQ3IKLQlSR0IgPT4gR1JBWVNDQUxFCi0JWUNiQ3IgPT4gR1JBWVNDQUxFCi0JQ01ZSyA9PiBZQ0NLCi1wbHVzIHRoZSBudWxsIHRyYW5zZm9ybXM6IEdSQVlTQ0FMRSA9PiBHUkFZU0NBTEUsIFJHQiA9PiBSR0IsCi1ZQ2JDciA9PiBZQ2JDciwgQ01ZSyA9PiBDTVlLLCBZQ0NLID0+IFlDQ0ssIGFuZCBVTktOT1dOID0+IFVOS05PV04uCi0KLVRoZSBkZS1mYWN0byBmaWxlIGZvcm1hdCBzdGFuZGFyZHMgKEpGSUYgYW5kIEFkb2JlKSBzcGVjaWZ5IEFQUG4gbWFya2VycyB0aGF0Ci1pbmRpY2F0ZSB0aGUgY29sb3Igc3BhY2Ugb2YgdGhlIEpQRUcgZmlsZS4gIEl0IGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhhdAotdGhlc2UgYXJlIHdyaXR0ZW4gY29ycmVjdGx5LCBvciBvbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBpcyBub3QKLW9uZSBvZiB0aGUgb25lcyBzdXBwb3J0ZWQgYnkgdGhlIGRlLWZhY3RvIHN0YW5kYXJkcy4gIGpwZWdfc2V0X2NvbG9yc3BhY2UoKQotd2lsbCBzZXQgdGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBvciBvbWl0IHRoZSBBUFBuIG1hcmtlcnMKLXByb3Blcmx5LCBzbyBsb25nIGFzIGl0IGlzIHRvbGQgdGhlIHRydXRoIGFib3V0IHRoZSBKUEVHIGNvbG9yIHNwYWNlLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyBzb21lIHJhbmRvbSAzLWNvbXBvbmVudCBjb2xvciBzcGFjZSB3aXRob3V0Ci1jb252ZXJzaW9uLCBkb24ndCB0cnkgdG8gZmFrZSBvdXQgdGhlIGxpYnJhcnkgYnkgc2V0dGluZyBpbl9jb2xvcl9zcGFjZSBhbmQKLWpwZWdfY29sb3Jfc3BhY2UgdG8gSkNTX1lDYkNyOyB1c2UgSkNTX1VOS05PV04uICBZb3UgbWF5IHdhbnQgdG8gd3JpdGUgYW4KLUFQUG4gbWFya2VyIG9mIHlvdXIgb3duIGRldmlzaW5nIHRvIGlkZW50aWZ5IHRoZSBjb2xvcnNwYWNlIC0tLSBzZWUgIlNwZWNpYWwKLW1hcmtlcnMiLCBiZWxvdy4KLQotV2hlbiB0b2xkIHRoYXQgdGhlIGNvbG9yIHNwYWNlIGlzIFVOS05PV04sIHRoZSBsaWJyYXJ5IHdpbGwgZGVmYXVsdCB0byB1c2luZwotbHVtaW5hbmNlLXF1YWxpdHkgY29tcHJlc3Npb24gcGFyYW1ldGVycyBmb3IgYWxsIGNvbG9yIGNvbXBvbmVudHMuICBZb3UgbWF5Ci13ZWxsIHdhbnQgdG8gY2hhbmdlIHRoZXNlIHBhcmFtZXRlcnMuICBTZWUgdGhlIHNvdXJjZSBjb2RlIGZvcgotanBlZ19zZXRfY29sb3JzcGFjZSgpLCBpbiBqY3BhcmFtLmMsIGZvciBkZXRhaWxzLgotCi1Gb3IgZGVjb21wcmVzc2lvbiwgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGlzIGdpdmVuIGluIGpwZWdfY29sb3Jfc3BhY2UsCi1hbmQgdGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlIG91dF9jb2xvcl9zcGFjZS4KLWpwZWdfcmVhZF9oZWFkZXIncyBzZXR0aW5nIG9mIGpwZWdfY29sb3Jfc3BhY2UgY2FuIGJlIHJlbGllZCBvbiBpZiB0aGUgZmlsZQotY29uZm9ybXMgdG8gSkZJRiBvciBBZG9iZSBjb252ZW50aW9ucywgYnV0IG90aGVyd2lzZSBpdCBpcyBubyBiZXR0ZXIgdGhhbiBhCi1ndWVzcy4gIElmIHlvdSBrbm93IHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBmb3IgY2VydGFpbiwgeW91IGNhbiBvdmVycmlkZQotanBlZ19yZWFkX2hlYWRlcidzIGd1ZXNzIGJ5IHNldHRpbmcganBlZ19jb2xvcl9zcGFjZS4gIGpwZWdfcmVhZF9oZWFkZXIgYWxzbwotc2VsZWN0cyBhIGRlZmF1bHQgb3V0cHV0IGNvbG9yIHNwYWNlIGJhc2VkIG9uIChpdHMgZ3Vlc3Mgb2YpIGpwZWdfY29sb3Jfc3BhY2U7Ci1zZXQgb3V0X2NvbG9yX3NwYWNlIHRvIG92ZXJyaWRlIHRoaXMuICBBZ2FpbiwgeW91IG11c3Qgc2VsZWN0IGEgc3VwcG9ydGVkCi10cmFuc2Zvcm1hdGlvbi4gIGpkY29sb3IuYyBjdXJyZW50bHkgc3VwcG9ydHMKLQlZQ2JDciA9PiBHUkFZU0NBTEUKLQlZQ2JDciA9PiBSR0IKLQlHUkFZU0NBTEUgPT4gUkdCCi0JWUNDSyA9PiBDTVlLCi1hcyB3ZWxsIGFzIHRoZSBudWxsIHRyYW5zZm9ybXMuICAoU2luY2UgR1JBWVNDQUxFPT5SR0IgaXMgcHJvdmlkZWQsIGFuCi1hcHBsaWNhdGlvbiBjYW4gZm9yY2UgZ3JheXNjYWxlIEpQRUdzIHRvIGxvb2sgbGlrZSBjb2xvciBKUEVHcyBpZiBpdCBvbmx5Ci13YW50cyB0byBoYW5kbGUgb25lIGNhc2UuKQotCi1UaGUgdHdvLXBhc3MgY29sb3IgcXVhbnRpemVyLCBqcXVhbnQyLmMsIGlzIHNwZWNpYWxpemVkIHRvIGhhbmRsZSBSR0IgZGF0YQotKGl0IHdlaWdodHMgZGlzdGFuY2VzIGFwcHJvcHJpYXRlbHkgZm9yIFJHQiBjb2xvcnMpLiAgWW91J2xsIG5lZWQgdG8gbW9kaWZ5Ci10aGUgY29kZSBpZiB5b3Ugd2FudCB0byB1c2UgaXQgZm9yIG5vbi1SR0Igb3V0cHV0IGNvbG9yIHNwYWNlcy4gIE5vdGUgdGhhdAotanF1YW50Mi5jIGlzIHVzZWQgdG8gbWFwIHRvIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGNvbG9ybWFwIGFzIHdlbGwgYXMgZm9yCi10aGUgbm9ybWFsIHR3by1wYXNzIGNvbG9ybWFwIHNlbGVjdGlvbiBwcm9jZXNzLgotCi1DQVVUSU9OOiBpdCBhcHBlYXJzIHRoYXQgQWRvYmUgUGhvdG9zaG9wIHdyaXRlcyBpbnZlcnRlZCBkYXRhIGluIENNWUsgSlBFRwotZmlsZXM6IDAgcmVwcmVzZW50cyAxMDAlIGluayBjb3ZlcmFnZSwgcmF0aGVyIHRoYW4gMCUgaW5rIGFzIHlvdSdkIGV4cGVjdC4KLVRoaXMgaXMgYXJndWFibHkgYSBidWcgaW4gUGhvdG9zaG9wLCBidXQgaWYgeW91IG5lZWQgdG8gd29yayB3aXRoIFBob3Rvc2hvcAotQ01ZSyBmaWxlcywgeW91IHdpbGwgaGF2ZSB0byBkZWFsIHdpdGggaXQgaW4geW91ciBhcHBsaWNhdGlvbi4gIFdlIGNhbm5vdAotImZpeCIgdGhpcyBpbiB0aGUgbGlicmFyeSBieSBpbnZlcnRpbmcgdGhlIGRhdGEgZHVyaW5nIHRoZSBDTVlLPD0+WUNDSwotdHJhbnNmb3JtLCBiZWNhdXNlIHRoYXQgd291bGQgYnJlYWsgb3RoZXIgYXBwbGljYXRpb25zLCBub3RhYmx5IEdob3N0c2NyaXB0LgotUGhvdG9zaG9wIHZlcnNpb25zIHByaW9yIHRvIDMuMCB3cml0ZSBFUFMgZmlsZXMgY29udGFpbmluZyBKUEVHLWVuY29kZWQgQ01ZSwotZGF0YSBpbiB0aGUgc2FtZSBpbnZlcnRlZC1ZQ0NLIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gYmFyZSBKUEVHIGZpbGVzLCBidXQKLXRoZSBzdXJyb3VuZGluZyBQb3N0U2NyaXB0IGNvZGUgcGVyZm9ybXMgYW4gaW52ZXJzaW9uIHVzaW5nIHRoZSBQUyBpbWFnZQotb3BlcmF0b3IuICBJIGFtIHRvbGQgdGhhdCBQaG90b3Nob3AgMy4wIHdpbGwgd3JpdGUgdW5pbnZlcnRlZCBZQ0NLIGluCi1FUFMvSlBFRyBmaWxlcywgYW5kIHdpbGwgb21pdCB0aGUgUFMtbGV2ZWwgaW52ZXJzaW9uLiAgKEJ1dCB0aGUgZGF0YQotcG9sYXJpdHkgdXNlZCBpbiBiYXJlIEpQRUcgZmlsZXMgd2lsbCBub3QgY2hhbmdlIGluIDMuMC4pICBJbiBlaXRoZXIgY2FzZSwKLXRoZSBKUEVHIGxpYnJhcnkgbXVzdCBub3QgaW52ZXJ0IHRoZSBkYXRhIGl0c2VsZiwgb3IgZWxzZSBHaG9zdHNjcmlwdCB3b3VsZAotcmVhZCB0aGVzZSBFUFMgZmlsZXMgaW5jb3JyZWN0bHkuCi0KLQotRXJyb3IgaGFuZGxpbmcKLS0tLS0tLS0tLS0tLS0tCi0KLVdoZW4gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBpcyB1c2VkLCBhbnkgZXJyb3IgZGV0ZWN0ZWQgaW5zaWRlIHRoZSBKUEVHCi1yb3V0aW5lcyB3aWxsIGNhdXNlIGEgbWVzc2FnZSB0byBiZSBwcmludGVkIG9uIHN0ZGVyciwgZm9sbG93ZWQgYnkgZXhpdCgpLgotWW91IGNhbiBzdXBwbHkgeW91ciBvd24gZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcgotYW5kIHRvIGNvbnRyb2wgdGhlIHRyZWF0bWVudCBvZiBub25mYXRhbCB3YXJuaW5ncyBhbmQgdHJhY2UvZGVidWcgbWVzc2FnZXMuCi1UaGUgZmlsZSBleGFtcGxlLmMgaWxsdXN0cmF0ZXMgdGhlIG1vc3QgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHRvIGhhdmUgdGhlCi1hcHBsaWNhdGlvbiByZWdhaW4gY29udHJvbCBhZnRlciBhbiBlcnJvciByYXRoZXIgdGhhbiBleGl0aW5nLgotCi1UaGUgSlBFRyBsaWJyYXJ5IG5ldmVyIHdyaXRlcyBhbnkgbWVzc2FnZSBkaXJlY3RseTsgaXQgYWx3YXlzIGdvZXMgdGhyb3VnaAotdGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLiAgVGhyZWUgY2xhc3NlcyBvZiBtZXNzYWdlcyBhcmUgcmVjb2duaXplZDoKLSAgKiBGYXRhbCBlcnJvcnM6IHRoZSBsaWJyYXJ5IGNhbm5vdCBjb250aW51ZS4KLSAgKiBXYXJuaW5nczogdGhlIGxpYnJhcnkgY2FuIGNvbnRpbnVlLCBidXQgdGhlIGRhdGEgaXMgY29ycnVwdCwgYW5kIGEKLSAgICBkYW1hZ2VkIG91dHB1dCBpbWFnZSBpcyBsaWtlbHkgdG8gcmVzdWx0LgotICAqIFRyYWNlL2luZm9ybWF0aW9uYWwgbWVzc2FnZXMuICBUaGVzZSBjb21lIHdpdGggYSB0cmFjZSBsZXZlbCBpbmRpY2F0aW5nCi0gICAgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIG1lc3NhZ2U7IHlvdSBjYW4gY29udHJvbCB0aGUgdmVyYm9zaXR5IG9mIHRoZQotICAgIHByb2dyYW0gYnkgYWRqdXN0aW5nIHRoZSBtYXhpbXVtIHRyYWNlIGxldmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuCi0KLVlvdSBtYXksIGlmIHlvdSB3aXNoLCBzaW1wbHkgcmVwbGFjZSB0aGUgZW50aXJlIEpQRUcgZXJyb3IgaGFuZGxpbmcgbW9kdWxlCi0oamVycm9yLmMpIHdpdGggeW91ciBvd24gY29kZS4gIEhvd2V2ZXIsIHlvdSBjYW4gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiBieQotb25seSByZXBsYWNpbmcgc29tZSBvZiB0aGUgcm91dGluZXMgZGVwZW5kaW5nIG9uIHRoZSBiZWhhdmlvciB5b3UgbmVlZC4KLVRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGNhbGxpbmcganBlZ19zdGRfZXJyb3IoKSBhcyB1c3VhbCwgYnV0IHRoZW4gb3ZlcnJpZGluZwotc29tZSBvZiB0aGUgbWV0aG9kIHBvaW50ZXJzIGluIHRoZSBqcGVnX2Vycm9yX21nciBzdHJ1Y3QsIGFzIGlsbHVzdHJhdGVkIGJ5Ci1leGFtcGxlLmMuCi0KLUFsbCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgd2lsbCByZWNlaXZlIGEgcG9pbnRlciB0byB0aGUgSlBFRyBvYmplY3QKLShhIGpfY29tbW9uX3B0ciB3aGljaCBwb2ludHMgdG8gZWl0aGVyIGEganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IgYQotanBlZ19kZWNvbXByZXNzX3N0cnVjdDsgaWYgeW91IG5lZWQgdG8gdGVsbCB3aGljaCwgdGVzdCB0aGUgaXNfZGVjb21wcmVzc29yCi1maWVsZCkuICBUaGlzIHN0cnVjdCBpbmNsdWRlcyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0IGluIGl0cwotImVyciIgZmllbGQuICBGcmVxdWVudGx5LCBjdXN0b20gZXJyb3IgaGFuZGxlciByb3V0aW5lcyB3aWxsIG5lZWQgdG8gYWNjZXNzCi1hZGRpdGlvbmFsIGRhdGEgd2hpY2ggaXMgbm90IGtub3duIHRvIHRoZSBKUEVHIGxpYnJhcnkgb3IgdGhlIHN0YW5kYXJkIGVycm9yCi1oYW5kbGVyLiAgVGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbWJlZCBlaXRoZXIgdGhlIEpQRUcKLW9iamVjdCBvciB0aGUganBlZ19lcnJvcl9tZ3Igc3RydWN0IGluIGEgbGFyZ2VyIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi1hZGRpdGlvbmFsIGZpZWxkczsgdGhlbiBjYXN0aW5nIHRoZSBwYXNzZWQgcG9pbnRlciBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCi1hZGRpdGlvbmFsIGZpZWxkcy4gIEFnYWluLCBzZWUgZXhhbXBsZS5jIGZvciBvbmUgd2F5IHRvIGRvIGl0LiAgKEJlZ2lubmluZwotd2l0aCBJSkcgdmVyc2lvbiA2YiwgdGhlcmUgaXMgYWxzbyBhIHZvaWQgcG9pbnRlciAiY2xpZW50X2RhdGEiIGluIGVhY2gKLUpQRUcgb2JqZWN0LCB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIGFsc28gdXNlIHRvIGZpbmQgcmVsYXRlZCBkYXRhLgotVGhlIGxpYnJhcnkgZG9lcyBub3QgdG91Y2ggY2xpZW50X2RhdGEgYXQgYWxsLikKLQotVGhlIGluZGl2aWR1YWwgbWV0aG9kcyB0aGF0IHlvdSBtaWdodCB3aXNoIHRvIG92ZXJyaWRlIGFyZToKLQotZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQotCVJlY2VpdmVzIGNvbnRyb2wgZm9yIGEgZmF0YWwgZXJyb3IuICBJbmZvcm1hdGlvbiBzdWZmaWNpZW50IHRvCi0JZ2VuZXJhdGUgdGhlIGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gc3RvcmVkIGluIGNpbmZvLT5lcnI7IGNhbGwKLQlvdXRwdXRfbWVzc2FnZSB0byBkaXNwbGF5IGl0LiAgQ29udHJvbCBtdXN0IE5PVCByZXR1cm4gdG8gdGhlIGNhbGxlcjsKLQlnZW5lcmFsbHkgdGhpcyByb3V0aW5lIHdpbGwgZXhpdCgpIG9yIGxvbmdqbXAoKSBzb21ld2hlcmUuCi0JVHlwaWNhbGx5IHlvdSB3b3VsZCBvdmVycmlkZSB0aGlzIHJvdXRpbmUgdG8gZ2V0IHJpZCBvZiB0aGUgZXhpdCgpCi0JZGVmYXVsdCBiZWhhdmlvci4gIE5vdGUgdGhhdCBpZiB5b3UgY29udGludWUgcHJvY2Vzc2luZywgeW91IHNob3VsZAotCWNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCB3aXRoIGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4KLQotb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKLQlBY3R1YWwgb3V0cHV0IG9mIGFueSBKUEVHIG1lc3NhZ2UuICBPdmVycmlkZSB0aGlzIHRvIHNlbmQgbWVzc2FnZXMKLQlzb21ld2hlcmUgb3RoZXIgdGhhbiBzdGRlcnIuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdwotCWhvdyB0byBnZW5lcmF0ZSBhIG1lc3NhZ2UsIG9ubHkgd2hlcmUgdG8gc2VuZCBpdC4KLQotZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKLQlDb25zdHJ1Y3RzIGEgcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgYmFzZWQgb24gdGhlIGVycm9yIGluZm8KLQlzdG9yZWQgaW4gY2luZm8tPmVyci4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBvdXRwdXRfbWVzc2FnZS4gIEZldwotCWFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4gIE9uZSBwb3NzaWJsZQotCXJlYXNvbiBmb3IgZG9pbmcgc28gaXMgdG8gaW1wbGVtZW50IGR5bmFtaWMgc3dpdGNoaW5nIG9mIGVycm9yIG1lc3NhZ2UKLQlsYW5ndWFnZS4KLQotZW1pdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpCi0JRGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGVtaXQgYSB3YXJuaW5nIG9yIHRyYWNlIG1lc3NhZ2U7IGlmIHNvLAotCWNhbGxzIG91dHB1dF9tZXNzYWdlLiAgVGhlIG1haW4gcmVhc29uIGZvciBvdmVycmlkaW5nIHRoaXMgbWV0aG9kCi0Jd291bGQgYmUgdG8gYWJvcnQgb24gd2FybmluZ3MuICBtc2dfbGV2ZWwgaXMgLTEgZm9yIHdhcm5pbmdzLAotCTAgYW5kIHVwIGZvciB0cmFjZSBtZXNzYWdlcy4KLQotT25seSBlcnJvcl9leGl0KCkgYW5kIGVtaXRfbWVzc2FnZSgpIGFyZSBjYWxsZWQgZnJvbSB0aGUgcmVzdCBvZiB0aGUgSlBFRwotbGlicmFyeTsgdGhlIG90aGVyIHR3byBhcmUgaW50ZXJuYWwgdG8gdGhlIGVycm9yIGhhbmRsZXIuCi0KLVRoZSBhY3R1YWwgbWVzc2FnZSB0ZXh0cyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggaXMgcG9pbnRlZCB0bwotYnkgdGhlIGZpZWxkIGVyci0+anBlZ19tZXNzYWdlX3RhYmxlLiAgVGhlIG1lc3NhZ2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8KLWVyci0+bGFzdF9qcGVnX21lc3NhZ2UsIGFuZCBpdCBpcyB0aGVzZSBjb2RlIG51bWJlcnMgdGhhdCBhcmUgdXNlZCBpbiB0aGUKLUpQRUcgbGlicmFyeSBjb2RlLiAgWW91IGNvdWxkIHJlcGxhY2UgdGhlIG1lc3NhZ2UgdGV4dHMgKGZvciBpbnN0YW5jZSwgd2l0aAotbWVzc2FnZXMgaW4gRnJlbmNoIG9yIEdlcm1hbikgYnkgY2hhbmdpbmcgdGhlIG1lc3NhZ2UgdGFibGUgcG9pbnRlci4gIFNlZQotamVycm9yLmggZm9yIHRoZSBkZWZhdWx0IHRleHRzLiAgQ0FVVElPTjogdGhpcyB0YWJsZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKLWNoYW5nZSBvciBncm93IGZyb20gb25lIGxpYnJhcnkgdmVyc2lvbiB0byB0aGUgbmV4dC4KLQotSXQgbWF5IGJlIHVzZWZ1bCBmb3IgYW4gYXBwbGljYXRpb24gdG8gYWRkIGl0cyBvd24gbWVzc2FnZSB0ZXh0cyB0aGF0IGFyZQotaGFuZGxlZCBieSB0aGUgc2FtZSBtZWNoYW5pc20uICBUaGUgZXJyb3IgaGFuZGxlciBzdXBwb3J0cyBhIHNlY29uZCAiYWRkLW9uIgotbWVzc2FnZSB0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLiAgVG8gZGVmaW5lIGFuIGFkZG9uIHRhYmxlLCBzZXQgdGhlIHBvaW50ZXIKLWVyci0+YWRkb25fbWVzc2FnZV90YWJsZSBhbmQgdGhlIG1lc3NhZ2UgbnVtYmVycyBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgYW5kCi1lcnItPmxhc3RfYWRkb25fbWVzc2FnZS4gIElmIHlvdSBudW1iZXIgdGhlIGFkZG9uIG1lc3NhZ2VzIGJlZ2lubmluZyBhdCAxMDAwCi1vciBzbywgeW91IHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgY29uZmxpY3RzIHdpdGggdGhlIGxpYnJhcnkncyBidWlsdC1pbgotbWVzc2FnZXMuICBTZWUgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcvZGpwZWcgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcKLWFkZG9uIG1lc3NhZ2VzICh0aGUgYWRkb24gbWVzc2FnZXMgYXJlIGRlZmluZWQgaW4gY2RlcnJvci5oKS4KLQotQWN0dWFsIGludm9jYXRpb24gb2YgdGhlIGVycm9yIGhhbmRsZXIgaXMgZG9uZSB2aWEgbWFjcm9zIGRlZmluZWQgaW4gamVycm9yLmg6Ci0JRVJSRVhJVG4oLi4uKQlmb3IgZmF0YWwgZXJyb3JzCi0JV0FSTk1TbiguLi4pCWZvciBjb3JydXB0LWRhdGEgd2FybmluZ3MKLQlUUkFDRU1TbiguLi4pCWZvciB0cmFjZSBhbmQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KLVRoZXNlIG1hY3JvcyBzdG9yZSB0aGUgbWVzc2FnZSBjb2RlIGFuZCBhbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGludG8gdGhlCi1lcnJvciBoYW5kbGVyIHN0cnVjdCwgdGhlbiBpbnZva2UgdGhlIGVycm9yX2V4aXQoKSBvciBlbWl0X21lc3NhZ2UoKSBtZXRob2QuCi1UaGUgdmFyaWFudHMgb2YgZWFjaCBtYWNybyBhcmUgZm9yIHZhcnlpbmcgbnVtYmVycyBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuCi1UaGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSB1c2luZwotc3RhbmRhcmQgcHJpbnRmKCkgZm9ybWF0IGNvZGVzLgotCi1TZWUgamVycm9yLmggYW5kIGplcnJvci5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0KLQotQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIChzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSlBFRyBjb21wcmVzc2lvbiBsaWJyYXJ5IHNlbmRzIGl0cyBjb21wcmVzc2VkIGRhdGEgdG8gYSAiZGVzdGluYXRpb24KLW1hbmFnZXIiIG1vZHVsZS4gIFRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIG1hbmFnZXIganVzdCB3cml0ZXMgdGhlIGRhdGEgdG8gYQotc3RkaW8gc3RyZWFtLCBidXQgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIG1hbmFnZXIgdG8gZG8gc29tZXRoaW5nIGVsc2UuCi1TaW1pbGFybHksIHRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgY2FsbHMgYSAic291cmNlIG1hbmFnZXIiIHRvIG9idGFpbiB0aGUKLWNvbXByZXNzZWQgZGF0YTsgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIHNvdXJjZSBtYW5hZ2VyIGlmIHlvdSB3YW50IHRoZSBkYXRhCi10byBjb21lIGZyb20gc29tZXdoZXJlIG90aGVyIHRoYW4gYSBzdGRpbyBzdHJlYW0uCi0KLUluIGJvdGggY2FzZXMsIGNvbXByZXNzZWQgZGF0YSBpcyBwcm9jZXNzZWQgYSBidWZmZXJsb2FkIGF0IGEgdGltZTogdGhlCi1kZXN0aW5hdGlvbiBvciBzb3VyY2UgbWFuYWdlciBwcm92aWRlcyBhIHdvcmsgYnVmZmVyLCBhbmQgdGhlIGxpYnJhcnkgaW52b2tlcwotdGhlIG1hbmFnZXIgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZmlsbGVkIG9yIGVtcHRpZWQuICAoWW91IGNvdWxkIGRlZmluZSBhCi1vbmUtY2hhcmFjdGVyIGJ1ZmZlciB0byBmb3JjZSB0aGUgbWFuYWdlciB0byBiZSBpbnZva2VkIGZvciBlYWNoIGJ5dGUsIGJ1dAotdGhhdCB3b3VsZCBiZSByYXRoZXIgaW5lZmZpY2llbnQuKSAgVGhlIGJ1ZmZlcidzIHNpemUgYW5kIGxvY2F0aW9uIGFyZQotY29udHJvbGxlZCBieSB0aGUgbWFuYWdlciwgbm90IGJ5IHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkZXNpcmVkIHRvCi1kZWNvbXByZXNzIGEgSlBFRyBkYXRhc3RyZWFtIHRoYXQgd2FzIGFsbCBpbiBtZW1vcnksIHlvdSBjb3VsZCBqdXN0IG1ha2UgdGhlCi1idWZmZXIgcG9pbnRlciBhbmQgbGVuZ3RoIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhIGluIG1lbW9yeS4gIFRoZW4gdGhlCi1idWZmZXItcmVsb2FkIHByb2NlZHVyZSB3b3VsZCBiZSBpbnZva2VkIG9ubHkgaWYgdGhlIGRlY29tcHJlc3NvciByYW4gb2ZmIHRoZQotZW5kIG9mIHRoZSBkYXRhc3RyZWFtLCB3aGljaCB3b3VsZCBpbmRpY2F0ZSBhbiBlcnJvbmVvdXMgZGF0YXN0cmVhbS4KLQotVGhlIHdvcmsgYnVmZmVyIGlzIGRlZmluZWQgYXMgYW4gYXJyYXkgb2YgZGF0YXR5cGUgSk9DVEVULCB3aGljaCBpcyBnZW5lcmFsbHkKLSJjaGFyIiBvciAidW5zaWduZWQgY2hhciIuICBPbiBhIG1hY2hpbmUgd2hlcmUgY2hhciBpcyBub3QgZXhhY3RseSA4IGJpdHMKLXdpZGUsIHlvdSBtdXN0IGRlZmluZSBKT0NURVQgYXMgYSB3aWRlciBkYXRhIHR5cGUgYW5kIHRoZW4gbW9kaWZ5IHRoZSBkYXRhCi1zb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgdG8gdHJhbnNjcmliZSB0aGUgd29yayBhcnJheXMgaW50byA4LWJpdCB1bml0cwotb24gZXh0ZXJuYWwgc3RvcmFnZS4KLQotQSBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIgc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciBhbmQgY291bnQgZGVmaW5pbmcgdGhlCi1uZXh0IGJ5dGUgdG8gd3JpdGUgaW4gdGhlIHdvcmsgYnVmZmVyIGFuZCB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2U6Ci0KLQlKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOyAgLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotCXNpemVfdCBmcmVlX2luX2J1ZmZlcjsgICAgICAvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLQotVGhlIGxpYnJhcnkgaW5jcmVtZW50cyB0aGUgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgY291bnQgdW50aWwgdGhlIGJ1ZmZlcgotaXMgZmlsbGVkLiAgVGhlIG1hbmFnZXIncyBlbXB0eV9vdXRwdXRfYnVmZmVyIG1ldGhvZCBtdXN0IHJlc2V0IHRoZSBwb2ludGVyCi1hbmQgY291bnQuICBUaGUgbWFuYWdlciBpcyBleHBlY3RlZCB0byByZW1lbWJlciB0aGUgYnVmZmVyJ3Mgc3RhcnRpbmcgYWRkcmVzcwotYW5kIHRvdGFsIHNpemUgaW4gcHJpdmF0ZSBmaWVsZHMgbm90IHZpc2libGUgdG8gdGhlIGxpYnJhcnkuCi0KLUEgZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHByb3ZpZGVzIHRocmVlIG1ldGhvZHM6Ci0KLWluaXRfZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCUluaXRpYWxpemUgZGVzdGluYXRpb24uICBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKLQliZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbi4gIEl0IG11c3QgaW5pdGlhbGl6ZQotCW5leHRfb3V0cHV0X2J5dGUgYW5kIGZyZWVfaW5fYnVmZmVyLiAgZnJlZV9pbl9idWZmZXIgbXVzdCBiZQotCWluaXRpYWxpemVkIHRvIGEgcG9zaXRpdmUgdmFsdWUuCi0KLWVtcHR5X291dHB1dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCVRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBidWZmZXIgaGFzIGZpbGxlZCAoZnJlZV9pbl9idWZmZXIKLQlyZWFjaGVzIHplcm8pLiAgSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIGl0IHNob3VsZCB3cml0ZSBvdXQgdGhlCi0JKmVudGlyZSogYnVmZmVyICh1c2UgdGhlIHNhdmVkIHN0YXJ0IGFkZHJlc3MgYW5kIGJ1ZmZlciBsZW5ndGg7Ci0JaWdub3JlIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfb3V0cHV0X2J5dGUgYW5kIGZyZWVfaW5fYnVmZmVyKS4KLQlUaGVuIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZAotCXJldHVybiBUUlVFIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGR1bXBlZC4KLQlmcmVlX2luX2J1ZmZlciBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlIHdoZW4gVFJVRSBpcwotCXJldHVybmVkLiAgQSBGQUxTRSByZXR1cm4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIEkvTyBzdXNwZW5zaW9uIGlzCi0JZGVzaXJlZCAodGhpcyBvcGVyYXRpbmcgbW9kZSBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbikuCi0KLXRlcm1fZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotCVRlcm1pbmF0ZSBkZXN0aW5hdGlvbiAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2NvbXByZXNzKCkgYWZ0ZXIgYWxsCi0JZGF0YSBoYXMgYmVlbiB3cml0dGVuLiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMsIHRoaXMgbXVzdCBmbHVzaCBhbnkKLQlkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyLiAgVXNlIGVpdGhlciBuZXh0X291dHB1dF9ieXRlIG9yCi0JZnJlZV9pbl9idWZmZXIgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlci4KLQotdGVybV9kZXN0aW5hdGlvbigpIGlzIE5PVCBjYWxsZWQgYnkganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLiAgSWYgeW91Ci13YW50IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHRvIGJlIGNsZWFuZWQgdXAgZHVyaW5nIGFuIGFib3J0LCB5b3UgbXVzdCBkbyBpdAoteW91cnNlbGYuCi0KLVlvdSB3aWxsIGFsc28gbmVlZCBjb2RlIHRvIGNyZWF0ZSBhIGpwZWdfZGVzdGluYXRpb25fbWdyIHN0cnVjdCwgZmlsbCBpbiBpdHMKLW1ldGhvZCBwb2ludGVycywgYW5kIGluc2VydCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpbnRvIHRoZSAiZGVzdCIgZmllbGQgb2YKLXRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIGRvbmUgaW4tbGluZSBpbiB5b3VyIHNldHVwIGNvZGUgaWYKLXlvdSBsaWtlLCBidXQgaXQncyBwcm9iYWJseSBjbGVhbmVyIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSByb3V0aW5lIHNpbWlsYXIgdG8KLXRoZSBqcGVnX3N0ZGlvX2Rlc3QoKSByb3V0aW5lIG9mIHRoZSBzdXBwbGllZCBkZXN0aW5hdGlvbiBtYW5hZ2VyLgotCi1EZWNvbXByZXNzaW9uIHNvdXJjZSBtYW5hZ2VycyBmb2xsb3cgYSBwYXJhbGxlbCBkZXNpZ24sIGJ1dCB3aXRoIHNvbWUKLWFkZGl0aW9uYWwgZnJhbW1pc2hlcy4gIFRoZSBzb3VyY2UgbWFuYWdlciBzdHJ1Y3QgY29udGFpbnMgYSBwb2ludGVyIGFuZCBjb3VudAotZGVmaW5pbmcgdGhlIG5leHQgYnl0ZSB0byByZWFkIGZyb20gdGhlIHdvcmsgYnVmZmVyIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1yZW1haW5pbmc6Ci0KLQljb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gYnVmZmVyICovCi0Jc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsgICAgICAgICAvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLQotVGhlIGxpYnJhcnkgaW5jcmVtZW50cyB0aGUgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgY291bnQgdW50aWwgdGhlIGJ1ZmZlcgotaXMgZW1wdGllZC4gIFRoZSBtYW5hZ2VyJ3MgZmlsbF9pbnB1dF9idWZmZXIgbWV0aG9kIG11c3QgcmVzZXQgdGhlIHBvaW50ZXIgYW5kCi1jb3VudC4gIEluIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgbWFuYWdlciBtdXN0IHJlbWVtYmVyIHRoZSBidWZmZXIncyBzdGFydGluZwotYWRkcmVzcyBhbmQgdG90YWwgc2l6ZSBpbiBwcml2YXRlIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgbGlicmFyeS4KLQotQSBkYXRhIHNvdXJjZSBtYW5hZ2VyIHByb3ZpZGVzIGZpdmUgbWV0aG9kczoKLQotaW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0JSW5pdGlhbGl6ZSBzb3VyY2UuICBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyKCkgYmVmb3JlIGFueQotCWRhdGEgaXMgYWN0dWFsbHkgcmVhZC4gIFVubGlrZSBpbml0X2Rlc3RpbmF0aW9uKCksIGl0IG1heSBsZWF2ZQotCWJ5dGVzX2luX2J1ZmZlciBzZXQgdG8gMCAoaW4gd2hpY2ggY2FzZSBhIGZpbGxfaW5wdXRfYnVmZmVyKCkgY2FsbAotCXdpbGwgb2NjdXIgaW1tZWRpYXRlbHkpLgotCi1maWxsX2lucHV0X2J1ZmZlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLQlUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBieXRlc19pbl9idWZmZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgbW9yZQotCWRhdGEgaXMgd2FudGVkLiAgSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIGl0IHNob3VsZCByZWFkIGZyZXNoIGRhdGEKLQlpbnRvIHRoZSBidWZmZXIgKGlnbm9yaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfaW5wdXRfYnl0ZSBhbmQKLQlieXRlc19pbl9idWZmZXIpLCByZXNldCB0aGUgcG9pbnRlciAmIGNvdW50IHRvIHRoZSBzdGFydCBvZiB0aGUKLQlidWZmZXIsIGFuZCByZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiByZWxvYWRlZC4KLQlJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciBlbnRpcmVseSwgb25seSB0byBvYnRhaW4gYXQKLQlsZWFzdCBvbmUgbW9yZSBieXRlLiAgYnl0ZXNfaW5fYnVmZmVyIE1VU1QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUKLQlpZiBUUlVFIGlzIHJldHVybmVkLiAgQSBGQUxTRSByZXR1cm4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIEkvTwotCXN1c3BlbnNpb24gaXMgZGVzaXJlZCAodGhpcyBtb2RlIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KLQotc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKLQlTa2lwIG51bV9ieXRlcyB3b3J0aCBvZiBkYXRhLiAgVGhlIGJ1ZmZlciBwb2ludGVyIGFuZCBjb3VudCBzaG91bGQKLQliZSBhZHZhbmNlZCBvdmVyIG51bV9ieXRlcyBpbnB1dCBieXRlcywgcmVmaWxsaW5nIHRoZSBidWZmZXIgYXMKLQluZWVkZWQuICBUaGlzIGlzIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCi0JdW5pbnRlcmVzdGluZyBkYXRhIChzdWNoIGFzIGFuIEFQUG4gbWFya2VyKS4gIEluIHNvbWUgYXBwbGljYXRpb25zCi0JaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG9wdGltaXplIGF3YXkgdGhlIHJlYWRpbmcgb2YgdGhlIHNraXBwZWQgZGF0YSwKLQlidXQgaXQncyBub3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aCBtdWNoIHRyb3VibGU7IGxhcmdlCi0Jc2tpcHMgYXJlIHVuY29tbW9uLiAgYnl0ZXNfaW5fYnVmZmVyIG1heSBiZSB6ZXJvIG9uIHJldHVybi4KLQlBIHplcm8gb3IgbmVnYXRpdmUgc2tpcCBjb3VudCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgotCi1yZXN5bmNfdG9fcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpCi0JVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRlY29tcHJlc3NvciBoYXMgZmFpbGVkIHRvIGZpbmQKLQlhIHJlc3RhcnQgKFJTVG4pIG1hcmtlciB3aGVyZSBvbmUgaXMgZXhwZWN0ZWQuICBJdHMgbWlzc2lvbiBpcyB0bwotCWZpbmQgYSBzdWl0YWJsZSBwb2ludCBmb3IgcmVzdW1pbmcgZGVjb21wcmVzc2lvbi4gIEZvciBtb3N0Ci0JYXBwbGljYXRpb25zLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UganVzdCB1c2UgdGhlIGRlZmF1bHQgcmVzeW5jCi0JcHJvY2VkdXJlLCBqcGVnX3Jlc3luY190b19yZXN0YXJ0KCkuICBIb3dldmVyLCBpZiB5b3UgYXJlIGFibGUgdG8gYmFjawotCXVwIGluIHRoZSBpbnB1dCBkYXRhIHN0cmVhbSwgb3IgaWYgeW91IGhhdmUgYS1wcmlvcmkga25vd2xlZGdlIGFib3V0Ci0JdGhlIGxpa2VseSBsb2NhdGlvbiBvZiByZXN0YXJ0IG1hcmtlcnMsIHlvdSBtYXkgYmUgYWJsZSB0byBkbyBiZXR0ZXIuCi0JUmVhZCB0aGUgcmVhZF9yZXN0YXJ0X21hcmtlcigpIGFuZCBqcGVnX3Jlc3luY190b19yZXN0YXJ0KCkgcm91dGluZXMKLQlpbiBqZG1hcmtlci5jIGlmIHlvdSB0aGluayB5b3UnZCBsaWtlIHRvIGltcGxlbWVudCB5b3VyIG93biByZXN5bmMKLQlwcm9jZWR1cmUuCi0KLXRlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotCVRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgYWZ0ZXIgYWxsCi0JZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KLQotRm9yIGJvdGggZmlsbF9pbnB1dF9idWZmZXIoKSBhbmQgc2tpcF9pbnB1dF9kYXRhKCksIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcKLWFzIGFuIEVPRiByZXR1cm4uICBJZiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSByb3V0aW5lIGhhcwotYSBjaG9pY2Ugb2YgZXhpdGluZyB2aWEgRVJSRVhJVCgpIG9yIGluc2VydGluZyBmYWtlIGRhdGEgaW50byB0aGUgYnVmZmVyLgotSW4gbW9zdCBjYXNlcywgZ2VuZXJhdGluZyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaW5zZXJ0aW5nIGEgZmFrZSBFT0kgbWFya2VyCi1pcyB0aGUgYmVzdCBjb3Vyc2Ugb2YgYWN0aW9uIC0tLSB0aGlzIHdpbGwgYWxsb3cgdGhlIGRlY29tcHJlc3NvciB0byBvdXRwdXQKLWhvd2V2ZXIgbXVjaCBvZiB0aGUgaW1hZ2UgaXMgdGhlcmUuICBJbiBwYXRob2xvZ2ljYWwgY2FzZXMsIHRoZSBkZWNvbXByZXNzb3IKLW1heSBzd2FsbG93IHRoZSBFT0kgYW5kIGFnYWluIGRlbWFuZCBkYXRhIC4uLiBqdXN0IGtlZXAgZmVlZGluZyBpdCBmYWtlIEVPSXMuCi1qZGF0YXNyYy5jIGlsbHVzdHJhdGVzIHRoZSByZWNvbW1lbmRlZCBlcnJvciByZWNvdmVyeSBiZWhhdmlvci4KLQotdGVybV9zb3VyY2UoKSBpcyBOT1QgY2FsbGVkIGJ5IGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIElmIHlvdSB3YW50Ci10aGUgc291cmNlIG1hbmFnZXIgdG8gYmUgY2xlYW5lZCB1cCBkdXJpbmcgYW4gYWJvcnQsIHlvdSBtdXN0IGRvIGl0IHlvdXJzZWxmLgotCi1Zb3Ugd2lsbCBhbHNvIG5lZWQgY29kZSB0byBjcmVhdGUgYSBqcGVnX3NvdXJjZV9tZ3Igc3RydWN0LCBmaWxsIGluIGl0cyBtZXRob2QKLXBvaW50ZXJzLCBhbmQgaW5zZXJ0IGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGludG8gdGhlICJzcmMiIGZpZWxkIG9mIHRoZSBKUEVHCi1kZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIGRvbmUgaW4tbGluZSBpbiB5b3VyIHNldHVwIGNvZGUgaWYgeW91Ci1saWtlLCBidXQgaXQncyBwcm9iYWJseSBjbGVhbmVyIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSByb3V0aW5lIHNpbWlsYXIgdG8gdGhlCi1qcGVnX3N0ZGlvX3NyYygpIHJvdXRpbmUgb2YgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYW5hZ2VyLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgc3RkaW8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2VycwotaW4gamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYy4KLQotCi1JL08gc3VzcGVuc2lvbgotLS0tLS0tLS0tLS0tLS0KLQotU29tZSBhcHBsaWNhdGlvbnMgbmVlZCB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSBhcyBhbiBpbmNyZW1lbnRhbCBtZW1vcnktdG8tCi1tZW1vcnkgZmlsdGVyOiB3aGVuIHRoZSBjb21wcmVzc2VkIGRhdGEgYnVmZmVyIGlzIGZpbGxlZCBvciBlbXB0aWVkLCB0aGV5IHdhbnQKLWNvbnRyb2wgdG8gcmV0dXJuIHRvIHRoZSBvdXRlciBsb29wLCByYXRoZXIgdGhhbiBleHBlY3RpbmcgdGhhdCB0aGUgYnVmZmVyIGNhbgotYmUgZW1wdGllZCBvciByZWxvYWRlZCB3aXRoaW4gdGhlIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXIgc3Vicm91dGluZS4KLVRoZSBsaWJyYXJ5IHN1cHBvcnRzIHRoaXMgbmVlZCBieSBwcm92aWRpbmcgYW4gIkkvTyBzdXNwZW5zaW9uIiBtb2RlLCB3aGljaCB3ZQotZGVzY3JpYmUgaW4gdGhpcyBzZWN0aW9uLgotCi1UaGUgSS9PIHN1c3BlbnNpb24gbW9kZSBpcyBub3QgYSBwYW5hY2VhOiBub3RoaW5nIGlzIGd1YXJhbnRlZWQgYWJvdXQgdGhlCi1tYXhpbXVtIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGFueSBvbmUgY2FsbCB0byB0aGUgbGlicmFyeSwgc28gaXQgd2lsbCBub3QKLWVsaW1pbmF0ZSByZXNwb25zZS10aW1lIHByb2JsZW1zIGluIHNpbmdsZS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICBJZiB5b3UKLW5lZWQgZ3VhcmFudGVlZCByZXNwb25zZSB0aW1lLCB3ZSBzdWdnZXN0IHlvdSAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgaW1wbGVtZW50Ci1hIHJlYWwgbXVsdGktdGFza2luZyBjYXBhYmlsaXR5LgotCi1UbyB1c2UgSS9PIHN1c3BlbnNpb24sIGNvb3BlcmF0aW9uIGlzIG5lZWRlZCBiZXR3ZWVuIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uCi1hbmQgdGhlIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uIG1hbmFnZXI7IHlvdSB3aWxsIGFsd2F5cyBuZWVkIGEgY3VzdG9tCi1zb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlci4gIChQbGVhc2UgcmVhZCB0aGUgcHJldmlvdXMgc2VjdGlvbiBpZiB5b3UgaGF2ZW4ndAotYWxyZWFkeS4pICBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHRoZSBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgb3IKLWZpbGxfaW5wdXRfYnVmZmVyKCkgcm91dGluZSBpcyBhIG5vLW9wLCBtZXJlbHkgcmV0dXJuaW5nIEZBTFNFIHRvIGluZGljYXRlCi10aGF0IGl0IGhhcyBkb25lIG5vdGhpbmcuICBVcG9uIHNlZWluZyB0aGlzLCB0aGUgSlBFRyBsaWJyYXJ5IHN1c3BlbmRzCi1vcGVyYXRpb24gYW5kIHJldHVybnMgdG8gaXRzIGNhbGxlci4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBpcwotcmVzcG9uc2libGUgZm9yIGVtcHR5aW5nIG9yIHJlZmlsbGluZyB0aGUgd29yayBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhlCi1KUEVHIGxpYnJhcnkgYWdhaW4uCi0KLUNvbXByZXNzaW9uIHN1c3BlbnNpb246Ci0KLUZvciBjb21wcmVzc2lvbiBzdXNwZW5zaW9uLCB1c2UgYW4gZW1wdHlfb3V0cHV0X2J1ZmZlcigpIHJvdXRpbmUgdGhhdCByZXR1cm5zCi1GQUxTRTsgdHlwaWNhbGx5IGl0IHdpbGwgbm90IGRvIGFueXRoaW5nIGVsc2UuICBUaGlzIHdpbGwgY2F1c2UgdGhlCi1jb21wcmVzc29yIHRvIHJldHVybiB0byB0aGUgY2FsbGVyIG9mIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCksIHdpdGggdGhlIHJldHVybgotdmFsdWUgaW5kaWNhdGluZyB0aGF0IG5vdCBhbGwgdGhlIHN1cHBsaWVkIHNjYW5saW5lcyBoYXZlIGJlZW4gYWNjZXB0ZWQuCi1UaGUgYXBwbGljYXRpb24gbXVzdCBtYWtlIG1vcmUgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgYWRqdXN0IHRoZSBvdXRwdXQKLWJ1ZmZlciBwb2ludGVyL2NvdW50IGFwcHJvcHJpYXRlbHksIGFuZCB0aGVuIGNhbGwganBlZ193cml0ZV9zY2FubGluZXMoKQotYWdhaW4sIHBvaW50aW5nIHRvIHRoZSBmaXJzdCB1bmNvbnN1bWVkIHNjYW5saW5lLgotCi1XaGVuIGZvcmNlZCB0byBzdXNwZW5kLCB0aGUgY29tcHJlc3NvciB3aWxsIGJhY2t0cmFjayB0byBhIGNvbnZlbmllbnQgc3RvcHBpbmcKLXBvaW50ICh1c3VhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpOyBpdCB3aWxsIHJlZ2VuZXJhdGUgc29tZSBvdXRwdXQKLWRhdGEgd2hlbiByZXN0YXJ0ZWQuICBUaGVyZWZvcmUsIGFsdGhvdWdoIGVtcHR5X291dHB1dF9idWZmZXIoKSBpcyBvbmx5Ci1jYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCwgeW91IHNob3VsZCBOT1Qgd3JpdGUgb3V0IHRoZSBlbnRpcmUgYnVmZmVyCi1hZnRlciBhIHN1c3BlbnNpb24uICBXcml0ZSBvbmx5IHRoZSBkYXRhIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mCi1uZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyLiAgVGhlIGRhdGEgYmV5b25kIHRoYXQgcG9pbnQgd2lsbCBiZQotcmVnZW5lcmF0ZWQgYWZ0ZXIgcmVzdW1wdGlvbi4KLQotQmVjYXVzZSBvZiB0aGUgYmFja3RyYWNraW5nIGJlaGF2aW9yLCBhIGdvb2Qtc2l6ZSBvdXRwdXQgYnVmZmVyIGlzIGVzc2VudGlhbAotZm9yIGVmZmljaWVuY3k7IHlvdSBkb24ndCB3YW50IHRoZSBjb21wcmVzc29yIHRvIHN1c3BlbmQgb2Z0ZW4uICAoSW4gZmFjdCwgYW4KLW92ZXJseSBzbWFsbCBidWZmZXIgY291bGQgbGVhZCB0byBpbmZpbml0ZSBsb29waW5nLCBpZiBhIHNpbmdsZSBNQ1UgcmVxdWlyZWQKLW1vcmUgZGF0YSB0aGFuIHdvdWxkIGZpdCBpbiB0aGUgYnVmZmVyLikgIFdlIHJlY29tbWVuZCBhIGJ1ZmZlciBvZiBhdCBsZWFzdAotc2V2ZXJhbCBLYnl0ZXMuICBZb3UgbWF5IHdhbnQgdG8gaW5zZXJ0IGV4cGxpY2l0IGNvZGUgdG8gZW5zdXJlIHRoYXQgeW91IGRvbid0Ci1jYWxsIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgdW5sZXNzIHRoZXJlIGlzIGEgcmVhc29uYWJsZSBhbW91bnQgb2Ygc3BhY2UgaW4KLXRoZSBvdXRwdXQgYnVmZmVyOyBpbiBvdGhlciB3b3JkcywgZmx1c2ggdGhlIGJ1ZmZlciBiZWZvcmUgdHJ5aW5nIHRvIGNvbXByZXNzCi1tb3JlIGRhdGEuCi0KLVRoZSBjb21wcmVzc29yIGRvZXMgbm90IGFsbG93IHN1c3BlbnNpb24gd2hpbGUgaXQgaXMgdHJ5aW5nIHRvIHdyaXRlIEpQRUcKLW1hcmtlcnMgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0OgotICAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24sIHRoZXJlIG11c3QgYmUgZW5vdWdoIGZyZWUKLSAgICBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBob2xkIHRoZSBoZWFkZXIgbWFya2VycyAodHlwaWNhbGx5IDYwMCBvcgotICAgIHNvIGJ5dGVzKS4gIFRoZSByZWNvbW1lbmRlZCBidWZmZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGlzIGFueXdheSwgc28KLSAgICB0aGlzIGlzIG5vdCBhIHByb2JsZW0gYXMgbG9uZyBhcyB5b3Ugc3RhcnQgd2l0aCBhbiBlbXB0eSBidWZmZXIuICBIb3dldmVyLAotICAgIHRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgY2F0Y2ggeW91IGlmIHlvdSBpbnNlcnQgbGFyZ2Ugc3BlY2lhbCBtYXJrZXJzLCBzdWNoCi0gICAgYXMgYSBKRklGIHRodW1ibmFpbCBpbWFnZSwgd2l0aG91dCBmbHVzaGluZyB0aGUgYnVmZmVyIGFmdGVyd2FyZHMuCi0gICogV2hlbiB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLCB0aGVyZSBtdXN0IGJlIGVub3VnaCBzcGFjZSBpbiB0aGUKLSAgICBvdXRwdXQgYnVmZmVyIHRvIGVtaXQgYW55IGJ1ZmZlcmVkIGRhdGEgYW5kIHRoZSBmaW5hbCBFT0kgbWFya2VyLiAgSW4gdGhlCi0gICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgaGFsZiBhIGRvemVuIGJ5dGVzIHNob3VsZCBzdWZmaWNlIGZvciB0aGlzLCBidXQKLSAgICBmb3Igc2FmZXR5J3Mgc2FrZSB3ZSByZWNvbW1lbmQgZW5zdXJpbmcgdGhhdCBhdCBsZWFzdCAxMDAgYnl0ZXMgYXJlIGZyZWUKLSAgICBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgotCi1BIG1vcmUgc2lnbmlmaWNhbnQgcmVzdHJpY3Rpb24gaXMgdGhhdCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGNhbm5vdCBzdXNwZW5kLgotVGhpcyBtZWFucyB5b3UgY2Fubm90IHVzZSBzdXNwZW5zaW9uIHdpdGggbXVsdGktcGFzcyBvcGVyYXRpbmcgbW9kZXMsIG5hbWVseQotSHVmZm1hbiBjb2RlIG9wdGltaXphdGlvbiBhbmQgbXVsdGlwbGUtc2NhbiBvdXRwdXQuICBUaG9zZSBtb2RlcyB3cml0ZSB0aGUKLXdob2xlIGZpbGUgZHVyaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCksIHdoaWNoIHdpbGwgY2VydGFpbmx5IHJlc3VsdCBpbgotYnVmZmVyIG92ZXJydW4uICAoTm90ZSB0aGF0IHRoaXMgcmVzdHJpY3Rpb24gYXBwbGllcyBvbmx5IHRvIGNvbXByZXNzaW9uLAotbm90IGRlY29tcHJlc3Npb24uICBUaGUgZGVjb21wcmVzc29yIHN1cHBvcnRzIGlucHV0IHN1c3BlbnNpb24gaW4gYWxsIG9mIGl0cwotb3BlcmF0aW5nIG1vZGVzLikKLQotRGVjb21wcmVzc2lvbiBzdXNwZW5zaW9uOgotCi1Gb3IgZGVjb21wcmVzc2lvbiBzdXNwZW5zaW9uLCB1c2UgYSBmaWxsX2lucHV0X2J1ZmZlcigpIHJvdXRpbmUgdGhhdCBzaW1wbHkKLXJldHVybnMgRkFMU0UgKGV4Y2VwdCBwZXJoYXBzIGR1cmluZyBlcnJvciByZWNvdmVyeSwgYXMgZGlzY3Vzc2VkIGJlbG93KS4KLVRoaXMgd2lsbCBjYXVzZSB0aGUgZGVjb21wcmVzc29yIHRvIHJldHVybiB0byBpdHMgY2FsbGVyIHdpdGggYW4gaW5kaWNhdGlvbgotdGhhdCBzdXNwZW5zaW9uIGhhcyBvY2N1cnJlZC4gIFRoaXMgY2FuIGhhcHBlbiBhdCBmb3VyIHBsYWNlczoKLSAgKiBqcGVnX3JlYWRfaGVhZGVyKCk6IHdpbGwgcmV0dXJuIEpQRUdfU1VTUEVOREVELgotICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpOiB3aWxsIHJldHVybiBGQUxTRSwgcmF0aGVyIHRoYW4gaXRzIHVzdWFsIFRSVUUuCi0gICoganBlZ19yZWFkX3NjYW5saW5lcygpOiB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhbHJlYWR5Ci0JY29tcGxldGVkIChwb3NzaWJseSAwKS4KLSAgKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCk6IHdpbGwgcmV0dXJuIEZBTFNFLCByYXRoZXIgdGhhbiBpdHMgdXN1YWwgVFJVRS4KLVRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtdXN0IHJlY29nbml6ZSB0aGVzZSBjYXNlcywgbG9hZCBtb3JlIGRhdGEgaW50bwotdGhlIGlucHV0IGJ1ZmZlciwgYW5kIHJlcGVhdCB0aGUgY2FsbC4gIEluIHRoZSBjYXNlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMoKSwKLWluY3JlbWVudCB0aGUgcGFzc2VkIHBvaW50ZXJzIHBhc3QgYW55IHNjYW5saW5lcyBzdWNjZXNzZnVsbHkgcmVhZC4KLQotSnVzdCBhcyB3aXRoIGNvbXByZXNzaW9uLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgdHlwaWNhbGx5IGJhY2t0cmFjayB0byBhCi1jb252ZW5pZW50IHJlc3RhcnQgcG9pbnQgYmVmb3JlIHN1c3BlbmRpbmcuICBXaGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkgaXMKLWNhbGxlZCwgbmV4dF9pbnB1dF9ieXRlL2J5dGVzX2luX2J1ZmZlciBwb2ludCB0byB0aGUgY3VycmVudCByZXN0YXJ0IHBvaW50LAotd2hpY2ggaXMgd2hlcmUgdGhlIGRlY29tcHJlc3NvciB3aWxsIGJhY2t0cmFjayB0byBpZiBGQUxTRSBpcyByZXR1cm5lZC4KLVRoZSBkYXRhIGJleW9uZCB0aGF0IHBvc2l0aW9uIG11c3QgTk9UIGJlIGRpc2NhcmRlZCBpZiB5b3Ugc3VzcGVuZDsgaXQgbmVlZHMKLXRvIGJlIHJlLXJlYWQgdXBvbiByZXN1bXB0aW9uLiAgSW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMsIHlvdSdsbCBuZWVkIHRvIHNoaWZ0Ci10aGlzIGRhdGEgZG93biB0byB0aGUgc3RhcnQgb2YgeW91ciB3b3JrIGJ1ZmZlciBhbmQgdGhlbiBsb2FkIG1vcmUgZGF0YSBhZnRlcgotaXQuICBBZ2FpbiwgdGhpcyBiZWhhdmlvciBtZWFucyB0aGF0IGEgc2V2ZXJhbC1LYnl0ZSB3b3JrIGJ1ZmZlciBpcyBlc3NlbnRpYWwKLWZvciBkZWNlbnQgcGVyZm9ybWFuY2U7IGZ1cnRoZXJtb3JlLCB5b3Ugc2hvdWxkIGxvYWQgYSByZWFzb25hYmxlIGFtb3VudCBvZgotbmV3IGRhdGEgYmVmb3JlIHJlc3VtaW5nIGRlY29tcHJlc3Npb24uICAoSWYgeW91IGxvYWRlZCwgc2F5LCBvbmx5IG9uZSBuZXcKLWJ5dGUgZWFjaCB0aW1lIGFyb3VuZCwgeW91IGNvdWxkIHdhc3RlIGEgTE9UIG9mIGN5Y2xlcy4pCi0KLVRoZSBza2lwX2lucHV0X2RhdGEoKSBzb3VyY2UgbWFuYWdlciByb3V0aW5lIHJlcXVpcmVzIHNwZWNpYWwgY2FyZSBpbiBhCi1zdXNwZW5zaW9uIHNjZW5hcmlvLiAgVGhpcyByb3V0aW5lIGlzIE5PVCBncmFudGVkIHRoZSBhYmlsaXR5IHRvIHN1c3BlbmQgdGhlCi1kZWNvbXByZXNzb3I7IGl0IGNhbiBkZWNyZW1lbnQgYnl0ZXNfaW5fYnVmZmVyIHRvIHplcm8sIGJ1dCBubyBtb3JlLiAgSWYgdGhlCi1yZXF1ZXN0ZWQgc2tpcCBkaXN0YW5jZSBleGNlZWRzIHRoZSBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGlucHV0Ci1idWZmZXIsIHRoZW4gc2tpcF9pbnB1dF9kYXRhKCkgbXVzdCBzZXQgYnl0ZXNfaW5fYnVmZmVyIHRvIHplcm8gYW5kIHJlY29yZCB0aGUKLWFkZGl0aW9uYWwgc2tpcCBkaXN0YW5jZSBzb21ld2hlcmUgZWxzZS4gIFRoZSBkZWNvbXByZXNzb3Igd2lsbCBpbW1lZGlhdGVseQotY2FsbCBmaWxsX2lucHV0X2J1ZmZlcigpLCB3aGljaCBzaG91bGQgcmV0dXJuIEZBTFNFLCB3aGljaCB3aWxsIGNhdXNlIGEKLXN1c3BlbnNpb24gcmV0dXJuLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG11c3QgdGhlbiBhcnJhbmdlIHRvIGRpc2NhcmQKLXRoZSByZWNvcmRlZCBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIGl0IHJlc3VtZXMgbG9hZGluZyB0aGUgaW5wdXQgYnVmZmVyLgotKFllcywgdGhpcyBkZXNpZ24gaXMgcmF0aGVyIGJhcm9xdWUsIGJ1dCBpdCBhdm9pZHMgY29tcGxleGl0eSBpbiB0aGUgZmFyIG1vcmUKLWNvbW1vbiBjYXNlIHdoZXJlIGEgbm9uLXN1c3BlbmRpbmcgc291cmNlIG1hbmFnZXIgaXMgdXNlZC4pCi0KLUlmIHRoZSBpbnB1dCBkYXRhIGhhcyBiZWVuIGV4aGF1c3RlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGVtaXQgYSB3YXJuaW5nCi1hbmQgaW5zZXJ0IGR1bW15IEVPSSBtYXJrZXJzIGp1c3QgYXMgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBtYW5hZ2VyCi13b3VsZCBkby4gIFRoaXMgY2FuIGJlIGhhbmRsZWQgZWl0aGVyIGluIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBsb2dpYyBvcgotd2l0aGluIGZpbGxfaW5wdXRfYnVmZmVyKCk7IHRoZSBsYXR0ZXIgaXMgcHJvYmFibHkgbW9yZSBlZmZpY2llbnQuICBJZgotZmlsbF9pbnB1dF9idWZmZXIoKSBrbm93cyB0aGF0IG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUsIGl0IGNhbiBzZXQgdGhlCi1wb2ludGVyL2NvdW50IHRvIHBvaW50IHRvIGEgZHVtbXkgRU9JIG1hcmtlciBhbmQgdGhlbiByZXR1cm4gVFJVRSBqdXN0IGFzCi10aG91Z2ggaXQgaGFkIHJlYWQgbW9yZSBkYXRhIGluIGEgbm9uLXN1c3BlbmRpbmcgc2l0dWF0aW9uLgotCi1UaGUgZGVjb21wcmVzc29yIGRvZXMgbm90IGF0dGVtcHQgdG8gc3VzcGVuZCB3aXRoaW4gc3RhbmRhcmQgSlBFRyBtYXJrZXJzOwotaW5zdGVhZCBpdCB3aWxsIGJhY2t0cmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIG1hcmtlciBhbmQgcmVwcm9jZXNzIHRoZSB3aG9sZQotbWFya2VyIG5leHQgdGltZS4gIEhlbmNlIHRoZSBpbnB1dCBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKLWxvbmdlc3Qgc3RhbmRhcmQgbWFya2VyIGluIHRoZSBmaWxlLiAgU3RhbmRhcmQgSlBFRyBtYXJrZXJzIHNob3VsZCBub3JtYWxseQotbm90IGV4Y2VlZCBhIGZldyBodW5kcmVkIGJ5dGVzIGVhY2ggKERIVCB0YWJsZXMgYXJlIHR5cGljYWxseSB0aGUgbG9uZ2VzdCkuCi1XZSByZWNvbW1lbmQgYXQgbGVhc3QgYSAySyBidWZmZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdoaWNoIGlzIG11Y2gKLWxhcmdlciB0aGFuIGFueSBjb3JyZWN0IG1hcmtlciBpcyBsaWtlbHkgdG8gYmUuICBGb3Igcm9idXN0bmVzcyBhZ2FpbnN0Ci1kYW1hZ2VkIG1hcmtlciBsZW5ndGggY291bnRzLCB5b3UgbWF5IHdpc2ggdG8gaW5zZXJ0IGEgdGVzdCBpbiB5b3VyCi1hcHBsaWNhdGlvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgaW5wdXQgYnVmZmVyIGlzIGNvbXBsZXRlbHkgZnVsbCBhbmQgeWV0Ci10aGUgZGVjb2RlciBoYXMgc3VzcGVuZGVkIHdpdGhvdXQgY29uc3VtaW5nIGFueSBkYXRhIC0tLSBvdGhlcndpc2UsIGlmIHRoaXMKLXNpdHVhdGlvbiBkaWQgb2NjdXIsIGl0IHdvdWxkIGxlYWQgdG8gYW4gZW5kbGVzcyBsb29wLiAgKFRoZSBsaWJyYXJ5IGNhbid0Ci1wcm92aWRlIHRoaXMgdGVzdCBzaW5jZSBpdCBoYXMgbm8gaWRlYSB3aGV0aGVyICJ0aGUgYnVmZmVyIGlzIGZ1bGwiLCBvcgotZXZlbiB3aGV0aGVyIHRoZXJlIGlzIGEgZml4ZWQtc2l6ZSBpbnB1dCBidWZmZXIuKQotCi1UaGUgaW5wdXQgYnVmZmVyIHdvdWxkIG5lZWQgdG8gYmUgNjRLIHRvIGFsbG93IGZvciBhcmJpdHJhcnkgQ09NIG9yIEFQUG4KLW1hcmtlcnMsIGJ1dCB0aGVzZSBhcmUgaGFuZGxlZCBzcGVjaWFsbHk6IHRoZXkgYXJlIGVpdGhlciBzYXZlZCBpbnRvIGFsbG9jYXRlZAotbWVtb3J5LCBvciBza2lwcGVkIG92ZXIgYnkgY2FsbGluZyBza2lwX2lucHV0X2RhdGEoKS4gIEluIHRoZSBmb3JtZXIgY2FzZSwKLXN1c3BlbnNpb24gaXMgaGFuZGxlZCBjb3JyZWN0bHksIGFuZCBpbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBwcm9ibGVtIG9mCi1idWZmZXIgb3ZlcnJ1biBpcyBwbGFjZWQgb24gc2tpcF9pbnB1dF9kYXRhJ3Mgc2hvdWxkZXJzLCBhcyBleHBsYWluZWQgYWJvdmUuCi1Ob3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgeW91ciBvd24gbWFya2VyIGhhbmRsaW5nIHJvdXRpbmUgZm9yIGxhcmdlIG1hcmtlcnMsCi15b3Ugc2hvdWxkIGNvbnNpZGVyIGhvdyB0byBkZWFsIHdpdGggYnVmZmVyIG92ZXJmbG93LgotCi1NdWx0aXBsZS1idWZmZXIgbWFuYWdlbWVudDoKLQotSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgaXMgZGVzaXJhYmxlIHRvIHN0b3JlIHRoZSBjb21wcmVzc2VkIGRhdGEgaW4gYSBsaW5rZWQKLWxpc3Qgb2YgYnVmZmVyIGFyZWFzLCBzbyBhcyB0byBhdm9pZCBkYXRhIGNvcHlpbmcuICBUaGlzIGNhbiBiZSBoYW5kbGVkIGJ5Ci1oYXZpbmcgZW1wdHlfb3V0cHV0X2J1ZmZlcigpIG9yIGZpbGxfaW5wdXRfYnVmZmVyKCkgc2V0IHRoZSBwb2ludGVyIGFuZCBjb3VudAotdG8gcmVmZXJlbmNlIHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXI7IEZBTFNFIGlzIHJldHVybmVkIG9ubHkgaWYgbm8gbW9yZQotYnVmZmVycyBhcmUgYXZhaWxhYmxlLiAgQWx0aG91Z2ggc2VlbWluZ2x5IHN0cmFpZ2h0Zm9yd2FyZCwgdGhlcmUgaXMgYQotcGl0ZmFsbCBpbiB0aGlzIGFwcHJvYWNoOiB0aGUgYmFja3RyYWNrIHRoYXQgb2NjdXJzIHdoZW4gRkFMU0UgaXMgcmV0dXJuZWQKLWNvdWxkIGJhY2sgdXAgaW50byBhbiBlYXJsaWVyIGJ1ZmZlci4gIEZvciBleGFtcGxlLCB3aGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkKLWlzIGNhbGxlZCwgdGhlIGN1cnJlbnQgcG9pbnRlciAmIGNvdW50IGluZGljYXRlIHRoZSBiYWNrdHJhY2sgcmVzdGFydCBwb2ludC4KLVNpbmNlIGZpbGxfaW5wdXRfYnVmZmVyKCkgd2lsbCBzZXQgdGhlIHBvaW50ZXIgYW5kIGNvdW50IHRvIHJlZmVyIHRvIGEgbmV3Ci1idWZmZXIsIHRoZSByZXN0YXJ0IHBvc2l0aW9uIG11c3QgYmUgc2F2ZWQgc29tZXdoZXJlIGVsc2UuICBTdXBwb3NlIGEgc2Vjb25kCi1jYWxsIHRvIGZpbGxfaW5wdXRfYnVmZmVyKCkgb2NjdXJzIGluIHRoZSBzYW1lIGxpYnJhcnkgY2FsbCwgYW5kIG5vCi1hZGRpdGlvbmFsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBzbyBmaWxsX2lucHV0X2J1ZmZlciBtdXN0IHJldHVybiBGQUxTRS4KLUlmIHRoZSBKUEVHIGxpYnJhcnkgaGFzIG5vdCBtb3ZlZCB0aGUgcG9pbnRlci9jb3VudCBmb3J3YXJkIGluIHRoZSBjdXJyZW50Ci1idWZmZXIsIHRoZW4gKnRoZSBjb3JyZWN0IHJlc3RhcnQgcG9pbnQgaXMgdGhlIHNhdmVkIHBvc2l0aW9uIGluIHRoZSBwcmlvcgotYnVmZmVyKi4gIFByaW9yIGJ1ZmZlcnMgbWF5IGJlIGRpc2NhcmRlZCBvbmx5IGFmdGVyIHRoZSBsaWJyYXJ5IGVzdGFibGlzaGVzCi1hIHJlc3RhcnQgcG9pbnQgd2l0aGluIGEgbGF0ZXIgYnVmZmVyLiAgU2ltaWxhciByZW1hcmtzIGFwcGx5IGZvciBvdXRwdXQgaW50bwotYSBjaGFpbiBvZiBidWZmZXJzLgotCi1UaGUgbGlicmFyeSB3aWxsIG5ldmVyIGF0dGVtcHQgdG8gYmFja3RyYWNrIG92ZXIgYSBza2lwX2lucHV0X2RhdGEoKSBjYWxsLAotc28gYW55IHNraXBwZWQgZGF0YSBjYW4gYmUgcGVybWFuZW50bHkgZGlzY2FyZGVkLiAgWW91IHN0aWxsIGhhdmUgdG8gZGVhbAotd2l0aCB0aGUgY2FzZSBvZiBza2lwcGluZyBub3QteWV0LXJlY2VpdmVkIGRhdGEsIGhvd2V2ZXIuCi0KLUl0J3MgbXVjaCBzaW1wbGVyIHRvIHVzZSBvbmx5IGEgc2luZ2xlIGJ1ZmZlcjsgd2hlbiBmaWxsX2lucHV0X2J1ZmZlcigpIGlzCi1jYWxsZWQsIG1vdmUgYW55IHVuY29uc3VtZWQgZGF0YSAoYmV5b25kIHRoZSBjdXJyZW50IHBvaW50ZXIvY291bnQpIGRvd24gdG8KLXRoZSBiZWdpbm5pbmcgb2YgdGhpcyBidWZmZXIgYW5kIHRoZW4gbG9hZCBuZXcgZGF0YSBpbnRvIHRoZSByZW1haW5pbmcgYnVmZmVyCi1zcGFjZS4gIFRoaXMgYXBwcm9hY2ggcmVxdWlyZXMgYSBsaXR0bGUgbW9yZSBkYXRhIGNvcHlpbmcgYnV0IGlzIGZhciBlYXNpZXIKLXRvIGdldCByaWdodC4KLQotCi1Qcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Qcm9ncmVzc2l2ZSBKUEVHIHJlYXJyYW5nZXMgdGhlIHN0b3JlZCBkYXRhIGludG8gYSBzZXJpZXMgb2Ygc2NhbnMgb2YKLWluY3JlYXNpbmcgcXVhbGl0eS4gIEluIHNpdHVhdGlvbnMgd2hlcmUgYSBKUEVHIGZpbGUgaXMgdHJhbnNtaXR0ZWQgYWNyb3NzIGEKLXNsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgYSBkZWNvZGVyIGNhbiBnZW5lcmF0ZSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkKLXF1aWNrbHkgZnJvbSB0aGUgZmlyc3Qgc2NhbiwgdGhlbiBncmFkdWFsbHkgaW1wcm92ZSB0aGUgZGlzcGxheWVkIHF1YWxpdHkgYXMKLW1vcmUgc2NhbnMgYXJlIHJlY2VpdmVkLiAgVGhlIGZpbmFsIGltYWdlIGFmdGVyIGFsbCBzY2FucyBhcmUgY29tcGxldGUgaXMKLWlkZW50aWNhbCB0byB0aGF0IG9mIGEgcmVndWxhciAoc2VxdWVudGlhbCkgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkKLXNldHRpbmcuICBQcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIGFyZSBvZnRlbiBzbGlnaHRseSBzbWFsbGVyIHRoYW4gZXF1aXZhbGVudAotc2VxdWVudGlhbCBKUEVHIGZpbGVzLCBidXQgdGhlIHBvc3NpYmlsaXR5IG9mIGluY3JlbWVudGFsIGRpc3BsYXkgaXMgdGhlIG1haW4KLXJlYXNvbiBmb3IgdXNpbmcgcHJvZ3Jlc3NpdmUgSlBFRy4KLQotVGhlIElKRyBlbmNvZGVyIGxpYnJhcnkgZ2VuZXJhdGVzIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgd2hlbiBnaXZlbiBhCi1zdWl0YWJsZSAic2NhbiBzY3JpcHQiIGRlZmluaW5nIGhvdyB0byBkaXZpZGUgdGhlIGRhdGEgaW50byBzY2Fucy4KLUNyZWF0aW9uIG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgaXMgb3RoZXJ3aXNlIHRyYW5zcGFyZW50IHRvIHRoZSBlbmNvZGVyLgotUHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyBjYW4gYWxzbyBiZSByZWFkIHRyYW5zcGFyZW50bHkgYnkgdGhlIGRlY29kZXIgbGlicmFyeS4KLUlmIHRoZSBkZWNvZGluZyBhcHBsaWNhdGlvbiBzaW1wbHkgdXNlcyB0aGUgbGlicmFyeSBhcyBkZWZpbmVkIGFib3ZlLCBpdAotd2lsbCByZWNlaXZlIGEgZmluYWwgZGVjb2RlZCBpbWFnZSB3aXRob3V0IGFueSBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgd2FzCi1wcm9ncmVzc2l2ZS4gIE9mIGNvdXJzZSwgdGhpcyBhcHByb2FjaCBkb2VzIG5vdCBhbGxvdyBpbmNyZW1lbnRhbCBkaXNwbGF5LgotVG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkaXNwbGF5LCBhbiBhcHBsaWNhdGlvbiBuZWVkcyB0byB1c2UgdGhlIGRlY29kZXIKLWxpYnJhcnkncyAiYnVmZmVyZWQtaW1hZ2UiIG1vZGUsIGluIHdoaWNoIGl0IHJlY2VpdmVzIGEgZGVjb2RlZCBpbWFnZQotbXVsdGlwbGUgdGltZXMuCi0KLUVhY2ggZGlzcGxheWVkIHNjYW4gcmVxdWlyZXMgYWJvdXQgYXMgbXVjaCB3b3JrIHRvIGRlY29kZSBhcyBhIGZ1bGwgSlBFRwotaW1hZ2Ugb2YgdGhlIHNhbWUgc2l6ZSwgc28gdGhlIGRlY29kZXIgbXVzdCBiZSBmYWlybHkgZmFzdCBpbiByZWxhdGlvbiB0byB0aGUKLWRhdGEgdHJhbnNtaXNzaW9uIHJhdGUgaW4gb3JkZXIgdG8gbWFrZSBpbmNyZW1lbnRhbCBkaXNwbGF5IHVzZWZ1bC4gIEhvd2V2ZXIsCi1pdCBpcyBwb3NzaWJsZSB0byBza2lwIGRpc3BsYXlpbmcgdGhlIGltYWdlIGFuZCBzaW1wbHkgYWRkIHRoZSBpbmNvbWluZyBiaXRzCi10byB0aGUgZGVjb2RlcidzIGNvZWZmaWNpZW50IGJ1ZmZlci4gIFRoaXMgaXMgZmFzdCBiZWNhdXNlIG9ubHkgSHVmZm1hbgotZGVjb2RpbmcgbmVlZCBiZSBkb25lLCBub3QgSURDVCwgdXBzYW1wbGluZywgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBldGMuCi1UaGUgSUpHIGRlY29kZXIgbGlicmFyeSBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN3aXRjaCBkeW5hbWljYWxseSBiZXR3ZWVuCi1kaXNwbGF5aW5nIHRoZSBpbWFnZSBhbmQgc2ltcGx5IGFic29yYmluZyB0aGUgaW5jb21pbmcgYml0cy4gIEEgcHJvcGVybHkKLWNvZGVkIGFwcGxpY2F0aW9uIGNhbiBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBudW1iZXIgb2YgZGlzcGxheSBwYXNzZXMgdG8KLXN1aXQgdGhlIHRpbWUgYXZhaWxhYmxlIGFzIHRoZSBpbWFnZSBpcyByZWNlaXZlZC4gIEFsc28sIGEgZmluYWwKLWhpZ2hlci1xdWFsaXR5IGRpc3BsYXkgY3ljbGUgY2FuIGJlIHBlcmZvcm1lZCBmcm9tIHRoZSBidWZmZXJlZCBkYXRhIGFmdGVyCi10aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQuCi0KLVByb2dyZXNzaXZlIGNvbXByZXNzaW9uOgotCi1UbyBjcmVhdGUgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKG9yIGEgbXVsdGlwbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZSksCi1zZXQgdGhlIHNjYW5faW5mbyBjaW5mbyBmaWVsZCB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlc2NyaXB0b3JzLCBhbmQKLXBlcmZvcm0gY29tcHJlc3Npb24gYXMgdXN1YWwuICBJbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyB5b3VyIG93biBzY2FuIGxpc3QsCi15b3UgY2FuIGNhbGwgdGhlIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKCkgaGVscGVyIHJvdXRpbmUgdG8gY3JlYXRlIGEKLXJlY29tbWVuZGVkIHByb2dyZXNzaW9uIHNlcXVlbmNlOyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieSBhbGwKLWFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8gZ2V0IGludm9sdmVkIGluIHRoZSBuaXR0eS1ncml0dHkgb2YKLXByb2dyZXNzaXZlIHNjYW4gc2VxdWVuY2UgZGVzaWduLiAgKElmIHlvdSB3YW50IHRvIHByb3ZpZGUgdXNlciBjb250cm9sIG9mCi1zY2FuIHNlcXVlbmNlcywgeW91IG1heSB3aXNoIHRvIGJvcnJvdyB0aGUgc2NhbiBzY3JpcHQgcmVhZGluZyBjb2RlIGZvdW5kCi1pbiByZHN3aXRjaC5jLCBzbyB0aGF0IHlvdSBjYW4gcmVhZCBzY2FuIHNjcmlwdCBmaWxlcyBqdXN0IGxpa2UgY2pwZWcncy4pCi1XaGVuIHNjYW5faW5mbyBpcyBub3QgTlVMTCwgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCBzdG9yZSBEQ1QnZCBkYXRhCi1pbnRvIGEgYnVmZmVyIGFycmF5IGFzIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgaXMgY2FsbGVkLCBhbmQgd2lsbCBlbWl0IGFsbAotdGhlIHJlcXVlc3RlZCBzY2FucyBkdXJpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKS4gIFRoaXMgaW1wbGllcyB0aGF0Ci1tdWx0aXBsZS1zY2FuIG91dHB1dCBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uCi1tYW5hZ2VyLCBzaW5jZSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuc2lvbi4gIFdlCi1zaG91bGQgYWxzbyBub3RlIHRoYXQgdGhlIGNvbXByZXNzb3IgY3VycmVudGx5IGZvcmNlcyBIdWZmbWFuIG9wdGltaXphdGlvbgotbW9kZSB3aGVuIGNyZWF0aW5nIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IEh1ZmZtYW4KLXRhYmxlcyBhcmUgdW5zdWl0YWJsZSBmb3IgcHJvZ3Jlc3NpdmUgZmlsZXMuCi0KLVByb2dyZXNzaXZlIGRlY29tcHJlc3Npb246Ci0KLVdoZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyBub3QgdXNlZCwgdGhlIGRlY29kZXIgbGlicmFyeSB3aWxsIHJlYWQgYWxsIG9mCi1hIG11bHRpLXNjYW4gZmlsZSBkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCksIHNvIHRoYXQgaXQgY2FuIHByb3ZpZGUgYQotZmluYWwgZGVjb2RlZCBpbWFnZS4gIChIZXJlICJtdWx0aS1zY2FuIiBtZWFucyBlaXRoZXIgcHJvZ3Jlc3NpdmUgb3IKLW11bHRpLXNjYW4gc2VxdWVudGlhbC4pICBUaGlzIG1ha2VzIG11bHRpLXNjYW4gZmlsZXMgdHJhbnNwYXJlbnQgdG8gdGhlCi1kZWNvZGluZyBhcHBsaWNhdGlvbi4gIEhvd2V2ZXIsIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZWQgc3VzcGVuZGluZwotaW5wdXQgd2l0aCB2ZXJzaW9uIDUgb2YgdGhlIElKRyBsaWJyYXJ5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZCB0byBjaGVjawotZm9yIGEgc3VzcGVuc2lvbiByZXR1cm4gZnJvbSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLQotVG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkaXNwbGF5LCBhbiBhcHBsaWNhdGlvbiBtdXN0IHVzZSB0aGUgbGlicmFyeSdzCi1idWZmZXJlZC1pbWFnZSBtb2RlLiAgVGhpcyBpcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KLQotCi1CdWZmZXJlZC1pbWFnZSBtb2RlCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBsaWJyYXJ5IHN0b3JlcyB0aGUgcGFydGlhbGx5IGRlY29kZWQgaW1hZ2UgaW4gYQotY29lZmZpY2llbnQgYnVmZmVyLCBmcm9tIHdoaWNoIGl0IGNhbiBiZSByZWFkIG91dCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQuCi1UaGlzIG1vZGUgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGluY3JlbWVudGFsIGRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcywKLWJ1dCBpdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBKUEVHIGZpbGUuICBFYWNoIHNjYW4gb2YgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUKLWFkZHMgbW9yZSBkYXRhIChtb3JlIGRldGFpbCkgdG8gdGhlIGJ1ZmZlcmVkIGltYWdlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbgotZGlzcGxheSBpbiBsb2Nrc3RlcCB3aXRoIHRoZSBzb3VyY2UgZmlsZSAob25lIGRpc3BsYXkgcGFzcyBwZXIgaW5wdXQgc2NhbiksCi1vciBpdCBjYW4gYWxsb3cgaW5wdXQgcHJvY2Vzc2luZyB0byBvdXRydW4gZGlzcGxheSBwcm9jZXNzaW5nLiAgQnkgbWFraW5nCi1pbnB1dCBhbmQgZGlzcGxheSBwcm9jZXNzaW5nIHJ1biBpbmRlcGVuZGVudGx5LCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlCi1hcHBsaWNhdGlvbiB0byBhZGFwdCBwcm9ncmVzc2l2ZSBkaXNwbGF5IHRvIGEgd2lkZSByYW5nZSBvZiBkYXRhIHRyYW5zbWlzc2lvbgotcmF0ZXMuCi0KLVRoZSBiYXNpYyBjb250cm9sIGZsb3cgZm9yIGJ1ZmZlcmVkLWltYWdlIGRlY29kaW5nIGlzCi0KLQlqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkKLQlzZXQgZGF0YSBzb3VyY2UKLQlqcGVnX3JlYWRfaGVhZGVyKCkKLQlzZXQgb3ZlcmFsbCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLQljaW5mby5idWZmZXJlZF9pbWFnZSA9IFRSVUU7CS8qIHNlbGVjdCBidWZmZXJlZC1pbWFnZSBtb2RlICovCi0JanBlZ19zdGFydF9kZWNvbXByZXNzKCkKLQlmb3IgKGVhY2ggb3V0cHV0IHBhc3MpIHsKLQkgICAgYWRqdXN0IG91dHB1dCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQKLQkgICAganBlZ19zdGFydF9vdXRwdXQoKQkJLyogc3RhcnQgYSBuZXcgb3V0cHV0IHBhc3MgKi8KLQkgICAgZm9yIChhbGwgc2NhbmxpbmVzIGluIGltYWdlKSB7Ci0JICAgICAgICBqcGVnX3JlYWRfc2NhbmxpbmVzKCkKLQkgICAgICAgIGRpc3BsYXkgc2NhbmxpbmVzCi0JICAgIH0KLQkgICAganBlZ19maW5pc2hfb3V0cHV0KCkJLyogdGVybWluYXRlIG91dHB1dCBwYXNzICovCi0JfQotCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQotCWpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkKLQotVGhpcyBkaWZmZXJzIGZyb20gb3JkaW5hcnkgdW5idWZmZXJlZCBkZWNvZGluZyBpbiB0aGF0IHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwKLWxldmVsIG9mIGxvb3BpbmcuICBUaGUgYXBwbGljYXRpb24gY2FuIGNob29zZSBob3cgbWFueSBvdXRwdXQgcGFzc2VzIHRvIG1ha2UKLWFuZCBob3cgdG8gZGlzcGxheSBlYWNoIHBhc3MuCi0KLVRoZSBzaW1wbGVzdCBhcHByb2FjaCB0byBkaXNwbGF5aW5nIHByb2dyZXNzaXZlIGltYWdlcyBpcyB0byBkbyBvbmUgZGlzcGxheQotcGFzcyBmb3IgZWFjaCBzY2FuIGFwcGVhcmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIEluIHRoaXMgY2FzZSB0aGUgb3V0ZXIgbG9vcAotY29uZGl0aW9uIGlzIHR5cGljYWxseQotCXdoaWxlICghIGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKSkKLWFuZCB0aGUgc3RhcnQtb3V0cHV0IGNhbGwgc2hvdWxkIHJlYWQKLQlqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKLVRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkgaW5kaWNhdGVzIHdoaWNoIHNjYW4gb2YgdGhlIGlucHV0Ci1maWxlIGlzIHRvIGJlIGRpc3BsYXllZDsgdGhlIHNjYW5zIGFyZSBudW1iZXJlZCBzdGFydGluZyBhdCAxIGZvciB0aGlzCi1wdXJwb3NlLiAgKFlvdSBjYW4gdXNlIGEgbG9vcCBjb3VudGVyIHN0YXJ0aW5nIGF0IDEgaWYgeW91IGxpa2UsIGJ1dCB1c2luZwotdGhlIGxpYnJhcnkncyBpbnB1dCBzY2FuIGNvdW50ZXIgaXMgZWFzaWVyLikgIFRoZSBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgcmVhZHMKLWRhdGEgYXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIGVhY2ggcmVxdWVzdGVkIHNjYW4sIGFuZCBqcGVnX2ZpbmlzaF9vdXRwdXQoKQotYWR2YW5jZXMgdG8gdGhlIG5leHQgc2NhbiBvciBlbmQtb2YtaW1hZ2UgbWFya2VyIChoZW5jZSBpbnB1dF9zY2FuX251bWJlcgotd2lsbCBiZSBpbmNyZW1lbnRlZCBieSB0aGUgdGltZSBjb250cm9sIGFycml2ZXMgYmFjayBhdCBqcGVnX3N0YXJ0X291dHB1dCgpKS4KLVdpdGggdGhpcyB0ZWNobmlxdWUsIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9ubHkgYXMgbmVlZGVkLCBhbmQKLWlucHV0IGFuZCBvdXRwdXQgcHJvY2Vzc2luZyBydW4gaW4gbG9ja3N0ZXAuCi0KLUFmdGVyIHJlYWRpbmcgdGhlIGZpbmFsIHNjYW4gYW5kIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUsIHRoZQotYnVmZmVyZWQgaW1hZ2UgcmVtYWlucyBhdmFpbGFibGU7IGl0IGNhbiBiZSByZWFkIGFkZGl0aW9uYWwgdGltZXMgYnkKLXJlcGVhdGluZyB0aGUganBlZ19zdGFydF9vdXRwdXQoKS9qcGVnX3JlYWRfc2NhbmxpbmVzKCkvanBlZ19maW5pc2hfb3V0cHV0KCkKLXNlcXVlbmNlLiAgRm9yIGV4YW1wbGUsIGEgdXNlZnVsIHRlY2huaXF1ZSBpcyB0byB1c2UgZmFzdCBvbmUtcGFzcyBjb2xvcgotcXVhbnRpemF0aW9uIGZvciBkaXNwbGF5IHBhc3NlcyBtYWRlIHdoaWxlIHRoZSBpbWFnZSBpcyBhcnJpdmluZywgZm9sbG93ZWQgYnkKLWEgZmluYWwgZGlzcGxheSBwYXNzIHVzaW5nIHR3by1wYXNzIHF1YW50aXphdGlvbiBmb3IgaGlnaGVzdCBxdWFsaXR5LiAgVGhpcwotaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgbGlicmFyeSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgZmluYWwgb3V0cHV0IHBhc3MuCi1DaGFuZ2luZyBwYXJhbWV0ZXJzIGJldHdlZW4gcGFzc2VzIGlzIGRpc2N1c3NlZCBpbiBkZXRhaWwgYmVsb3cuCi0KLUluIGdlbmVyYWwgdGhlIGxhc3Qgc2NhbiBvZiBhIHByb2dyZXNzaXZlIGZpbGUgY2Fubm90IGJlIHJlY29nbml6ZWQgYXMgc3VjaAotdW50aWwgYWZ0ZXIgaXQgaXMgcmVhZCwgc28gYSBwb3N0LWlucHV0IGRpc3BsYXkgcGFzcyBpcyB0aGUgYmVzdCBhcHByb2FjaCBpZgoteW91IHdhbnQgc3BlY2lhbCBwcm9jZXNzaW5nIGluIHRoZSBmaW5hbCBwYXNzLgotCi1XaGVuIGRvbmUgd2l0aCB0aGUgaW1hZ2UsIGJlIHN1cmUgdG8gY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgdG8gcmVsZWFzZQotdGhlIGJ1ZmZlcmVkIGltYWdlIChvciBqdXN0IHVzZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpKS4KLQotSWYgaW5wdXQgZGF0YSBhcnJpdmVzIGZhc3RlciB0aGFuIGl0IGNhbiBiZSBkaXNwbGF5ZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4KLWNhdXNlIHRoZSBsaWJyYXJ5IHRvIGRlY29kZSBpbnB1dCBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCdzIG5lZWRlZCB0byBwcm9kdWNlCi1vdXRwdXQuICBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB0aGUgcm91dGluZSBqcGVnX2NvbnN1bWVfaW5wdXQoKS4KLVRoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JSlBFR19SRUFDSEVEX1NPUzogICAgcmVhY2hlZCBhbiBTT1MgbWFya2VyICh0aGUgc3RhcnQgb2YgYSBuZXcgc2NhbikKLQlKUEVHX1JFQUNIRURfRU9JOiAgICByZWFjaGVkIHRoZSBFT0kgbWFya2VyIChlbmQgb2YgaW1hZ2UpCi0JSlBFR19ST1dfQ09NUExFVEVEOiAgY29tcGxldGVkIHJlYWRpbmcgb25lIE1DVSByb3cgb2YgY29tcHJlc3NlZCBkYXRhCi0JSlBFR19TQ0FOX0NPTVBMRVRFRDogY29tcGxldGVkIHJlYWRpbmcgbGFzdCBNQ1Ugcm93IG9mIGN1cnJlbnQgc2NhbgotCUpQRUdfU1VTUEVOREVEOiAgICAgIHN1c3BlbmRlZCBiZWZvcmUgY29tcGxldGluZyBhbnkgb2YgdGhlIGFib3ZlCi0oSlBFR19TVVNQRU5ERUQgY2FuIG9jY3VyIG9ubHkgaWYgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuKSAgVGhpcwotcm91dGluZSBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIGluaXRpYWxpemluZyB0aGUgSlBFRyBvYmplY3QuICBJdAotcmVhZHMgc29tZSBhZGRpdGlvbmFsIGRhdGEgYW5kIHJldHVybnMgd2hlbiBvbmUgb2YgdGhlIGluZGljYXRlZCBzaWduaWZpY2FudAotZXZlbnRzIG9jY3Vycy4gIChJZiBjYWxsZWQgYWZ0ZXIgdGhlIEVPSSBtYXJrZXIgaXMgcmVhY2hlZCwgaXQgd2lsbAotaW1tZWRpYXRlbHkgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0kgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSBkYXRhLikKLQotVGhlIGxpYnJhcnkncyBvdXRwdXQgcHJvY2Vzc2luZyB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKQotd2hlbmV2ZXIgdGhlIG91dHB1dCBwcm9jZXNzaW5nIG92ZXJ0YWtlcyB0aGUgaW5wdXQ7IHRodXMsIHNpbXBsZSBsb2Nrc3RlcAotZGlzcGxheSByZXF1aXJlcyBubyBkaXJlY3QgY2FsbHMgdG8ganBlZ19jb25zdW1lX2lucHV0KCkuICBCdXQgYnkgYWRkaW5nCi1jYWxscyB0byBqcGVnX2NvbnN1bWVfaW5wdXQoKSwgeW91IGNhbiBhYnNvcmIgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgaXMKLWJlaW5nIGRpc3BsYXllZC4gIFRoaXMgaGFzIHR3byBiZW5lZml0czoKLSAgKiBZb3UgY2FuIGxpbWl0IGJ1aWxkdXAgb2YgdW5wcm9jZXNzZWQgZGF0YSBpbiB5b3VyIGlucHV0IGJ1ZmZlci4KLSAgKiBZb3UgY2FuIGVsaW1pbmF0ZSBleHRyYSBkaXNwbGF5IHBhc3NlcyBieSBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZQotICAgIHN0YXRlIG9mIHRoZSBsaWJyYXJ5J3MgaW5wdXQgcHJvY2Vzc2luZy4KLQotVGhlIGZpcnN0IG9mIHRoZXNlIGJlbmVmaXRzIG9ubHkgcmVxdWlyZXMgaW50ZXJzcGVyc2luZyBjYWxscyB0bwotanBlZ19jb25zdW1lX2lucHV0KCkgd2l0aCB5b3VyIGRpc3BsYXkgb3BlcmF0aW9ucyBhbmQgYW55IG90aGVyIHByb2Nlc3NpbmcKLXlvdSBtYXkgYmUgZG9pbmcuICBUbyBhdm9pZCB3YXN0aW5nIGN5Y2xlcyBkdWUgdG8gYmFja3RyYWNraW5nLCBpdCdzIGJlc3QgdG8KLWNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgb25seSBhZnRlciBhIGh1bmRyZWQgb3Igc28gbmV3IGJ5dGVzIGhhdmUgYXJyaXZlZC4KLVRoaXMgaXMgZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIkkvTyBzdXNwZW5zaW9uIiwgYWJvdmUuICAoTm90ZTogdGhlIEpQRUcKLWxpYnJhcnkgY3VycmVudGx5IGlzIG5vdCB0aHJlYWQtc2FmZS4gIFlvdSBtdXN0IG5vdCBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpCi1mcm9tIG9uZSB0aHJlYWQgb2YgY29udHJvbCBpZiBhIGRpZmZlcmVudCBsaWJyYXJ5IHJvdXRpbmUgaXMgd29ya2luZyBvbiB0aGUKLXNhbWUgSlBFRyBvYmplY3QgaW4gYW5vdGhlciB0aHJlYWQuKQotCi1XaGVuIGlucHV0IGFycml2ZXMgZmFzdCBlbm91Z2ggdGhhdCBtb3JlIHRoYW4gb25lIG5ldyBzY2FuIGlzIGF2YWlsYWJsZQotYmVmb3JlIHlvdSBzdGFydCBhIG5ldyBvdXRwdXQgcGFzcywgeW91IG1heSBhcyB3ZWxsIHNraXAgdGhlIG91dHB1dCBwYXNzCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wbGV0ZWQgc2Nhbi4gIFRoaXMgb2NjdXJzIGZvciBmcmVlIGlmIHlvdSBwYXNzCi1jaW5mby5pbnB1dF9zY2FuX251bWJlciBhcyB0aGUgdGFyZ2V0IHNjYW4gbnVtYmVyIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi1UaGUgaW5wdXRfc2Nhbl9udW1iZXIgZmllbGQgaXMgc2ltcGx5IHRoZSBpbmRleCBvZiB0aGUgc2NhbiBjdXJyZW50bHkgYmVpbmcKLWNvbnN1bWVkIGJ5IHRoZSBpbnB1dCBwcm9jZXNzb3IuICBZb3UgY2FuIGVuc3VyZSB0aGF0IHRoaXMgaXMgdXAtdG8tZGF0ZSBieQotZW1wdHlpbmcgdGhlIGlucHV0IGJ1ZmZlciBqdXN0IGJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCk6IGNhbGwKLWpwZWdfY29uc3VtZV9pbnB1dCgpIHJlcGVhdGVkbHkgdW50aWwgaXQgcmV0dXJucyBKUEVHX1NVU1BFTkRFRCBvcgotSlBFR19SRUFDSEVEX0VPSS4KLQotVGhlIHRhcmdldCBzY2FuIG51bWJlciBwYXNzZWQgdG8ganBlZ19zdGFydF9vdXRwdXQoKSBpcyBzYXZlZCBpbiB0aGUKLWNpbmZvLm91dHB1dF9zY2FuX251bWJlciBmaWVsZC4gIFRoZSBsaWJyYXJ5J3Mgb3V0cHV0IHByb2Nlc3NpbmcgY2FsbHMKLWpwZWdfY29uc3VtZV9pbnB1dCgpIHdoZW5ldmVyIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGFuZCByb3cgd2l0aGluCi10aGF0IHNjYW4gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IG91dHB1dCBzY2FuIG51bWJlciBhbmQgcm93LgotVGh1cywgaW5wdXQgcHJvY2Vzc2luZyBjYW4gImdldCBhaGVhZCIgb2YgdGhlIG91dHB1dCBwcm9jZXNzaW5nIGJ1dCBpcyBub3QKLWFsbG93ZWQgdG8gImZhbGwgYmVoaW5kIi4gIFlvdSBjYW4gYWNoaWV2ZSBzZXZlcmFsIGRpZmZlcmVudCBlZmZlY3RzIGJ5Ci1tYW5pcHVsYXRpbmcgdGhpcyBpbnRlcmxvY2sgcnVsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgcGFzcyBhIHRhcmdldCBzY2FuCi1udW1iZXIgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyLCB0aGUgb3V0cHV0IHByb2Nlc3NvciB3aWxsCi13YWl0IHVudGlsIHRoYXQgc2NhbiBzdGFydHMgdG8gYXJyaXZlIGJlZm9yZSBwcm9kdWNpbmcgYW55IG91dHB1dC4gIChUbyBhdm9pZAotYW4gaW5maW5pdGUgbG9vcCwgdGhlIHRhcmdldCBzY2FuIG51bWJlciBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIHRoZSBsYXN0Ci1zY2FuIG51bWJlciB3aGVuIHRoZSBlbmQgb2YgaW1hZ2UgaXMgcmVhY2hlZC4gIFRodXMsIGlmIHlvdSBzcGVjaWZ5IGEgbGFyZ2UKLXRhcmdldCBzY2FuIG51bWJlciwgdGhlIGxpYnJhcnkgd2lsbCBqdXN0IGFic29yYiB0aGUgZW50aXJlIGlucHV0IGZpbGUgYW5kCi10aGVuIHBlcmZvcm0gYW4gb3V0cHV0IHBhc3MuICBUaGlzIGlzIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIHdoYXQKLWpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGRvZXMgd2hlbiB5b3UgZG9uJ3Qgc2VsZWN0IGJ1ZmZlcmVkLWltYWdlIG1vZGUuKQotV2hlbiB5b3UgcGFzcyBhIHRhcmdldCBzY2FuIG51bWJlciBlcXVhbCB0byB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciwKLXRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgbm8gZmFzdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBhcnJpdmVzLiAgVGhlCi1maW5hbCBwb3NzaWJpbGl0eSBpcyB0byBwYXNzIGEgdGFyZ2V0IHNjYW4gbnVtYmVyIGxlc3MgdGhhbiB0aGUgY3VycmVudCBpbnB1dAotc2NhbiBudW1iZXI7IHRoaXMgZGlzYWJsZXMgdGhlIGlucHV0L291dHB1dCBpbnRlcmxvY2sgYW5kIGNhdXNlcyB0aGUgb3V0cHV0Ci1wcm9jZXNzb3IgdG8gc2ltcGx5IGRpc3BsYXkgd2hhdGV2ZXIgaXQgZmluZHMgaW4gdGhlIGltYWdlIGJ1ZmZlciwgd2l0aG91dAotd2FpdGluZyBmb3IgaW5wdXQuICAoSG93ZXZlciwgdGhlIGxpYnJhcnkgd2lsbCBub3QgYWNjZXB0IGEgdGFyZ2V0IHNjYW4KLW51bWJlciBsZXNzIHRoYW4gb25lLCBzbyB5b3UgY2FuJ3QgYXZvaWQgd2FpdGluZyBmb3IgdGhlIGZpcnN0IHNjYW4uKQotCi1XaGVuIGRhdGEgaXMgYXJyaXZpbmcgZmFzdGVyIHRoYW4gdGhlIG91dHB1dCBkaXNwbGF5IHByb2Nlc3NpbmcgY2FuIGFkdmFuY2UKLXRocm91Z2ggdGhlIGltYWdlLCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aWxsIHN0b3JlIGRhdGEgaW50byB0aGUgYnVmZmVyZWQKLWltYWdlIGJleW9uZCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG91dHB1dCBwcm9jZXNzaW5nIGlzIHJlYWRpbmcgZGF0YSBvdXQKLWFnYWluLiAgSWYgdGhlIGlucHV0IGFycml2ZXMgZmFzdCBlbm91Z2gsIGl0IG1heSAid3JhcCBhcm91bmQiIHRoZSBidWZmZXIgdG8KLXRoZSBwb2ludCB3aGVyZSB0aGUgaW5wdXQgaXMgbW9yZSB0aGFuIG9uZSB3aG9sZSBzY2FuIGFoZWFkIG9mIHRoZSBvdXRwdXQuCi1JZiB0aGUgb3V0cHV0IHByb2Nlc3Npbmcgc2ltcGx5IHByb2NlZWRzIHRocm91Z2ggaXRzIGRpc3BsYXkgcGFzcyB3aXRob3V0Ci1wYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBpbnB1dCwgdGhlIGVmZmVjdCBzZWVuIG9uLXNjcmVlbiBpcyB0aGF0IHRoZSBsb3dlcgotcGFydCBvZiB0aGUgaW1hZ2UgaXMgb25lIG9yIG1vcmUgc2NhbnMgYmV0dGVyIGluIHF1YWxpdHkgdGhhbiB0aGUgdXBwZXIgcGFydC4KLVRoZW4sIHdoZW4gdGhlIG5leHQgb3V0cHV0IHNjYW4gaXMgc3RhcnRlZCwgeW91IGhhdmUgYSBjaG9pY2Ugb2Ygd2hhdCB0YXJnZXQKLXNjYW4gbnVtYmVyIHRvIHVzZS4gIFRoZSByZWNvbW1lbmRlZCBjaG9pY2UgaXMgdG8gdXNlIHRoZSBjdXJyZW50IGlucHV0IHNjYW4KLW51bWJlciBhdCB0aGF0IHRpbWUsIHdoaWNoIGltcGxpZXMgdGhhdCB5b3UndmUgc2tpcHBlZCB0aGUgb3V0cHV0IHNjYW5zCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzY2FucyB0aGF0IHdlcmUgY29tcGxldGVkIHdoaWxlIHlvdSBwcm9jZXNzZWQgdGhlCi1wcmV2aW91cyBvdXRwdXQgc2Nhbi4gIEluIHRoaXMgd2F5LCB0aGUgZGVjb2RlciBhdXRvbWF0aWNhbGx5IGFkYXB0cyBpdHMKLXNwZWVkIHRvIHRoZSBhcnJpdmluZyBkYXRhLCBieSBza2lwcGluZyBvdXRwdXQgc2NhbnMgYXMgbmVjZXNzYXJ5IHRvIGtlZXAgdXAKLXdpdGggdGhlIGFycml2aW5nIGRhdGEuCi0KLVdoZW4gdXNpbmcgdGhpcyBzdHJhdGVneSwgeW91J2xsIHdhbnQgdG8gYmUgc3VyZSB0aGF0IHlvdSBwZXJmb3JtIGEgZmluYWwKLW91dHB1dCBwYXNzIGFmdGVyIHJlY2VpdmluZyBhbGwgdGhlIGRhdGE7IG90aGVyd2lzZSB5b3VyIGxhc3QgZGlzcGxheSBtYXkgbm90Ci1iZSBmdWxsIHF1YWxpdHkgYWNyb3NzIHRoZSB3aG9sZSBzY3JlZW4uICBTbyB0aGUgcmlnaHQgb3V0ZXIgbG9vcCBsb2dpYyBpcwotc29tZXRoaW5nIGxpa2UgdGhpczoKLQlkbyB7Ci0JICAgIGFic29yYiBhbnkgd2FpdGluZyBpbnB1dCBieSBjYWxsaW5nIGpwZWdfY29uc3VtZV9pbnB1dCgpCi0JICAgIGZpbmFsX3Bhc3MgPSBqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbyk7Ci0JICAgIGFkanVzdCBvdXRwdXQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkCi0JICAgIGpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOwotCSAgICAuLi4KLQkgICAganBlZ19maW5pc2hfb3V0cHV0KCkKLQl9IHdoaWxlICghIGZpbmFsX3Bhc3MpOwotcmF0aGVyIHRoYW4gcXVpdHRpbmcgYXMgc29vbiBhcyBqcGVnX2lucHV0X2NvbXBsZXRlKCkgcmV0dXJucyBUUlVFLiAgVGhpcwotYXJyYW5nZW1lbnQgbWFrZXMgaXQgc2ltcGxlIHRvIHVzZSBoaWdoZXItcXVhbGl0eSBkZWNvZGluZyBwYXJhbWV0ZXJzCi1mb3IgdGhlIGZpbmFsIHBhc3MuICBCdXQgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHNwZWNpYWwgcGFyYW1ldGVycyBmb3IKLXRoZSBmaW5hbCBwYXNzLCB0aGUgcmlnaHQgbG9vcCBsb2dpYyBpcyBsaWtlIHRoaXM6Ci0JZm9yICg7OykgewotCSAgICBhYnNvcmIgYW55IHdhaXRpbmcgaW5wdXQgYnkgY2FsbGluZyBqcGVnX2NvbnN1bWVfaW5wdXQoKQotCSAgICBqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKLQkgICAgLi4uCi0JICAgIGpwZWdfZmluaXNoX291dHB1dCgpCi0JICAgIGlmIChqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbykgJiYKLQkgICAgICAgIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLm91dHB1dF9zY2FuX251bWJlcikKLQkgICAgICBicmVhazsKLQl9Ci1JbiB0aGlzIGNhc2UgeW91IGRvbid0IG5lZWQgdG8ga25vdyBpbiBhZHZhbmNlIHdoZXRoZXIgYW4gb3V0cHV0IHBhc3MgaXMgdG8KLWJlIHRoZSBsYXN0IG9uZSwgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIGhhdmUgcmVhY2hlZCBFT0YgYmVmb3JlIHN0YXJ0aW5nCi10aGUgZmluYWwgb3V0cHV0IHBhc3M7IHJhdGhlciwgd2hhdCB5b3Ugd2FudCB0byB0ZXN0IGlzIHdoZXRoZXIgdGhlIG91dHB1dAotcGFzcyB3YXMgcGVyZm9ybWVkIGluIHN5bmMgd2l0aCB0aGUgZmluYWwgaW5wdXQgc2Nhbi4gIFRoaXMgZm9ybSBvZiB0aGUgbG9vcAotd2lsbCBhdm9pZCBhbiBleHRyYSBvdXRwdXQgcGFzcyB3aGVuZXZlciB0aGUgZGVjb2RlciBpcyBhYmxlIChvciBuZWFybHkgYWJsZSkKLXRvIGtlZXAgdXAgd2l0aCB0aGUgaW5jb21pbmcgZGF0YS4KLQotV2hlbiB0aGUgZGF0YSB0cmFuc21pc3Npb24gc3BlZWQgaXMgaGlnaCwgeW91IG1pZ2h0IGJlZ2luIGEgZGlzcGxheSBwYXNzLAotdGhlbiBmaW5kIHRoYXQgbXVjaCBvciBhbGwgb2YgdGhlIGZpbGUgaGFzIGFycml2ZWQgYmVmb3JlIHlvdSBjYW4gY29tcGxldGUKLXRoZSBwYXNzLiAgKFlvdSBjYW4gZGV0ZWN0IHRoaXMgYnkgbm90aW5nIHRoZSBKUEVHX1JFQUNIRURfRU9JIHJldHVybiBjb2RlCi1mcm9tIGpwZWdfY29uc3VtZV9pbnB1dCgpLCBvciBlcXVpdmFsZW50bHkgYnkgdGVzdGluZyBqcGVnX2lucHV0X2NvbXBsZXRlKCkuKQotSW4gdGhpcyBzaXR1YXRpb24geW91IG1heSB3aXNoIHRvIGFib3J0IHRoZSBjdXJyZW50IGRpc3BsYXkgcGFzcyBhbmQgc3RhcnQgYQotbmV3IG9uZSB1c2luZyB0aGUgbmV3bHkgYXJyaXZlZCBpbmZvcm1hdGlvbi4gIFRvIGRvIHNvLCBqdXN0IGNhbGwKLWpwZWdfZmluaXNoX291dHB1dCgpIGFuZCB0aGVuIHN0YXJ0IGEgbmV3IHBhc3Mgd2l0aCBqcGVnX3N0YXJ0X291dHB1dCgpLgotCi1BIHZhcmlhbnQgc3RyYXRlZ3kgaXMgdG8gYWJvcnQgYW5kIHJlc3RhcnQgZGlzcGxheSBpZiBtb3JlIHRoYW4gb25lIGNvbXBsZXRlCi1zY2FuIGFycml2ZXMgZHVyaW5nIGFuIG91dHB1dCBwYXNzOyB0aGlzIGNhbiBiZSBkZXRlY3RlZCBieSBub3RpbmcKLUpQRUdfUkVBQ0hFRF9TT1MgcmV0dXJucyBhbmQvb3IgZXhhbWluaW5nIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyLiAgVGhpcwotaWRlYSBzaG91bGQgYmUgZW1wbG95ZWQgd2l0aCBjYXV0aW9uLCBob3dldmVyLCBzaW5jZSB0aGUgZGlzcGxheSBwcm9jZXNzCi1taWdodCBuZXZlciBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UgYmVmb3JlIGJlaW5nIGFib3J0ZWQsIHJlc3VsdGluZwotaW4gdGhlIGxvd2VyIHBhcnQgb2YgdGhlIHNjcmVlbiBiZWluZyBzZXZlcmFsIHBhc3NlcyB3b3JzZSB0aGFuIHRoZSB1cHBlci4KLUluIG1vc3QgY2FzZXMgaXQncyBwcm9iYWJseSBiZXN0IHRvIGFib3J0IGFuIG91dHB1dCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlCi1maWxlIGhhcyBhcnJpdmVkIGFuZCB5b3Ugd2FudCB0byBiZWdpbiB0aGUgZmluYWwgb3V0cHV0IHBhc3MgaW1tZWRpYXRlbHkuCi0KLVdoZW4gcmVjZWl2aW5nIGRhdGEgYWNyb3NzIGEgY29tbXVuaWNhdGlvbiBsaW5rLCB3ZSByZWNvbW1lbmQgYWx3YXlzIHVzaW5nCi10aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBmb3IgdGhlIG91dHB1dCB0YXJnZXQgc2NhbiBudW1iZXI7IGlmIGEKLWhpZ2hlci1xdWFsaXR5IGZpbmFsIHBhc3MgaXMgdG8gYmUgZG9uZSwgaXQgc2hvdWxkIGJlIHN0YXJ0ZWQgKGFib3J0aW5nIGFueQotaW5jb21wbGV0ZSBvdXRwdXQgcGFzcykgYXMgc29vbiBhcyB0aGUgZW5kIG9mIGZpbGUgaXMgcmVjZWl2ZWQuICBIb3dldmVyLAotbWFueSBvdGhlciBzdHJhdGVnaWVzIGFyZSBwb3NzaWJsZS4gIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gY2FuIGV4YW1pbmUKLXRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gYW5kIGRlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXkgaXQgb3IKLW5vdC4gIElmIHRoZSBzY2FuIGNvbnRhaW5zIG9ubHkgY2hyb21hIGRhdGEsIG9uZSBtaWdodCBjaG9vc2Ugbm90IHRvIHVzZSBpdAotYXMgdGhlIHRhcmdldCBzY2FuLCBleHBlY3RpbmcgdGhhdCB0aGUgc2NhbiB3aWxsIGJlIHNtYWxsIGFuZCB3aWxsIGFycml2ZQotcXVpY2tseS4gIFRvIHNraXAgdG8gdGhlIG5leHQgc2NhbiwgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB1bnRpbCBpdAotcmV0dXJucyBKUEVHX1JFQUNIRURfU09TIG9yIEpQRUdfUkVBQ0hFRF9FT0kuICBPciBqdXN0IHVzZSB0aGUgbmV4dCBoaWdoZXIKLW51bWJlciBhcyB0aGUgdGFyZ2V0IHNjYW4gZm9yIGpwZWdfc3RhcnRfb3V0cHV0KCk7IGJ1dCB0aGF0IG1ldGhvZCBkb2Vzbid0Ci1sZXQgeW91IGluc3BlY3QgdGhlIG5leHQgc2NhbidzIHBhcmFtZXRlcnMgYmVmb3JlIGRlY2lkaW5nIHRvIGRpc3BsYXkgaXQuCi0KLQotSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwganBlZ19zdGFydF9kZWNvbXByZXNzKCkgbmV2ZXIgcGVyZm9ybXMgaW5wdXQgYW5kCi10aHVzIG5ldmVyIHN1c3BlbmRzLiAgQW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIGlucHV0IHN1c3BlbnNpb24gd2l0aAotYnVmZmVyZWQtaW1hZ2UgbW9kZSBtdXN0IGJlIHByZXBhcmVkIGZvciBzdXNwZW5zaW9uIHJldHVybnMgZnJvbSB0aGVzZQotcm91dGluZXM6Ci0qIGpwZWdfc3RhcnRfb3V0cHV0KCkgcGVyZm9ybXMgaW5wdXQgb25seSBpZiB5b3UgcmVxdWVzdCAyLXBhc3MgcXVhbnRpemF0aW9uCi0gIGFuZCB0aGUgdGFyZ2V0IHNjYW4gaXNuJ3QgZnVsbHkgcmVhZCB5ZXQuICAoVGhpcyBpcyBkaXNjdXNzZWQgYmVsb3cuKQotKiBqcGVnX3JlYWRfc2NhbmxpbmVzKCksIGFzIGFsd2F5cywgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyB0aGF0IGl0Ci0gIHdhcyBhYmxlIHRvIHByb2R1Y2UgYmVmb3JlIHN1c3BlbmRpbmcuCi0qIGpwZWdfZmluaXNoX291dHB1dCgpIHdpbGwgcmVhZCBhbnkgbWFya2VycyBmb2xsb3dpbmcgdGhlIHRhcmdldCBzY2FuLAotICB1cCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIG9yIHRoZSBTT1MgbWFya2VyIHRoYXQgYmVnaW5zIGFub3RoZXIgc2Nhbi4KLSAgKEJ1dCBpdCByZWFkcyBubyBpbnB1dCBpZiBqcGVnX2NvbnN1bWVfaW5wdXQoKSBoYXMgYWxyZWFkeSByZWFjaGVkIHRoZQotICBlbmQgb2YgdGhlIGZpbGUgb3IgYSBTT1MgbWFya2VyIGJleW9uZCB0aGUgdGFyZ2V0IG91dHB1dCBzY2FuLikKLSoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHdpbGwgcmVhZCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUsIGFuZCB0aHVzIGNhbgotICBzdXNwZW5kIGlmIHRoZSBlbmQgaGFzbid0IGFscmVhZHkgYmVlbiByZWFjaGVkIChhcyBjYW4gYmUgdGVzdGVkIGJ5Ci0gIGNhbGxpbmcganBlZ19pbnB1dF9jb21wbGV0ZSgpKS4KLWpwZWdfc3RhcnRfb3V0cHV0KCksIGpwZWdfZmluaXNoX291dHB1dCgpLCBhbmQganBlZ19maW5pc2hfZGVjb21wcmVzcygpCi1hbGwgcmV0dXJuIFRSVUUgaWYgdGhleSBjb21wbGV0ZWQgdGhlaXIgdGFza3MsIEZBTFNFIGlmIHRoZXkgaGFkIHRvIHN1c3BlbmQuCi1JbiB0aGUgZXZlbnQgb2YgYSBGQUxTRSByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGxvYWQgbW9yZSBpbnB1dCBkYXRhCi1hbmQgcmVwZWF0IHRoZSBjYWxsLiAgQXBwbGljYXRpb25zIHRoYXQgdXNlIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlcyBuZWVkCi1ub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlc2UgdGhyZWUgcm91dGluZXMuCi0KLQotSXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIGRlY29kaW5nIHBhcmFtZXRlcnMgYmV0d2VlbiBvdXRwdXQgcGFzc2VzIGluIHRoZQotYnVmZmVyZWQtaW1hZ2UgbW9kZS4gIFRoZSBkZWNvZGVyIGxpYnJhcnkgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgdmVyeQotbGltaXRlZCBjaGFuZ2VzIG9mIHBhcmFtZXRlcnMuICBPTkxZIFRIRSBGT0xMT1dJTkcgcGFyYW1ldGVyIGNoYW5nZXMgYXJlCi1hbGxvd2VkIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGlzIGNhbGxlZDoKLSogZGN0X21ldGhvZCBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi0gIEZvciBleGFtcGxlLCBvbmUgY291bGQgdXNlIGEgZmFzdCBEQ1QgbWV0aG9kIGZvciBlYXJseSBzY2FucywgY2hhbmdpbmcKLSAgdG8gYSBoaWdoZXIgcXVhbGl0eSBtZXRob2QgZm9yIHRoZSBmaW5hbCBzY2FuLgotKiBkaXRoZXJfbW9kZSBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCk7Ci0gIG9mIGNvdXJzZSB0aGlzIGhhcyBubyBpbXBhY3QgaWYgbm90IHVzaW5nIGNvbG9yIHF1YW50aXphdGlvbi4gIFR5cGljYWxseQotICBvbmUgd291bGQgdXNlIG9yZGVyZWQgZGl0aGVyIGZvciBpbml0aWFsIHBhc3NlcywgdGhlbiBzd2l0Y2ggdG8KLSAgRmxveWQtU3RlaW5iZXJnIGRpdGhlciBmb3IgdGhlIGZpbmFsIHBhc3MuICBDYXV0aW9uOiBjaGFuZ2luZyBkaXRoZXIgbW9kZQotICBjYW4gY2F1c2UgbW9yZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5LiAgQWx0aG91Z2ggdGhlIGFtb3VudAotICBvZiBtZW1vcnkgaW52b2x2ZWQgaXMgbm90IGxhcmdlIChhIHNjYW5saW5lIG9yIHNvKSwgaXQgbWF5IGNhdXNlIHRoZQotICBpbml0aWFsIG1heF9tZW1vcnlfdG9fdXNlIHNwZWNpZmljYXRpb24gdG8gYmUgZXhjZWVkZWQsIHdoaWNoIGluIHRoZSB3b3JzdAotICBjYXNlIHdvdWxkIHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtb3J5IGZhaWx1cmUuCi0qIGRvX2Jsb2NrX3Ntb290aGluZyBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCi0gIFRoaXMgc2V0dGluZyBpcyByZWxldmFudCBvbmx5IHdoZW4gZGVjb2RpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHIGltYWdlLgotICBEdXJpbmcgdGhlIGZpcnN0IERDLW9ubHkgc2NhbiwgYmxvY2sgc21vb3RoaW5nIHByb3ZpZGVzIGEgdmVyeSAiZnV6enkiIGxvb2sKLSAgaW5zdGVhZCBvZiB0aGUgdmVyeSAiYmxvY2t5IiBsb29rIHNlZW4gd2l0aG91dCBpdDsgd2hpY2ggaXMgYmV0dGVyIHNlZW1zIGEKLSAgbWF0dGVyIG9mIHBlcnNvbmFsIHRhc3RlLiAgQnV0IGJsb2NrIHNtb290aGluZyBpcyBuZWFybHkgYWx3YXlzIGEgd2luCi0gIGR1cmluZyBsYXRlciBzdGFnZXMsIGVzcGVjaWFsbHkgd2hlbiBkZWNvZGluZyBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbgotICBpbWFnZTogc21vb3RoaW5nIGhlbHBzIHRvIGhpZGUgdGhlIHNsaWdodCBibG9ja2luZXNzIHRoYXQgb3RoZXJ3aXNlIHNob3dzCi0gIHVwIG9uIHNtb290aCBncmFkaWVudHMgdW50aWwgdGhlIGxvd2VzdCBjb2VmZmljaWVudCBiaXRzIGFyZSBzZW50LgotKiBDb2xvciBxdWFudGl6YXRpb24gbW9kZSBjYW4gYmUgY2hhbmdlZCB1bmRlciB0aGUgcnVsZXMgZGVzY3JpYmVkIGJlbG93LgotICBZb3UgKmNhbm5vdCogY2hhbmdlIGJldHdlZW4gZnVsbC1jb2xvciBhbmQgcXVhbnRpemVkIG91dHB1dCAoYmVjYXVzZSB0aGF0Ci0gIHdvdWxkIGFsdGVyIHRoZSByZXF1aXJlZCBJL08gYnVmZmVyIHNpemVzKSwgYnV0IHlvdSBjYW4gY2hhbmdlIHdoaWNoCi0gIHF1YW50aXphdGlvbiBtZXRob2QgaXMgdXNlZC4KLQotV2hlbiBnZW5lcmF0aW5nIGNvbG9yLXF1YW50aXplZCBvdXRwdXQsIGNoYW5naW5nIHF1YW50aXphdGlvbiBtZXRob2QgaXMgYQotdmVyeSB1c2VmdWwgd2F5IG9mIHN3aXRjaGluZyBiZXR3ZWVuIGhpZ2gtc3BlZWQgYW5kIGhpZ2gtcXVhbGl0eSBkaXNwbGF5LgotVGhlIGxpYnJhcnkgYWxsb3dzIHlvdSB0byBjaGFuZ2UgYW1vbmcgaXRzIHRocmVlIHF1YW50aXphdGlvbiBtZXRob2RzOgotMS4gU2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGEgZml4ZWQgY29sb3IgY3ViZS4KLSAgIFNlbGVjdGVkIGJ5IGNpbmZvLnR3b19wYXNzX3F1YW50aXplID0gRkFMU0UgYW5kIGNpbmZvLmNvbG9ybWFwID0gTlVMTC4KLTIuIFNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBjb2xvcm1hcC4KLSAgIFNlbGVjdGVkIGJ5IHNldHRpbmcgY2luZm8uY29sb3JtYXAgdG8gcG9pbnQgdG8gdGhlIGNvbG9ybWFwICh0aGUgdmFsdWUgb2YKLSAgIHR3b19wYXNzX3F1YW50aXplIGlzIGlnbm9yZWQpOyBhbHNvIHNldCBjaW5mby5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycy4KLTMuIFR3by1wYXNzIHF1YW50aXphdGlvbiB0byBhIGNvbG9ybWFwIGNob3NlbiBzcGVjaWZpY2FsbHkgZm9yIHRoZSBpbWFnZS4KLSAgIFNlbGVjdGVkIGJ5IGNpbmZvLnR3b19wYXNzX3F1YW50aXplID0gVFJVRSBhbmQgY2luZm8uY29sb3JtYXAgPSBOVUxMLgotICAgKFRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBzZWxlY3RlZCBieSBqcGVnX3JlYWRfaGVhZGVyLCBidXQgaXQgaXMKLSAgIHByb2JhYmx5IE5PVCB3aGF0IHlvdSB3YW50IGZvciB0aGUgZmlyc3QgcGFzcyBvZiBwcm9ncmVzc2l2ZSBkaXNwbGF5ISkKLVRoZXNlIG1ldGhvZHMgb2ZmZXIgc3VjY2Vzc2l2ZWx5IGJldHRlciBxdWFsaXR5IGFuZCBsZXNzZXIgc3BlZWQuICBIb3dldmVyLAotb25seSB0aGUgZmlyc3QgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgcXVhbnRpemluZyBpbiBub24tUkdCIGNvbG9yIHNwYWNlcy4KLQotSU1QT1JUQU5UOiBiZWNhdXNlIHRoZSBkaWZmZXJlbnQgcXVhbnRpemVyIG1ldGhvZHMgaGF2ZSB2ZXJ5IGRpZmZlcmVudAotd29ya2luZy1zdG9yYWdlIHJlcXVpcmVtZW50cywgdGhlIGxpYnJhcnkgcmVxdWlyZXMgeW91IHRvIGluZGljYXRlIHdoaWNoCi1vbmUocykgeW91IGludGVuZCB0byB1c2UgYmVmb3JlIHlvdSBjYWxsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgKElmIHdlIGRpZAotbm90IHJlcXVpcmUgdGhpcywgdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcgd291bGQgYmUgYSBjb21wbGV0ZSBmaWN0aW9uLikKLVlvdSBkbyB0aGlzIGJ5IHNldHRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgdGhyZWUgY2luZm8gZmllbGRzIHRvIFRSVUU6Ci0JZW5hYmxlXzFwYXNzX3F1YW50CQlGaXhlZCBjb2xvciBjdWJlIGNvbG9ybWFwCi0JZW5hYmxlX2V4dGVybmFsX3F1YW50CQlFeHRlcm5hbGx5LXN1cHBsaWVkIGNvbG9ybWFwCi0JZW5hYmxlXzJwYXNzX3F1YW50CQlUd28tcGFzcyBjdXN0b20gY29sb3JtYXAKLUFsbCB0aHJlZSBhcmUgaW5pdGlhbGl6ZWQgRkFMU0UgYnkganBlZ19yZWFkX2hlYWRlcigpLiAgQnV0Ci1qcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBhdXRvbWF0aWNhbGx5IHNldHMgVFJVRSB0aGUgb25lIHNlbGVjdGVkIGJ5IHRoZQotY3VycmVudCB0d29fcGFzc19xdWFudGl6ZSBhbmQgY29sb3JtYXAgc2V0dGluZ3MsIHNvIHlvdSBvbmx5IG5lZWQgdG8gc2V0IHRoZQotZW5hYmxlIGZsYWdzIGZvciBhbnkgb3RoZXIgcXVhbnRpemF0aW9uIG1ldGhvZHMgeW91IHBsYW4gdG8gY2hhbmdlIHRvIGxhdGVyLgotCi1BZnRlciBzZXR0aW5nIHRoZSBlbmFibGUgZmxhZ3MgY29ycmVjdGx5IGF0IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRpbWUsIHlvdQotY2FuIGNoYW5nZSB0byBhbnkgZW5hYmxlZCBxdWFudGl6YXRpb24gbWV0aG9kIGJ5IHNldHRpbmcgdHdvX3Bhc3NfcXVhbnRpemUKLWFuZCBjb2xvcm1hcCBwcm9wZXJseSBqdXN0IGJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCkuICBUaGUgZm9sbG93aW5nCi1zcGVjaWFsIHJ1bGVzIGFwcGx5OgotMS4gWW91IG11c3QgZXhwbGljaXRseSBzZXQgY2luZm8uY29sb3JtYXAgdG8gTlVMTCB3aGVuIHN3aXRjaGluZyB0byAxLXBhc3MKLSAgIG9yIDItcGFzcyBtb2RlIGZyb20gYSBkaWZmZXJlbnQgbW9kZSwgb3Igd2hlbiB5b3Ugd2FudCB0aGUgMi1wYXNzCi0gICBxdWFudGl6ZXIgdG8gYmUgcmUtcnVuIHRvIGdlbmVyYXRlIGEgbmV3IGNvbG9ybWFwLgotMi4gVG8gc3dpdGNoIHRvIGFuIGV4dGVybmFsIGNvbG9ybWFwLCBvciB0byBjaGFuZ2UgdG8gYSBkaWZmZXJlbnQgZXh0ZXJuYWwKLSAgIGNvbG9ybWFwIHRoYW4gd2FzIHVzZWQgb24gdGhlIHByaW9yIHBhc3MsIHlvdSBtdXN0IGNhbGwKLSAgIGpwZWdfbmV3X2NvbG9ybWFwKCkgYWZ0ZXIgc2V0dGluZyBjaW5mby5jb2xvcm1hcC4KLU5PVEU6IGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgc2FtZSBjb2xvcm1hcCBhcyB3YXMgdXNlZCBpbiB0aGUgcHJpb3IgcGFzcywKLXlvdSBzaG91bGQgbm90IGRvIGVpdGhlciBvZiB0aGVzZSB0aGluZ3MuICBUaGlzIHdpbGwgc2F2ZSBzb21lIG5vbnRyaXZpYWwKLXN3aXRjaG92ZXIgY29zdHMuCi0oVGhlc2UgcmVxdWlyZW1lbnRzIGV4aXN0IGJlY2F1c2UgY2luZm8uY29sb3JtYXAgd2lsbCBhbHdheXMgYmUgbm9uLU5VTEwKLWFmdGVyIGNvbXBsZXRpbmcgYSBwcmlvciBvdXRwdXQgcGFzcywgc2luY2UgYm90aCB0aGUgMS1wYXNzIGFuZCAyLXBhc3MKLXF1YW50aXplcnMgc2V0IGl0IHRvIHBvaW50IHRvIHRoZWlyIG91dHB1dCBjb2xvcm1hcHMuICBUaHVzIHlvdSBoYXZlIHRvCi1kbyBvbmUgb2YgdGhlc2UgdHdvIHRoaW5ncyB0byBub3RpZnkgdGhlIGxpYnJhcnkgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQuCi1ZdXAsIGl0J3MgYSBiaXQga2x1Z3ksIGJ1dCBpdCdzIG5lY2Vzc2FyeSB0byBkbyBpdCB0aGlzIHdheSBmb3IgYmFja3dhcmRzCi1jb21wYXRpYmlsaXR5LikKLQotTm90ZSB0aGF0IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBsaWJyYXJ5IGdlbmVyYXRlcyBhbnkgcmVxdWVzdGVkIGNvbG9ybWFwCi1kdXJpbmcganBlZ19zdGFydF9vdXRwdXQoKSwgbm90IGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLQotV2hlbiB1c2luZyB0d28tcGFzcyBxdWFudGl6YXRpb24sIGpwZWdfc3RhcnRfb3V0cHV0KCkgbWFrZXMgYSBwYXNzIG92ZXIgdGhlCi1idWZmZXJlZCBpbWFnZSB0byBkZXRlcm1pbmUgdGhlIG9wdGltdW0gY29sb3IgbWFwOyBpdCB0aGVyZWZvcmUgbWF5IHRha2UgYQotc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUsIHdoZXJlYXMgb3JkaW5hcmlseSBpdCBkb2VzIGxpdHRsZSB3b3JrLiAgVGhlCi1wcm9ncmVzcyBtb25pdG9yIGhvb2sgaXMgY2FsbGVkIGR1cmluZyB0aGlzIHBhc3MsIGlmIGRlZmluZWQuICBJdCBpcyBhbHNvCi1pbXBvcnRhbnQgdG8gcmVhbGl6ZSB0aGF0IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHNjYW4gbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbgotb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIsIGpwZWdfc3RhcnRfb3V0cHV0KCkgd2lsbCBhdHRlbXB0Ci10byBjb25zdW1lIGlucHV0IGFzIGl0IG1ha2VzIHRoaXMgcGFzcy4gIElmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLAoteW91IG5lZWQgdG8gY2hlY2sgZm9yIGEgRkFMU0UgcmV0dXJuIGZyb20ganBlZ19zdGFydF9vdXRwdXQoKSB1bmRlciB0aGVzZQotY29uZGl0aW9ucy4gIFRoZSBjb21iaW5hdGlvbiBvZiAyLXBhc3MgcXVhbnRpemF0aW9uIGFuZCBhIG5vdC15ZXQtZnVsbHktcmVhZAotdGFyZ2V0IHNjYW4gaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCBqcGVnX3N0YXJ0X291dHB1dCgpIHdpbGwgY29uc3VtZSBpbnB1dC4KLQotCi1BcHBsaWNhdGlvbiBhdXRob3JzIHdobyBzdXBwb3J0IGJ1ZmZlcmVkLWltYWdlIG1vZGUgbWF5IGJlIHRlbXB0ZWQgdG8gdXNlIGl0Ci1mb3IgYWxsIEpQRUcgaW1hZ2VzLCBldmVuIHNpbmdsZS1zY2FuIG9uZXMuICBUaGlzIHdpbGwgd29yaywgYnV0IGl0IGlzCi1pbmVmZmljaWVudDogdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gaW1hZ2Utc2l6ZWQgY29lZmZpY2llbnQgYnVmZmVyIGZvcgotc2luZ2xlLXNjYW4gaW1hZ2VzLiAgUmVxdWVzdGluZyBidWZmZXJlZC1pbWFnZSBtb2RlIGZvciBzdWNoIGFuIGltYWdlIHdhc3RlcwotbWVtb3J5LiAgV29yc2UsIGl0IGNhbiBjb3N0IHRpbWUgb24gbGFyZ2UgaW1hZ2VzLCBzaW5jZSB0aGUgYnVmZmVyZWQgZGF0YSBoYXMKLXRvIGJlIHN3YXBwZWQgb3V0IG9yIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkgZmlsZS4gIElmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0Ci1tYXhpbXVtIHBlcmZvcm1hbmNlIG9uIGJhc2VsaW5lIEpQRUcgZmlsZXMsIHlvdSBzaG91bGQgdXNlIGJ1ZmZlcmVkLWltYWdlCi1tb2RlIG9ubHkgd2hlbiB0aGUgaW5jb21pbmcgZmlsZSBhY3R1YWxseSBoYXMgbXVsdGlwbGUgc2NhbnMuICBUaGlzIGNhbiBiZQotdGVzdGVkIGJ5IGNhbGxpbmcganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMoKSwgd2hpY2ggd2lsbCByZXR1cm4gYSBjb3JyZWN0Ci1yZXN1bHQgYXQgYW55IHRpbWUgYWZ0ZXIganBlZ19yZWFkX2hlYWRlcigpIGNvbXBsZXRlcy4KLQotSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB3aGVuIHlvdSB1c2UganBlZ19jb25zdW1lX2lucHV0KCkgdG8gbGV0IGlucHV0Ci1wcm9jZXNzaW5nIGdldCBhaGVhZCBvZiBvdXRwdXQgcHJvY2Vzc2luZywgdGhlIHJlc3VsdGluZyBwYXR0ZXJuIG9mIGFjY2VzcyB0bwotdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBxdWl0ZSBub25zZXF1ZW50aWFsLiAgSXQncyBiZXN0IHRvIHVzZSB0aGUgbWVtb3J5Ci1tYW5hZ2VyIGptZW1ub2JzLmMgaWYgeW91IGNhbiAoaWUsIGlmIHlvdSBoYXZlIGVub3VnaCByZWFsIG9yIHZpcnR1YWwgbWFpbgotbWVtb3J5KS4gIElmIG5vdCwgYXQgbGVhc3QgbWFrZSBzdXJlIHRoYXQgbWF4X21lbW9yeV90b191c2UgaXMgc2V0IGFzIGhpZ2ggYXMKLXBvc3NpYmxlLiAgSWYgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIgaGFzIHRvIHVzZSBhIHRlbXBvcmFyeSBmaWxlLCB5b3Ugd2lsbAotcHJvYmFibHkgc2VlIGEgbG90IG9mIGRpc2sgdHJhZmZpYyBhbmQgcG9vciBwZXJmb3JtYW5jZS4gIChUaGlzIGNvdWxkIGJlCi1pbXByb3ZlZCB3aXRoIGFkZGl0aW9uYWwgd29yayBvbiB0aGUgbWVtb3J5IG1hbmFnZXIsIGJ1dCB3ZSBoYXZlbid0IGdvdHRlbgotYXJvdW5kIHRvIGl0IHlldC4pCi0KLUluIHNvbWUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBjb252ZW5pZW50IHRvIHVzZSBqcGVnX2NvbnN1bWVfaW5wdXQoKSBmb3IgYWxsCi1pbnB1dCBwcm9jZXNzaW5nLCBpbmNsdWRpbmcgcmVhZGluZyB0aGUgaW5pdGlhbCBtYXJrZXJzOyB0aGF0IGlzLCB5b3UgbWF5Ci13aXNoIHRvIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgaW5zdGVhZCBvZiBqcGVnX3JlYWRfaGVhZGVyKCkgZHVyaW5nCi1zdGFydHVwLiAgVGhpcyB3b3JrcywgYnV0IG5vdGUgdGhhdCB5b3UgbXVzdCBjaGVjayBmb3IgSlBFR19SRUFDSEVEX1NPUyBhbmQKLUpQRUdfUkVBQ0hFRF9FT0kgcmV0dXJuIGNvZGVzIGFzIHRoZSBlcXVpdmFsZW50IG9mIGpwZWdfcmVhZF9oZWFkZXIncyBjb2Rlcy4KLU9uY2UgdGhlIGZpcnN0IFNPUyBtYXJrZXIgaGFzIGJlZW4gcmVhY2hlZCwgeW91IG11c3QgY2FsbAotanBlZ19zdGFydF9kZWNvbXByZXNzKCkgYmVmb3JlIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgY29uc3VtZSBtb3JlIGlucHV0OwotaXQnbGwganVzdCBrZWVwIHJldHVybmluZyBKUEVHX1JFQUNIRURfU09TIHVudGlsIHlvdSBkby4gIElmIHlvdSByZWFkIGEKLXRhYmxlcy1vbmx5IGZpbGUgdGhpcyB3YXksIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0kKLXdpdGhvdXQgZXZlciByZXR1cm5pbmcgSlBFR19SRUFDSEVEX1NPUzsgYmUgc3VyZSB0byBjaGVjayBmb3IgdGhpcyBjYXNlLgotSWYgdGhpcyBoYXBwZW5zLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgbm90IHJlYWQgYW55IG1vcmUgaW5wdXQgdW50aWwgeW91IGNhbGwKLWpwZWdfYWJvcnQoKSB0byByZXNldCBpdC4gIEl0IGlzIE9LIHRvIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgZXZlbiB3aGVuIG5vdAotdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZSwgYnV0IGluIHRoYXQgY2FzZSBpdCdzIGJhc2ljYWxseSBhIG5vLW9wIGFmdGVyIHRoZQotaW5pdGlhbCBtYXJrZXJzIGhhdmUgYmVlbiByZWFkOiBpdCB3aWxsIGp1c3QgcmV0dXJuIEpQRUdfU1VTUEVOREVELgotCi0KLUFiYnJldmlhdGVkIGRhdGFzdHJlYW1zIGFuZCBtdWx0aXBsZSBpbWFnZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBKUEVHIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb2JqZWN0IGNhbiBiZSByZXVzZWQgdG8gcHJvY2VzcyBtdWx0aXBsZQotaW1hZ2VzLiAgVGhpcyBzYXZlcyBhIHNtYWxsIGFtb3VudCBvZiB0aW1lIHBlciBpbWFnZSBieSBlbGltaW5hdGluZyB0aGUKLSJjcmVhdGUiIGFuZCAiZGVzdHJveSIgb3BlcmF0aW9ucywgYnV0IHRoYXQgaXNuJ3QgdGhlIHJlYWwgcHVycG9zZSBvZiB0aGUKLWZlYXR1cmUuICBSYXRoZXIsIHJldXNlIG9mIGFuIG9iamVjdCBwcm92aWRlcyBzdXBwb3J0IGZvciBhYmJyZXZpYXRlZCBKUEVHCi1kYXRhc3RyZWFtcy4gIE9iamVjdCByZXVzZSBjYW4gYWxzbyBzaW1wbGlmeSBwcm9jZXNzaW5nIGEgc2VyaWVzIG9mIGltYWdlcyBpbgotYSBzaW5nbGUgaW5wdXQgb3Igb3V0cHV0IGZpbGUuICBUaGlzIHNlY3Rpb24gZXhwbGFpbnMgdGhlc2UgZmVhdHVyZXMuCi0KLUEgSlBFRyBmaWxlIG5vcm1hbGx5IGNvbnRhaW5zIHNldmVyYWwgaHVuZHJlZCBieXRlcyB3b3J0aCBvZiBxdWFudGl6YXRpb24KLWFuZCBIdWZmbWFuIHRhYmxlcy4gIEluIGEgc2l0dWF0aW9uIHdoZXJlIG1hbnkgaW1hZ2VzIHdpbGwgYmUgc3RvcmVkIG9yCi10cmFuc21pdHRlZCB3aXRoIGlkZW50aWNhbCB0YWJsZXMsIHRoaXMgbWF5IHJlcHJlc2VudCBhbiBhbm5veWluZyBvdmVyaGVhZC4KLVRoZSBKUEVHIHN0YW5kYXJkIHRoZXJlZm9yZSBwZXJtaXRzIHRhYmxlcyB0byBiZSBvbWl0dGVkLiAgVGhlIHN0YW5kYXJkCi1kZWZpbmVzIHRocmVlIGNsYXNzZXMgb2YgSlBFRyBkYXRhc3RyZWFtczoKLSAgKiAiSW50ZXJjaGFuZ2UiIGRhdGFzdHJlYW1zIGNvbnRhaW4gYW4gaW1hZ2UgYW5kIGFsbCB0YWJsZXMgbmVlZGVkIHRvIGRlY29kZQotICAgICB0aGUgaW1hZ2UuICBUaGVzZSBhcmUgdGhlIHVzdWFsIGtpbmQgb2YgSlBFRyBmaWxlLgotICAqICJBYmJyZXZpYXRlZCBpbWFnZSIgZGF0YXN0cmVhbXMgY29udGFpbiBhbiBpbWFnZSwgYnV0IGFyZSBtaXNzaW5nIHNvbWUgb3IKLSAgICBhbGwgb2YgdGhlIHRhYmxlcyBuZWVkZWQgdG8gZGVjb2RlIHRoYXQgaW1hZ2UuCi0gICogIkFiYnJldmlhdGVkIHRhYmxlIHNwZWNpZmljYXRpb24iIChoZW5jZWZvcnRoICJ0YWJsZXMtb25seSIpIGRhdGFzdHJlYW1zCi0gICAgY29udGFpbiBvbmx5IHRhYmxlIHNwZWNpZmljYXRpb25zLgotVG8gZGVjb2RlIGFuIGFiYnJldmlhdGVkIGltYWdlLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgbWlzc2luZyB0YWJsZShzKQotaW50byB0aGUgZGVjb2RlciBiZWZvcmVoYW5kLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHJlYWRpbmcgYSBzZXBhcmF0ZQotdGFibGVzLW9ubHkgZmlsZS4gIEEgdmFyaWFudCBzY2hlbWUgdXNlcyBhIHNlcmllcyBvZiBpbWFnZXMgaW4gd2hpY2ggdGhlIGZpcnN0Ci1pbWFnZSBpcyBhbiBpbnRlcmNoYW5nZSAoY29tcGxldGUpIGRhdGFzdHJlYW0sIHdoaWxlIHN1YnNlcXVlbnQgb25lcyBhcmUKLWFiYnJldmlhdGVkIGFuZCByZWx5IG9uIHRoZSB0YWJsZXMgbG9hZGVkIGJ5IHRoZSBmaXJzdCBpbWFnZS4gIEl0IGlzIGFzc3VtZWQKLXRoYXQgb25jZSB0aGUgZGVjb2RlciBoYXMgcmVhZCBhIHRhYmxlLCBpdCB3aWxsIHJlbWVtYmVyIHRoYXQgdGFibGUgdW50aWwgYQotbmV3IGRlZmluaXRpb24gZm9yIHRoZSBzYW1lIHRhYmxlIG51bWJlciBpcyBlbmNvdW50ZXJlZC4KLQotSXQgaXMgdGhlIGFwcGxpY2F0aW9uIGRlc2lnbmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmlndXJlIG91dCBob3cgdG8gYXNzb2NpYXRlCi10aGUgY29ycmVjdCB0YWJsZXMgd2l0aCBhbiBhYmJyZXZpYXRlZCBpbWFnZS4gIFdoaWxlIGFiYnJldmlhdGVkIGRhdGFzdHJlYW1zCi1jYW4gYmUgdXNlZnVsIGluIGEgY2xvc2VkIGVudmlyb25tZW50LCB0aGVpciB1c2UgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgaW4KLWFueSBzaXR1YXRpb24gd2hlcmUgZGF0YSBleGNoYW5nZSB3aXRoIG90aGVyIGFwcGxpY2F0aW9ucyBtaWdodCBiZSBuZWVkZWQuCi1DYXZlYXQgZGVzaWduZXIuCi0KLVRoZSBKUEVHIGxpYnJhcnkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBhbnkgY29tYmluYXRpb24gb2YKLXRhYmxlcy1vbmx5IGRhdGFzdHJlYW1zIGFuZCBhYmJyZXZpYXRlZCBpbWFnZXMuICBJbiBib3RoIGNvbXByZXNzaW9uIGFuZAotZGVjb21wcmVzc2lvbiBvYmplY3RzLCBhIHF1YW50aXphdGlvbiBvciBIdWZmbWFuIHRhYmxlIHdpbGwgYmUgcmV0YWluZWQgZm9yCi10aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdCwgdW5sZXNzIGl0IGlzIG92ZXJ3cml0dGVuIGJ5IGEgbmV3IHRhYmxlIGRlZmluaXRpb24uCi0KLQotVG8gY3JlYXRlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW1zLCBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byB0ZWxsIHRoZQotY29tcHJlc3NvciBub3QgdG8gZW1pdCBzb21lIG9yIGFsbCBvZiB0aGUgdGFibGVzIGl0IGlzIHVzaW5nLiAgRWFjaAotcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlIHN0cnVjdCBjb250YWlucyBhIGJvb2xlYW4gZmllbGQgInNlbnRfdGFibGUiLAotd2hpY2ggbm9ybWFsbHkgaXMgaW5pdGlhbGl6ZWQgdG8gRkFMU0UuICBGb3IgZWFjaCB0YWJsZSB1c2VkIGJ5IHRoZSBpbWFnZSwgdGhlCi1oZWFkZXItd3JpdGluZyBwcm9jZXNzIGVtaXRzIHRoZSB0YWJsZSBhbmQgc2V0cyBzZW50X3RhYmxlID0gVFJVRSB1bmxlc3MgaXQgaXMKLWFscmVhZHkgVFJVRS4gIChJbiBub3JtYWwgdXNhZ2UsIHRoaXMgcHJldmVudHMgb3V0cHV0dGluZyB0aGUgc2FtZSB0YWJsZQotZGVmaW5pdGlvbiBtdWx0aXBsZSB0aW1lcywgYXMgd291bGQgb3RoZXJ3aXNlIG9jY3VyIGJlY2F1c2UgdGhlIGNocm9tYQotY29tcG9uZW50cyB0eXBpY2FsbHkgc2hhcmUgdGFibGVzLikgIFRodXMsIHNldHRpbmcgdGhpcyBmaWVsZCB0byBUUlVFIGJlZm9yZQotY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgd2lsbCBwcmV2ZW50IHRoZSB0YWJsZSBmcm9tIGJlaW5nIHdyaXR0ZW4gYXQKLWFsbC4KLQotSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgInB1cmUiIGFiYnJldmlhdGVkIGltYWdlIGZpbGUgY29udGFpbmluZyBubyB0YWJsZXMsCi1qdXN0IGNhbGwgImpwZWdfc3VwcHJlc3NfdGFibGVzKCZjaW5mbywgVFJVRSkiIGFmdGVyIGNvbnN0cnVjdGluZyBhbGwgdGhlCi10YWJsZXMuICBJZiB5b3Ugd2FudCB0byBlbWl0IHNvbWUgYnV0IG5vdCBhbGwgdGFibGVzLCB5b3UnbGwgbmVlZCB0byBzZXQgdGhlCi1pbmRpdmlkdWFsIHNlbnRfdGFibGUgZmllbGRzIGRpcmVjdGx5LgotCi1UbyBjcmVhdGUgYW4gYWJicmV2aWF0ZWQgaW1hZ2UsIHlvdSBtdXN0IGFsc28gY2FsbCBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKLXdpdGggYSBzZWNvbmQgcGFyYW1ldGVyIG9mIEZBTFNFLCBub3QgVFJVRS4gIE90aGVyd2lzZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKLXdpbGwgZm9yY2UgYWxsIHRoZSBzZW50X3RhYmxlIGZpZWxkcyB0byBGQUxTRS4gIChUaGlzIGlzIGEgc2FmZXR5IGZlYXR1cmUgdG8KLXByZXZlbnQgYWJicmV2aWF0ZWQgaW1hZ2VzIGZyb20gYmVpbmcgY3JlYXRlZCBhY2NpZGVudGFsbHkuKQotCi1UbyBjcmVhdGUgYSB0YWJsZXMtb25seSBmaWxlLCBwZXJmb3JtIHRoZSBzYW1lIHBhcmFtZXRlciBzZXR1cCB0aGF0IHlvdQotbm9ybWFsbHkgd291bGQsIGJ1dCBpbnN0ZWFkIG9mIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBzbyBvbiwgY2FsbAotanBlZ193cml0ZV90YWJsZXMoJmNpbmZvKS4gIFRoaXMgd2lsbCB3cml0ZSBhbiBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtCi1jb250YWluaW5nIG9ubHkgU09JLCBEUVQgYW5kL29yIERIVCBtYXJrZXJzLCBhbmQgRU9JLiAgQWxsIHRoZSBxdWFudGl6YXRpb24KLWFuZCBIdWZmbWFuIHRhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHdpbGwKLWJlIGVtaXR0ZWQgdW5sZXNzIHRoZWlyIHNlbnRfdGFibGVzIGZsYWcgaXMgYWxyZWFkeSBUUlVFLCBhbmQgdGhlbiBhbGwgdGhlCi1zZW50X3RhYmxlcyBmbGFncyB3aWxsIGJlIHNldCBUUlVFLgotCi1BIHN1cmUtZmlyZSB3YXkgdG8gY3JlYXRlIG1hdGNoaW5nIHRhYmxlcy1vbmx5IGFuZCBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlcwotaXMgdG8gcHJvY2VlZCBhcyBmb2xsb3dzOgotCi0JY3JlYXRlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0Jc2V0IEpQRUcgcGFyYW1ldGVycwotCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZXMtb25seSBmaWxlCi0JanBlZ193cml0ZV90YWJsZXMoJmNpbmZvKTsKLQlzZXQgZGVzdGluYXRpb24gdG8gaW1hZ2UgZmlsZQotCWpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBGQUxTRSk7Ci0Jd3JpdGUgZGF0YS4uLgotCWpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7Ci0KLVNpbmNlIHRoZSBKUEVHIHBhcmFtZXRlcnMgYXJlIG5vdCBhbHRlcmVkIGJldHdlZW4gd3JpdGluZyB0aGUgdGFibGUgZmlsZSBhbmQKLXRoZSBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlLCB0aGUgc2FtZSB0YWJsZXMgYXJlIHN1cmUgdG8gYmUgdXNlZC4gIE9mIGNvdXJzZSwKLXlvdSBjYW4gcmVwZWF0IHRoZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgLi4uIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgc2VxdWVuY2UKLW1hbnkgdGltZXMgdG8gcHJvZHVjZSBtYW55IGFiYnJldmlhdGVkIGltYWdlIGZpbGVzIG1hdGNoaW5nIHRoZSB0YWJsZSBmaWxlLgotCi1Zb3UgY2Fubm90IHN1cHByZXNzIG91dHB1dCBvZiB0aGUgY29tcHV0ZWQgSHVmZm1hbiB0YWJsZXMgd2hlbiBIdWZmbWFuCi1vcHRpbWl6YXRpb24gaXMgc2VsZWN0ZWQuICAoSWYgeW91IGNvdWxkLCB0aGVyZSdkIGJlIG5vIHdheSB0byBkZWNvZGUgdGhlCi1pbWFnZS4uLikgIEdlbmVyYWxseSwgeW91IGRvbid0IHdhbnQgdG8gc2V0IG9wdGltaXplX2NvZGluZyA9IFRSVUUgd2hlbgoteW91IGFyZSB0cnlpbmcgdG8gcHJvZHVjZSBhYmJyZXZpYXRlZCBmaWxlcy4KLQotSW4gc29tZSBjYXNlcyB5b3UgbWlnaHQgd2FudCB0byBjb21wcmVzcyBhbiBpbWFnZSB1c2luZyB0YWJsZXMgd2hpY2ggYXJlCi1ub3Qgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiwgYnV0IGFyZSBkZWZpbmVkIGluIGFuIGludGVyY2hhbmdlIG9yCi10YWJsZXMtb25seSBmaWxlIHJlYWRhYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB1cAotYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHJlYWQgdGhlIHNwZWNpZmljYXRpb24gZmlsZSwgdGhlbiBjb3B5aW5nIHRoZQotdGFibGVzIGludG8geW91ciBjb21wcmVzc2lvbiBvYmplY3QuICBTZWUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKQotZm9yIGFuIGV4YW1wbGUgb2YgY29weWluZyBxdWFudGl6YXRpb24gdGFibGVzLgotCi0KLVRvIHJlYWQgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZXMsIHlvdSBzaW1wbHkgbmVlZCB0byBsb2FkIHRoZSBwcm9wZXIgdGFibGVzCi1pbnRvIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlLgotSWYgdGhlIHByb3BlciB0YWJsZXMgYXJlIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSwgeW91IGNhbiBqdXN0Ci1hbGxvY2F0ZSB0aGUgdGFibGUgc3RydWN0cyBhbmQgZmlsbCBpbiB0aGVpciBjb250ZW50cyBkaXJlY3RseS4gIEZvciBleGFtcGxlLAotdG8gbG9hZCBhIGZpeGVkIHF1YW50aXphdGlvbiB0YWJsZSBpbnRvIHRhYmxlIHNsb3QgIm4iOgotCi0gICAgaWYgKGNpbmZvLnF1YW50X3RibF9wdHJzW25dID09IE5VTEwpCi0gICAgICBjaW5mby5xdWFudF90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSAgICBxdWFudF9wdHIgPSBjaW5mby5xdWFudF90YmxfcHRyc1tuXTsJLyogcXVhbnRfcHRyIGlzIEpRVUFOVF9UQkwqICovCi0gICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLSAgICAgIC8qIFF0YWJsZVtdIGlzIGRlc2lyZWQgcXVhbnRpemF0aW9uIHRhYmxlLCBpbiBuYXR1cmFsIGFycmF5IG9yZGVyICovCi0gICAgICBxdWFudF9wdHItPnF1YW50dmFsW2ldID0gUXRhYmxlW2ldOwotICAgIH0KLQotQ29kZSB0byBsb2FkIGEgZml4ZWQgSHVmZm1hbiB0YWJsZSBpcyB0eXBpY2FsbHkgKGZvciBBQyB0YWJsZSAibiIpOgotCi0gICAgaWYgKGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl0gPT0gTlVMTCkKLSAgICAgIGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKLSAgICBodWZmX3B0ciA9IGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl07CS8qIGh1ZmZfcHRyIGlzIEpIVUZGX1RCTCogKi8KLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKLSAgICAgIC8qIGNvdW50c1tpXSBpcyBudW1iZXIgb2YgSHVmZm1hbiBjb2RlcyBvZiBsZW5ndGggaSBiaXRzLCBpPTEuLjE2ICovCi0gICAgICBodWZmX3B0ci0+Yml0c1tpXSA9IGNvdW50c1tpXTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAvKiBzeW1ib2xzW10gaXMgdGhlIGxpc3Qgb2YgSHVmZm1hbiBzeW1ib2xzLCBpbiBjb2RlLWxlbmd0aCBvcmRlciAqLwotICAgICAgaHVmZl9wdHItPmh1ZmZ2YWxbaV0gPSBzeW1ib2xzW2ldOwotICAgIH0KLQotKE5vdGUgdGhhdCB0cnlpbmcgdG8gc2V0IGNpbmZvLnF1YW50X3RibF9wdHJzW25dIHRvIHBvaW50IGRpcmVjdGx5IGF0IGEKLWNvbnN0YW50IEpRVUFOVF9UQkwgb2JqZWN0IGlzIG5vdCBzYWZlLiAgSWYgdGhlIGluY29taW5nIGZpbGUgaGFwcGVuZWQgdG8KLWNvbnRhaW4gYSBxdWFudGl6YXRpb24gdGFibGUgZGVmaW5pdGlvbiwgeW91ciBtYXN0ZXIgdGFibGUgd291bGQgZ2V0Ci1vdmVyd3JpdHRlbiEgIEluc3RlYWQgYWxsb2NhdGUgYSB3b3JraW5nIHRhYmxlIGNvcHkgYW5kIGNvcHkgdGhlIG1hc3RlciB0YWJsZQotaW50byBpdCwgYXMgaWxsdXN0cmF0ZWQgYWJvdmUuICBEaXR0byBmb3IgSHVmZm1hbiB0YWJsZXMsIG9mIGNvdXJzZS4pCi0KLVlvdSBtaWdodCB3YW50IHRvIHJlYWQgdGhlIHRhYmxlcyBmcm9tIGEgdGFibGVzLW9ubHkgZmlsZSwgcmF0aGVyIHRoYW4KLWhhcmQtd2lyaW5nIHRoZW0gaW50byB5b3VyIGFwcGxpY2F0aW9uLiAgVGhlIGpwZWdfcmVhZF9oZWFkZXIoKSBjYWxsIGlzCi1zdWZmaWNpZW50IHRvIHJlYWQgYSB0YWJsZXMtb25seSBmaWxlLiAgWW91IG11c3QgcGFzcyBhIHNlY29uZCBwYXJhbWV0ZXIgb2YKLUZBTFNFIHRvIGluZGljYXRlIHRoYXQgeW91IGRvIG5vdCByZXF1aXJlIGFuIGltYWdlIHRvIGJlIHByZXNlbnQuICBUaHVzLCB0aGUKLXR5cGljYWwgc2NlbmFyaW8gaXMKLQotCWNyZWF0ZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0Ci0Jc2V0IHNvdXJjZSB0byB0YWJsZXMtb25seSBmaWxlCi0JanBlZ19yZWFkX2hlYWRlcigmY2luZm8sIEZBTFNFKTsKLQlzZXQgc291cmNlIHRvIGFiYnJldmlhdGVkIGltYWdlIGZpbGUKLQlqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0Jc2V0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycwotCWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOwotCXJlYWQgZGF0YS4uLgotCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKLQotSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIHJlYWQgYSBmaWxlIHdpdGhvdXQga25vd2luZyB3aGV0aGVyIGl0IGNvbnRhaW5zCi1hbiBpbWFnZSBvciBqdXN0IHRhYmxlcy4gIEluIHRoYXQgY2FzZSwgcGFzcyBGQUxTRSBhbmQgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQotZnJvbSBqcGVnX3JlYWRfaGVhZGVyKCk6IGl0IHdpbGwgYmUgSlBFR19IRUFERVJfT0sgaWYgYW4gaW1hZ2Ugd2FzIGZvdW5kLAotSlBFR19IRUFERVJfVEFCTEVTX09OTFkgaWYgb25seSB0YWJsZXMgd2VyZSBmb3VuZC4gIChBIHRoaXJkIHJldHVybiB2YWx1ZSwKLUpQRUdfU1VTUEVOREVELCBpcyBwb3NzaWJsZSB3aGVuIHVzaW5nIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBtYW5hZ2VyLikKLU5vdGUgdGhhdCBqcGVnX3JlYWRfaGVhZGVyKCkgd2lsbCBub3QgY29tcGxhaW4gaWYgeW91IHJlYWQgYW4gYWJicmV2aWF0ZWQKLWltYWdlIGZvciB3aGljaCB5b3UgaGF2ZW4ndCBsb2FkZWQgdGhlIG1pc3NpbmcgdGFibGVzOyB0aGUgbWlzc2luZy10YWJsZSBjaGVjawotb2NjdXJzIGxhdGVyLCBpbiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLQotCi1JdCBpcyBwb3NzaWJsZSB0byByZWFkIGEgc2VyaWVzIG9mIGltYWdlcyBmcm9tIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGJ5Ci1yZXBlYXRpbmcgdGhlIGpwZWdfcmVhZF9oZWFkZXIoKSAuLi4ganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHNlcXVlbmNlLAotd2l0aG91dCByZWxlYXNpbmcvcmVjcmVhdGluZyB0aGUgSlBFRyBvYmplY3Qgb3IgdGhlIGRhdGEgc291cmNlIG1vZHVsZS4KLShJZiB5b3UgZGlkIHJlaW5pdGlhbGl6ZSwgYW55IHBhcnRpYWwgYnVmZmVybG9hZCBsZWZ0IGluIHRoZSBkYXRhIHNvdXJjZQotYnVmZmVyIGF0IHRoZSBlbmQgb2Ygb25lIGltYWdlIHdvdWxkIGJlIGRpc2NhcmRlZCwgY2F1c2luZyB5b3UgdG8gbG9zZSB0aGUKLXN0YXJ0IG9mIHRoZSBuZXh0IGltYWdlLikgIFdoZW4geW91IHVzZSB0aGlzIG1ldGhvZCwgc3RvcmVkIHRhYmxlcyBhcmUKLWF1dG9tYXRpY2FsbHkgY2FycmllZCBmb3J3YXJkLCBzbyBzb21lIG9mIHRoZSBpbWFnZXMgY2FuIGJlIGFiYnJldmlhdGVkIGltYWdlcwotdGhhdCBkZXBlbmQgb24gdGFibGVzIGZyb20gZWFybGllciBpbWFnZXMuCi0KLUlmIHlvdSBpbnRlbmQgdG8gd3JpdGUgYSBzZXJpZXMgb2YgaW1hZ2VzIGludG8gYSBzaW5nbGUgZGVzdGluYXRpb24gZmlsZSwKLXlvdSBtaWdodCB3YW50IHRvIG1ha2UgYSBzcGVjaWFsaXplZCBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSB0aGF0IGRvZXNuJ3QKLWZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGF0IHRlcm1fZGVzdGluYXRpb24oKSB0aW1lLiAgVGhpcyB3b3VsZCBzcGVlZCB0aGluZ3MKLXVwIGJ5IHNvbWUgdHJpZmxpbmcgYW1vdW50LiAgT2YgY291cnNlLCB5b3UnZCBuZWVkIHRvIHJlbWVtYmVyIHRvIGZsdXNoIHRoZQotYnVmZmVyIGFmdGVyIHRoZSBsYXN0IGltYWdlLiAgWW91IGNhbiBtYWtlIHRoZSBsYXRlciBpbWFnZXMgYmUgYWJicmV2aWF0ZWQKLW9uZXMgYnkgcGFzc2luZyBGQUxTRSB0byBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuCi0KLQotU3BlY2lhbCBtYXJrZXJzCi0tLS0tLS0tLS0tLS0tLS0KLQotU29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zZXJ0IG9yIGV4dHJhY3Qgc3BlY2lhbCBkYXRhIGluIHRoZSBKUEVHCi1kYXRhc3RyZWFtLiAgVGhlIEpQRUcgc3RhbmRhcmQgcHJvdmlkZXMgbWFya2VyIHR5cGVzICJDT00iIChjb21tZW50KSBhbmQKLSJBUFAwIiB0aHJvdWdoICJBUFAxNSIgKGFwcGxpY2F0aW9uKSB0byBob2xkIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuCi1VbmZvcnR1bmF0ZWx5LCB0aGUgdXNlIG9mIHRoZXNlIG1hcmtlcnMgaXMgbm90IHNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuCi1DT00gbWFya2VycyBhcmUgZmFpcmx5IHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0LiAgVGhlIEpGSUYgZmlsZQotZm9ybWF0IHNwZWMgdXNlcyBBUFAwIG1hcmtlcnMgd2l0aCBzcGVjaWZpZWQgaW5pdGlhbCBzdHJpbmdzIHRvIGhvbGQgY2VydGFpbgotZGF0YS4gIEFkb2JlIGFwcGxpY2F0aW9ucyB1c2UgQVBQMTQgbWFya2VycyBiZWdpbm5pbmcgd2l0aCB0aGUgc3RyaW5nICJBZG9iZSIKLWZvciBtaXNjZWxsYW5lb3VzIGRhdGEuICBPdGhlciBBUFBuIG1hcmtlcnMgYXJlIHJhcmVseSBzZWVuLCBidXQgbWlnaHQKLWNvbnRhaW4gYWxtb3N0IGFueXRoaW5nLgotCi1JZiB5b3Ugd2lzaCB0byBzdG9yZSB1c2VyLXN1cHBsaWVkIHRleHQsIHdlIHJlY29tbWVuZCB5b3UgdXNlIENPTSBtYXJrZXJzCi1hbmQgcGxhY2UgcmVhZGFibGUgNy1iaXQgQVNDSUkgdGV4dCBpbiB0aGVtLiAgTmV3bGluZSBjb252ZW50aW9ucyBhcmUgbm90Ci1zdGFuZGFyZGl6ZWQgLS0tIGV4cGVjdCB0byBmaW5kIExGIChVbml4IHN0eWxlKSwgQ1IvTEYgKERPUyBzdHlsZSksIG9yIENSCi0oTWFjIHN0eWxlKS4gIEEgcm9idXN0IENPTSByZWFkZXIgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIHJhbmRvbSBiaW5hcnkKLWdhcmJhZ2UsIGluY2x1ZGluZyBudWxscywgc2luY2Ugc29tZSBhcHBsaWNhdGlvbnMgZ2VuZXJhdGUgQ09NIG1hcmtlcnMKLWNvbnRhaW5pbmcgbm9uLUFTQ0lJIGp1bmsuICAoQnV0IHlvdXJzIHNob3VsZCBub3QgYmUgb25lIG9mIHRoZW0uKQotCi1Gb3IgcHJvZ3JhbS1zdXBwbGllZCBkYXRhLCB1c2UgYW4gQVBQbiBtYXJrZXIsIGFuZCBiZSBzdXJlIHRvIGJlZ2luIGl0IHdpdGggYW4KLWlkZW50aWZ5aW5nIHN0cmluZyBzbyB0aGF0IHlvdSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBtYXJrZXIgaXMgYWN0dWFsbHkgeW91cnMuCi1JdCdzIHByb2JhYmx5IGJlc3QgdG8gYXZvaWQgdXNpbmcgQVBQMCBvciBBUFAxNCBmb3IgYW55IHByaXZhdGUgbWFya2Vycy4KLShOT1RFOiB0aGUgdXBjb21pbmcgU1BJRkYgc3RhbmRhcmQgd2lsbCB1c2UgQVBQOCBtYXJrZXJzOyB3ZSByZWNvbW1lbmQgeW91Ci1ub3QgdXNlIEFQUDggbWFya2VycyBmb3IgYW55IHByaXZhdGUgcHVycG9zZXMsIGVpdGhlci4pCi0KLUtlZXAgaW4gbWluZCB0aGF0IGF0IG1vc3QgNjU1MzMgYnl0ZXMgY2FuIGJlIHB1dCBpbnRvIG9uZSBtYXJrZXIsIGJ1dCB5b3UKLWNhbiBoYXZlIGFzIG1hbnkgbWFya2VycyBhcyB5b3UgbGlrZS4KLQotQnkgZGVmYXVsdCwgdGhlIElKRyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgd3JpdGUgYSBKRklGIEFQUDAgbWFya2VyIGlmIHRoZQotc2VsZWN0ZWQgSlBFRyBjb2xvcnNwYWNlIGlzIGdyYXlzY2FsZSBvciBZQ2JDciwgb3IgYW4gQWRvYmUgQVBQMTQgbWFya2VyIGlmCi10aGUgc2VsZWN0ZWQgY29sb3JzcGFjZSBpcyBSR0IsIENNWUssIG9yIFlDQ0suICBZb3UgY2FuIGRpc2FibGUgdGhpcywgYnV0Ci13ZSBkb24ndCByZWNvbW1lbmQgaXQuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgcmVjb2duaXplIEpGSUYgYW5kCi1BZG9iZSBtYXJrZXJzIGFuZCB3aWxsIHNldCB0aGUgSlBFRyBjb2xvcnNwYWNlIHByb3Blcmx5IHdoZW4gb25lIGlzIGZvdW5kLgotCi0KLVlvdSBjYW4gd3JpdGUgc3BlY2lhbCBtYXJrZXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgYnkKLWNhbGxpbmcganBlZ193cml0ZV9tYXJrZXIoKSBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QKLWNhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKS4gIFdoZW4geW91IGRvIHRoaXMsIHRoZSBtYXJrZXJzIGFwcGVhciBhZnRlcgotdGhlIFNPSSBhbmQgdGhlIEpGSUYgQVBQMCBhbmQgQWRvYmUgQVBQMTQgbWFya2VycyAoaWYgd3JpdHRlbiksIGJ1dCBiZWZvcmUKLWFsbCBlbHNlLiAgU3BlY2lmeSB0aGUgbWFya2VyIHR5cGUgcGFyYW1ldGVyIGFzICJKUEVHX0NPTSIgZm9yIENPTSBvcgotIkpQRUdfQVBQMCArIG4iIGZvciBBUFBuLiAgKEFjdHVhbGx5LCBqcGVnX3dyaXRlX21hcmtlciB3aWxsIGxldCB5b3Ugd3JpdGUKLWFueSBtYXJrZXIgdHlwZSwgYnV0IHdlIGRvbid0IHJlY29tbWVuZCB3cml0aW5nIGFueSBvdGhlciBraW5kcyBvZiBtYXJrZXIuKQotRm9yIGV4YW1wbGUsIHRvIHdyaXRlIGEgdXNlciBjb21tZW50IHN0cmluZyBwb2ludGVkIHRvIGJ5IGNvbW1lbnRfdGV4dDoKLQlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19DT00sIGNvbW1lbnRfdGV4dCwgc3RybGVuKGNvbW1lbnRfdGV4dCkpOwotCi1JZiBpdCdzIG5vdCBjb252ZW5pZW50IHRvIHN0b3JlIGFsbCB0aGUgbWFya2VyIGRhdGEgaW4gbWVtb3J5IGF0IG9uY2UsCi15b3UgY2FuIGluc3RlYWQgY2FsbCBqcGVnX3dyaXRlX21faGVhZGVyKCkgZm9sbG93ZWQgYnkgbXVsdGlwbGUgY2FsbHMgdG8KLWpwZWdfd3JpdGVfbV9ieXRlKCkuICBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIGl0J3MgeW91ciByZXNwb25zaWJpbGl0eSB0bwotY2FsbCBqcGVnX3dyaXRlX21fYnl0ZSgpIGV4YWN0bHkgdGhlIG51bWJlciBvZiB0aW1lcyBnaXZlbiBpbiB0aGUgbGVuZ3RoCi1wYXJhbWV0ZXIgdG8ganBlZ193cml0ZV9tX2hlYWRlcigpLiAgKFRoaXMgbWV0aG9kIGxldHMgeW91IGVtcHR5IHRoZQotb3V0cHV0IGJ1ZmZlciBwYXJ0d2F5IHRocm91Z2ggYSBtYXJrZXIsIHdoaWNoIG1pZ2h0IGJlIGltcG9ydGFudCB3aGVuCi11c2luZyBhIHN1c3BlbmRpbmcgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUuICBJbiBhbnkgY2FzZSwgaWYgeW91IGFyZSB1c2luZwotYSBzdXNwZW5kaW5nIGRlc3RpbmF0aW9uLCB5b3Ugc2hvdWxkIGZsdXNoIGl0cyBidWZmZXIgYWZ0ZXIgaW5zZXJ0aW5nCi1hbnkgc3BlY2lhbCBtYXJrZXJzLiAgU2VlICJJL08gc3VzcGVuc2lvbiIuKQotCi1PciwgaWYgeW91IHByZWZlciB0byBzeW50aGVzaXplIHRoZSBtYXJrZXIgYnl0ZSBzZXF1ZW5jZSB5b3Vyc2VsZiwKLXlvdSBjYW4ganVzdCBjcmFtIGl0IHN0cmFpZ2h0IGludG8gdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlLgotCi1JZiB5b3UgYXJlIHdyaXRpbmcgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzICh0aHVtYm5haWwgaW1hZ2VzKSwgZG9uJ3QKLWZvcmdldCB0byBzZXQgY2luZm8uSkZJRl9taW5vcl92ZXJzaW9uID0gMiBzbyB0aGF0IHRoZSBlbmNvZGVyIHdpbGwgd3JpdGUgdGhlCi1jb3JyZWN0IEpGSUYgdmVyc2lvbiBudW1iZXIgaW4gdGhlIEpGSUYgaGVhZGVyIG1hcmtlci4gIFRoZSBsaWJyYXJ5J3MgZGVmYXVsdAotaXMgdG8gd3JpdGUgdmVyc2lvbiAxLjAxLCBidXQgdGhhdCdzIHdyb25nIGlmIHlvdSBpbnNlcnQgYW55IDEuMDIgZXh0ZW5zaW9uCi1tYXJrZXJzLiAgKFdlIGNvdWxkIHByb2JhYmx5IGdldCBhd2F5IHdpdGgganVzdCBkZWZhdWx0aW5nIHRvIDEuMDIsIGJ1dCB0aGVyZQotdXNlZCB0byBiZSBicm9rZW4gZGVjb2RlcnMgdGhhdCB3b3VsZCBjb21wbGFpbiBhYm91dCB1bmtub3duIG1pbm9yIHZlcnNpb24KLW51bWJlcnMuICBUbyByZWR1Y2UgY29tcGF0aWJpbGl0eSByaXNrcyBpdCdzIHNhZmVzdCBub3QgdG8gd3JpdGUgMS4wMiB1bmxlc3MKLXlvdSBhcmUgYWN0dWFsbHkgdXNpbmcgMS4wMiBleHRlbnNpb25zLikKLQotCi1XaGVuIHJlYWRpbmcsIHR3byBtZXRob2RzIG9mIGhhbmRsaW5nIHNwZWNpYWwgbWFya2VycyBhcmUgYXZhaWxhYmxlOgotMS4gWW91IGNhbiBhc2sgdGhlIGxpYnJhcnkgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgQ09NIGFuZC9vciBBUFBuIG1hcmtlcnMKLWludG8gbWVtb3J5LCBhbmQgdGhlbiBleGFtaW5lIHRoZW0gYXQgeW91ciBsZWlzdXJlIGFmdGVyd2FyZHMuCi0yLiBZb3UgY2FuIHN1cHBseSB5b3VyIG93biByb3V0aW5lIHRvIHByb2Nlc3MgQ09NIGFuZC9vciBBUFBuIG1hcmtlcnMKLW9uLXRoZS1mbHkgYXMgdGhleSBhcmUgcmVhZC4KLVRoZSBmaXJzdCBtZXRob2QgaXMgc2ltcGxlciB0byB1c2UsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBhIHN1c3BlbmRpbmcKLWRhdGEgc291cmNlOyB3cml0aW5nIGEgbWFya2VyIHByb2Nlc3NvciB0aGF0IGNvcGVzIHdpdGggaW5wdXQgc3VzcGVuc2lvbiBpcwotbm90IGVhc3kgKGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiB0aGUgbWFya2VyIGlzIGxvbmdlciB0aGFuIHlvdXIgYXZhaWxhYmxlCi1pbnB1dCBidWZmZXIpLiAgSG93ZXZlciwgdGhlIHNlY29uZCBtZXRob2QgY29uc2VydmVzIG1lbW9yeSBzaW5jZSB0aGUgbWFya2VyCi1kYXRhIG5lZWQgbm90IGJlIGtlcHQgYXJvdW5kIGFmdGVyIGl0J3MgYmVlbiBwcm9jZXNzZWQuCi0KLUZvciBlaXRoZXIgbWV0aG9kLCB5b3UnZCBub3JtYWxseSBzZXQgdXAgbWFya2VyIGhhbmRsaW5nIGFmdGVyIGNyZWF0aW5nIGEKLWRlY29tcHJlc3Npb24gb2JqZWN0IGFuZCBiZWZvcmUgY2FsbGluZyBqcGVnX3JlYWRfaGVhZGVyKCksIGJlY2F1c2UgdGhlCi1tYXJrZXJzIG9mIGludGVyZXN0IHdpbGwgdHlwaWNhbGx5IGJlIG5lYXIgdGhlIGhlYWQgb2YgdGhlIGZpbGUgYW5kIHNvIHdpbGwKLWJlIHNjYW5uZWQgYnkganBlZ19yZWFkX2hlYWRlci4gIE9uY2UgeW91J3ZlIGVzdGFibGlzaGVkIGEgbWFya2VyIGhhbmRsaW5nCi1tZXRob2QsIGl0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGxpZmUgb2YgdGhhdCBkZWNvbXByZXNzaW9uIG9iamVjdAotKHBvdGVudGlhbGx5IG1hbnkgZGF0YXN0cmVhbXMpLCB1bmxlc3MgeW91IGNoYW5nZSBpdC4gIE1hcmtlciBoYW5kbGluZyBpcwotZGV0ZXJtaW5lZCBzZXBhcmF0ZWx5IGZvciBDT00gbWFya2VycyBhbmQgZm9yIGVhY2ggQVBQbiBtYXJrZXIgY29kZS4KLQotCi1UbyBzYXZlIHRoZSBjb250ZW50cyBvZiBzcGVjaWFsIG1hcmtlcnMgaW4gbWVtb3J5LCBjYWxsCi0JanBlZ19zYXZlX21hcmtlcnMoY2luZm8sIG1hcmtlcl9jb2RlLCBsZW5ndGhfbGltaXQpCi13aGVyZSBtYXJrZXJfY29kZSBpcyB0aGUgbWFya2VyIHR5cGUgdG8gc2F2ZSwgSlBFR19DT00gb3IgSlBFR19BUFAwK24uCi0oVG8gYXJyYW5nZSB0byBzYXZlIGFsbCB0aGUgc3BlY2lhbCBtYXJrZXIgdHlwZXMsIHlvdSBuZWVkIHRvIGNhbGwgdGhpcwotcm91dGluZSAxNyB0aW1lcywgZm9yIENPTSBhbmQgQVBQMC1BUFAxNS4pICBJZiB0aGUgaW5jb21pbmcgbWFya2VyIGlzIGxvbmdlcgotdGhhbiBsZW5ndGhfbGltaXQgZGF0YSBieXRlcywgb25seSBsZW5ndGhfbGltaXQgYnl0ZXMgd2lsbCBiZSBzYXZlZDsgdGhpcwotcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gYXZvaWQgY2hld2luZyB1cCBtZW1vcnkgd2hlbiB5b3Ugb25seSBuZWVkIHRvIHNlZSB0aGUKLWZpcnN0IGZldyBieXRlcyBvZiBhIHBvdGVudGlhbGx5IGxhcmdlIG1hcmtlci4gIElmIHlvdSB3YW50IHRvIHNhdmUgYWxsIHRoZQotZGF0YSwgc2V0IGxlbmd0aF9saW1pdCB0byAweEZGRkY7IHRoYXQgaXMgZW5vdWdoIHNpbmNlIG1hcmtlciBsZW5ndGhzIGFyZSBvbmx5Ci0xNiBiaXRzLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHNldHRpbmcgbGVuZ3RoX2xpbWl0IHRvIDAgcHJldmVudHMgdGhhdCBtYXJrZXIKLXR5cGUgZnJvbSBiZWluZyBzYXZlZCBhdCBhbGwuICAoVGhhdCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaW4gZmFjdC4pCi0KLUFmdGVyIGpwZWdfcmVhZF9oZWFkZXIoKSBjb21wbGV0ZXMsIHlvdSBjYW4gZXhhbWluZSB0aGUgc3BlY2lhbCBtYXJrZXJzIGJ5Ci1mb2xsb3dpbmcgdGhlIGNpbmZvLT5tYXJrZXJfbGlzdCBwb2ludGVyIGNoYWluLiAgQWxsIHRoZSBzcGVjaWFsIG1hcmtlcnMgaW4KLXRoZSBmaWxlIGFwcGVhciBpbiB0aGlzIGxpc3QsIGluIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGZpbGUgKGJ1dAotb21pdHRpbmcgYW55IG1hcmtlcnMgb2YgdHlwZXMgeW91IGRpZG4ndCBhc2sgZm9yKS4gIEJvdGggdGhlIG9yaWdpbmFsIGRhdGEKLWxlbmd0aCBhbmQgdGhlIHNhdmVkIGRhdGEgbGVuZ3RoIGFyZSByZWNvcmRlZCBmb3IgZWFjaCBsaXN0IGVudHJ5OyB0aGUgbGF0dGVyCi13aWxsIG5vdCBleGNlZWQgbGVuZ3RoX2xpbWl0IGZvciB0aGUgcGFydGljdWxhciBtYXJrZXIgdHlwZS4gIE5vdGUgdGhhdCB0aGVzZQotbGVuZ3RocyBleGNsdWRlIHRoZSBtYXJrZXIgbGVuZ3RoIHdvcmQsIHdoZXJlYXMgdGhlIHN0b3JlZCByZXByZXNlbnRhdGlvbgotd2l0aGluIHRoZSBKUEVHIGZpbGUgaW5jbHVkZXMgaXQuICAoSGVuY2UgdGhlIG1heGltdW0gZGF0YSBsZW5ndGggaXMgcmVhbGx5Ci1vbmx5IDY1NTMzLikKLQotSXQgaXMgcG9zc2libGUgdGhhdCBhZGRpdGlvbmFsIHNwZWNpYWwgbWFya2VycyBhcHBlYXIgaW4gdGhlIGZpbGUgYmV5b25kIHRoZQotU09TIG1hcmtlciBhdCB3aGljaCBqcGVnX3JlYWRfaGVhZGVyIHN0b3BzOyBpZiBzbywgdGhlIG1hcmtlciBsaXN0IHdpbGwgYmUKLWV4dGVuZGVkIGR1cmluZyByZWFkaW5nIG9mIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gYmUKLWNvbW1vbiwgaG93ZXZlci4gIElmIHlvdSBhcmUgc2hvcnQgb24gbWVtb3J5IHlvdSBtYXkgd2FudCB0byByZXNldCB0aGUgbGVuZ3RoCi1saW1pdCB0byB6ZXJvIGZvciBhbGwgbWFya2VyIHR5cGVzIGFmdGVyIGZpbmlzaGluZyBqcGVnX3JlYWRfaGVhZGVyLCB0bwotZW5zdXJlIHRoYXQgdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcgY2Fubm90IGJlIGV4Y2VlZGVkIGR1ZSB0byBhZGRpdGlvbgotb2YgbGF0ZXIgbWFya2Vycy4KLQotVGhlIG1hcmtlciBsaXN0IHJlbWFpbnMgc3RvcmVkIHVudGlsIHlvdSBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3Mgb3IKLWpwZWdfYWJvcnQsIGF0IHdoaWNoIHBvaW50IHRoZSBtZW1vcnkgaXMgZnJlZWQgYW5kIHRoZSBsaXN0IGlzIHNldCB0byBlbXB0eS4KLShqcGVnX2Rlc3Ryb3kgYWxzbyByZWxlYXNlcyB0aGUgc3RvcmFnZSwgb2YgY291cnNlLikKLQotTm90ZSB0aGF0IHRoZSBsaWJyYXJ5IGlzIGludGVybmFsbHkgaW50ZXJlc3RlZCBpbiBBUFAwIGFuZCBBUFAxNCBtYXJrZXJzOwotaWYgeW91IHRyeSB0byBzZXQgYSBzbWFsbCBub256ZXJvIGxlbmd0aCBsaW1pdCBvbiB0aGVzZSB0eXBlcywgdGhlIGxpYnJhcnkKLXdpbGwgc2lsZW50bHkgZm9yY2UgdGhlIGxlbmd0aCB1cCB0byB0aGUgbWluaW11bSBpdCB3YW50cy4gIChCdXQgeW91IGNhbiBzZXQKLWEgemVybyBsZW5ndGggbGltaXQgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgc2F2ZWQgYXQgYWxsLikgIEFsc28sIGluIGEKLTE2LWJpdCBlbnZpcm9ubWVudCwgdGhlIG1heGltdW0gbGVuZ3RoIGxpbWl0IG1heSBiZSBjb25zdHJhaW5lZCB0byBsZXNzIHRoYW4KLTY1NTMzIGJ5IG1hbGxvYygpIGxpbWl0YXRpb25zLiAgSXQgaXMgdGhlcmVmb3JlIGJlc3Qgbm90IHRvIGFzc3VtZSB0aGF0IHRoZQotZWZmZWN0aXZlIGxlbmd0aCBsaW1pdCBpcyBleGFjdGx5IHdoYXQgeW91IHNldCBpdCB0byBiZS4KLQotCi1JZiB5b3Ugd2FudCB0byBzdXBwbHkgeW91ciBvd24gbWFya2VyLXJlYWRpbmcgcm91dGluZSwgeW91IGRvIGl0IGJ5IGNhbGxpbmcKLWpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoKS4gIEEgbWFya2VyIHByb2Nlc3NvciByb3V0aW5lIG11c3QgaGF2ZSB0aGUKLXNpZ25hdHVyZQotCWJvb2xlYW4ganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLUFsdGhvdWdoIHRoZSBtYXJrZXIgY29kZSBpcyBub3QgZXhwbGljaXRseSBwYXNzZWQsIHRoZSByb3V0aW5lIGNhbiBmaW5kIGl0Ci1pbiBjaW5mby0+dW5yZWFkX21hcmtlci4gIEF0IHRoZSB0aW1lIG9mIGNhbGwsIHRoZSBtYXJrZXIgcHJvcGVyIGhhcyBiZWVuCi1yZWFkIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZS4gIFRoZSBwcm9jZXNzb3Igcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IKLXJlYWRpbmcgdGhlIG1hcmtlciBsZW5ndGggd29yZCBhbmQgdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXIgYnl0ZXMsIGlmIGFueS4KLVJldHVybiBUUlVFIHRvIGluZGljYXRlIHN1Y2Nlc3MuICAoRkFMU0Ugc2hvdWxkIGJlIHJldHVybmVkIG9ubHkgaWYgeW91IGFyZQotdXNpbmcgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGFuZCBpdCB0ZWxscyB5b3UgdG8gc3VzcGVuZC4gIFNlZSB0aGUgc3RhbmRhcmQKLW1hcmtlciBwcm9jZXNzb3JzIGluIGpkbWFya2VyLmMgZm9yIGFwcHJvcHJpYXRlIGNvZGluZyBtZXRob2RzIGlmIHlvdSBuZWVkIHRvCi11c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLikKLQotSWYgeW91IG92ZXJyaWRlIHRoZSBkZWZhdWx0IEFQUDAgb3IgQVBQMTQgcHJvY2Vzc29ycywgaXQgaXMgdXAgdG8geW91IHRvCi1yZWNvZ25pemUgSkZJRiBhbmQgQWRvYmUgbWFya2VycyBpZiB5b3Ugd2FudCBjb2xvcnNwYWNlIHJlY29nbml0aW9uIHRvIG9jY3VyCi1wcm9wZXJseS4gIFdlIHJlY29tbWVuZCBjb3B5aW5nIGFuZCBleHRlbmRpbmcgdGhlIGRlZmF1bHQgcHJvY2Vzc29ycyBpZiB5b3UKLXdhbnQgdG8gZG8gdGhhdC4gIChBIGJldHRlciBpZGVhIGlzIHRvIHNhdmUgdGhlc2UgbWFya2VyIHR5cGVzIGZvciBsYXRlcgotZXhhbWluYXRpb24gYnkgY2FsbGluZyBqcGVnX3NhdmVfbWFya2VycygpOyB0aGF0IG1ldGhvZCBkb2Vzbid0IGludGVyZmVyZQotd2l0aCB0aGUgbGlicmFyeSdzIG93biBwcm9jZXNzaW5nIG9mIHRoZXNlIG1hcmtlcnMuKQotCi1qcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCkgYW5kIGpwZWdfc2F2ZV9tYXJrZXJzKCkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQotLS0tIGlmIHlvdSBjYWxsIG9uZSBpdCBvdmVycmlkZXMgYW55IHByZXZpb3VzIGNhbGwgdG8gdGhlIG90aGVyLCBmb3IgdGhlCi1wYXJ0aWN1bGFyIG1hcmtlciB0eXBlIHNwZWNpZmllZC4KLQotQSBzaW1wbGUgZXhhbXBsZSBvZiBhbiBleHRlcm5hbCBDT00gcHJvY2Vzc29yIGNhbiBiZSBmb3VuZCBpbiBkanBlZy5jLgotQWxzbywgc2VlIGpwZWd0cmFuLmMgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcganBlZ19zYXZlX21hcmtlcnMuCi0KLQotUmF3IChkb3duc2FtcGxlZCkgaW1hZ2UgZGF0YQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Tb21lIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHN1cHBseSBhbHJlYWR5LWRvd25zYW1wbGVkIGltYWdlIGRhdGEgdG8gdGhlIEpQRUcKLWNvbXByZXNzb3IsIG9yIHRvIHJlY2VpdmUgcmF3IGRvd25zYW1wbGVkIGRhdGEgZnJvbSB0aGUgZGVjb21wcmVzc29yLiAgVGhlCi1saWJyYXJ5IHN1cHBvcnRzIHRoaXMgcmVxdWlyZW1lbnQgYnkgYWxsb3dpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHdyaXRlIG9yCi1yZWFkIHJhdyBkYXRhLCBieXBhc3NpbmcgdGhlIG5vcm1hbCBwcmVwcm9jZXNzaW5nIG9yIHBvc3Rwcm9jZXNzaW5nIHN0ZXBzLgotVGhlIGludGVyZmFjZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3RhbmRhcmQgb25lIGFuZCBpcyBzb21ld2hhdCBoYXJkZXIgdG8KLXVzZS4gIElmIHlvdXIgaW50ZXJlc3QgaXMgbWVyZWx5IGluIGJ5cGFzc2luZyBjb2xvciBjb252ZXJzaW9uLCB3ZSByZWNvbW1lbmQKLXRoYXQgeW91IHVzZSB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlIGFuZCBzaW1wbHkgc2V0IGpwZWdfY29sb3Jfc3BhY2UgPQotaW5fY29sb3Jfc3BhY2UgKG9yIGpwZWdfY29sb3Jfc3BhY2UgPSBvdXRfY29sb3Jfc3BhY2UgZm9yIGRlY29tcHJlc3Npb24pLgotVGhlIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIHN1cHBseSBvcgotcmVjZWl2ZSBkb3duc2FtcGxlZCBpbWFnZSBkYXRhLCBpbiB3aGljaCBub3QgYWxsIGNvbXBvbmVudHMgaGF2ZSB0aGUgc2FtZQotZGltZW5zaW9ucy4KLQotCi1UbyBjb21wcmVzcyByYXcgZGF0YSwgeW91IG11c3Qgc3VwcGx5IHRoZSBkYXRhIGluIHRoZSBjb2xvcnNwYWNlIHRvIGJlIHVzZWQKLWluIHRoZSBKUEVHIGZpbGUgKHBsZWFzZSByZWFkIHRoZSBlYXJsaWVyIHNlY3Rpb24gb24gU3BlY2lhbCBjb2xvciBzcGFjZXMpCi1hbmQgZG93bnNhbXBsZWQgdG8gdGhlIHNhbXBsaW5nIGZhY3RvcnMgc3BlY2lmaWVkIGluIHRoZSBKUEVHIHBhcmFtZXRlcnMuCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGRhdGEgaW4gdGhlIGZvcm1hdCB1c2VkIGludGVybmFsbHkgYnkgdGhlIEpQRUcgbGlicmFyeSwKLW5hbWVseSBhIEpTQU1QSU1BR0UgYXJyYXkuICBUaGlzIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHR3by1kaW1lbnNpb25hbAotYXJyYXlzLCBlYWNoIG9mIHR5cGUgSlNBTVBBUlJBWS4gIEVhY2ggMi1EIGFycmF5IGhvbGRzIHRoZSB2YWx1ZXMgZm9yIG9uZQotY29sb3IgY29tcG9uZW50LiAgVGhpcyBzdHJ1Y3R1cmUgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBjb21wb25lbnRzIGFyZSBvZgotZGlmZmVyZW50IHNpemVzLiAgSWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBNQ1Ugc2l6ZSwKLXlvdSBtdXN0IGFsc28gcGFkIHRoZSBkYXRhIGNvcnJlY3RseSAodXN1YWxseSwgdGhpcyBpcyBkb25lIGJ5IHJlcGxpY2F0aW5nCi10aGUgbGFzdCBjb2x1bW4gYW5kL29yIHJvdykuICBUaGUgZGF0YSBtdXN0IGJlIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIGEgRENUCi1ibG9jayBpbiBlYWNoIGNvbXBvbmVudDogdGhhdCBpcywgZWFjaCBkb3duc2FtcGxlZCByb3cgbXVzdCBjb250YWluIGEKLW11bHRpcGxlIG9mIDggdmFsaWQgc2FtcGxlcywgYW5kIHRoZXJlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IHNhbXBsZSByb3dzCi1mb3IgZWFjaCBjb21wb25lbnQuICAoRm9yIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGNvbnZlcnNpb24gb2YgZGlnaXRhbCBUVgotaW1hZ2VzLCB0aGUgc3RhbmRhcmQgaW1hZ2Ugc2l6ZSBpcyB1c3VhbGx5IGEgbXVsdGlwbGUgb2YgdGhlIERDVCBibG9jayBzaXplLAotc28gdGhhdCBubyBwYWRkaW5nIG5lZWQgYWN0dWFsbHkgYmUgZG9uZS4pCi0KLVRoZSBwcm9jZWR1cmUgZm9yIGNvbXByZXNzaW9uIG9mIHJhdyBkYXRhIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBub3JtYWwKLWNvbXByZXNzaW9uLCBleGNlcHQgdGhhdCB5b3UgY2FsbCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YKLWpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBCZWZvcmUgY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCksIHlvdSBtdXN0IGRvCi10aGUgZm9sbG93aW5nOgotICAqIFNldCBjaW5mby0+cmF3X2RhdGFfaW4gdG8gVFJVRS4gIChJdCBpcyBzZXQgRkFMU0UgYnkganBlZ19zZXRfZGVmYXVsdHMoKS4pCi0gICAgVGhpcyBub3RpZmllcyB0aGUgbGlicmFyeSB0aGF0IHlvdSB3aWxsIGJlIHN1cHBseWluZyByYXcgZGF0YS4KLSAgKiBFbnN1cmUganBlZ19jb2xvcl9zcGFjZSBpcyBjb3JyZWN0IC0tLSBhbiBleHBsaWNpdCBqcGVnX3NldF9jb2xvcnNwYWNlKCkKLSAgICBjYWxsIGlzIGEgZ29vZCBpZGVhLiAgTm90ZSB0aGF0IHNpbmNlIGNvbG9yIGNvbnZlcnNpb24gaXMgYnlwYXNzZWQsCi0gICAgaW5fY29sb3Jfc3BhY2UgaXMgaWdub3JlZCwgZXhjZXB0IHRoYXQganBlZ19zZXRfZGVmYXVsdHMoKSB1c2VzIGl0IHRvCi0gICAgY2hvb3NlIHRoZSBkZWZhdWx0IGpwZWdfY29sb3Jfc3BhY2Ugc2V0dGluZy4KLSAgKiBFbnN1cmUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIGNpbmZvLT5jb21wX2luZm9baV0uaF9zYW1wX2ZhY3RvciBhbmQKLSAgICBjaW5mby0+Y29tcF9pbmZvW2ldLnZfc2FtcF9mYWN0b3IsIGFyZSBjb3JyZWN0LiAgU2luY2UgdGhlc2UgaW5kaWNhdGUgdGhlCi0gICAgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSB5b3UgYXJlIHN1cHBseWluZywgaXQncyB3aXNlIHRvIHNldCB0aGVtCi0gICAgZXhwbGljaXRseSwgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhlIGxpYnJhcnkncyBkZWZhdWx0cyBhcmUgd2hhdCB5b3Ugd2FudC4KLQotVG8gcGFzcyByYXcgZGF0YSB0byB0aGUgbGlicmFyeSwgY2FsbCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YKLWpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBUaGUgdHdvIHJvdXRpbmVzIHdvcmsgc2ltaWxhcmx5IGV4Y2VwdCB0aGF0Ci1qcGVnX3dyaXRlX3Jhd19kYXRhIHRha2VzIGEgSlNBTVBJTUFHRSBkYXRhIGFycmF5IHJhdGhlciB0aGFuIEpTQU1QQVJSQVkuCi1UaGUgc2NhbmxpbmVzIGNvdW50IHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgZnJvbSBqcGVnX3dyaXRlX3Jhd19kYXRhIGlzCi1tZWFzdXJlZCBpbiB0ZXJtcyBvZiB0aGUgY29tcG9uZW50IHdpdGggdGhlIGxhcmdlc3Qgdl9zYW1wX2ZhY3Rvci4KLQotanBlZ193cml0ZV9yYXdfZGF0YSgpIHByb2Nlc3NlcyBvbmUgTUNVIHJvdyBwZXIgY2FsbCwgd2hpY2ggaXMgdG8gc2F5Ci12X3NhbXBfZmFjdG9yKkRDVFNJWkUgc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBUaGUgcGFzc2VkIG51bV9saW5lcwotdmFsdWUgbXVzdCBiZSBhdCBsZWFzdCBtYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFLCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsCi1iZSBleGFjdGx5IHRoYXQgYW1vdW50IChvciBwb3NzaWJseSBzb21lIG11bHRpcGxlIG9mIHRoYXQgYW1vdW50LCBpbiBmdXR1cmUKLWxpYnJhcnkgdmVyc2lvbnMpLiAgVGhpcyBpcyB0cnVlIGV2ZW4gb24gdGhlIGxhc3QgY2FsbCBhdCB0aGUgYm90dG9tIG9mIHRoZQotaW1hZ2U7IGRvbid0IGZvcmdldCB0byBwYWQgeW91ciBkYXRhIGFzIG5lY2Vzc2FyeS4KLQotVGhlIHJlcXVpcmVkIGRpbWVuc2lvbnMgb2YgdGhlIHN1cHBsaWVkIGRhdGEgY2FuIGJlIGNvbXB1dGVkIGZvciBlYWNoCi1jb21wb25lbnQgYXMKLQljaW5mby0+Y29tcF9pbmZvW2ldLndpZHRoX2luX2Jsb2NrcypEQ1RTSVpFICBzYW1wbGVzIHBlciByb3cKLQljaW5mby0+Y29tcF9pbmZvW2ldLmhlaWdodF9pbl9ibG9ja3MqRENUU0laRSByb3dzIGluIGltYWdlCi1hZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgaGFzIGluaXRpYWxpemVkIHRob3NlIGZpZWxkcy4gIElmIHRoZSB2YWxpZCBkYXRhCi1pcyBzbWFsbGVyIHRoYW4gdGhpcywgaXQgbXVzdCBiZSBwYWRkZWQgYXBwcm9wcmlhdGVseS4gIEZvciBzb21lIHNhbXBsaW5nCi1mYWN0b3JzIGFuZCBpbWFnZSBzaXplcywgYWRkaXRpb25hbCBkdW1teSBEQ1QgYmxvY2tzIGFyZSBpbnNlcnRlZCB0byBtYWtlCi10aGUgaW1hZ2UgYSBtdWx0aXBsZSBvZiB0aGUgTUNVIGRpbWVuc2lvbnMuICBUaGUgbGlicmFyeSBjcmVhdGVzIHN1Y2ggZHVtbXkKLWJsb2NrcyBpdHNlbGY7IGl0IGRvZXMgbm90IHJlYWQgdGhlbSBmcm9tIHlvdXIgc3VwcGxpZWQgZGF0YS4gIFRoZXJlZm9yZSB5b3UKLW5lZWQgbmV2ZXIgcGFkIGJ5IG1vcmUgdGhhbiBEQ1RTSVpFIHNhbXBsZXMuICBBbiBleGFtcGxlIG1heSBoZWxwIGhlcmUuCi1Bc3N1bWUgMmgydiBkb3duc2FtcGxpbmcgb2YgWUNiQ3IgZGF0YSwgdGhhdCBpcwotCWNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDIJCWZvciBZCi0JY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMgotCWNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9IDEJCWZvciBDYgotCWNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDEKLQljaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxCQlmb3IgQ3IKLQljaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxCi1hbmQgc3VwcG9zZSB0aGF0IHRoZSBub21pbmFsIGltYWdlIGRpbWVuc2lvbnMgKGNpbmZvLT5pbWFnZV93aWR0aCBhbmQKLWNpbmZvLT5pbWFnZV9oZWlnaHQpIGFyZSAxMDF4MTAxIHBpeGVscy4gIFRoZW4ganBlZ19zdGFydF9jb21wcmVzcygpIHdpbGwKLWNvbXB1dGUgZG93bnNhbXBsZWRfd2lkdGggPSAxMDEgYW5kIHdpZHRoX2luX2Jsb2NrcyA9IDEzIGZvciBZLAotZG93bnNhbXBsZWRfd2lkdGggPSA1MSBhbmQgd2lkdGhfaW5fYmxvY2tzID0gNyBmb3IgQ2IgYW5kIENyIChhbmQgdGhlIHNhbWUKLWZvciB0aGUgaGVpZ2h0IGZpZWxkcykuICBZb3UgbXVzdCBwYWQgdGhlIFkgZGF0YSB0byBhdCBsZWFzdCAxMyo4ID0gMTA0Ci1jb2x1bW5zIGFuZCByb3dzLCB0aGUgQ2IvQ3IgZGF0YSB0byBhdCBsZWFzdCA3KjggPSA1NiBjb2x1bW5zIGFuZCByb3dzLiAgVGhlCi1NQ1UgaGVpZ2h0IGlzIG1heF92X3NhbXBfZmFjdG9yID0gMiBEQ1Qgcm93cyBzbyB5b3UgbXVzdCBwYXNzIGF0IGxlYXN0IDE2Ci1zY2FubGluZXMgb24gZWFjaCBjYWxsIHRvIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSwgd2hpY2ggaXMgdG8gc2F5IDE2IGFjdHVhbAotc2FtcGxlIHJvd3Mgb2YgWSBhbmQgOCBlYWNoIG9mIENiIGFuZCBDci4gIEEgdG90YWwgb2YgNyBNQ1Ugcm93cyBhcmUgbmVlZGVkLAotc28geW91IG11c3QgcGFzcyBhIHRvdGFsIG9mIDcqMTYgPSAxMTIgInNjYW5saW5lcyIuICBUaGUgbGFzdCBEQ1QgYmxvY2sgcm93Ci1vZiBZIGRhdGEgaXMgZHVtbXksIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgeW91IHBhc3MgZm9yIGl0IGluIHRoZSBkYXRhCi1hcnJheXMsIGJ1dCB0aGUgc2NhbmxpbmVzIGNvdW50IG11c3QgdG90YWwgdXAgdG8gMTEyIHNvIHRoYXQgYWxsIG9mIHRoZSBDYgotYW5kIENyIGRhdGEgZ2V0cyBwYXNzZWQuCi0KLU91dHB1dCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCB3aXRoIHJhdy1kYXRhIGNvbXByZXNzaW9uOiBpZiB0aGUgZGF0YQotZGVzdGluYXRpb24gbW9kdWxlIHN1c3BlbmRzLCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgd2lsbCByZXR1cm4gMC4KLUluIHRoaXMgY2FzZSB0aGUgc2FtZSBkYXRhIHJvd3MgbXVzdCBiZSBwYXNzZWQgYWdhaW4gb24gdGhlIG5leHQgY2FsbC4KLQotCi1EZWNvbXByZXNzaW9uIHdpdGggcmF3IGRhdGEgb3V0cHV0IGltcGxpZXMgYnlwYXNzaW5nIGFsbCBwb3N0cHJvY2Vzc2luZzoKLXlvdSBjYW5ub3QgYXNrIGZvciByZXNjYWxpbmcgb3IgY29sb3IgcXVhbnRpemF0aW9uLCBmb3IgaW5zdGFuY2UuICBNb3JlCi1zZXJpb3VzbHksIHlvdSBtdXN0IGRlYWwgd2l0aCB0aGUgY29sb3Igc3BhY2UgYW5kIHNhbXBsaW5nIGZhY3RvcnMgcHJlc2VudCBpbgotdGhlIGluY29taW5nIGZpbGUuICBJZiB5b3VyIGFwcGxpY2F0aW9uIG9ubHkgaGFuZGxlcywgc2F5LCAyaDF2IFlDYkNyIGRhdGEsCi15b3UgbXVzdCBjaGVjayBmb3IgYW5kIGZhaWwgb24gb3RoZXIgY29sb3Igc3BhY2VzIG9yIG90aGVyIHNhbXBsaW5nIGZhY3RvcnMuCi1UaGUgbGlicmFyeSB3aWxsIG5vdCBjb252ZXJ0IHRvIGEgZGlmZmVyZW50IGNvbG9yIHNwYWNlIGZvciB5b3UuCi0KLVRvIG9idGFpbiByYXcgZGF0YSBvdXRwdXQsIHNldCBjaW5mby0+cmF3X2RhdGFfb3V0ID0gVFJVRSBiZWZvcmUKLWpwZWdfc3RhcnRfZGVjb21wcmVzcygpIChpdCBpcyBzZXQgRkFMU0UgYnkganBlZ19yZWFkX2hlYWRlcigpKS4gIEJlIHN1cmUgdG8KLXZlcmlmeSB0aGF0IHRoZSBjb2xvciBzcGFjZSBhbmQgc2FtcGxpbmcgZmFjdG9ycyBhcmUgb25lcyB5b3UgY2FuIGhhbmRsZS4KLVRoZW4gY2FsbCBqcGVnX3JlYWRfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuICBUaGUKLWRlY29tcHJlc3Npb24gcHJvY2VzcyBpcyBvdGhlcndpc2UgdGhlIHNhbWUgYXMgdXN1YWwuCi0KLWpwZWdfcmVhZF9yYXdfZGF0YSgpIHJldHVybnMgb25lIE1DVSByb3cgcGVyIGNhbGwsIGFuZCB0aHVzIHlvdSBtdXN0IHBhc3MgYQotYnVmZmVyIG9mIGF0IGxlYXN0IG1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUgc2NhbmxpbmVzIChzY2FubGluZSBjb3VudGluZyBpcwotdGhlIHNhbWUgYXMgZm9yIHJhdy1kYXRhIGNvbXByZXNzaW9uKS4gIFRoZSBidWZmZXIgeW91IHBhc3MgbXVzdCBiZSBsYXJnZQotZW5vdWdoIHRvIGhvbGQgdGhlIGFjdHVhbCBkYXRhIHBsdXMgcGFkZGluZyB0byBEQ1QtYmxvY2sgYm91bmRhcmllcy4gIEFzIHdpdGgKLWNvbXByZXNzaW9uLCBhbnkgZW50aXJlbHkgZHVtbXkgRENUIGJsb2NrcyBhcmUgbm90IHByb2Nlc3NlZCBzbyB5b3UgbmVlZCBub3QKLWFsbG9jYXRlIHNwYWNlIGZvciB0aGVtLCBidXQgdGhlIHRvdGFsIHNjYW5saW5lIGNvdW50IGluY2x1ZGVzIHRoZW0uICBUaGUKLWFib3ZlIGV4YW1wbGUgb2YgY29tcHV0aW5nIGJ1ZmZlciBkaW1lbnNpb25zIGZvciByYXctZGF0YSBjb21wcmVzc2lvbiBpcwotZXF1YWxseSB2YWxpZCBmb3IgZGVjb21wcmVzc2lvbi4KLQotSW5wdXQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQgd2l0aCByYXctZGF0YSBkZWNvbXByZXNzaW9uOiBpZiB0aGUgZGF0YSBzb3VyY2UKLW1vZHVsZSBzdXNwZW5kcywganBlZ19yZWFkX3Jhd19kYXRhKCkgd2lsbCByZXR1cm4gMC4gIFlvdSBjYW4gYWxzbyB1c2UKLWJ1ZmZlcmVkLWltYWdlIG1vZGUgdG8gcmVhZCByYXcgZGF0YSBpbiBtdWx0aXBsZSBwYXNzZXMuCi0KLQotUmVhbGx5IHJhdyBkYXRhOiBEQ1QgY29lZmZpY2llbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSXQgaXMgcG9zc2libGUgdG8gcmVhZCBvciB3cml0ZSB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgcmF3IERDVAotY29lZmZpY2llbnRzLiAgVGhpcyBmYWNpbGl0eSBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHVzZSBpbiBsb3NzbGVzcwotdHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQgSlBFRyBmaWxlIGZvcm1hdHMuICBPdGhlciBwb3NzaWJsZSBhcHBsaWNhdGlvbnMKLWluY2x1ZGUgbG9zc2xlc3MgY3JvcHBpbmcgb2YgYSBKUEVHIGltYWdlLCBsb3NzbGVzcyByZWFzc2VtYmx5IG9mIGEKLW11bHRpLXN0cmlwIG9yIG11bHRpLXRpbGUgVElGRi9KUEVHIGZpbGUgaW50byBhIHNpbmdsZSBKUEVHIGRhdGFzdHJlYW0sIGV0Yy4KLQotVG8gcmVhZCB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cywgb3BlbiB0aGUgZmlsZSBhbmQgZG8KLWpwZWdfcmVhZF9oZWFkZXIoKSBhcyB1c3VhbC4gIEJ1dCBpbnN0ZWFkIG9mIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkKLWFuZCBqcGVnX3JlYWRfc2NhbmxpbmVzKCksIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpLiAgVGhpcyB3aWxsIHJlYWQgdGhlCi1lbnRpcmUgaW1hZ2UgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywgb25lIGFycmF5IHBlcgotY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbC1hcnJheQotZGVzY3JpcHRvcnMuICBFYWNoIHZpcnR1YWwgYXJyYXkgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHVzaW5nIHRoZSBKUEVHCi1tZW1vcnkgbWFuYWdlcidzIGFjY2Vzc192aXJ0X2JhcnJheSBtZXRob2QgKHNlZSBNZW1vcnkgbWFuYWdlbWVudCwgYmVsb3csCi1hbmQgYWxzbyByZWFkIHN0cnVjdHVyZS5kb2MncyBkaXNjdXNzaW9uIG9mIHZpcnR1YWwgYXJyYXkgaGFuZGxpbmcpLiAgT3IsCi1mb3Igc2ltcGxlIHRyYW5zY29kaW5nIHRvIGEgZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXQsIHRoZSBhcnJheSBsaXN0IGNhbgotanVzdCBiZSBoYW5kZWQgZGlyZWN0bHkgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KLQotRWFjaCBibG9jayBpbiB0aGUgYmxvY2sgYXJyYXlzIGNvbnRhaW5zIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZXMgaW4KLW5vcm1hbCBhcnJheSBvcmRlciAobm90IEpQRUcgemlnemFnIG9yZGVyKS4gIFRoZSBibG9jayBhcnJheXMgY29udGFpbiBvbmx5Ci1EQ1QgYmxvY2tzIGNvbnRhaW5pbmcgcmVhbCBkYXRhOyBhbnkgZW50aXJlbHktZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGZpbGwgb3V0Ci1pbnRlcmxlYXZlZCBNQ1VzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZXMgb2YgdGhlIGltYWdlIGFyZSBkaXNjYXJkZWQKLWR1cmluZyByZWFkaW5nIGFuZCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgYmxvY2sgYXJyYXlzLiAgKFRoZSBzaXplIG9mIGVhY2gKLWJsb2NrIGFycmF5IGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIHdpZHRoX2luX2Jsb2NrcyBhbmQgaGVpZ2h0X2luX2Jsb2NrcwotZmllbGRzIG9mIHRoZSBjb21wb25lbnQncyBjb21wX2luZm8gZW50cnkuKSAgVGhpcyBpcyBhbHNvIHRoZSBkYXRhIGZvcm1hdAotZXhwZWN0ZWQgYnkganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KLQotV2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIHZpcnR1YWwgYXJyYXlzLCBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQotdG8gcmVsZWFzZSB0aGUgYXJyYXkgc3RvcmFnZSBhbmQgcmV0dXJuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBhbiBpZGxlCi1zdGF0ZTsgb3IganVzdCBjYWxsIGpwZWdfZGVzdHJveSgpIGlmIHlvdSBkb24ndCBuZWVkIHRvIHJldXNlIHRoZSBvYmplY3QuCi0KLUlmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkgd2lsbCByZXR1cm4KLU5VTEwgaWYgaXQgaXMgZm9yY2VkIHRvIHN1c3BlbmQ7IGEgbm9uLU5VTEwgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgWW91IG5lZWQgbm90IHRlc3QgZm9yIGEgTlVMTCByZXR1cm4gdmFsdWUgd2hlbiB1c2luZyBhCi1ub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZQotZGVjb2RlcidzIGNvZWZmaWNpZW50IGFycmF5cyBkdXJpbmcgYSBub3JtYWwgZGVjb2RlIGN5Y2xlIGluIGJ1ZmZlcmVkLWltYWdlCi1tb2RlLiAgVGhpcyBmcmFtbWlzaCBtaWdodCBiZSB1c2VmdWwgZm9yIHByb2dyZXNzaXZlbHkgZGlzcGxheWluZyBhbiBpbmNvbWluZwotaW1hZ2UgYW5kIHRoZW4gcmUtZW5jb2RpbmcgaXQgd2l0aG91dCBsb3NzLiAgVG8gZG8gdGhpcywgZGVjb2RlIGluIGJ1ZmZlcmVkLQotaW1hZ2UgbW9kZSBhcyBkaXNjdXNzZWQgcHJldmlvdXNseSwgdGhlbiBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSBhZnRlcgotdGhlIGxhc3QganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdXIgdXNlCi11bnRpbCB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCi0KLQotVG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMsIHlvdSBtdXN0IHByb3ZpZGUKLXRoZSBEQ1QgY29lZmZpY2llbnRzIHN0b3JlZCBpbiB2aXJ0dWFsIGJsb2NrIGFycmF5cy4gIFlvdSBjYW4gZWl0aGVyIHBhc3MKLWJsb2NrIGFycmF5cyByZWFkIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlIGJ5IGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSwgb3IKLWFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGFuZCBmaWxsIHRoZW0KLXlvdXJzZWxmLiAgSW4gZWl0aGVyIGNhc2UsIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgc3Vic3RpdHV0ZWQgZm9yCi1qcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBUaHVzIHRoZSBzZXF1ZW5jZSBpcwotICAqIENyZWF0ZSBjb21wcmVzc2lvbiBvYmplY3QKLSAgKiBTZXQgYWxsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYXMgbmVjZXNzYXJ5Ci0gICogUmVxdWVzdCB2aXJ0dWFsIGFycmF5cyBpZiBuZWVkZWQKLSAgKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpCi0gICoganBlZ19maW5pc2hfY29tcHJlc3MoKQotICAqIERlc3Ryb3kgb3IgcmUtdXNlIGNvbXByZXNzaW9uIG9iamVjdAotanBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBwYXNzZWQgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpcnR1YWwgYmxvY2sKLWFycmF5IGRlc2NyaXB0b3JzOyB0aGUgbnVtYmVyIG9mIGFycmF5cyBpcyBlcXVhbCB0byBjaW5mby5udW1fY29tcG9uZW50cy4KLQotVGhlIHZpcnR1YWwgYXJyYXlzIG5lZWQgb25seSBoYXZlIGJlZW4gcmVxdWVzdGVkLCBub3QgcmVhbGl6ZWQsIGJlZm9yZQotanBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBjYWxsZWQuICBBIHNpZGUtZWZmZWN0IG9mCi1qcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIHRvIHJlYWxpemUgYW55IHZpcnR1YWwgYXJyYXlzIHRoYXQgaGF2ZSBiZWVuCi1yZXF1ZXN0ZWQgZnJvbSB0aGUgY29tcHJlc3Npb24gb2JqZWN0J3MgbWVtb3J5IG1hbmFnZXIuICBUaHVzLCB3aGVuIG9idGFpbmluZwotdGhlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIGNvbXByZXNzaW9uIG9iamVjdCwgeW91IHNob3VsZCBmaWxsIHRoZSBhcnJheXMKLWFmdGVyIGNhbGxpbmcganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4gIFRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gb3V0Ci13aGVuIHlvdSBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCk7IGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgb25seSB3cml0ZXMKLXRoZSBmaWxlIGhlYWRlci4KLQotV2hlbiB3cml0aW5nIHJhdyBEQ1QgY29lZmZpY2llbnRzLCBpdCBpcyBjcnVjaWFsIHRoYXQgdGhlIEpQRUcgcXVhbnRpemF0aW9uCi10YWJsZXMgYW5kIHNhbXBsaW5nIGZhY3RvcnMgbWF0Y2ggdGhlIHdheSB0aGUgZGF0YSB3YXMgZW5jb2RlZCwgb3IgdGhlCi1yZXN1bHRpbmcgZmlsZSB3aWxsIGJlIGludmFsaWQuICBGb3IgdHJhbnNjb2RpbmcgZnJvbSBhbiBleGlzdGluZyBKUEVHIGZpbGUsCi13ZSByZWNvbW1lbmQgdXNpbmcganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKS4gIFRoaXMgcm91dGluZSBpbml0aWFsaXplcwotYWxsIHRoZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzIChsaWtlIGpwZWdfc2V0X2RlZmF1bHRzKCkpLAotdGhlbiBjb3BpZXMgdGhlIGNyaXRpY2FsIGluZm9ybWF0aW9uIGZyb20gYSBzb3VyY2UgZGVjb21wcmVzc2lvbiBvYmplY3QuCi1UaGUgZGVjb21wcmVzc2lvbiBvYmplY3Qgc2hvdWxkIGhhdmUganVzdCBiZWVuIHVzZWQgdG8gcmVhZCB0aGUgZW50aXJlCi1KUEVHIGlucHV0IGZpbGUgLS0tIHRoYXQgaXMsIGl0IHNob3VsZCBiZSBhd2FpdGluZyBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCi0KLWpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgbWFya3MgYWxsIHRhYmxlcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzaW9uIG9iamVjdAotYXMgbmVlZGluZyB0byBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZSAodGh1cywgaXQgYWN0cyBsaWtlCi1qcGVnX3N0YXJ0X2NvbXByZXNzKGNpbmZvLCBUUlVFKSkuICBUaGlzIGlzIGZvciBzYWZldHkncyBzYWtlLCB0byBhdm9pZAotZW1pdHRpbmcgYWJicmV2aWF0ZWQgSlBFRyBmaWxlcyBieSBhY2NpZGVudC4gIElmIHlvdSByZWFsbHkgd2FudCB0byBlbWl0IGFuCi1hYmJyZXZpYXRlZCBKUEVHIGZpbGUsIGNhbGwganBlZ19zdXBwcmVzc190YWJsZXMoKSwgb3Igc2V0IHRoZSB0YWJsZXMnCi1pbmRpdmlkdWFsIHNlbnRfdGFibGUgZmxhZ3MsIGJldHdlZW4gY2FsbGluZyBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGFuZAotanBlZ19maW5pc2hfY29tcHJlc3MoKS4KLQotCi1Qcm9ncmVzcyBtb25pdG9yaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNvbWUgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIHJlZ2FpbiBjb250cm9sIGZyb20gdGhlIEpQRUcgbGlicmFyeSBldmVyeSBzbwotb2Z0ZW4uICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHByb2R1Y2UgYSBwZXJjZW50LWRvbmUgYmFyIG9yCi1vdGhlciBwcm9ncmVzcyBkaXNwbGF5LiAgKEZvciBhIHNpbXBsZSBleGFtcGxlLCBzZWUgY2pwZWcuYyBvciBkanBlZy5jLikKLUFsdGhvdWdoIHlvdSBkbyBnZXQgY29udHJvbCBiYWNrIGZyZXF1ZW50bHkgZHVyaW5nIHRoZSBkYXRhLXRyYW5zZmVycmluZyBwYXNzCi0odGhlIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ193cml0ZV9zY2FubGluZXMgbG9vcCksIGFueSBhZGRpdGlvbmFsIHBhc3Nlcwotd2lsbCBvY2N1ciBpbnNpZGUganBlZ19maW5pc2hfY29tcHJlc3Mgb3IganBlZ19zdGFydF9kZWNvbXByZXNzOyB0aG9zZQotcm91dGluZXMgbWF5IHRha2UgYSBsb25nIHRpbWUgdG8gZXhlY3V0ZSwgYW5kIHlvdSBkb24ndCBnZXQgY29udHJvbCBiYWNrCi11bnRpbCB0aGV5IGFyZSBkb25lLgotCi1Zb3UgY2FuIGRlZmluZSBhIHByb2dyZXNzLW1vbml0b3Igcm91dGluZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKLWJ5IHRoZSBsaWJyYXJ5LiAgTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCBob3cgb2Z0ZW4gdGhpcyBjYWxsIHdpbGwgb2NjdXIsCi1zbyB3ZSBkb24ndCByZWNvbW1lbmQgeW91IHVzZSBpdCBmb3IgbW91c2UgdHJhY2tpbmcgb3IgYW55dGhpbmcgbGlrZSB0aGF0LgotQXQgcHJlc2VudCwgYSBjYWxsIHdpbGwgb2NjdXIgb25jZSBwZXIgTUNVIHJvdywgc2NhbmxpbmUsIG9yIHNhbXBsZSByb3cKLWdyb3VwLCB3aGljaGV2ZXIgdW5pdCBpcyBjb252ZW5pZW50IGZvciB0aGUgY3VycmVudCBwcm9jZXNzaW5nIG1vZGU7IHNvIHRoZQotd2lkZXIgdGhlIGltYWdlLCB0aGUgbG9uZ2VyIHRoZSB0aW1lIGJldHdlZW4gY2FsbHMuICBEdXJpbmcgdGhlIGRhdGEKLXRyYW5zZmVycmluZyBwYXNzLCBvbmx5IG9uZSBjYWxsIG9jY3VycyBwZXIgY2FsbCBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzIG9yCi1qcGVnX3dyaXRlX3NjYW5saW5lcywgc28gZG9uJ3QgcGFzcyBhIGxhcmdlIG51bWJlciBvZiBzY2FubGluZXMgYXQgb25jZSBpZgoteW91IHdhbnQgZmluZSByZXNvbHV0aW9uIGluIHRoZSBwcm9ncmVzcyBjb3VudC4gIChJZiB5b3UgcmVhbGx5IG5lZWQgdG8gdXNlCi10aGUgY2FsbGJhY2sgbWVjaGFuaXNtIGZvciB0aW1lLWNyaXRpY2FsIHRhc2tzIGxpa2UgbW91c2UgdHJhY2tpbmcsIHlvdSBjb3VsZAotaW5zZXJ0IGFkZGl0aW9uYWwgY2FsbHMgaW5zaWRlIHNvbWUgb2YgdGhlIGxpYnJhcnkncyBpbm5lciBsb29wcy4pCi0KLVRvIGVzdGFibGlzaCBhIHByb2dyZXNzLW1vbml0b3IgY2FsbGJhY2ssIGNyZWF0ZSBhIHN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciwKLWZpbGwgaW4gaXRzIHByb2dyZXNzX21vbml0b3IgZmllbGQgd2l0aCBhIHBvaW50ZXIgdG8geW91ciBjYWxsYmFjayByb3V0aW5lLAotYW5kIHNldCBjaW5mby0+cHJvZ3Jlc3MgdG8gcG9pbnQgdG8gdGhlIHN0cnVjdC4gIFRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZAotd2hlbmV2ZXIgY2luZm8tPnByb2dyZXNzIGlzIG5vbi1OVUxMLiAgKFRoaXMgcG9pbnRlciBpcyBzZXQgdG8gTlVMTCBieQotanBlZ19jcmVhdGVfY29tcHJlc3Mgb3IganBlZ19jcmVhdGVfZGVjb21wcmVzczsgdGhlIGxpYnJhcnkgd2lsbCBub3QgY2hhbmdlCi1pdCB0aGVyZWFmdGVyLiAgU28gaWYgeW91IGFsbG9jYXRlIGR5bmFtaWMgc3RvcmFnZSBmb3IgdGhlIHByb2dyZXNzIHN0cnVjdCwKLW1ha2Ugc3VyZSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyB0aGUgSlBFRyBvYmplY3QgZG9lcy4gIEFsbG9jYXRpbmcgZnJvbSB0aGUKLUpQRUcgbWVtb3J5IG1hbmFnZXIgd2l0aCBsaWZldGltZSBKUE9PTF9QRVJNQU5FTlQgd2lsbCB3b3JrIG5pY2VseS4pICBZb3UKLWNhbiB1c2UgdGhlIHNhbWUgY2FsbGJhY2sgcm91dGluZSBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KLQotVGhlIGpwZWdfcHJvZ3Jlc3NfbWdyIHN0cnVjdCBjb250YWlucyBmb3VyIGZpZWxkcyB3aGljaCBhcmUgc2V0IGJ5IHRoZSBsaWJyYXJ5OgotCWxvbmcgcGFzc19jb3VudGVyOwkvKiB3b3JrIHVuaXRzIGNvbXBsZXRlZCBpbiB0aGlzIHBhc3MgKi8KLQlsb25nIHBhc3NfbGltaXQ7CS8qIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGluIHRoaXMgcGFzcyAqLwotCWludCBjb21wbGV0ZWRfcGFzc2VzOwkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLwotCWludCB0b3RhbF9wYXNzZXM7CS8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgZXhwZWN0ZWQgKi8KLUR1cmluZyBhbnkgb25lIHBhc3MsIHBhc3NfY291bnRlciBpbmNyZWFzZXMgZnJvbSAwIHVwIHRvIChub3QgaW5jbHVkaW5nKQotcGFzc19saW1pdDsgdGhlIHN0ZXAgc2l6ZSBpcyB1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgMS4gIFRoZSBwYXNzX2xpbWl0Ci12YWx1ZSBtYXkgY2hhbmdlIGZyb20gb25lIHBhc3MgdG8gYW5vdGhlci4gIFRoZSBleHBlY3RlZCB0b3RhbCBudW1iZXIgb2YKLXBhc3NlcyBpcyBpbiB0b3RhbF9wYXNzZXMsIGFuZCB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbHJlYWR5IGNvbXBsZXRlZCBpcyBpbgotY29tcGxldGVkX3Bhc3Nlcy4gIFRodXMgdGhlIGZyYWN0aW9uIG9mIHdvcmsgY29tcGxldGVkIG1heSBiZSBlc3RpbWF0ZWQgYXMKLQkJY29tcGxldGVkX3Bhc3NlcyArIChwYXNzX2NvdW50ZXIvcGFzc19saW1pdCkKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQl0b3RhbF9wYXNzZXMKLWlnbm9yaW5nIHRoZSBmYWN0IHRoYXQgdGhlIHBhc3NlcyBtYXkgbm90IGJlIGVxdWFsIGFtb3VudHMgb2Ygd29yay4KLQotV2hlbiBkZWNvbXByZXNzaW5nLCBwYXNzX2xpbWl0IGNhbiBldmVuIGNoYW5nZSB3aXRoaW4gYSBwYXNzLCBiZWNhdXNlIGl0Ci1kZXBlbmRzIG9uIHRoZSBudW1iZXIgb2Ygc2NhbnMgaW4gdGhlIEpQRUcgZmlsZSwgd2hpY2ggaXNuJ3QgYWx3YXlzIGtub3duIGluCi1hZHZhbmNlLiAgVGhlIGNvbXB1dGVkIGZyYWN0aW9uLW9mLXdvcmstZG9uZSBtYXkganVtcCBzdWRkZW5seSAoaWYgdGhlIGxpYnJhcnkKLWRpc2NvdmVycyBpdCBoYXMgb3ZlcmVzdGltYXRlZCB0aGUgbnVtYmVyIG9mIHNjYW5zKSBvciBldmVuIGRlY3JlYXNlIChpbiB0aGUKLW9wcG9zaXRlIGNhc2UpLiAgSXQgaXMgbm90IHdpc2UgdG8gcHV0IGdyZWF0IGZhaXRoIGluIHRoZSB3b3JrIGVzdGltYXRlLgotCi1XaGVuIHVzaW5nIHRoZSBkZWNvbXByZXNzb3IncyBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3b3JrCi1lc3RpbWF0ZSBpcyBsaWtlbHkgdG8gYmUgY29tcGxldGVseSB1bmhlbHBmdWwsIGJlY2F1c2UgdGhlIGxpYnJhcnkgaGFzIG5vIHdheQotdG8ga25vdyBob3cgbWFueSBvdXRwdXQgcGFzc2VzIHdpbGwgYmUgZGVtYW5kZWQgb2YgaXQuICBDdXJyZW50bHksIHRoZSBsaWJyYXJ5Ci1zZXRzIHRvdGFsX3Bhc3NlcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIHdpbGwgYmUgb25lIG1vcmUgb3V0cHV0Ci1wYXNzIGlmIHRoZSBpbnB1dCBmaWxlIGVuZCBoYXNuJ3QgeWV0IGJlZW4gcmVhZCAoanBlZ19pbnB1dF9jb21wbGV0ZSgpIGlzbid0Ci1UUlVFKSwgYnV0IG5vIG1vcmUgb3V0cHV0IHBhc3NlcyBpZiB0aGUgZmlsZSBlbmQgaGFzIGJlZW4gcmVhY2hlZCB3aGVuIHRoZQotb3V0cHV0IHBhc3MgaXMgc3RhcnRlZC4gIFRoaXMgbWVhbnMgdGhhdCB0b3RhbF9wYXNzZXMgd2lsbCByaXNlIGFzIGFkZGl0aW9uYWwKLW91dHB1dCBwYXNzZXMgYXJlIHJlcXVlc3RlZC4gIElmIHlvdSBoYXZlIGEgd2F5IG9mIGRldGVybWluaW5nIHRoZSBpbnB1dCBmaWxlCi1zaXplLCBlc3RpbWF0aW5nIHByb2dyZXNzIGJhc2VkIG9uIHRoZSBmcmFjdGlvbiBvZiB0aGUgZmlsZSB0aGF0J3MgYmVlbiByZWFkCi13aWxsIHByb2JhYmx5IGJlIG1vcmUgdXNlZnVsIHRoYW4gdXNpbmcgdGhlIGxpYnJhcnkncyB2YWx1ZS4KLQotCi1NZW1vcnkgbWFuYWdlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGNvdmVycyBzb21lIGtleSBmYWN0cyBhYm91dCB0aGUgSlBFRyBsaWJyYXJ5J3MgYnVpbHQtaW4gbWVtb3J5Ci1tYW5hZ2VyLiAgRm9yIG1vcmUgaW5mbywgcGxlYXNlIHJlYWQgc3RydWN0dXJlLmRvYydzIHNlY3Rpb24gYWJvdXQgdGhlIG1lbW9yeQotbWFuYWdlciwgYW5kIGNvbnN1bHQgdGhlIHNvdXJjZSBjb2RlIGlmIG5lY2Vzc2FyeS4KLQotQWxsIG1lbW9yeSBhbmQgdGVtcG9yYXJ5IGZpbGUgYWxsb2NhdGlvbiB3aXRoaW4gdGhlIGxpYnJhcnkgaXMgZG9uZSB2aWEgdGhlCi1tZW1vcnkgbWFuYWdlci4gIElmIG5lY2Vzc2FyeSwgeW91IGNhbiByZXBsYWNlIHRoZSAiYmFjayBlbmQiIG9mIHRoZSBtZW1vcnkKLW1hbmFnZXIgdG8gY29udHJvbCBhbGxvY2F0aW9uIHlvdXJzZWxmIChmb3IgZXhhbXBsZSwgaWYgeW91IGRvbid0IHdhbnQgdGhlCi1saWJyYXJ5IHRvIHVzZSBtYWxsb2MoKSBhbmQgZnJlZSgpIGZvciBzb21lIHJlYXNvbikuCi0KLVNvbWUgZGF0YSBpcyBhbGxvY2F0ZWQgInBlcm1hbmVudGx5IiBhbmQgd2lsbCBub3QgYmUgZnJlZWQgdW50aWwgdGhlIEpQRUcKLW9iamVjdCBpcyBkZXN0cm95ZWQuICBNb3N0IGRhdGEgaXMgYWxsb2NhdGVkICJwZXIgaW1hZ2UiIGFuZCBpcyBmcmVlZCBieQotanBlZ19maW5pc2hfY29tcHJlc3MsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MsIG9yIGpwZWdfYWJvcnQuICBZb3UgY2FuIGNhbGwgdGhlCi1tZW1vcnkgbWFuYWdlciB5b3Vyc2VsZiB0byBhbGxvY2F0ZSBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCi1mcmVlZCBhdCB0aGVzZSB0aW1lcy4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBpcwotICBwdHIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBzaXplKTsKLVVzZSBKUE9PTF9QRVJNQU5FTlQgdG8gZ2V0IHN0b3JhZ2UgdGhhdCBsYXN0cyBhcyBsb25nIGFzIHRoZSBKUEVHIG9iamVjdC4KLVVzZSBhbGxvY19sYXJnZSBpbnN0ZWFkIG9mIGFsbG9jX3NtYWxsIGZvciBhbnl0aGluZyBiaWdnZXIgdGhhbiBhIGZldyBLYnl0ZXMuCi1UaGVyZSBhcmUgYWxzbyBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSByb3V0aW5lcyB0aGF0IGF1dG9tYXRpY2FsbHkKLWJ1aWxkIDItRCBzYW1wbGUgb3IgYmxvY2sgYXJyYXlzLgotCi1UaGUgbGlicmFyeSdzIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnRzIHRvIHByb2Nlc3MgYW4gaW1hZ2UgZGVwZW5kIG9uIHRoZQotaW1hZ2UncyB3aWR0aCwgYnV0IG5vdCBvbiBpdHMgaGVpZ2h0LCBiZWNhdXNlIHRoZSBsaWJyYXJ5IG9yZGluYXJpbHkgd29ya3MKLXdpdGggInN0cmlwIiBidWZmZXJzIHRoYXQgYXJlIGFzIHdpZGUgYXMgdGhlIGltYWdlIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaC4KLVNvbWUgb3BlcmF0aW5nIG1vZGVzIChlZywgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uKSByZXF1aXJlIGZ1bGwtaW1hZ2UKLWJ1ZmZlcnMuICBTdWNoIGJ1ZmZlcnMgYXJlIHRyZWF0ZWQgYXMgInZpcnR1YWwgYXJyYXlzIjogb25seSB0aGUgY3VycmVudCBzdHJpcAotbmVlZCBiZSBpbiBtZW1vcnksIGFuZCB0aGUgcmVzdCBjYW4gYmUgc3dhcHBlZCBvdXQgdG8gYSB0ZW1wb3JhcnkgZmlsZS4KLQotSWYgeW91IHVzZSB0aGUgc2ltcGxlc3QgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgKGptZW1ub2JzLmMpLCB0aGVuIG5vCi10ZW1wb3JhcnkgZmlsZXMgYXJlIHVzZWQ7IHZpcnR1YWwgYXJyYXlzIGFyZSBzaW1wbHkgbWFsbG9jKCknZC4gIEltYWdlcyBiaWdnZXIKLXRoYW4gbWVtb3J5IGNhbiBiZSBwcm9jZXNzZWQgb25seSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyB2aXJ0dWFsIG1lbW9yeS4KLVRoZSBvdGhlciBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZHMgc3VwcG9ydCB0ZW1wb3JhcnkgZmlsZXMgb2YgdmFyaW91cyBmbGF2b3JzCi1hbmQgdGh1cyB3b3JrIGluIG1hY2hpbmVzIHdpdGhvdXQgdmlydHVhbCBtZW1vcnkuICBUaGV5IG1heSBhbHNvIGJlIHVzZWZ1bCBvbgotVW5peCBtYWNoaW5lcyBpZiB5b3UgbmVlZCB0byBwcm9jZXNzIGltYWdlcyB0aGF0IGV4Y2VlZCBhdmFpbGFibGUgc3dhcCBzcGFjZS4KLQotV2hlbiB1c2luZyB0ZW1wb3JhcnkgZmlsZXMsIHRoZSBsaWJyYXJ5IHdpbGwgbWFrZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yCi1pdHMgdmlydHVhbCBhcnJheXMganVzdCBiaWcgZW5vdWdoIHRvIHN0YXkgd2l0aGluIGEgIm1heGltdW0gbWVtb3J5IiBzZXR0aW5nLgotWW91ciBhcHBsaWNhdGlvbiBjYW4gc2V0IHRoaXMgbGltaXQgYnkgc2V0dGluZyBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZQotYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LiAgKE9mIGNvdXJzZSwgdGhlcmUgaXMgc3RpbGwgYSBtaW5pbXVtIHNpemUgZm9yCi10aGUgYnVmZmVycywgc28gdGhlIG1heC1tZW1vcnkgc2V0dGluZyBpcyBlZmZlY3RpdmUgb25seSBpZiBpdCBpcyBiaWdnZXIgdGhhbgotdGhlIG1pbmltdW0gc3BhY2UgbmVlZGVkLikgIElmIHlvdSBhbGxvY2F0ZSBhbnkgbGFyZ2Ugc3RydWN0dXJlcyB5b3Vyc2VsZiwgeW91Ci1tdXN0IGFsbG9jYXRlIHRoZW0gYmVmb3JlIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBpbgotb3JkZXIgdG8gaGF2ZSB0aGVtIGNvdW50ZWQgYWdhaW5zdCB0aGUgbWF4IG1lbW9yeSBsaW1pdC4gIEFsc28ga2VlcCBpbiBtaW5kCi10aGF0IHNwYWNlIGFsbG9jYXRlZCB3aXRoIGFsbG9jX3NtYWxsKCkgaXMgaWdub3JlZCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotaXQncyB0b28gc21hbGwgdG8gYmUgd29ydGggd29ycnlpbmcgYWJvdXQ7IHNvIGEgcmVhc29uYWJsZSBzYWZldHkgbWFyZ2luCi1zaG91bGQgYmUgbGVmdCB3aGVuIHNldHRpbmcgbWF4X21lbW9yeV90b191c2UuCi0KLUlmIHlvdSB1c2UgdGhlIGptZW1uYW1lLmMgb3Igam1lbWRvcy5jIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kLCBpdCBpcwotaW1wb3J0YW50IHRvIGNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCBwcm9wZXJseSB0byBlbnN1cmUgdGhhdCB0aGUgdGVtcG9yYXJ5Ci1maWxlcyBnZXQgZGVsZXRlZC4gIChUaGlzIGlzIGVzcGVjaWFsbHkgY3J1Y2lhbCB3aXRoIGptZW1kb3MuYywgd2hlcmUgdGhlCi0idGVtcG9yYXJ5IGZpbGVzIiBtYXkgYmUgZXh0ZW5kZWQtbWVtb3J5IHNlZ21lbnRzOyBpZiB0aGV5IGFyZSBub3QgZnJlZWQsCi1ET1Mgd2lsbCByZXF1aXJlIGEgcmVib290IHRvIHJlY292ZXIgdGhlIG1lbW9yeS4pICBUaHVzLCB3aXRoIHRoZXNlIG1lbW9yeQotbWFuYWdlcnMsIGl0J3MgYSBnb29kIGlkZWEgdG8gcHJvdmlkZSBhIHNpZ25hbCBoYW5kbGVyIHRoYXQgd2lsbCB0cmFwIGFueQotZWFybHkgZXhpdCBmcm9tIHlvdXIgcHJvZ3JhbS4gIFRoZSBoYW5kbGVyIHNob3VsZCBjYWxsIGVpdGhlciBqcGVnX2Fib3J0KCkKLW9yIGpwZWdfZGVzdHJveSgpIGZvciBhbnkgYWN0aXZlIEpQRUcgb2JqZWN0cy4gIEEgaGFuZGxlciBpcyBub3QgbmVlZGVkIHdpdGgKLWptZW1ub2JzLmMsIGFuZCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHdpdGggam1lbWFuc2kuYyBvciBqbWVtbWFjLmMgZWl0aGVyLAotc2luY2UgdGhlIEMgbGlicmFyeSBpcyBzdXBwb3NlZCB0byB0YWtlIGNhcmUgb2YgZGVsZXRpbmcgZmlsZXMgbWFkZSB3aXRoCi10bXBmaWxlKCkuCi0KLQotTWVtb3J5IHVzYWdlCi0tLS0tLS0tLS0tLS0KLQotV29ya2luZyBtZW1vcnkgcmVxdWlyZW1lbnRzIHdoaWxlIHBlcmZvcm1pbmcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbgotZGVwZW5kIG9uIGltYWdlIGRpbWVuc2lvbnMsIGltYWdlIGNoYXJhY3RlcmlzdGljcyAoc3VjaCBhcyBjb2xvcnNwYWNlIGFuZAotSlBFRyBwcm9jZXNzKSwgYW5kIG9wZXJhdGluZyBtb2RlIChhcHBsaWNhdGlvbi1zZWxlY3RlZCBvcHRpb25zKS4KLQotQXMgb2YgdjZiLCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzOgotIDEuIEFib3V0IDI0SyBpbiBtb3JlLW9yLWxlc3MtZml4ZWQtc2l6ZSBkYXRhLiAgVGhpcyB2YXJpZXMgYSBiaXQgZGVwZW5kaW5nCi0gICAgb24gb3BlcmF0aW5nIG1vZGUgYW5kIGltYWdlIGNoYXJhY3RlcmlzdGljcyAocGFydGljdWxhcmx5IGNvbG9yIHZzLgotICAgIGdyYXlzY2FsZSksIGJ1dCBpdCBkb2Vzbid0IGRlcGVuZCBvbiBpbWFnZSBkaW1lbnNpb25zLgotIDIuIFN0cmlwIGJ1ZmZlcnMgKG9mIHNpemUgcHJvcG9ydGlvbmFsIHRvIHRoZSBpbWFnZSB3aWR0aCkgZm9yIElEQ1QgYW5kCi0gICAgdXBzYW1wbGluZyByZXN1bHRzLiAgVGhlIHdvcnN0IGNhc2UgZm9yIGNvbW1vbmx5IHVzZWQgc2FtcGxpbmcgZmFjdG9ycwotICAgIGlzIGFib3V0IDM0IGJ5dGVzICogd2lkdGggaW4gcGl4ZWxzIGZvciBhIGNvbG9yIGltYWdlLiAgQSBncmF5c2NhbGUgaW1hZ2UKLSAgICBvbmx5IG5lZWRzIGFib3V0IDggYnl0ZXMgcGVyIHBpeGVsIGNvbHVtbi4KLSAzLiBBIGZ1bGwtaW1hZ2UgRENUIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBuZWVkZWQgdG8gZGVjb2RlIGEgbXVsdGktc2NhbiBKUEVHCi0gICAgZmlsZSAoaW5jbHVkaW5nIHByb2dyZXNzaXZlIEpQRUdzKSwgb3Igd2hlbmV2ZXIgeW91IHNlbGVjdCBidWZmZXJlZC1pbWFnZQotICAgIG1vZGUuICBUaGlzIHRha2VzIDIgYnl0ZXMvY29lZmZpY2llbnQuICBBdCB0eXBpY2FsIDJ4MiBzYW1wbGluZywgdGhhdCdzCi0gICAgMyBieXRlcyBwZXIgcGl4ZWwgZm9yIGEgY29sb3IgaW1hZ2UuICBXb3JzdCBjYXNlICgxeDEgc2FtcGxpbmcpIHJlcXVpcmVzCi0gICAgNiBieXRlcy9waXhlbC4gIEZvciBncmF5c2NhbGUsIGZpZ3VyZSAyIGJ5dGVzL3BpeGVsLgotIDQuIFRvIHBlcmZvcm0gMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgdGhlIGRlY29tcHJlc3NvciBhbHNvIG5lZWRzIGEKLSAgICAxMjhLIGNvbG9yIGxvb2t1cCB0YWJsZSBhbmQgYSBmdWxsLWltYWdlIHBpeGVsIGJ1ZmZlciAoMyBieXRlcy9waXhlbCkuCi1UaGlzIGRvZXMgbm90IGNvdW50IGFueSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc3VjaCBhcyBhCi1idWZmZXIgdG8gaG9sZCB0aGUgZmluYWwgb3V0cHV0IGltYWdlLgotCi1UaGUgYWJvdmUgZmlndXJlcyBhcmUgdmFsaWQgZm9yIDgtYml0IEpQRUcgZGF0YSBwcmVjaXNpb24gYW5kIGEgbWFjaGluZSB3aXRoCi0zMi1iaXQgaW50cy4gIEZvciAxMi1iaXQgSlBFRyBkYXRhLCBkb3VibGUgdGhlIHNpemUgb2YgdGhlIHN0cmlwIGJ1ZmZlcnMgYW5kCi1xdWFudGl6YXRpb24gcGl4ZWwgYnVmZmVyLiAgVGhlICJmaXhlZC1zaXplIiBkYXRhIHdpbGwgYmUgc29tZXdoYXQgc21hbGxlcgotd2l0aCAxNi1iaXQgaW50cywgbGFyZ2VyIHdpdGggNjQtYml0IGludHMuICBBbHNvLCBDTVlLIG9yIG90aGVyIHVudXN1YWwKLWNvbG9yIHNwYWNlcyB3aWxsIHJlcXVpcmUgZGlmZmVyZW50IGFtb3VudHMgb2Ygc3BhY2UuCi0KLVRoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGFuZCBwaXhlbCBidWZmZXJzLCBpZiBuZWVkZWQgYXQgYWxsLCBkbyBub3QKLWhhdmUgdG8gYmUgZnVsbHkgUkFNIHJlc2lkZW50OyB5b3UgY2FuIGhhdmUgdGhlIGxpYnJhcnkgdXNlIHRlbXBvcmFyeQotZmlsZXMgaW5zdGVhZCB3aGVuIHRoZSB0b3RhbCBtZW1vcnkgdXNhZ2Ugd291bGQgZXhjZWVkIGEgbGltaXQgeW91IHNldC4KLShCdXQgaWYgeW91ciBPUyBzdXBwb3J0cyB2aXJ0dWFsIG1lbW9yeSwgaXQncyBwcm9iYWJseSBiZXR0ZXIgdG8ganVzdCB1c2UKLWptZW1ub2JzIGFuZCBsZXQgdGhlIE9TIGRvIHRoZSBzd2FwcGluZy4pCi0KLVRoZSBjb21wcmVzc29yJ3MgbWVtb3J5IHJlcXVpcmVtZW50cyBhcmUgc2ltaWxhciwgZXhjZXB0IHRoYXQgaXQgaGFzIG5vIG5lZWQKLWZvciBjb2xvciBxdWFudGl6YXRpb24uICBBbHNvLCBpdCBuZWVkcyBhIGZ1bGwtaW1hZ2UgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcgotaWYgSHVmZm1hbi10YWJsZSBvcHRpbWl6YXRpb24gaXMgYXNrZWQgZm9yLCBldmVuIGlmIHByb2dyZXNzaXZlIG1vZGUgaXMgbm90Ci1yZXF1ZXN0ZWQuCi0KLUlmIHlvdSBuZWVkIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IHVzYWdlIGluIGEgcGFydGljdWxhcgotc2l0dWF0aW9uLCB5b3UgY2FuIGVuYWJsZSB0aGUgTUVNX1NUQVRTIGNvZGUgaW4gam1lbW1nci5jLgotCi0KLUxpYnJhcnkgY29tcGlsZS10aW1lIG9wdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBudW1iZXIgb2YgY29tcGlsZS10aW1lIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBieSBtb2RpZnlpbmcgam1vcmVjZmcuaC4KLQotVGhlIEpQRUcgc3RhbmRhcmQgcHJvdmlkZXMgZm9yIGJvdGggdGhlIGJhc2VsaW5lIDgtYml0IERDVCBwcm9jZXNzIGFuZAotYSAxMi1iaXQgRENUIHByb2Nlc3MuICBUaGUgSUpHIGNvZGUgc3VwcG9ydHMgMTItYml0IGxvc3N5IEpQRUcgaWYgeW91IGRlZmluZQotQklUU19JTl9KU0FNUExFIGFzIDEyIHJhdGhlciB0aGFuIDguICBOb3RlIHRoYXQgdGhpcyBjYXVzZXMgSlNBTVBMRSB0byBiZQotbGFyZ2VyIHRoYW4gYSBjaGFyLCBzbyBpdCBhZmZlY3RzIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbidzIGltYWdlIGRhdGEuCi1UaGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZyBhbmQgZGpwZWcgY2FuIHN1cHBvcnQgMTItYml0IG1vZGUgb25seSBmb3IgUFBNCi1hbmQgR0lGIGZpbGUgZm9ybWF0czsgeW91IG11c3QgZGlzYWJsZSB0aGUgb3RoZXIgZmlsZSBmb3JtYXRzIHRvIGNvbXBpbGUgYQotMTItYml0IGNqcGVnIG9yIGRqcGVnLiAgKGluc3RhbGwuZG9jIGhhcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQuKQotQXQgcHJlc2VudCwgYSAxMi1iaXQgbGlicmFyeSBjYW4gaGFuZGxlICpvbmx5KiAxMi1iaXQgaW1hZ2VzLCBub3QgYm90aAotcHJlY2lzaW9ucy4gIChJZiB5b3UgbmVlZCB0byBpbmNsdWRlIGJvdGggOC0gYW5kIDEyLWJpdCBsaWJyYXJpZXMgaW4gYSBzaW5nbGUKLWFwcGxpY2F0aW9uLCB5b3UgY291bGQgcHJvYmFibHkgZG8gaXQgYnkgZGVmaW5pbmcgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotZm9yIGp1c3Qgb25lIG9mIHRoZSBjb3BpZXMuICBZb3UnZCBoYXZlIHRvIGFjY2VzcyB0aGUgOC1iaXQgYW5kIDEyLWJpdCBjb3BpZXMKLWZyb20gc2VwYXJhdGUgYXBwbGljYXRpb24gc291cmNlIGZpbGVzLiAgVGhpcyBpcyB1bnRlc3RlZCAuLi4gaWYgeW91IHRyeSBpdCwKLXdlJ2QgbGlrZSB0byBoZWFyIHdoZXRoZXIgaXQgd29ya3MhKQotCi1Ob3RlIHRoYXQgYSAxMi1iaXQgbGlicmFyeSBhbHdheXMgY29tcHJlc3NlcyBpbiBIdWZmbWFuIG9wdGltaXphdGlvbiBtb2RlLAotaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdmFsaWQgSHVmZm1hbiB0YWJsZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG91cgotZGVmYXVsdCBIdWZmbWFuIHRhYmxlcyBvbmx5IGNvdmVyIDgtYml0IGRhdGEuICBJZiB5b3UgbmVlZCB0byBvdXRwdXQgMTItYml0Ci1maWxlcyBpbiBvbmUgcGFzcywgeW91J2xsIGhhdmUgdG8gc3VwcGx5IHN1aXRhYmxlIGRlZmF1bHQgSHVmZm1hbiB0YWJsZXMuCi1Zb3UgbWF5IGFsc28gd2FudCB0byBzdXBwbHkgeW91ciBvd24gRENUIHF1YW50aXphdGlvbiB0YWJsZXM7IHRoZSBleGlzdGluZwotcXVhbGl0eS1zY2FsaW5nIGNvZGUgaGFzIGJlZW4gZGV2ZWxvcGVkIGZvciA4LWJpdCB1c2UsIGFuZCBwcm9iYWJseSBkb2Vzbid0Ci1nZW5lcmF0ZSBlc3BlY2lhbGx5IGdvb2QgdGFibGVzIGZvciAxMi1iaXQuCi0KLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgaW4gdGhlIGltYWdlIGlzIGRldGVybWluZWQKLWJ5IE1BWF9DT01QT05FTlRTLiAgVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzIHVwIHRvIDI1NSBjb21wb25lbnRzLCBidXQgd2UKLWV4cGVjdCB0aGF0IGZldyBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIG1vcmUgdGhhbiBmb3VyIG9yIHNvLgotCi1PbiBtYWNoaW5lcyB3aXRoIHVudXN1YWwgZGF0YSB0eXBlIHNpemVzLCB5b3UgbWF5IGJlIGFibGUgdG8gaW1wcm92ZQotcGVyZm9ybWFuY2Ugb3IgcmVkdWNlIG1lbW9yeSBzcGFjZSBieSB0d2Vha2luZyB0aGUgdmFyaW91cyB0eXBlZGVmcyBpbgotam1vcmVjZmcuaC4gIEluIHBhcnRpY3VsYXIsIG9uIHNvbWUgUklTQyBDUFVzLCBhY2Nlc3MgdG8gYXJyYXlzIG9mICJzaG9ydCJzCi1pcyBxdWl0ZSBzbG93OyBjb25zaWRlciB0cmFkaW5nIG1lbW9yeSBmb3Igc3BlZWQgYnkgbWFraW5nIEpDT0VGLCBJTlQxNiwgYW5kCi1VSU5UMTYgYmUgImludCIgb3IgInVuc2lnbmVkIGludCIuICBVSU5UOCBpcyBhbHNvIGEgY2FuZGlkYXRlIHRvIGJlY29tZSBpbnQuCi1Zb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBtYWtlIEpTQU1QTEUgYmUgaW50IHVubGVzcyB5b3UgaGF2ZSBsb3RzIG9mIG1lbW9yeQotdG8gYnVybi4KLQotWW91IGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxpYnJhcnkgYnkgY29tcGlsaW5nIG91dCB2YXJpb3VzIG9wdGlvbmFsCi1mdW5jdGlvbnMuICBUbyBkbyB0aGlzLCB1bmRlZmluZSB4eHhfU1VQUE9SVEVEIHN5bWJvbHMgYXMgbmVjZXNzYXJ5LgotCi1Zb3UgY2FuIGFsc28gc2F2ZSBhIGZldyBLIGJ5IG5vdCBoYXZpbmcgdGV4dCBlcnJvciBtZXNzYWdlcyBpbiB0aGUgbGlicmFyeTsKLXRoZSBzdGFuZGFyZCBlcnJvciBtZXNzYWdlIHRhYmxlIG9jY3VwaWVzIGFib3V0IDVLYi4gIFRoaXMgaXMgcGFydGljdWxhcmx5Ci1yZWFzb25hYmxlIGZvciBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgd2hlcmUgdGhlcmUncyBubyBnb29kIHdheSB0byBkaXNwbGF5IAotYSBtZXNzYWdlIGFueXdheS4gIFRvIGRvIHRoaXMsIHJlbW92ZSB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UgdGFibGUKLShqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlW10pIGZyb20gamVycm9yLmMsIGFuZCBhbHRlciBmb3JtYXRfbWVzc2FnZSB0byBkbwotc29tZXRoaW5nIHJlYXNvbmFibGUgd2l0aG91dCBpdC4gIFlvdSBjb3VsZCBvdXRwdXQgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlCi1tZXNzYWdlIGNvZGUgbnVtYmVyLCBmb3IgZXhhbXBsZS4gIElmIHlvdSBkbyB0aGlzLCB5b3UgY2FuIGFsc28gc2F2ZSBhIGNvdXBsZQotbW9yZSBLIGJ5IG1vZGlmeWluZyB0aGUgVFJBQ0VNU24oKSBtYWNyb3MgaW4gamVycm9yLmggdG8gZXhwYW5kIHRvIG5vdGhpbmc7Ci15b3UgZG9uJ3QgbmVlZCB0cmFjZSBjYXBhYmlsaXR5IGFueXdheSwgcmlnaHQ/Ci0KLQotUG9ydGFiaWxpdHkgY29uc2lkZXJhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBKUEVHIGxpYnJhcnkgaGFzIGJlZW4gd3JpdHRlbiB0byBiZSBleHRyZW1lbHkgcG9ydGFibGU7IHRoZSBzYW1wbGUKLWFwcGxpY2F0aW9ucyBjanBlZyBhbmQgZGpwZWcgYXJlIHNsaWdodGx5IGxlc3Mgc28uICBUaGlzIHNlY3Rpb24gc3VtbWFyaXplcwotdGhlIGRlc2lnbiBnb2FscyBpbiB0aGlzIGFyZWEuICAoSWYgeW91IGVuY291bnRlciBhbnkgYnVncyB0aGF0IGNhdXNlIHRoZQotbGlicmFyeSB0byBiZSBsZXNzIHBvcnRhYmxlIHRoYW4gaXMgY2xhaW1lZCBoZXJlLCB3ZSdkIGFwcHJlY2lhdGUgaGVhcmluZwotYWJvdXQgdGhlbS4pCi0KLVRoZSBjb2RlIHdvcmtzIGZpbmUgb24gQU5TSSBDLCBDKyssIGFuZCBwcmUtQU5TSSBDIGNvbXBpbGVycywgdXNpbmcgYW55IG9mCi10aGUgcG9wdWxhciBzeXN0ZW0gaW5jbHVkZSBmaWxlIHNldHVwcywgYW5kIHNvbWUgbm90LXNvLXBvcHVsYXIgb25lcyB0b28uCi1TZWUgaW5zdGFsbC5kb2MgZm9yIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcy4KLQotVGhlIGNvZGUgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgZXhhY3Qgc2l6ZXMgb2YgdGhlIEMgZGF0YSB0eXBlcy4gIEFzCi1kaXN0cmlidXRlZCwgd2UgbWFrZSB0aGUgYXNzdW1wdGlvbnMgdGhhdAotCWNoYXIJaXMgYXQgbGVhc3QgOCBiaXRzIHdpZGUKLQlzaG9ydAlpcyBhdCBsZWFzdCAxNiBiaXRzIHdpZGUKLQlpbnQJaXMgYXQgbGVhc3QgMTYgYml0cyB3aWRlCi0JbG9uZwlpcyBhdCBsZWFzdCAzMiBiaXRzIHdpZGUKLShUaGVzZSBhcmUgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIHRoZSBBTlNJIEMgc3RhbmRhcmQuKSAgV2lkZXIgdHlwZXMgd2lsbAotd29yayBmaW5lLCBhbHRob3VnaCBtZW1vcnkgbWF5IGJlIHVzZWQgaW5lZmZpY2llbnRseSBpZiBjaGFyIGlzIG11Y2ggbGFyZ2VyCi10aGFuIDggYml0cyBvciBzaG9ydCBpcyBtdWNoIGJpZ2dlciB0aGFuIDE2IGJpdHMuICBUaGUgY29kZSBzaG91bGQgd29yawotZXF1YWxseSB3ZWxsIHdpdGggMTYtIG9yIDMyLWJpdCBpbnRzLgotCi1JbiBhIHN5c3RlbSB3aGVyZSB0aGVzZSBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldCwgeW91IG1heSBiZSBhYmxlIHRvIG1ha2UgdGhlCi1jb2RlIHdvcmsgYnkgbW9kaWZ5aW5nIHRoZSB0eXBlZGVmcyBpbiBqbW9yZWNmZy5oLiAgSG93ZXZlciwgeW91IHdpbGwgcHJvYmFibHkKLWhhdmUgZGlmZmljdWx0eSBpZiBpbnQgaXMgbGVzcyB0aGFuIDE2IGJpdHMgd2lkZSwgc2luY2UgcmVmZXJlbmNlcyB0byBwbGFpbgotaW50IGFib3VuZCBpbiB0aGUgY29kZS4KLQotY2hhciBjYW4gYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZCwgYWx0aG91Z2ggdGhlIGNvZGUgcnVucyBmYXN0ZXIgaWYgYW4KLXVuc2lnbmVkIGNoYXIgdHlwZSBpcyBhdmFpbGFibGUuICBJZiBjaGFyIGlzIHdpZGVyIHRoYW4gOCBiaXRzLCB5b3Ugd2lsbCBuZWVkCi10byByZWRlZmluZSBKT0NURVQgYW5kL29yIHByb3ZpZGUgY3VzdG9tIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIHNvCi10aGF0IEpPQ1RFVCByZXByZXNlbnRzIGV4YWN0bHkgOCBiaXRzIG9mIGRhdGEgb24gZXh0ZXJuYWwgc3RvcmFnZS4KLQotVGhlIEpQRUcgbGlicmFyeSBwcm9wZXIgZG9lcyBub3QgYXNzdW1lIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJhY3RlcnMuCi1CdXQgc29tZSBvZiB0aGUgaW1hZ2UgZmlsZSBJL08gbW9kdWxlcyBpbiBjanBlZy9kanBlZyBkbyBoYXZlIEFTQ0lJCi1kZXBlbmRlbmNpZXMgaW4gZmlsZS1oZWFkZXIgbWFuaXB1bGF0aW9uOyBzbyBkb2VzIGNqcGVnJ3Mgc2VsZWN0X2ZpbGVfdHlwZSgpCi1yb3V0aW5lLgotCi1UaGUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IHJlbHkgaGVhdmlseSBvbiB0aGUgQyBsaWJyYXJ5LiAgSW4gcGFydGljdWxhciwgQwotc3RkaW8gaXMgdXNlZCBvbmx5IGJ5IHRoZSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGVzIGFuZCB0aGUgZXJyb3IKLWhhbmRsZXIsIGFsbCBvZiB3aGljaCBhcmUgYXBwbGljYXRpb24tcmVwbGFjZWFibGUuICAoY2pwZWcvZGpwZWcgYXJlIG1vcmUKLWhlYXZpbHkgZGVwZW5kZW50IG9uIHN0ZGlvLikgIG1hbGxvYyBhbmQgZnJlZSBhcmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgbWVtb3J5Ci1tYW5hZ2VyICJiYWNrIGVuZCIgbW9kdWxlLCBzbyB5b3UgY2FuIHVzZSBhIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdG9yIGJ5Ci1yZXBsYWNpbmcgdGhhdCBvbmUgZmlsZS4KLQotVGhlIGNvZGUgZ2VuZXJhbGx5IGFzc3VtZXMgdGhhdCBDIG5hbWVzIG11c3QgYmUgdW5pcXVlIGluIHRoZSBmaXJzdCAxNQotY2hhcmFjdGVycy4gIEhvd2V2ZXIsIGdsb2JhbCBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgbWFkZSB1bmlxdWUgaW4gdGhlCi1maXJzdCA2IGNoYXJhY3RlcnMgYnkgZGVmaW5pbmcgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUy4KLQotTW9yZSBpbmZvIGFib3V0IHBvcnRpbmcgdGhlIGNvZGUgbWF5IGJlIGdsZWFuZWQgYnkgcmVhZGluZyBqY29uZmlnLmRvYywKLWptb3JlY2ZnLmgsIGFuZCBqaW5jbHVkZS5oLgotCi0KLU5vdGVzIGZvciBNUy1ET1MgaW1wbGVtZW50b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgSUpHIGNvZGUgaXMgZGVzaWduZWQgdG8gd29yayBlZmZpY2llbnRseSBpbiA4MHg4NiAic21hbGwiIG9yICJtZWRpdW0iCi1tZW1vcnkgbW9kZWxzIChpLmUuLCBkYXRhIHBvaW50ZXJzIGFyZSAxNiBiaXRzIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkCi0iZmFyIjsgY29kZSBwb2ludGVycyBjYW4gYmUgZWl0aGVyIHNpemUpLiAgWW91IG1heSBiZSBhYmxlIHRvIHVzZSBzbWFsbAotbW9kZWwgdG8gY29tcGlsZSBjanBlZyBvciBkanBlZyBieSBpdHNlbGYsIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZQotbWVkaXVtIG1vZGVsIGZvciBhbnkgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3b24ndCBtYWtlIG11Y2ggZGlmZmVyZW5jZSBpbgotcGVyZm9ybWFuY2UuICBZb3UgKndpbGwqIHRha2UgYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGhpdCBpZiB5b3UgdXNlIGEKLWxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsIChwZXJoYXBzIDEwJS0yNSUpLCBhbmQgeW91IHNob3VsZCBhdm9pZCAiaHVnZSIgbW9kZWwKLWlmIGF0IGFsbCBwb3NzaWJsZS4KLQotVGhlIEpQRUcgbGlicmFyeSB0eXBpY2FsbHkgbmVlZHMgMktiLTNLYiBvZiBzdGFjayBzcGFjZS4gIEl0IHdpbGwgYWxzbwotbWFsbG9jIGFib3V0IDIwSy0zMEsgb2YgbmVhciBoZWFwIHNwYWNlIHdoaWxlIGV4ZWN1dGluZyAoYW5kIGxvdHMgb2YgZmFyCi1oZWFwLCBidXQgdGhhdCBkb2Vzbid0IGNvdW50IGluIHRoaXMgY2FsY3VsYXRpb24pLiAgVGhpcyBmaWd1cmUgd2lsbCB2YXJ5Ci1kZXBlbmRpbmcgb24gc2VsZWN0ZWQgb3BlcmF0aW5nIG1vZGUsIGFuZCB0byBhIGxlc3NlciBleHRlbnQgb24gaW1hZ2Ugc2l6ZS4KLVRoZXJlIGlzIGFsc28gYWJvdXQgNUtiLTZLYiBvZiBjb25zdGFudCBkYXRhIHdoaWNoIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZQotbmVhciBkYXRhIHNlZ21lbnQgKGFib3V0IDRLYiBvZiB0aGlzIGlzIHRoZSBlcnJvciBtZXNzYWdlIHRhYmxlKS4KLVRodXMgeW91IGhhdmUgcGVyaGFwcyAyMEsgYXZhaWxhYmxlIGZvciBvdGhlciBtb2R1bGVzJyBzdGF0aWMgZGF0YSBhbmQgbmVhcgotaGVhcCBzcGFjZSBiZWZvcmUgeW91IG5lZWQgdG8gZ28gdG8gYSBsYXJnZXIgbWVtb3J5IG1vZGVsLiAgVGhlIEMgbGlicmFyeSdzCi1zdGF0aWMgZGF0YSB3aWxsIGFjY291bnQgZm9yIHNldmVyYWwgSyBvZiB0aGlzLCBidXQgdGhhdCBzdGlsbCBsZWF2ZXMgYSBnb29kCi1kZWFsIGZvciB5b3VyIG5lZWRzLiAgKElmIHlvdSBhcmUgdGlnaHQgb24gc3BhY2UsIHlvdSBjb3VsZCByZWR1Y2UgdGhlIHNpemVzCi1vZiB0aGUgSS9PIGJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IGpkYXRhc3JjLmMgYW5kIGpkYXRhZHN0LmMsIHNheSBmcm9tIDRLIHRvCi0xSy4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gbW92ZSB0aGUgZXJyb3IgbWVzc2FnZSB0YWJsZSB0byBmYXIgbWVtb3J5OwotdGhpcyBzaG91bGQgYmUgZG9hYmxlIHdpdGggb25seSBsb2NhbGl6ZWQgaGFja2luZyBvbiBqZXJyb3IuYy4pCi0KLUFib3V0IDJLIG9mIHRoZSBuZWFyIGhlYXAgc3BhY2UgaXMgInBlcm1hbmVudCIgbWVtb3J5IHRoYXQgd2lsbCBub3QgYmUKLXJlbGVhc2VkIHVudGlsIHlvdSBkZXN0cm95IHRoZSBKUEVHIG9iamVjdC4gIFRoaXMgaXMgb25seSBhbiBpc3N1ZSBpZiB5b3UKLXNhdmUgYSBKUEVHIG9iamVjdCBiZXR3ZWVuIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucy4KLQotRmFyIGRhdGEgc3BhY2UgbWF5IGFsc28gYmUgYSB0aWdodCByZXNvdXJjZSB3aGVuIHlvdSBhcmUgZGVhbGluZyB3aXRoIGxhcmdlCi1pbWFnZXMuICBUaGUgbW9zdCBtZW1vcnktaW50ZW5zaXZlIGNhc2UgaXMgZGVjb21wcmVzc2lvbiB3aXRoIHR3by1wYXNzIGNvbG9yCi1xdWFudGl6YXRpb24sIG9yIHNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbG9yCi1tYXAuICBUaGlzIHJlcXVpcmVzIGEgMTI4S2IgY29sb3IgbG9va3VwIHRhYmxlIHBsdXMgc3RyaXAgYnVmZmVycyBhbW91bnRpbmcKLXRvIGFib3V0IDQwIGJ5dGVzIHBlciBjb2x1bW4gZm9yIHR5cGljYWwgc2FtcGxpbmcgcmF0aW9zIChlZywgYWJvdXQgMjU2MDAKLWJ5dGVzIGZvciBhIDY0MC1waXhlbC13aWRlIGltYWdlKS4gIFlvdSBtYXkgbm90IGJlIGFibGUgdG8gcHJvY2VzcyB3aWRlCi1pbWFnZXMgaWYgeW91IGhhdmUgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIG9mIHlvdXIgb3duLgotCi1PZiBjb3Vyc2UsIGFsbCBvZiB0aGVzZSBjb25jZXJucyB2YW5pc2ggaWYgeW91IHVzZSBhIDMyLWJpdCBmbGF0LW1lbW9yeS1tb2RlbAotY29tcGlsZXIsIHN1Y2ggYXMgREpHUFAgb3IgV2F0Y29tIEMuICBXZSBoaWdobHkgcmVjb21tZW5kIGZsYXQgbW9kZWwgaWYgeW91Ci1jYW4gdXNlIGl0OyB0aGUgSlBFRyBsaWJyYXJ5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGluIGZsYXQgbW9kZWwuCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9sdGNvbmZpZyBiL2xpYmpwZWd0d3JwL2x0Y29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMzQ3ZTY5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL2x0Y29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgbHRjb25maWcgLSBDcmVhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbC4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBsb3Qgb2YgdGhpcyBzY3JpcHQgaXMgdGFrZW4gZnJvbSBhdXRvY29uZi0yLjEwLgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKLQotZWNobz1lY2hvCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4gOgotZWxzZQotICAjIFRoZSBTb2xhcmlzIGFuZCBBSVggZGVmYXVsdCBlY2hvIHByb2dyYW0gdW5xdW90ZXMgYmFja3NsYXNoZXMuCi0gICMgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMgU28sIHdlIGVtdWxhdGUgZWNobyB3aXRoIHByaW50ZiAnJXNcbicKLSAgZWNobz0icHJpbnRmICVzXFxuIgotICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4gOgotICBlbHNlCi0gICAgIyBPb3BzLiAgV2UgaGF2ZSBubyB3b3JraW5nIHByaW50Zi4gIFRyeSB0byBmaW5kIGEgbm90LXNvLWJ1Z2d5IGVjaG8uCi0gICAgZWNobz1lY2hvCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgICAgaWYgdGVzdCAtZiAkZGlyL2VjaG8gJiYgdGVzdCAiWGAkZGlyL2VjaG8gJ1x0J2AiID0gJ1hcdCc7IHRoZW4KLSAgICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gIGZpCi1maQotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiWCQwIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSMgQ29uc3RhbnRzOgotUFJPR1JBTT1sdGNvbmZpZwotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuMgotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuYyAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuYyAkTElCUyAxPiY1Jwotcm09InJtIC1mIgotCi1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi1lbmFibGVfc2hhcmVkPXllcwotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZy4KLWVuYWJsZV9zdGF0aWM9eWVzCi1sdG1haW49Ci1zaWxlbnQ9Ci1zcmNkaXI9Ci1hY19jb25maWdfZ3Vlc3M9Ci1hY19jb25maWdfc3ViPQotaG9zdD0KLW5vbm9wdD0KLXZlcmlmeV9ob3N0PXllcwotd2l0aF9nY2M9bm8KLXdpdGhfZ251X2xkPW5vCi0KLW9sZF9BUj0iJEFSIgotb2xkX0NDPSIkQ0MiCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotb2xkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi1vbGRfTEQ9IiRMRCIKLW9sZF9MTl9TPSIkTE5fUyIKLW9sZF9OTT0iJE5NIgotb2xkX1JBTkxJQj0iJFJBTkxJQiIKLQotIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi1hcmdzPQotcHJldj0KLWZvciBvcHRpb24KLWRvCi0gIGNhc2UgIiRvcHRpb24iIGluCi0gIC0qPSopIG9wdGFyZz1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgZXZhbCAiJHByZXY9XCRvcHRpb24iCi0gICAgcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRvcHRpb24iIGluCi0gIC0taGVscCkgY2F0IDw8RU9NCi1Vc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIExUTUFJTiBbSE9TVF0KLQotR2VuZXJhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbCBzY3JpcHQuCi0KLSAgICAtLWRpc2FibGUtc2hhcmVkICAgICAgIGRvIG5vdCBidWlsZCBzaGFyZWQgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLXN0YXRpYyAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcwotICAgIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAtLW5vLXZlcmlmeSAgICAgICAgICAgIGRvIG5vdCB2ZXJpZnkgdGhhdCBIT1NUIGlzIGEgdmFsaWQgaG9zdCB0eXBlCi0gICAgLS1xdWlldCAgICAgICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgZmluZCBcYGNvbmZpZy5ndWVzcycgaW4gRElSCi0gICAgLS12ZXJzaW9uICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0td2l0aC1nY2MgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEdOVSBDIGNvbXBpbGVyIHdpbGwgYmUgdXNlZAotICAgIC0td2l0aC1nbnUtbGQgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEMgY29tcGlsZXIgdXNlcyB0aGUgR05VIGxpbmtlcgotCi1MVE1BSU4gaXMgdGhlIFxgbHRtYWluLnNoJyBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBwcm92aWRlcyBiYXNpYyBsaWJ0b29sCi1mdW5jdGlvbmFsaXR5LgotCi1IT1NUIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzeXN0ZW0gbmFtZSBbZGVmYXVsdD1ndWVzc2VkXS4KLUVPTQotICBleGl0IDAKLSAgOzsKLQotICAtLWRpc2FibGUtc2hhcmVkKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLXN0YXRpYykgZW5hYmxlX3N0YXRpYz1ubyA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkgc2lsZW50PXllcyA7OwotCi0gIC0tc3JjZGlyKSBwcmV2PXNyY2RpciA7OwotICAtLXNyY2Rpcj0qKSBzcmNkaXI9IiRvcHRhcmciIDs7Ci0KLSAgLS1uby12ZXJpZnkpIHZlcmlmeV9ob3N0PW5vIDs7Ci0KLSAgLS12ZXJzaW9uKSBlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiI7IGV4aXQgMCA7OwotCi0gIC0td2l0aC1nY2MpIHdpdGhfZ2NjPXllcyA7OwotICAtLXdpdGgtZ251LWxkKSB3aXRoX2dudV9sZD15ZXMgOzsKLQotICAtKikKLSAgICBlY2hvICIkcHJvZ25hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gICAgICBsdG1haW49IiRvcHRpb24iCi0gICAgZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KLSMgVGhpcyBnZW5lcmF0ZXMgYW4gdW5uZWNlc3Nhcnkgd2FybmluZyBmb3Igc3BhcmMtc3VuLXNvbGFyaXM0LjEuM19VMQotIyAgICAgIGlmIHRlc3QgLW4gImBlY2hvICRvcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0jICAgICAgICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmcgXGAkb3B0aW9uJyBpcyBub3QgYSB2YWxpZCBob3N0IHR5cGUiIDE+JjIKLSMgICAgICBmaQotICAgICAgaG9zdD0iJG9wdGlvbiIKLSAgICBlbHNlCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IHRvbyBtYW55IGFyZ3VtZW50cyIgMT4mMgotICAgICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTFRNQUlOIGZpbGUiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbiA6Ci1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogXGAkbHRtYWluJyBkb2VzIG5vdCBleGlzdCIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgUXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWx0Y29uZmlnX2FyZ3M9Ci1mb3IgYXJnCi1kbwotICBjYXNlICIkYXJnIiBpbgotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAnJGFyZyciIDs7Ci0gICopIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICRhcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBBIHJlbGV2YW50IHN1YnNldCBvZiBBQ19JTklULgotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gICMgQXNzdW1lIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIG9uZSBhcyB0aGUgcGF0aCB0byBsdG1haW4uc2guCi0gIHNyY2Rpcj1gJGVjaG8gIiRsdG1haW4iIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgdGVzdCAiJHNyY2RpciIgPSAiJGx0bWFpbiIgJiYgc3JjZGlyPS4KLWZpCi0KLXRyYXAgIiRybSBjb25mdGVzdCo7IGV4aXQgMSIgMSAyIDE1Ci1pZiB0ZXN0ICIkdmVyaWZ5X2hvc3QiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgZm9yIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1Yi4KLSAgYWNfYXV4X2Rpcj0KLSAgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvY29uZmlnLmd1ZXNzOyB0aGVuCi0gICAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBmaW5kIGNvbmZpZy5ndWVzcyBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gIGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLSAgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi0KLSAgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotCi0gIGhvc3RfYWxpYXM9JGhvc3QKLSAgY2FzZSAiJGhvc3RfYWxpYXMiIGluCi0gICIiKQotICAgIGlmIGhvc3RfYWxpYXM9YCRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotICBob3N0PWAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLSAgZWNobyAiJGFjX3QkaG9zdCIgMT4mNgotCi0gICMgTWFrZSBzdXJlIHRoZSBob3N0IHZlcmlmaWVkLgotICB0ZXN0IC16ICIkaG9zdCIgJiYgZXhpdCAxCi0KLWVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGhvc3QgdHlwZSBpZiB5b3UgdXNlIFxgLS1uby12ZXJpZnknIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZWxzZQotICBob3N0X2FsaWFzPSRob3N0Ci1maQotCi0jIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eC1nbnUqKSA7OwotbGludXgqKSBob3N0PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qLS4qLWxpbnV4XClcKC4qXCkkL1wxLWdudVwyLydgCi1lc2FjCi0KLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgotICAgIENPTExFQ1RfTkFNRVM9Ci0gICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCi1vbGRfYXJjaGl2ZV9jbWRzPSckQVIgY3J1ICRvbGRsaWIkb2xkb2JqcycKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9Ci0KLSMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgQVInLgotdGVzdCAteiAiJEFSIiAmJiBBUj1hcgotCi0jIElmIFJBTkxJQiBpcyBub3Qgc2V0LCB0aGVuIHJ1biB0aGUgdGVzdC4KLWlmIHRlc3QgIiR7UkFOTElCK3NldH0iICE9ICJzZXQiOyB0aGVuCi0gIHJlc3VsdD1ubwotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByYW5saWIuLi4gJGFjX2MiIDE+JjYKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9yYW5saWI7IHRoZW4KLSAgICAgIFJBTkxJQj0icmFubGliIgotICAgICAgcmVzdWx0PSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgZWNobyAiJGFjX3QkcmVzdWx0IiAxPiY2Ci1maQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kcztcJFJBTkxJQiBcJG9sZGxpYiIKLSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGliOyRvbGRfcG9zdGluc3RhbGxfY21kcyIKLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB1c2luZyBHQ0MuCi1pZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllcyB8fCB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgSWYgQ0MgaXMgbm90IHNldCwgdGhlbiB0cnkgdG8gZmluZCBHQ0Mgb3IgYSB1c2FibGUgQ0MuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2NjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgotCUNDPSJnY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLSAgZmkKLQotICAjIE5vdCAiZ2NjIiwgc28gdHJ5ICJjYyIsIHJlamVjdGluZyAiL3Vzci91Y2IvY2MiLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBjY19yZWplY3RlZD1ubwotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2NjOyB0aGVuCi0JaWYgdGVzdCAiJGRpci9jYyIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0JICBjY19yZWplY3RlZD15ZXMKLQkgIGNvbnRpbnVlCi0JZmkKLQlDQz0iY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGlmIHRlc3QgJGNjX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICAgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gICAgICBzZXQgZHVtbXkgJENDCi0gICAgICBzaGlmdAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotCSMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotCSMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIG5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotCSMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIG5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0Jc2hpZnQKLQlzZXQgZHVtbXkgIiRkaXIvY2MiICIkQCIKLQlzaGlmdAotCUNDPSIkQCIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLQotICAjIE5vdyBzZWUgaWYgdGhlIGNvbXBpbGVyIGlzIHJlYWxseSBHQ0MuCi0gIHdpdGhfZ2NjPW5vCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uICRhY19jIiAxPiY2Ci0gIGVjaG8gIiRwcm9nbmFtZTo0MjQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLQotICAkcm0gY29uZnRlc3QuYwotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLSAgaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gJHByb2duYW1lOjQzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgd2l0aF9nY2M9eWVzCi0gIGZpCi0gICRybSBjb25mdGVzdC5jCi0gIGVjaG8gIiRhY190JHdpdGhfZ2NjIiAxPiY2Ci1maQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotc2V0IGR1bW15ICRDQwotY29tcGlsZXI9IiQyIgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkYWNfYyIgMT4mNgotcGljX2ZsYWc9Ci1zcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Ci13bD0KLWxpbmtfc3RhdGljX2ZsYWc9Ci1ub19idWlsdGluX2ZsYWc9Ci0KLWlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgd2w9Jy1XbCwnCi0gIGxpbmtfc3RhdGljX2ZsYWc9Jy1zdGF0aWMnCi0gIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KiB8IGlyaXg1KiB8IGlyaXg2KiB8IG9zZjMqIHwgb3NmNCopCi0gICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgOzsKLSAgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotICBhbWlnYW9zKikKLSAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICBwaWNfZmxhZz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgIDs7Ci0gICopCi0gICAgcGljX2ZsYWc9Jy1mUElDJwotICAgIDs7Ci0gIGVzYWMKLWVsc2UKLSAgIyBQT1JUTUUgQ2hlY2sgZm9yIFBJQyBmbGFncyBmb3IgdGhlIHN5c3RlbSBjb21waWxlci4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICA7OwotCi0gIGhwdXg5KiB8IGhwdXgxMCopCi0gICAgIyBJcyB0aGVyZSBhIGJldHRlciBsaW5rX3N0YXRpY19mbGFnIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSIke3dsfS1hICR7d2x9YXJjaGl2ZSIKLSAgICBwaWNfZmxhZz0nK1onCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgIDs7Ci0KLSAgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotCi0gIG9zZjMqIHwgb3NmNCopCi0gICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgcGljX2ZsYWc9Jy1LcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1kbicKLSAgICBzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Jy1iZWxmJwotICAgIDs7Ci0KLSAgc29sYXJpczIqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgcGljX2ZsYWc9Jy1QSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1Rb3B0aW9uIGxkICcKLSAgICA7OwotCi0gIHN5c3Y0LjJ1dzIqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIHBpY19mbGFnPSctcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIDs7Ci0KLSAgKikKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICBlY2hvICIkYWNfdCRwaWNfZmxhZyIgMT4mNgotCi0gICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gPiBjb25mdGVzdC5jCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgJHBpY19mbGFnIC1EUElDIgotICBlY2hvICIkcHJvZ25hbWU6NTQ3OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1NDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotICAgICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLQotICAgICMgT24gSFAtVVgsIGJvdGggQ0MgYW5kIEdDQyBvbmx5IHdhcm4gdGhhdCBQSUMgaXMgc3VwcG9ydGVkLi4uIHRoZW4gdGhleQotICAgICMgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UgYXNzdW1lIHRoYXQKLSAgICAjIFBJQyBpcyBub3Qgc3VwcG9ydGVkLgotICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBwaWNfZmxhZz0KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIHBpY19mbGFnPQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci1maQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KLWlmIHRlc3QgLW4gIiRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZzogXGAkQ0MnIHJlcXVpcmVzIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3NbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogYWRkIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiAxPiYyCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdtYWluKCl7cmV0dXJuKDApO30nID4gY29uZnRlc3QuYwotc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLUxERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotZWNobyAiJHByb2duYW1lOjU5MTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgZWNobyAiJGFjX3QkbGlua19zdGF0aWNfZmxhZyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLSAgbGlua19zdGF0aWNfZmxhZz0KLWZpCi1MREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IC16ICIkTE5fUyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSBsbiAtcywgb3Igd2UgbmVlZCBoYXJkIGxpbmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdGRhdGEKLSAgaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGw7IHRoZW4KLSAgICAkcm0gY29uZnRlc3RkYXRhCi0gICAgTE5fUz0ibG4gLXMiCi0gIGVsc2UKLSAgICBMTl9TPWxuCi0gIGZpCi0gIGlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotZmkKLQotIyBNYWtlIHN1cmUgTEQgaXMgYW4gYWJzb2x1dGUgcGF0aC4KLWlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgYWNfcHJvZz1sZAotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjYyNDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gICAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpcXCopCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICAgIiIpCi0gICAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlIG5vdCB1c2luZyBHQ0MuCi0gICAgICBhY19wcm9nPWxkCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo2NDI6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotICBlbHNlCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo2NDU6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0JTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotCSMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLQkjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLQlpZiAiJExEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCWVsc2UKLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfaWZzIgotICBmaQotCi0gIGlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCRMRCIgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgaXQgcmVhbGx5IGlzIG9yIGlzIG5vdCBHTlUgbGQuCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotZWNobyAiJGFjX3Qkd2l0aF9nbnVfbGQiIDE+JjYKLQotIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLQotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci1ub191bmRlZmluZWRfZmxhZz0KLWFyY2hpdmVfY21kcz0KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLWhhcmRjb2RlX2RpcmVjdD1ubwotaGFyZGNvZGVfbWludXNfTD1ubwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotcnVucGF0aF92YXI9Ci0KLWNhc2UgIiRob3N0X29zIiBpbgotYW1pZ2FvcyogfCBzdW5vczQqKQotICAjIE9uIHRoZXNlIG9wZXJhdGluZyBzeXN0ZW1zLCB3ZSBzaG91bGQgdHJlYXQgR05VIGxkIGxpa2UgdGhlIHN5c3RlbSBsZC4KLSAgZ251X2xkX2FjdHNfbmF0aXZlPXllcwotICA7OwotKikKLSAgZ251X2xkX2FjdHNfbmF0aXZlPW5vCi0gIDs7Ci1lc2FjCi0KLWxkX3NobGlicz15ZXMKLWlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXMgJiYgdGVzdCAiJGdudV9sZF9hY3RzX25hdGl2ZSIgIT0geWVzOyB0aGVuCi0KLSAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWIkbGlib2JqcycKLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIGxkX3NobGlicz15ZXMKLSAgZWxzZQotICAgIGxkX3NobGlicz1ubwotICBmaQotCi0gIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgZmkKLWVsc2UKLSAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyopCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhcmNoaXZlX2NtZHM9JyROTSRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgPiAkbGliLmV4cDskTEQgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianMgLWJFOiRsaWIuZXhwIC1UNTEyIC1INTEyIC1iTTpTUkU7JEFSIGNydSAkbGliICRvYmpkaXIvJHNvbmFtZScKLSAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLSAgICAgICMgYnJva2VuIGNvbGxlY3QyLgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeDQqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYXJjaGl2ZV9jbWRzPSckTk0kbGlib2JqcyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnID4gJGxpYi5leHA7JENDIC1vICRvYmpkaXIvJHNvbmFtZSRsaWJvYmpzICR7d2x9LWJFOiRsaWIuZXhwICR7d2x9LWJNOlNSRSAke3dsfS1ibm9lbnRyeTskQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JEFSIGNydSAkbGliJGxpYm9ianM7JFJBTkxJQiAkbGliOyhjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQotICAjIGV4dHJhIHNwYWNlKS4KLSAgZnJlZWJzZDIuMiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzIC91c3IvbGliL2MrK3J0MC5vJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gIGZyZWVic2QyKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDMsIGF0IGxhc3QsIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgZnJlZWJzZDMqKQotICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBocHV4OSopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci8kc29uYW1lOyRMRCAtYiArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianM7bXYgJG9iamRpci8kc29uYW1lICRsaWInCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaHB1eDEwKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAtc29uYW1lICRzb25hbWUgLXNldF92ZXJzaW9uICR2ZXJzdHJpbmckbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgOzsKLQotICBuZXRic2QqKQotICAgICMgVGVzdGVkIHdpdGggTmV0QlNEIDEuMiBsZAotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9wZW5ic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9zMiopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyBEQVRBID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gRVhQT1JUUyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjtlbXhleHAkbGlib2JqcyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiRsaWJvYmpzICRvYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb2JqZGlyLyRsaWJuYW1lLmEgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgOzsKLQotICBvc2YzKiB8IG9zZjQqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtbyAkbGliIC1zb25hbWUgJHNvbmFtZSAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyRsaWJvYmpzJGRlcGxpYnMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgOzsKLQotICBzb2xhcmlzMiopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLQotICAgICMgU29sYXJpcyAyIGJlZm9yZSAyLjUgaGFyZGNvZGVzIC1MIHBhdGhzLgotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIHNvbGFyaXMyLlswLTRdKikKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliJGxpYm9ianMnCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiRsaWJvYmpzJwotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LWV4cG9ydC1keW5hbWljJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIHV0czQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLWVjaG8gIiRhY190JGxkX3NobGlicyIgMT4mNgotCi1pZiB0ZXN0IC16ICIkTk0iOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkYWNfYyIgMT4mNgotICBjYXNlICIkTk0iIGluCi0gIC8qIHwgW0EtWmEtel06XFwqKSA7OyAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgKikKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBhY19kaXIgaW4gL3Vzci91Y2IgL3Vzci9jY3MvYmluICRQQVRIIC9iaW47IGRvCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgIE5NPSIkYWNfZGlyL25tIC1CIgotICAgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgIE5NPSIkYWNfZGlyL25tIC1wIgotCWVsc2UKLSAgICAgICAgICBOTT0iJGFjX2Rpci9ubSIKLQlmaQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJE5NIiAmJiBOTT1ubQotICAgIDs7Ci0gIGVzYWMKLSAgZWNobyAiJGFjX3QkTk0iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQuLi4gJGFjX2MiIDE+JjYKLQotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbQkNERUdSU1RVXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1zeW14ZnJtPSdcMSBcMScKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgc3ltY29kZT0nW0JDRFRVXScKLSAgOzsKLWlyaXgqKQotICAjIENhbm5vdCB1c2UgdW5kZWZpbmVkIHN5bWJvbHMgb24gSVJJWCBiZWNhdXNlIGlubGluZWQgZnVuY3Rpb25zIG1lc3MgdXMgdXAuCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzMiopCi0gIHN5bWNvZGU9J1tCRFRVXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgc3ltY29kZT0nW0FCQ0RHSVNUVVddJwotZmkKLQotIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qICRzeW1jb2RlICRzeW1wYXQkLyRzeW14ZnJtL3AnIgotCi0jIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLXBpcGVfd29ya3M9bm8KLSRybSBjb25mdGVzdCoKLWNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1tYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotZWNobyAiJHByb2duYW1lOjk3MTogY2hlY2tpbmcgaWYgZ2xvYmFsX3N5bWJvbF9waXBlIHdvcmtzIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6OTcyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyBlY2hvICIkcHJvZ25hbWU6OTc1OiBldmFsIFwiJE5NIGNvbmZ0ZXN0Lm8gfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0XCIiID4mNTsgZXZhbCAiJE5NIGNvbmZ0ZXN0Lm8gfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0IDI+JjUiOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLQotICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLSAgICAgIG12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgd2NvdXQ9YHdjICIkbmxpc3QiIDI+L2Rldi9udWxsYAotICAgICAgY291bnQ9YCRlY2hvICJYJHdjb3V0IiB8ICRYc2VkIC1lICdzL15bIAldKlwoWzAtOV1bMC05XSpcKS4qJC9cMS8nYAotICAgICAgKHRlc3QgIiRjb3VudCIgLWdlIDApIDI+L2Rldi9udWxsIHx8IGNvdW50PS0xCi0gICAgZWxzZQotICAgICAgcm0gLWYgIiRubGlzdCJUCi0gICAgICBjb3VudD0tMQotICAgIGZpCi0KLSAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0gICAgICAgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLSAgICAgICAgc2VkICdzL14uKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy8nIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYwotCi0JY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIF9fcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgX19wdHJfdCBjaGFyICoKLSNlbmRpZgotCi0vKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gZGxkX3ByZWxvYWRlZF9zeW1ib2xzLCAtMSBpZiB1bnNvcnRlZC4gKi8KLWludCBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudCA9ICRjb3VudDsKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1zdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICBfX3B0cl90IGFkZHJlc3M7Ci19Ci1kbGRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLSAgICAgICAgc2VkICdzL15cKC4qXCkgXCguKlwpJC8gIHsiXDEiLCAoX19wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCi0gICAgICAgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKF9fcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0gICAgICAgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0gICAgICAgIG12IGNvbmZ0ZXN0Lm8gY29uZnRlc3RtLm8KLQlzYXZlX0xJQlM9IiRMSUJTIgotCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgICAgICBMSUJTPSdjb25mdGVzdG0ubycKLQlDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotICAgICAgICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjEwMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICAgICAgICAgIHBpcGVfd29ya3M9eWVzCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgICAgICAgIGNhdCBjb25mdGVzdC5jID4mNQotICAgICAgICBmaQotICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgotICAgICAgZWxzZQotICAgICAgICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY2Fubm90IHJ1biAkZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotJHJtIGNvbmZ0ZXN0KgotCi0jIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi1lY2hvICIkYWNfdCRwaXBlX3dvcmtzIiAxPiY2Ci10ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXMgfHwgZ2xvYmFsX3N5bWJvbF9waXBlPQotCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJGFjX2MiIDE+JjYKLWhhcmRjb2RlX2FjdGlvbj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubzsgdGhlbgotCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IHllcyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSB5ZXM7IHRoZW4KLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcuCi0gIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAotZWxzZQotICAjIFdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi1maQotZWNobyAiJGFjX3QkaGFyZGNvZGVfYWN0aW9uIiAxPiY2Ci10ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHVuc3VwcG9ydGVkICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotCi1yZWxvYWRfZmxhZz0KLXJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gJGFjX2MiIDE+JjYKLSMgUE9SVE1FIFNvbWUgbGlua2VyIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgotcmVsb2FkX2ZsYWc9Jy1yJwotZWNobyAiJGFjX3QkcmVsb2FkX2ZsYWciCi10ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgotCi0jIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCi1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotCi1lY2hvICRhY19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJGFjX2MiIDE+JjYKLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyogfCBhaXg0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICIoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkiOyAoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1mcmVlYnNkMiogfCBmcmVlYnNkMyopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCcKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJG1ham9yICRsaWJuYW1lLnNsJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJG1ham9yJwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLQotICBpZiB0ZXN0IC1mIC9saWIvbGQuc28uMTsgdGhlbgotICAgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIGVsc2UKLSAgICAjIE9ubHkgdGhlIEdOVSBsZC5zbyBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIG9uIE1rTGludXguCi0gICAgY2FzZSAiJGhvc3RfY3B1IiBpbgotICAgIHBvd2VycGMqKSBkeW5hbWljX2xpbmtlcj1ubyA7OwotICAgICopIGR5bmFtaWNfbGlua2VyPSdMaW51eCBsZC5zbycgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci0KLW5ldGJzZCogfCBvcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zY28zLjJ2NSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc29sYXJpczIqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zeXN2NC4ydXcyKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLWVjaG8gIiRhY190JGR5bmFtaWNfbGlua2VyIgotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KLWVjaG8gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkY2FuX2J1aWxkX3NoYXJlZCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHM7XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotZXNhYwotCi1lY2hvICIkYWNfdCRlbmFibGVfc2hhcmVkIiAxPiY2Ci0KLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi0KLWVjaG8gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkZW5hYmxlX3N0YXRpYyIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRhY19jIiAxPiY2Ci1ybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIG9iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsCi1lY2hvICIkYWNfdCRvYmpkaXIiIDE+JjYKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCwgYmVjYXVzZSBpdCBpcwotIyB1c2VkIGxhdGVyLgotbHRlY2hvPSIkZWNobyIKLQotIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycy4KLWZvciB2YXIgaW4gbHRlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBvbGRfTEQgb2xkX05NIG9sZF9SQU5MSUIgXAotICBvbGRfTE5fUyBBUiBDQyBMRCBMTl9TIE5NIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIHdsIHBpY19mbGFnIFwKLSAgbGlua19zdGF0aWNfZmxhZyBub19idWlsdGluX2ZsYWcgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBSQU5MSUIgXAotICBvbGRfYXJjaGl2ZV9jbWRzIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAotICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBwb3N0aW5zdGFsbF9jbWRzIHBvc3R1bmluc3RhbGxfY21kcyBcCi0gIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKLSAgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgZ2xvYmFsX3N5bWJvbF9waXBlIFwKLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yOyBkbwotCi0gIGNhc2UgIiR2YXIiIGluCi0gIHJlbG9hZF9jbWRzIHwgb2xkX2FyY2hpdmVfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCi0gIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IGFyY2hpdmVfY21kcyB8IFwKLSAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IGZpbmlzaF9jbWRzKQotICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICBldmFsICIkdmFyPVxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYCIKLSAgICA7OwotICAqKQotICAgIGV2YWwgIiR2YXI9XGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGAiCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1vZmlsZT1saWJ0b29sCi10cmFwICIkcm0gJG9maWxlOyBleGl0IDEiIDEgMiAxNQotZWNobyBjcmVhdGluZyAkb2ZpbGUKLSRybSAkb2ZpbGUKLWNhdCA8PEVPRiA+ICRvZmlsZQotIyEgL2Jpbi9zaAotCi0jIGxpYnRvb2wgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04KLSMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRjb25maWcgb3IgbHRtYWluLnNoLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBUaGlzIHByb2dyYW0gd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jIENDPSIkb2xkX0NDIiBDRkxBR1M9IiRvbGRfQ0ZMQUdTIiBDUFBGTEFHUz0iJG9sZF9DUFBGTEFHUyIgXFwKLSMgTEQ9IiRvbGRfTEQiIE5NPSIkb2xkX05NIiBSQU5MSUI9IiRvbGRfUkFOTElCIiBMTl9TPSIkb2xkX0xOX1MiIFxcCi0jICAgJDAkbHRjb25maWdfYXJncwotIwotIyBDb21waWxlciBhbmQgb3RoZXIgdGVzdCBvdXRwdXQgcHJvZHVjZWQgYnkgJHByb2duYW1lLCB1c2VmdWwgZm9yCi0jIGRlYnVnZ2luZyAkcHJvZ25hbWUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSJzZWQgLWUgcy9eWC8vIgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiXCR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0iJGx0ZWNobyIKLQotIyBUaGUgdmVyc2lvbiBvZiAkcHJvZ25hbWUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBzY3JpcHQuCi1MVENPTkZJR19WRVJTSU9OPSIkVkVSU0lPTiIKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBsaWJ0b29sIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIG9sZC1zdHlsZSBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9IiRob3N0X2FsaWFzIgotaG9zdD0iJGhvc3QiCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9IiRBUiIKLQotIyBUaGUgZGVmYXVsdCBDIGNvbXBpbGVyLgotQ0M9IiRDQyIKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9IiRMRCIKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0iJExOX1MiCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09IiROTSIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9IiRvYmpkaXIiCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSIkcmVsb2FkX2ZsYWciCi1yZWxvYWRfY21kcz0iJHJlbG9hZF9jbWRzIgotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0iJHdsIgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSIkcGljX2ZsYWciCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9IiRsaW5rX3N0YXRpY19mbGFnIgotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9IiRub19idWlsdGluX2ZsYWciCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0iJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyIKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9IiRsaWJuYW1lX3NwZWMiCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0iJGxpYnJhcnlfbmFtZXNfc3BlYyIKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSIkc29uYW1lX3NwZWMiCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0iJFJBTkxJQiIKLW9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzIgotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kcyIKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9IiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIgotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHMiCi1wb3N0aW5zdGFsbF9jbWRzPSIkcG9zdGluc3RhbGxfY21kcyIKLXBvc3R1bmluc3RhbGxfY21kcz0iJHBvc3R1bmluc3RhbGxfY21kcyIKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9IiRmaW5pc2hfY21kcyIKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9IiRmaW5pc2hfZXZhbCIKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSIkZ2xvYmFsX3N5bWJvbF9waXBlIgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9IiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgotCi1FT0YKLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgY2F0IDw8XEVPRiA+PiAkb2ZpbGUKLSMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0jIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi1pZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotCi1FT0YKLSAgOzsKLWVzYWMKLQotIyBBcHBlbmQgdGhlIGx0bWFpbi5zaCBzY3JpcHQuCi1jYXQgIiRsdG1haW4iID4+ICRvZmlsZSB8fCAocm0gLWYgJG9maWxlOyBleGl0IDEpCi0KLWNobW9kICt4ICRvZmlsZQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL2x0bWFpbi5zaCBiL2xpYmpwZWd0d3JwL2x0bWFpbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzNTBiMy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9sdG1haW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUzICswLDAgQEAKLSMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGx0Y29uZmlnLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIiQwIiB8IHNlZCAncyVeLiovJSUnYAotbW9kZW5hbWU9IiRwcm9nbmFtZSIKLQotIyBDb25zdGFudHMuCi1QUk9HUkFNPWx0bWFpbi5zaAotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuMgotCi1kZWZhdWx0X21vZGU9Ci1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi1tYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCi1ta2Rpcj0ibWtkaXIiCi1tdj0ibXYgLWYiCi1ybT0icm0gLWYiCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcYFxcIiRcXFxcXVwpL1xcXDEvZycKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotCi1pZiB0ZXN0ICIkTFRDT05GSUdfVkVSU0lPTiIgIT0gIiRWRVJTSU9OIjsgdGhlbgotICBlY2hvICIkbW9kZW5hbWU6IGx0Y29uZmlnIHZlcnNpb24gXGAkTFRDT05GSUdfVkVSU0lPTicgZG9lcyBub3QgbWF0Y2ggJFBST0dSQU0gdmVyc2lvbiBcYCRWRVJTSU9OJyIgMT4mMgotICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgotICBlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIEdsb2JhbCB2YXJpYWJsZXMuCi1tb2RlPSRkZWZhdWx0X21vZGUKLW5vbm9wdD0KLXByZXY9Ci1wcmV2b3B0PQotcnVuPQotc2hvdz0iJGVjaG8iCi1zaG93X2hlbHA9Ci1leGVjdXRlX2RsZmlsZXM9Ci0KLSMgUGFyc2Ugb3VyIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuCi13aGlsZSB0ZXN0ICQjIC1ndCAwCi1kbwotICBhcmc9IiQxIgotICBzaGlmdAotCi0gIGNhc2UgIiRhcmciIGluCi0gIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGNhc2UgIiRwcmV2IiBpbgotICAgIGV4ZWN1dGVfZGxmaWxlcykKLSAgICAgIGV2YWwgIiRwcmV2PVwiXCQkcHJldiBcJGFyZ1wiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAiJHByZXY9XCRhcmciCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIHByZXY9Ci0gICAgcHJldm9wdD0KLSAgICBjb250aW51ZQotICBmaQotCi0gICMgSGF2ZSB3ZSBzZWVuIGEgbm9uLW9wdGlvbmFsIGFyZ3VtZW50IHlldD8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgLS1oZWxwKQotICAgIHNob3dfaGVscD15ZXMKLSAgICA7OwotCi0gIC0tdmVyc2lvbikKLSAgICBlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tZHJ5LXJ1biB8IC1uKQotICAgIHJ1bj06Ci0gICAgOzsKLQotICAtLWZlYXR1cmVzKQotICAgIGVjaG8gImhvc3Q6ICRob3N0IgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICBlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICBlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7Ci0KLSAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OwotICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKLQotICAtLXF1aWV0IHwgLS1zaWxlbnQpCi0gICAgc2hvdz06Ci0gICAgOzsKLQotICAtZGxvcGVuKQotICAgIHByZXZvcHQ9Ii1kbG9wZW4iCi0gICAgcHJldj1leGVjdXRlX2RsZmlsZXMKLSAgICA7OwotCi0gIC0qKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkYXJnJyIgMT4mMgotICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBub25vcHQ9IiRhcmciCi0gICAgYnJlYWsKLSAgICA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRwcmV2b3B0IjsgdGhlbgotICAkZWNobyAiJG1vZGVuYW1lOiBvcHRpb24gXGAkcHJldm9wdCcgcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAteiAiJHNob3dfaGVscCI7IHRoZW4KLQotICAjIEluZmVyIHRoZSBvcGVyYXRpb24gbW9kZS4KLSAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0gICAgY2FzZSAiJG5vbm9wdCIgaW4KLSAgICAqY2MgfCAqKysgfCBnY2MqIHwgKi1nY2MqKQotICAgICAgbW9kZT1saW5rCi0gICAgICBmb3IgYXJnCi0gICAgICBkbwotICAgICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgICAtYykKLSAgICAgICAgICAgbW9kZT1jb21waWxlCi0gICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgKmRiIHwgKmRieCkKLSAgICAgIG1vZGU9ZXhlY3V0ZQotICAgICAgOzsKLSAgICAqaW5zdGFsbCp8Y3B8bXYpCi0gICAgICBtb2RlPWluc3RhbGwKLSAgICAgIDs7Ci0gICAgKnJtKQotICAgICAgbW9kZT11bmluc3RhbGwKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCi0gICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKLQotICAgICAgIyBKdXN0IHVzZSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gbW9kZS4KLSAgICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgICAgICBpZiB0ZXN0IC1uICIkbm9ub3B0IjsgdGhlbgotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLSAgICAgICAgZWxzZQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSB3aXRob3V0IE1PREUtQVJHUyIgMT4mMgotICAgICAgICBmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICIkbW9kZSIgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgbGFzdGFyZz0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IgotICAgIHN1cHByZXNzX291dHB1dD0KLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1vKQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGVuYW1lIHdpdGggXGAtbyciIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLQk7OwotCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgotICAgICAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0gICAgICBzcmNmaWxlPSIkYXJnIgotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotCi0gICAgICAjIEJhY2tzbGFzaGlmeSBhbnkgYmFja3NsYXNoZXMsIGRvdWJsZSBxdW90ZXMsIGFuZCBkb2xsYXIgc2lnbnMuCi0gICAgICAjIFRoZXNlIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIHNwZWNpYWxseQotICAgICAgIyBpbnRlcnByZXRlZCBpbnNpZGUgb2YgZG91YmxlLXF1b3RlZCBzY3JpbmdzLgotICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5IGluIHNjYW4KLSAgICAgICMgc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotICAgICAgY2FzZSAiJGxhc3RhcmciIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZGQgdGhlIHByZXZpb3VzIGFyZ3VtZW50IHRvIGJhc2VfY29tcGlsZS4KLSAgICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0JYmFzZV9jb21waWxlPSIkbGFzdGFyZyIKLSAgICAgIGVsc2UKLQliYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KLSAgICBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgeGZvcm09J1tjQ0ZTZm1zXScKLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncy9cLmxvJC8uby8nYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRzcmNmaWxlJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKLSAgICAgIHRyYXAgIiRydW4gJHJtICRvYmogJGxpYm9iajsgZXhpdCAxIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICAkcnVuICRybSAkbGlib2JqCi0gICAgICB0cmFwICIkcnVuICRybSAkbGlib2JqOyBleGl0IDEiIDEgMiAxNQotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICAjIEFsbCBwbGF0Zm9ybXMgdXNlIC1EUElDLCB0byBub3RpZnkgcHJlcHJvY2Vzc2VkIGFzc2VtYmxlciBjb2RlLgotICAgICAgJHNob3cgIiRiYXNlX2NvbXBpbGUkcGljX2ZsYWcgLURQSUMgJHNyY2ZpbGUiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRiYXNlX2NvbXBpbGVcJHBpY19mbGFnIC1EUElDIFwkc3JjZmlsZSI7IHRoZW4gOgotICAgICAgZWxzZQotICAgICAgICB0ZXN0IC1uICIkb2JqIiAmJiAkcnVuICRybSAkb2JqCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIHBpY19mbGFnLCB0aGVuIGNvcHkgdGhlIG9iamVjdCBpbnRvIHBsYWNlIGFuZCBmaW5pc2guCi0gICAgICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciOyB0aGVuCi0gICAgICAgICRzaG93ICIkTE5fUyAkb2JqICRsaWJvYmoiCi0gICAgICAgICRydW4gJExOX1MgJG9iaiAkbGlib2JqCi0gICAgICAgIGV4aXQgJD8KLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKLSAgICAgICRzaG93ICIkbXYgJG9iaiAkbGlib2JqIgotICAgICAgJHJ1biAkbXYgJG9iaiAkbGlib2JqIHx8IGV4aXQgMQotCi0gICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgICRzaG93ICIkYmFzZV9jb21waWxlICRzcmNmaWxlJHN1cHByZXNzX291dHB1dCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGJhc2VfY29tcGlsZSBcJHNyY2ZpbGUkc3VwcHJlc3Nfb3V0cHV0IjsgdGhlbiA6Ci0gICAgICBlbHNlCi0gICAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotICAgICAgICBleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvIG5vdAotICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgICAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotICAgICAgJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+IFwkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgQ0M9IiRub25vcHQiCi0gICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgIGNvbXBpbGVfY29tbWFuZD0iJENDIgotICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRDQyIKLQotICAgIGNvbXBpbGVfc2hsaWJwYXRoPQotICAgIGZpbmFsaXplX3NobGlicGF0aD0KLSAgICBkZXBsaWJzPQotICAgIGRsZmlsZXM9Ci0gICAgZGxwcmVmaWxlcz0KLSAgICBleHBvcnRfZHluYW1pYz1ubwotICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgbGlib2Jqcz0KLSAgICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPQotICAgIGx0bGlicz0KLSAgICBvYmpzPQotICAgIHByZXY9Ci0gICAgcHJldmFyZz0KLSAgICByZWxlYXNlPQotICAgIHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB2aW5mbz0KLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCi0gICAgICAgIGlmIHRlc3QgIlgkYXJnIiA9ICJYLWFsbC1zdGF0aWMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgotICAgICAgICBmaQotICAgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLSAgICAgICAgYnJlYWsKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgICBjYXNlICIkcHJldiIgaW4KLSAgICAgICAgb3V0cHV0KQotICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKLSAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAiJHByZXYiIGluCi0gICAgICAgIGRsZmlsZXN8ZGxwcmVmaWxlcykKLSAgICAgICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgICAgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0gICAgICAgICAgKikKLSAgICAgICAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0gICAgICAgICAgICB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0gICAgICAgICAgICBwcmV2PQotICAgICAgICAgICAgOzsKLSAgICAgICAgICBlc2FjCi0gICAgICAgICAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0gICAgICAgIHJwYXRoKQotICAgICAgICAgIHJwYXRoPSIkcnBhdGggJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLSAgICAgICAgKikKLSAgICAgICAgICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0gICAgICAgICAgcHJldj0KLSAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIGZpCi0KLSAgICAgIHByZXZhcmc9IiRhcmciCi0KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYykKLQlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLSAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLSAgICAgICAgZmkKLSAgICAgICAgY29udGludWUKLQk7OwotCi0gICAgICAtYWxsb3ctdW5kZWZpbmVkKQotCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYC1hbGxvdy11bmRlZmluZWQnIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLSAgICAgICAgcHJldj1kbGZpbGVzCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0gICAgICAgIHByZXY9ZGxwcmVmaWxlcwotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0gICAgICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgIT0geWVzOyB0aGVuCi0gICAgICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBhcmc9Ci0JICBmaQotCi0gICAgICAgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0KLSAgICAgIC1MKikKLSAgICAgICAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi1MXCguKlwpJCVcMSUnYAotICAgICAgICBjYXNlICIkZGlyIiBpbgotICAgICAgICAvKiB8IFtBLVphLXpdOlxcKikKLQkgICMgQWRkIHRoZSBjb3JyZXNwb25kaW5nIGhhcmRjb2RlX2xpYmRpcl9mbGFnLCBpZiBpdCBpcyBub3QgaWRlbnRpY2FsLgotICAgICAgICAgIDs7Ci0gICAgICAgICopCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAtTCRkaXInIGNhbm5vdCBzcGVjaWZ5IGEgcmVsYXRpdmUgZGlyZWN0b3J5IiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotICAgICAgICA7OwotCi0gICAgICAtbCopIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciIDs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0gICAgICAgIHByZXY9cnBhdGgKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLQotICAgICAgLXN0YXRpYykKLQkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KLQlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotICAgICAgICBmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24taW5mbykKLSAgICAgICAgcHJldj12aW5mbwotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLSAgICAgICAgOzsKLQotICAgICAgKi5vIHwgKi5hKQotICAgICAgICAjIEEgc3RhbmRhcmQgb2JqZWN0LgotICAgICAgICBvYmpzPSIkb2JqcyAkYXJnIgotICAgICAgICA7OwotCi0gICAgICAqLmxvKQotICAgICAgICAjIEEgbGlicmFyeSBvYmplY3QuCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBlbHNlCi0JICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCi0JICBwcmV2PQotCWZpCi0JbGlib2Jqcz0iJGxpYm9ianMgJGFyZyIKLSAgICAgICAgOzsKLQotICAgICAgKi5sYSkKLSAgICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0gICAgICAgIGRsbmFtZT0KLSAgICAgICAgbGliZGlyPQotICAgICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgICBvbGRfbGlicmFyeT0KLQotICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotICAgICAgICBpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotCi0gICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotICAgICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgICAqLyogfCAqXFwqKSAuICRhcmcgOzsKLSAgICAgICAgKikgLiAuLyRhcmcgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBjb250YWlucyBubyAtcnBhdGggaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLQotICAgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0gICAgICAgIGxpbmtsaWI9Ci0gICAgICAgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLSAgICAgICAgICBsaW5rbGliPSIkbCIKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0gICAgICAgIG5hbWU9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0gICAgICAgIGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICAgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGFyZyI7IHRoZW4KLSAgICAgICAgICBkaXI9IiRvYmpkaXIiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXI9IiRkaXIvJG9iamRpciIKLSAgICAgICAgZmkKLQotICAgICAgICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLSAgICAgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotICAgICAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0gICAgICAgICAgaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLSAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCB3ZSBuZWVkIHRvIHByZWxvYWQuCi0gICAgICAgICAgICBwcmV2PWRscHJlZmlsZXMKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAjIFdlIHNob3VsZCBub3QgY3JlYXRlIGEgZGVwZW5kZW5jeSBvbiB0aGlzIGxpYnJhcnksIGJ1dCB3ZQotCSAgICAjIG1heSBuZWVkIGFueSBsaWJyYXJpZXMgaXQgcmVxdWlyZXMuCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLSAgICAgICAgICAgIHByZXY9Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLSAgICAgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotICAgICAgICAgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotICAgICAgICAgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLSAgICAgICAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgZmkKLSAgICAgICAgICBwcmV2PQotICAgICAgICBmaQotCi0gICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotICAgICAgICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9IiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzICRhcmciCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0gICAgICAgICAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCi0gICAgICAgICAgICAqIiAkZGlyICIqKSA7OwotICAgICAgICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGRpciIgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICBmaQotCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLSAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAgICAgICAgICAgIyBQdXQgdGhlIG1hZ2ljIGxpYmRpciB3aXRoIHRoZSBoYXJkY29kZSBmbGFnLgotICAgICAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0gICAgICAgICAgICAgICAgbGliZGlyPSJASEFSRENPREVfTElCRElSU0AiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JCWNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkJKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgIDs7Ci0JCSopCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgOzsKLQkJZXNhYwotICAgICAgICAgICAgICAgIGxpYmRpcj0KLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGZsYWciCi0gICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmbGFnIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgICAgICAgICMgRG8gdGhlIHNhbWUgZm9yIHRoZSBwZXJtYW5lbnQgcnVuIHBhdGguCi0gICAgICAgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0gICAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OwotICAgICAgICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICBmaQotCi0KLSAgICAgICAgICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotICAgICAgICAgIGltbWVkaWF0ZSkKLSAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKLSAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6IgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotCi0gICAgICAgICAgcmVsaW5rKQotICAgICAgICAgICAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0gICAgICAgICAgICBjYXNlICIkZGlyIiBpbgotICAgICAgICAgICAgLyogfCBbQS1aYS16XTpcXCopIDs7Ci0gICAgICAgICAgICAqKQotICAgICAgICAgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0gICAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCi0gICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIGRpcj0iJGFic2RpciIKLSAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCi0gICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGRpcjoiCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIDs7Ci0KLSAgICAgICAgICAqKQotICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkaGFyZGNvZGVfYWN0aW9uJyBpcyBhbiB1bmtub3duIGhhcmRjb2RlIGFjdGlvbiIgMT4mMgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICA7OwotICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0gICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaWJkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciAtbCRuYW1lIgotICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0gICAgICAgICAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIKLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciAtbCRuYW1lIgotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciICYmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLSAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHN0YXRpYyBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICBmaQotCi0JICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCi0JICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKLQkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgIGVsc2UKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKLQkgIGZpCi0gICAgICAgIGZpCi0KLQkjIEFkZCBpbiBhbnkgbGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIFxgLXZlcnNpb24taW5mbycgYW5kIFxgLXJlbGVhc2UnIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBvbGRsaWI9Ci0gICAgb2xkb2Jqcz0KLSAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICIiKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0KLSAgICAqLyogfCAqXFwqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogb3V0cHV0IGZpbGUgXGAkb3V0cHV0JyBtdXN0IGhhdmUgbm8gZGlyZWN0b3J5IGNvbXBvbmVudHMiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLQotICAgICouYSkKLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBidWlsZF9vbGRfbGlicz15ZXMKLSAgICAgIG9sZGxpYj0iJG91dHB1dCIKLSAgICAgICRzaG93ICIkcm0gJG9sZGxpYiIKLSAgICAgICRydW4gJHJtICRvbGRsaWIKLSAgICAgIDs7Ci0KLSAgICAqLmxhKQotICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgotICAgICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAgIGxpYiopIDs7Ci0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRhcmcnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLSAgICAgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0gICAgICBjdXJyZW50PTAKLSAgICAgIHJldmlzaW9uPTAKLSAgICAgIGFnZT0wCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBIb3cgdGhlIGhlY2sgYXJlIHdlIHN1cHBvc2VkIHRvIHdyaXRlIGEgd3JhcHBlciBmb3IgYSBzaGFyZWQgbGlicmFyeT8KLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtYXkgbm90IGRlcGVuZCBvbiB1bmluc3RhbGxlZCBsaWJyYXJpZXM6JGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2l0aCBcYC1ycGF0aCciIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBzZXQgZHVtbXkgJHJwYXRoCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiIDE+JjIKLSAgICAgIGZpCi0gICAgICBpbnN0YWxsX2xpYmRpcj0iJDIiCi0KLSAgICAgICMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotICAgICAgc2V0IGR1bW15ICR2aW5mbwotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiQ1IjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciIDE+JjIKLSAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgdGVzdCAtbiAiJDIiICYmIGN1cnJlbnQ9IiQyIgotICAgICAgdGVzdCAtbiAiJDMiICYmIHJldmlzaW9uPSIkMyIKLSAgICAgIHRlc3QgLW4gIiQ0IiAmJiBhZ2U9IiQ0IgotCi0gICAgICAjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgotICAgICAgY2FzZSAiJGN1cnJlbnQiIGluCi0gICAgICAwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLSAgICAgICopCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgIiRyZXZpc2lvbiIgaW4KLSAgICAgIDAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotICAgICAgKikKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICIkYWdlIiBpbgotICAgICAgMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0gICAgICAqKQotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0gICAgICB2ZXJzaW9uX3ZhcnM9InZlcnNpb25fdHlwZSBjdXJyZW50IGFnZSByZXZpc2lvbiIKLSAgICAgIGNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0gICAgICBub25lKSA7OwotCi0gICAgICBsaW51eCkKLSAgICAgICAgdmVyc2lvbl92YXJzPSIkdmVyc2lvbl92YXJzIG1ham9yIHZlcnN1ZmZpeCIKLSAgICAgICAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotICAgICAgICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLSAgICAgICAgOzsKLQotICAgICAgb3NmKQotICAgICAgICB2ZXJzaW9uX3ZhcnM9IiR2ZXJzaW9uX3ZhcnMgdmVyc3VmZml4IHZlcnN0cmluZyIKLSAgICAgICAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotICAgICAgICB2ZXJzdWZmaXg9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotICAgICAgICB2ZXJzdHJpbmc9IiR2ZXJzdWZmaXgiCi0KLSAgICAgICAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLSAgICAgICAgbG9vcD0kYWdlCi0gICAgICAgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLSAgICAgICAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAotICAgICAgICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotICAgICAgICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotICAgICAgICBkb25lCi0KLSAgICAgICAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotICAgICAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotICAgICAgICA7OwotCi0gICAgICBzdW5vcykKLSAgICAgICAgdmVyc2lvbl92YXJzPSIkdmVyc2lvbl92YXJzIG1ham9yIHZlcnN1ZmZpeCIKLSAgICAgICAgbWFqb3I9IiRjdXJyZW50IgotICAgICAgICB2ZXJzdWZmaXg9IiRjdXJyZW50LiRyZXZpc2lvbiIKLSAgICAgICAgOzsKLQotICAgICAgKikKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0gICAgICAgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICAjIENyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgb3IgcmVtb3ZlIG91ciBvdXRwdXRzIGlmIHdlIG5lZWQgdG8uCi0gICAgICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KLSAgICAgICAgJHNob3cgIiRybSAkb2JqZGlyLyRvdXRwdXQgJG9iamRpci8kbGlibmFtZS4qICRvYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKLSAgICAgICAgJHJ1biAkcm0gJG9iamRpci8kb3V0cHV0ICRvYmpkaXIvJGxpYm5hbWUuKiAkb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKLSAgICAgIGVsc2UKLSAgICAgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotICAgICAgICAkcnVuICRta2RpciAkb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1lcSAwIHx8IHRlc3QgLWQgJG9iamRpcjsgdGhlbiA6Ci0JZWxzZQotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLSAgICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgIGJ1aWxkX29sZF9saWJzPXllcwotICAgICAgICBmaQotICAgICAgZWxzZQotICAgICAgICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotICAgICAgZmkKLQotICAgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBzeXN0ZW1zLgotICAgICAgZGVwZW5kZW5jeV9saWJzPSIkZGVwbGlicyIKLSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0gICAgICAgIGV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotICAgICAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLSAgICAgICAgcmVhbG5hbWU9IiQyIgotICAgICAgICBzaGlmdDsgc2hpZnQKLQotICAgICAgICBpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0gICAgICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotICAgICAgICBlbHNlCi0gICAgICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCi0gICAgICAgIGZpCi0KLSAgICAgICAgbGliPSIkb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0gICAgICAgICMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgUElDLgotICAgICAgICB0ZXN0IC16ICIkcGljX2ZsYWciICYmIGxpYm9ianM9YCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vZydgCi0KLSAgICAgICAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgICBldmFsIGNtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLSAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgICAgZG9uZQotICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgICAjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgotICAgICAgICBmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLSAgICAgICAgICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0gICAgICAgICAgJHJ1biBldmFsICcoY2QgJG9iamRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotICAgICAgICBkb25lCi0KLSAgICAgICAgIyBJZiAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0gICAgICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KLSAgICAgICAgICBkbG5hbWU9IiRzb25hbWUiCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIG9sZGxpYj0iJG9iamRpci8kbGlibmFtZS5hIgotICAgICAgOzsKLQotICAgICoubG8gfCAqLm8pCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIGxpYnRvb2wgbGlicmFyaWVzIGludG8gcmVsb2FkYWJsZSBvYmplY3RzIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgotICAgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgICAqLmxvKQotICAgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICAgICAgbGlib2JqPSIkb3V0cHV0IgotICAgICAgICBvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncy9cLmxvJC8uby8nYAotICAgICAgICA7OwotICAgICAgKikKLSAgICAgICAgbGlib2JqPQotICAgICAgICBvYmo9IiRvdXRwdXQiCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyJgJGVjaG8gIlgkbGlib2JqcyAiIHwgJFhzZWQgLWUgJ3MvW14gICAgICAgXSpcLmEgLy9nJyAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiBleGl0IDAKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0gICAgICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0gICAgICAgICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0gICAgICAgICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgICAgIGV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICAgICAgICAjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotICAgICAgICByZWxvYWRfb2Jqcz0iJGxpYm9ianMiCi0gICAgICAgIG91dHB1dD0iJGxpYm9iaiIKLSAgICAgICAgZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKLSAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgICAgZG9uZQotICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgIGVsc2UKLSAgICAgICAgIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCi0gICAgICAgICRzaG93ICIkTE5fUyAkb2JqICRsaWJvYmoiCi0gICAgICAgICRydW4gJExOX1MgJG9iaiAkbGlib2JqIHx8IGV4aXQgMQotICAgICAgZmkKLQotICAgICAgZXhpdCAwCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIHdoaWxlIGxpbmtpbmcgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLSAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAgICAgICAgICAgIyBQdXQgdGhlIG1hZ2ljIGxpYmRpciB3aXRoIHRoZSBoYXJkY29kZSBmbGFnLgotICAgICAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0gICAgICAgICAgICAgICAgbGliZGlyPSJASEFSRENPREVfTElCRElSU0AiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JCWNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkJKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgIDs7Ci0JCSopCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgOzsKLQkJZXNhYwotICAgICAgICAgICAgICAgIGxpYmRpcj0KLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGZsYWciCi0gICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmbGFnIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgICAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLSAgICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0gICAgICAgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgIGZpCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBjb21waWxlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQEhBUkRDT0RFX0xJQkRJUlNAJSRoYXJkY29kZV9saWJkaXJzJWciYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQEhBUkRDT0RFX0xJQkRJUlNAJSRoYXJkY29kZV9saWJkaXJzJWciYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy8nYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvLydgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgICAgICAgZGxzeW1zPSIke291dHB1dH1TLmMiCi0gICAgICBlbHNlCi0gICAgICAgIGRsc3ltcz0KLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0gICAgICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBwcmVsb2FkZWQgbGlzdC4KLSAgICAgICAgZGxwcmVmaWxlcz1gJGVjaG8gIlgkb2JqcyRkbHByZWZpbGVzICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvLydgCi0KLQkjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgotICAgICAgICBubGlzdD0iJG9iamRpci8ke291dHB1dH0ubm0iCi0KLQlpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KLQkgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVQiCi0JZWxzZQotCSAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotCSAgJHJ1biAkbWtkaXIgJG9iamRpcgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLQkgIGVsc2UKLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCWZpCi0KLSAgICAgICAgZm9yIGFyZyBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgotICAgICAgICAkc2hvdyAiY3JlYXRpbmcgJG9iamRpci8kZGxzeW1zIgotICAgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgIyBNYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBhbiBlbXB0eSBmaWxlLgotCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JICAgIG12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotCSAgICB3Y291dD1gd2MgIiRubGlzdCIgMj4vZGV2L251bGxgCi0JICAgIGNvdW50PWBlY2hvICJYJHdjb3V0IiB8ICRYc2VkIC1lICdzL15bIAldKlwoWzAtOV1bMC05XSpcKS4qJC9cMS8nYAotCSAgICAodGVzdCAiJGNvdW50IiAtZ2UgMCkgMj4vZGV2L251bGwgfHwgY291bnQ9LTEKLQkgIGVsc2UKLQkgICAgJHJtICIkbmxpc3QiVAotCSAgICBjb3VudD0tMQotCSAgZmkKLQotCSAgY2FzZSAiJGRsc3ltcyIgaW4KLQkgICIiKSA7OwotCSAgKi5jKQotCSAgICAkZWNobyA+ICIkb2JqZGlyLyRkbHN5bXMiICJcCi0vKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dCcgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLwotI2RlZmluZSBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudCBzb21lX290aGVyX3N5bWJvbAotI2RlZmluZSBkbGRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiOyB0aGVuCi0JICAgICAgc2VkIC1lICdzL14uKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy8nIDwgIiRubGlzdCIgPj4gIiRvYmpkaXIvJGRsc3ltcyIKLQkgICAgZWxzZQotCSAgICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLQotI3VuZGVmIGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50Ci0jdW5kZWYgZGxkX3ByZWxvYWRlZF9zeW1ib2xzCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIF9fcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgX19wdHJfdCBjaGFyICoKLSNlbmRpZgotCi0vKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gZGxkX3ByZWxvYWRlZF9zeW1ib2xzLCAtMSBpZiB1bnNvcnRlZC4gKi8KLWludCBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudCA9ICRjb3VudDsKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1zdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICBfX3B0cl90IGFkZHJlc3M7Ci19Ci1kbGRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCI7IHRoZW4KLQkgICAgICBzZWQgJ3MvXlwoLipcKSBcKC4qXCkkLyAgeyJcMSIsIChfX3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+ICIkb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLSAgezAsIChfX3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JICAgIDs7Ci0KLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgICA7OwotCSAgZXNhYwotICAgICAgICBmaQotCi0gICAgICAgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCi0gICAgICAgICRzaG93ICIoY2QgJG9iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnIFwiJGRsc3ltc1wiKSIKLSAgICAgICAgJHJ1biBldmFsICcoY2QgJG9iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnICIkZGxzeW1zIiknIHx8IGV4aXQgJD8KLQotICAgICAgICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG9iamRpci8ke291dHB1dH1TLm8lImAKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG9iamRpci8ke291dHB1dH1TLm8lImAKLSAgICAgIGVsaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBhbmQgXGAtZGxwcmVvcGVuJyBhcmUgaWdub3JlZCB3aXRob3V0IFxgLWV4cG9ydC1keW5hbWljJyIgMT4mMgotICAgICAgZWxzZQotICAgICAgICAjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotICAgICAgICAjIGRsZF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQotICAgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIgMT4mMgotCi0gICAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQotICAgICAgICAjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KLSAgICAgICAgJHNob3cgIiRjb21waWxlX2NvbW1hbmQiCi0gICAgICAgICRydW4gZXZhbCAiJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICAgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb2JqZGlyLyRvdXRwdXQiJyVnJ2AKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb2JqZGlyLyRvdXRwdXQiJ1QlZydgCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBiaW5hcnkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIHRoZW4gd3JhcCBpdC4KLSAgICAgIGlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbiA6Ci0gICAgICBlbHNlCi0gICAgICAgICRzaG93ICIkbWtkaXIgJG9iamRpciIKLQkkcnVuICRta2RpciAkb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1lcSAwIHx8IHRlc3QgLWQgJG9iamRpcjsgdGhlbiA6Ci0JZWxzZQotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHNobGlicGF0aF92YXIKLSAgICAgICAgcnBhdGg9Ci0gICAgICAgIGZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCi0gICAgICAgICAgY2FzZSAiJGRpciIgaW4KLSAgICAgICAgICAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAgICAgICAgICMgQWJzb2x1dGUgcGF0aC4KLSAgICAgICAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgKikKLSAgICAgICAgICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KLSAgICAgICAgICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCi0gICAgICAgICAgICA7OwotICAgICAgICAgIGVzYWMKLSAgICAgICAgZG9uZQotICAgICAgICB0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgotICAgICAgJHJ1biAkcm0gJG91dHB1dAotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgiOyB0aGVuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotICAgICAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotICAgICAgICBycGF0aD0KLSAgICAgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLSAgICAgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0gICAgICAgIGRvbmUKLSAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotICAgICAgcmVsaW5rKQotICAgICAgICAjIEFHSCEgRmxhbWUgdGhlIEFJWCBhbmQgSFAtVVggcGVvcGxlIGZvciBtZSwgd2lsbCB5YT8KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdXNpbmcgYSBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHJlbGlua2luZyB3aWxsIGJlIHJlcXVpcmVkIGJlZm9yZSBcYCRvdXRwdXQnIGNhbiBiZSBpbnN0YWxsZWQiIDE+JjIKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgJHNob3cgIiRjb21waWxlX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRjb21waWxlX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSBmaW5hbGl6ZSBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KLSAgICAgIHFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgICAkcm0gJG91dHB1dAotICAgICAgICB0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAxIiAxIDIgMTUKLQotICAgICAgICAkZWNobyA+ICRvdXRwdXQgIlwKLSMhIC9iaW4vc2gKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXQKLSMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgotIwotIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotIwotIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgXGBgcHdkYCcuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0IFwiXCR7Q0RQQVRIK3NldH1cIiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6Ci0gIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9JyRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzJwotICBmaW5hbGl6ZV9jb21tYW5kPVwiJGZpbmFsaXplX2NvbW1hbmRcIgotZWxzZQotICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCi0gIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgZmlcCi0iCi0gICAgICAgICRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICAvKiB8IFtBLVphLXpdOlxcKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7Ci0gICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLQotICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICBkb25lCi0KLSAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KLSAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAotICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgotCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0gIHByb2dyYW09JyRvdXRwdXQnCi0KLSAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKLQotICAgICAgICAjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KLSAgICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotICAgICAgICAgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgotICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKLQotICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86KlwkLy8nXGAKLQotICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgotIgotICAgICAgICBmaQotCi0gICAgICAgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgotCi0gICAgICAjIEV4cG9ydCB0aGUgcGF0aCB0byB0aGUgcHJvZ3JhbS4KLSAgICAgIFBBVEg9XCJcJHByb2dkaXI6XCRQQVRIXCIKLSAgICAgIGV4cG9ydCBQQVRICi0KLSAgICAgIGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLQotICAgICAgXCRlY2hvIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifVwiCi0gICAgICBleGl0IDEKLSAgICBmaQotICBlbHNlCi0gICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgotICAgIFwkZWNobyBcIlwkMDogZXJyb3I6IFwkcHJvZ2Rpci9cJHByb2dyYW0gZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgZWNobyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maVwKLSIKLSAgICAgICAgY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgMAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gInllcyI7IHRoZW4KLSAgICAgICMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KLSAgICAgIG9sZG9ianM9IiRvYmpzImAkZWNobyAiWCRsaWJvYmpzICIgfCAkWHNlZCAtZSAncy9bXiAgIF0qXC5hIC8vZycgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy9nJ2AKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc1wiCi0gICAgICBlbHNlCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotICAgICAgZmkKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgJHNob3cgIiRjbWQiCi0gICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZmkKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuYSIKLQotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLSAgICAgICAgJGVjaG8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXQgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04KLQotIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCi1kbG5hbWU9JyRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJ1wKLSIKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJExOX1MgLi4vJG91dHB1dCAkb3V0cHV0KSIKLSAgICAgICRydW4gZXZhbCAiKGNkICRvYmpkaXIgJiYgJExOX1MgLi4vJG91dHB1dCAkb3V0cHV0KSIgfHwgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKLSAgaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgotCi0gICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgL2Jpbi9zaCBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCi0gICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIjsgdGhlbgotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICBpbnN0YWxsX3Byb2c9Ci0gICAgICBhcmc9IiRub25vcHQiCi0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgIiRhcmciIGluCi0gICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0gICAgICBhcmc9IlwiJGFyZ1wiIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9Ci0gICAgc3RyaXBtZT0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgotICAgICAgICBmaWxlcz0iJGZpbGVzICRkZXN0IgotICAgICAgICBkZXN0PSIkYXJnIgotICAgICAgICBjb250aW51ZQotICAgICAgZmkKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKLSAgICAgIC1mKSBwcmV2PSItZiIgOzsKLSAgICAgIC1nKSBwcmV2PSItZyIgOzsKLSAgICAgIC1tKSBwcmV2PSItbSIgOzsKLSAgICAgIC1vKSBwcmV2PSItbyIgOzsKLSAgICAgIC1zKQotICAgICAgICBzdHJpcG1lPSIgLXMiCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0gICAgICAtKikgOzsKLQotICAgICAgKikKLSAgICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgotICAgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICAgICBwcmV2PQotICAgICAgICBlbHNlCi0gICAgICAgICAgZGVzdD0iJGFyZyIKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICBmaQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgotICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogbm8gZmlsZSBvciBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiIDE+JjIKLSAgICAgIGVsc2UKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0IC1uICIkaXNkaXIiOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KLSAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXMKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCi0gICAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLSAgICBjYXNlICIkZGVzdGRpciIgaW4KLSAgICAvKiB8IFtBLVphLXpdOlxcKikgOzsKLSAgICAqKQotICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotICAgICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICAgKi5sbykgOzsKLSAgICAgICAgKikKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCi0gICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIHN0YXRpY2xpYnM9Ci0gICAgZnV0dXJlX2xpYmRpcnM9Ci0gICAgY3VycmVudF9saWJkaXJzPQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQotICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5hKQotICAgICAgICAjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotICAgICAgICBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKLSAgICAgICAgOzsKLQotICAgICAgKi5sYSkKLSAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICAgICAgZWxzZQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotICAgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotCi0gICAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLSAgICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLSAgICAgICAgKikgLiAuLyRmaWxlIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICAjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgIGlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCi0gICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKLSAgICAgICAgICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLSAgICAgICAgICBlc2FjCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0gICAgICAgICAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KLSAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OwotICAgICAgICAgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLSAgICAgICAgICBlc2FjCi0gICAgICAgIGZpCi0KLSAgICAgICAgZGlyPSJgJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8iCi0gICAgICAgIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9Ci0gICAgICAgIGRpcj0iJGRpciRvYmpkaXIiCi0KLSAgICAgICAgIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLSAgICAgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0gICAgICAgIGlmIHRlc3QgLW4gIiQyIjsgdGhlbgotICAgICAgICAgIHJlYWxuYW1lPSIkMiIKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIHNoaWZ0Ci0KLSAgICAgICAgICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0gICAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgotICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KLSAgICAgICAgICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRyZWFsbmFtZSIgJiYgZGxuYW1lPQotCi0gICAgICAgICAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICAgICAgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcy4KLSAgICAgICAgICAgIHJtY21kPSIkcm0iCi0gICAgICAgICAgICBmb3IgbGlua25hbWUKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgIHJtY21kPSIkcm1jbWQgJGRlc3RkaXIvJGxpbmtuYW1lIgotICAgICAgICAgICAgZG9uZQotICAgICAgICAgICAgJHNob3cgIiRybWNtZCIKLSAgICAgICAgICAgICRydW4gJHJtY21kCi0KLSAgICAgICAgICAgICMgLi4uIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0gICAgICAgICAgICBmb3IgbGlua25hbWUKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJGxpbmtuYW1lIiAmJiBkbG5hbWU9Ci0gICAgICAgICAgICAgICRzaG93ICIoY2QgJGRlc3RkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0gICAgICAgICAgICAgICRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotICAgICAgICAgICAgZG9uZQotICAgICAgICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotICAgICAgICAgICAgIyBJbnN0YWxsIHRoZSBkeW5hbWljYWxseS1sb2FkYWJsZSBsaWJyYXJ5LgotICAgICAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lICRkZXN0ZGlyLyRkbG5hbWUiCi0gICAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lICRkZXN0ZGlyLyRkbG5hbWUiIHx8IGV4aXQgJD8KLSAgICAgICAgICBmaQotCi0gICAgICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgICAgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotICAgICAgICAgIGV2YWwgY21kcz1cIiRwb3N0aW5zdGFsbF9jbWRzXCIKLSAgICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JwotICAgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICAgICRzaG93ICIkY21kIgotICAgICAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICAgICAgZG9uZQotICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICBmaQotCi0gICAgICAgICMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgotICAgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZGlyLyRuYW1lIgotICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KLQotICAgICAgICAjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCi0gICAgICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0gICAgICAgIDs7Ci0KLSAgICAgICoubG8pCi0gICAgICAgICMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgotCi0gICAgICAgICMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLSAgICAgICAgaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotICAgICAgICAgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgICAgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLSAgICAgICAgY2FzZSAiJGRlc3RmaWxlIiBpbgotICAgICAgICAqLmxvKQotICAgICAgICAgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICdzL1wubG8kL1wuby8nYAotICAgICAgICAgIDs7Ci0gICAgICAgICoubykKLSAgICAgICAgICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCi0gICAgICAgICAgZGVzdGZpbGU9Ci0gICAgICAgICAgOzsKLSAgICAgICAgKikKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIgMT4mMgotICAgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgICAgIGV4aXQgMQotICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICAjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KLSAgICAgICAgaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgotICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0gICAgICAgIGZpCi0KLSAgICAgICAgIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0gICAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotICAgICAgICAgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKLQotICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCi0gICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotICAgICAgICBmaQotICAgICAgICBleGl0IDAKLSAgICAgICAgOzsKLQotICAgICAgKikKLSAgICAgICAgIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotICAgICAgICBpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAgICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPQotICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9Ci0KLSAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLSAgICAgICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICAgICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0gICAgICAgICAgKikgLiAuLyRmaWxlIDs7Ci0gICAgICAgICAgZXNhYwotCi0gICAgICAgICAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCi0gICAgICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgLXogIiRmaW5hbGl6ZV9jb21tYW5kIjsgdGhlbgotICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJGZpbGUnIiAxPiYyCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICBmaQotCi0gICAgICAgICAgZmluYWxpemU9eWVzCi0gICAgICAgICAgZm9yIGxpYiBpbiAkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGliczsgZG8KLSAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLSAgICAgICAgICAgIGxpYmRpcj0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0gICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotICAgICAgICAgICAgICBjYXNlICIkbGliIiBpbgotICAgICAgICAgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLSAgICAgICAgICAgICAgKikgLiAuLyRsaWIgOzsKLSAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGxpYmZpbGU9IiRsaWJkaXIvYCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AiCi0gICAgICAgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGNvbnRhaW5zIG5vIC1ycGF0aCBpbmZvcm1hdGlvbiIgMT4mMgotICAgICAgICAgICAgZWxpZiB0ZXN0IC1mICIkbGliZmlsZSI7IHRoZW4gOgotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgotICAgICAgICAgICAgICBmaW5hbGl6ZT1ubwotICAgICAgICAgICAgZmkKLSAgICAgICAgICBkb25lCi0KLSAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotICAgICAgICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgotICAgICAgICAgICAgICAkc2hvdyAiJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICAgICAgICAgIGlmICRydW4gZXZhbCAiJGZpbmFsaXplX2NvbW1hbmQiOyB0aGVuIDoKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIGZpbGU9IiRvYmpkaXIvJGZpbGUiVAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0KLSAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdCIKLSAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3QiIHx8IGV4aXQgJD8KLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0aW5zdGFsbF9jbWRzXCIKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgJHNob3cgIiRjbWQiCi0gICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgotICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KLSAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWMgJFNIRUxMICQwIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycwotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCi0gIGZpbmlzaCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCi0gICAgbGliZGlycz0iJG5vbm9wdCIKLQotICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCi0gICAgICBmb3IgZGlyCi0gICAgICBkbwotICAgICAgICBsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQotCi0gICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2NtZHNcIgotICAgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0gICAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgICAgJHNob3cgIiRjbWQiCi0gICAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0gICAgICAgICAgZG9uZQotICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRydW4gZXZhbCAiJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgZWNobyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgZWNobwotICAgIGVjaG8gIlRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIGluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIgotICAgIGVjaG8gInlvdSBtdXN0IHVzZSB0aGUgXGAtTExJQkRJUicgZmxhZyBkdXJpbmcgbGlua2luZy4iCi0gICAgZWNobwotICAgIGVjaG8gIiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6IgotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICBlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICBlY2hvCi0gICAgZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCi0gICAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQotICBleGVjdXRlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCi0KLSAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgotICAgIGNtZD0iJG5vbm9wdCIKLSAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgotICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4gOgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGRpcj0KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5sYSkKLSAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICAgICAgZWxzZQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0gICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0KLQkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KLQlkbG5hbWU9Ci0JbGlicmFyeV9uYW1lcz0KLQotICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0gICAgICAgICopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0JOzsKLQotICAgICAgKikKLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCi0gICAgICAgIGNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgotICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgotCi0gICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgotICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCi0gICAgICBlbHNlCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgotICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKLQotICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KLSAgICBhcmdzPQotICAgIGZvciBmaWxlCi0gICAgZG8KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotICAgICAgICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0gICAgICAgIGlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICIkZmlsZSIgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZmkKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0gICAgICBldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBldmFsICJleGVjIFwkY21kJGFyZ3MiCi0KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBleGVjIFwkY21kJGFyZ3MiCi0gICAgICBleGl0IDEKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgICRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICAkZWNobyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAwCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCB1bmluc3RhbGwgbW9kZQotICB1bmluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogdW5pbnN0YWxsIgotICAgIHJtPSIkbm9ub3B0IgotICAgIGZpbGVzPQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgKi5sYSkKLSAgICAgICAgIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgotICAgICAgICBpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAgICAuICRkaXIvJG5hbWUKLQotICAgICAgICAgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCi0gICAgICAgICAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0gICAgICAgICAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRuIgotICAgICAgICAgICAgdGVzdCAiWCRuIiA9ICJYJGRsbmFtZSIgJiYgZGxuYW1lPQotICAgICAgICAgIGRvbmUKLSAgICAgICAgICB0ZXN0IC1uICIkZGxuYW1lIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRkbG5hbWUiCi0gICAgICAgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQotCSAgJHNob3cgIiRybSAkcm1maWxlcyIKLQkgICRydW4gJHJtICRybWZpbGVzCi0KLQkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgZXZhbCBjbWRzPVwiJHBvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotICAgICAgICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgICBmaQotICAgICAgICA7OwotCi0gICAgICAqLmxvKQotICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAgICAgb2xkb2JqPWAkZWNobyAiWCRuYW1lIiB8ICRYc2VkIC1lICdzL1wubG8kL1wuby8nYAotICAgICAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZG9iaiIKLSAgICAgICAgZmkKLQkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCi0gICAgICAgIDs7Ci0KLSAgICAgICopCi0gICAgICAJJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIiIpCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0gIGVzYWMKLQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgotCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgIiRtb2RlIiBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLQotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0KLS1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcwotICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJwotICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KLSAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLQotTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICBjb21waWxlICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAotICAgICAgZXhlY3V0ZSAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCi0gICAgICBmaW5pc2ggICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAgICAgaW5zdGFsbCAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCi0gICAgICBsaW5rICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCi0gICAgICB1bmluc3RhbGwgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLQotTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCi1hIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4iCi0gIGV4aXQgMAotICA7OwotCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLUNPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCi1mcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgotCi1UaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KLVNPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQotbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgotICA7OwotCi1leGVjdXRlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgotCi1BdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKLQotVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJwotZmxhZ3MuCi0KLUlmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKLWludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQotZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCi0KLVRoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgotICA7OwotCi1maW5pc2gpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KLQotQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KLQotRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KLQotVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCi10aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKLSAgOzsKLQotaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCi0KLUluc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgotCi1JTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKLWVpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgotCi1UaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQotQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCi0gIDs7Ci0KLWxpbmspCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgotCi1MaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCi1jcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgotCi1MSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKLWEgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKLQotICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKLSAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCi0gIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGRsZF9wcmVsb2FkZWRfc3ltYm9scwotICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scwotICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLSAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KLSAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgotICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQotICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwgb25seQotbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMgcmVxdWlyZWQuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQgdXNpbmcgXGBhcicKLWFuZCBcYHJhbmxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLm8nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBpcwotY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKLSAgOzsKLQotdW5pbnN0YWxsKQotICAkZWNobwotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KLU90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotKikKLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWVjaG8KLSRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtjanBlZy5zdCBiL2xpYmpwZWd0d3JwL21ha2NqcGVnLnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcyYzg5Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2NqcGVnLnN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotOwotOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCi07Ci07IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBjanBlZy5wcmouCi07IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKLTsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKLTsKLTsKLTsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgotY2pwZWcudHRwCi07Ci07ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAotLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCi0uQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcwotLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncwotLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCi0uQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCi0uQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKLT0KLTsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKLXBjc3RhcnQubwotY2pwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCi1jZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotcmRzd2l0Y2guYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotcmRwcG0uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotcmRnaWYuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotcmR0YXJnYS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZGJtcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHJsZS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1saWJqcGVnLmxpYiAgICAgICAgOyBidWlsdCBieSBsaWJqcGVnLnByagotcGNmbHRsaWIubGliICAgICAgIDsgZmxvYXRpbmcgcG9pbnQgbGlicmFyeQotOyB0aGUgZmxvYXQgbGlicmFyeSBjYW4gYmUgb21pdHRlZCBpZiB5b3UndmUgdHVybmVkIG9mZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi1wY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5Ci1wY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtkanBlZy5zdCBiL2xpYmpwZWd0d3JwL21ha2RqcGVnLnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjI2NzI2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2RqcGVnLnN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotOwotOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCi07Ci07IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBkanBlZy5wcmouCi07IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKLTsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKLTsKLTsKLTsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgotZGpwZWcudHRwCi07Ci07ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAotLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCi0uQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcwotLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncwotLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCi0uQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCi0uQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKLT0KLTsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKLXBjc3RhcnQubwotZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCi1jZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotcmRjb2xtYXAuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotd3JwcG0uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotd3JnaWYuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotd3J0YXJnYS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cmJtcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi13cnJsZS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1saWJqcGVnLmxpYiAgICAgICAgOyBidWlsdCBieSBsaWJqcGVnLnByagotcGNmbHRsaWIubGliICAgICAgIDsgZmxvYXRpbmcgcG9pbnQgbGlicmFyeQotOyB0aGUgZmxvYXQgbGlicmFyeSBjYW4gYmUgb21pdHRlZCBpZiB5b3UndmUgdHVybmVkIG9mZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi1wY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5Ci1wY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlYXBwcy5kcyBiL2xpYmpwZWd0d3JwL21ha2VhcHBzLmRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkMDM4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VhcHBzLmRzCisrKyAvZGV2L251bGwKQEAgLTEsODI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDQuMjAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLSFJRiAiJChDRkcpIiA9PSAiIgotQ0ZHPWNqcGVnIC0gV2luMzIKLSFNRVNTQUdFIE5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLiAgRGVmYXVsdGluZyB0byBjanBlZyAtIFdpbjMyLgotIUVORElGIAotCi0hSUYgIiQoQ0ZHKSIgIT0gImNqcGVnIC0gV2luMzIiICYmICIkKENGRykiICE9ICJkanBlZyAtIFdpbjMyIiAmJlwKLSAiJChDRkcpIiAhPSAianBlZ3RyYW4gLSBXaW4zMiIgJiYgIiQoQ0ZHKSIgIT0gInJkanBnY29tIC0gV2luMzIiICYmXAotICIkKENGRykiICE9ICJ3cmpwZ2NvbSAtIFdpbjMyIgotIU1FU1NBR0UgSW52YWxpZCBjb25maWd1cmF0aW9uICIkKENGRykiIHNwZWNpZmllZC4KLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFIG9uIHRoaXMgbWFrZWZpbGUKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiYXBwcy5tYWsiIENGRz0iY2pwZWcgLSBXaW4zMiIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJjanBlZyAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImRqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAianBlZ3RyYW4gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJyZGpwZ2NvbSAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgIndyanBnY29tIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLSFFUlJPUiBBbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLgotIUVORElGIAotCi0hSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKLU5VTEw9Ci0hRUxTRSAKLU5VTEw9bnVsCi0hRU5ESUYgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgVGFyZ2V0X0xhc3RfU2Nhbm5lZCAiY2pwZWcgLSBXaW4zMiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiY2pwZWcgLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImNqcGVnXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJjanBlZ1xSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiY2pwZWciCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiY2pwZWdcUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJjanBlZ1xSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgImNqcGVnIgotT1VURElSPS5cY2pwZWdcUmVsZWFzZQotSU5URElSPS5cY2pwZWdcUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXGNqcGVnLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcY2pwZWcub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHBwbS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkZ2lmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmR0YXJnYS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkcmxlLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRibXAub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCi0JLUBlcmFzZSAiJChPVVRESVIpXGNqcGVnLmV4ZSIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAotIC9GcCIkKElOVERJUikvY2pwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlxjanBlZ1xSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9janBlZy5ic2MiIAotQlNDMzJfU0JSUz0gXAotCQotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci1MSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAotIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKLSBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCi0gL3BkYjoiJChPVVRESVIpL2NqcGVnLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvY2pwZWcuZXhlIiAKLUxJTkszMl9PQkpTPSBcCi0JIiQoSU5URElSKVxjanBlZy5vYmoiIFwKLQkiJChJTlRESVIpXHJkcHBtLm9iaiIgXAotCSIkKElOVERJUilccmRnaWYub2JqIiBcCi0JIiQoSU5URElSKVxyZHRhcmdhLm9iaiIgXAotCSIkKElOVERJUilccmRybGUub2JqIiBcCi0JIiQoSU5URElSKVxyZGJtcC5vYmoiIFwKLQkiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgXAotCSIkKElOVERJUilcY2RqcGVnLm9iaiIgXAotCi0KLSIkKE9VVERJUilcY2pwZWcuZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCi0gICAgJChMSU5LMzIpIEA8PAotICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKLTw8Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJkanBlZyAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZGpwZWdcUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImRqcGVnXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICJkanBlZyIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJkanBlZ1xSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImRqcGVnXFJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAiZGpwZWciCi1PVVRESVI9LlxkanBlZ1xSZWxlYXNlCi1JTlRESVI9LlxkanBlZ1xSZWxlYXNlCi0KLUFMTCA6ICIkKE9VVERJUilcZGpwZWcuZXhlIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxkanBlZy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdycHBtLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcd3JnaWYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cnRhcmdhLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcd3JybGUub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cmJtcC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkY29sbWFwLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcZGpwZWcuZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS9kanBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXGRqcGVnXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2RqcGVnLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvZGpwZWcucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9kanBlZy5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXGRqcGVnLm9iaiIgXAotCSIkKElOVERJUilcd3JwcG0ub2JqIiBcCi0JIiQoSU5URElSKVx3cmdpZi5vYmoiIFwKLQkiJChJTlRESVIpXHdydGFyZ2Eub2JqIiBcCi0JIiQoSU5URElSKVx3cnJsZS5vYmoiIFwKLQkiJChJTlRESVIpXHdyYm1wLm9iaiIgXAotCSIkKElOVERJUilccmRjb2xtYXAub2JqIiBcCi0JIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCi0KLQotIiQoT1VURElSKVxkanBlZy5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKLSAgICAkKExJTkszMikgQDw8Ci0gICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQotPDwKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImpwZWd0cmFuIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJqcGVndHJhblxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAianBlZ3RyYW5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImpwZWd0cmFuIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAianBlZ3RyYW5cUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICJqcGVndHJhbiIKLU9VVERJUj0uXGpwZWd0cmFuXFJlbGVhc2UKLUlOVERJUj0uXGpwZWd0cmFuXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxqcGVndHJhbi5leGUiCi0KLUNMRUFOIDogCi0JLUBlcmFzZSAiJChJTlRESVIpXGpwZWd0cmFuLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRzd2l0Y2gub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx0cmFuc3VwcC5vYmoiCi0JLUBlcmFzZSAiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAotIC9GcCIkKElOVERJUikvanBlZ3RyYW4ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlxqcGVndHJhblxSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9qcGVndHJhbi5ic2MiIAotQlNDMzJfU0JSUz0gXAotCQotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci1MSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAotIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKLSBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCi0gL3BkYjoiJChPVVRESVIpL2pwZWd0cmFuLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvanBlZ3RyYW4uZXhlIiAKLUxJTkszMl9PQkpTPSBcCi0JIiQoSU5URElSKVxqcGVndHJhbi5vYmoiIFwKLQkiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgXAotCSIkKElOVERJUilcY2RqcGVnLm9iaiIgXAotCSIkKElOVERJUilcdHJhbnN1cHAub2JqIiBcCi0KLQotIiQoT1VURElSKVxqcGVndHJhbi5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKLSAgICAkKExJTkszMikgQDw8Ci0gICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQotPDwKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInJkanBnY29tIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAicmRqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgInJkanBnY29tIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgInJkanBnY29tXFJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAicmRqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICJyZGpwZ2NvbSIKLU9VVERJUj0uXHJkanBnY29tXFJlbGVhc2UKLUlOVERJUj0uXHJkanBnY29tXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxyZGpwZ2NvbS5leGUiCi0KLUNMRUFOIDogCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkanBnY29tLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilccmRqcGdjb20uZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS9yZGpwZ2NvbS5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXHJkanBnY29tXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL3JkanBnY29tLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvcmRqcGdjb20ucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9yZGpwZ2NvbS5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXHJkanBnY29tLm9iaiIKLQotIiQoT1VURElSKVxyZGpwZ2NvbS5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKLSAgICAkKExJTkszMikgQDw8Ci0gICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQotPDwKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIndyanBnY29tIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAid3JqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIndyanBnY29tIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIndyanBnY29tXFJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAid3JqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICJ3cmpwZ2NvbSIKLU9VVERJUj0uXHdyanBnY29tXFJlbGVhc2UKLUlOVERJUj0uXHdyanBnY29tXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVx3cmpwZ2NvbS5leGUiCi0KLUNMRUFOIDogCi0JLUBlcmFzZSAiJChJTlRESVIpXHdyanBnY29tLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcd3JqcGdjb20uZXhlIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCi0gL0ZwIiQoSU5URElSKS93cmpwZ2NvbS5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXHdyanBnY29tXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL3dyanBnY29tLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCi0gY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAotIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKLSAvcGRiOiIkKE9VVERJUikvd3JqcGdjb20ucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS93cmpwZ2NvbS5leGUiIAotTElOSzMyX09CSlM9IFwKLQkiJChJTlRESVIpXHdyanBnY29tLm9iaiIKLQotIiQoT1VURElSKVx3cmpwZ2NvbS5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKLSAgICAkKExJTkszMikgQDw8Ci0gICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQotPDwKLQotIUVORElGIAotCi0uY3skKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jcHB7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jeHh7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImNqcGVnIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImNqcGVnIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJjanBlZy5jIgotREVQX0NQUF9DSlBFRz1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JImp2ZXJzaW9uLmgiXAotCQotCi0iJChJTlRESVIpXGNqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0NKUEVHKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImNkanBlZy5jIgotREVQX0NQUF9DREpQRT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcY2RqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0NESlBFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkc3dpdGNoLmMiCi1ERVBfQ1BQX1JEU1dJPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFNXSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZHBwbS5jIgotREVQX0NQUF9SRFBQTT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRwcG0ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRQUE0pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRnaWYuYyIKLURFUF9DUFBfUkRHSUY9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkZ2lmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JER0lGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkdGFyZ2EuYyIKLURFUF9DUFBfUkRUQVI9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkdGFyZ2Eub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRUQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRibXAuYyIKLURFUF9DUFBfUkRCTVA9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkYm1wLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEQk1QKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkcmxlLmMiCi1ERVBfQ1BQX1JEUkxFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZHJsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFJMRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJkanBlZyAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJkanBlZyAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iZGpwZWcuYyIKLURFUF9DUFBfREpQRUc9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCSJqdmVyc2lvbi5oIlwKLQkKLQotIiQoSU5URElSKVxkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9ESlBFRykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJjZGpwZWcuYyIKLURFUF9DUFBfQ0RKUEU9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZGNvbG1hcC5jIgotREVQX0NQUF9SRENPTD1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRjb2xtYXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRDT0wpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JwcG0uYyIKLURFUF9DUFBfV1JQUE09XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdycHBtLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSUFBNKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndyZ2lmLmMiCi1ERVBfQ1BQX1dSR0lGPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVx3cmdpZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUkdJRikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cnRhcmdhLmMiCi1ERVBfQ1BQX1dSVEFSPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVx3cnRhcmdhLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSVEFSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndyYm1wLmMiCi1ERVBfQ1BQX1dSQk1QPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVx3cmJtcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUkJNUCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cnJsZS5jIgotREVQX0NQUF9XUlJMRT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcd3JybGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JSTEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAianBlZ3RyYW4gLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAianBlZ3RyYW4gLSBXaW4zMiIKLQotIUVORElGIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpwZWd0cmFuLmMiCi1ERVBfQ1BQX0pQRUdUPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkidHJhbnN1cHAuaCJcCi0JImp2ZXJzaW9uLmgiXAotCQotCi0iJChJTlRESVIpXGpwZWd0cmFuLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pQRUdUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImNkanBlZy5jIgotREVQX0NQUF9DREpQRT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcY2RqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0NESlBFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkc3dpdGNoLmMiCi1ERVBfQ1BQX1JEU1dJPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFNXSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ0cmFuc3VwcC5jIgotREVQX0NQUF9UUkFOUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJ0cmFuc3VwcC5oIlwKLQkKLQotIiQoSU5URElSKVx0cmFuc3VwcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9UUkFOUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJyZGpwZ2NvbSAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJyZGpwZ2NvbSAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRqcGdjb20uYyIKLURFUF9DUFBfUkRKUEc9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkKLQotIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREpQRykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJ3cmpwZ2NvbSAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJ3cmpwZ2NvbSAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JqcGdjb20uYyIKLURFUF9DUFBfV1JKUEc9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkKLQotIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUkpQRykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS5hbnNpIGIvbGlianBlZ3R3cnAvbWFrZWZpbGUuYW5zaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MTkxMy4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS5hbnNpCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggQU5TSS1jYXBhYmxlIGNvbXBpbGVycy4KLSMgSWYgeW91IGhhdmUgYSBub24tQU5TSSBjb21waWxlciwgbWFrZWZpbGUudW5peCBpcyBhIGJldHRlciBzdGFydGluZyBwb2ludC4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gY2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci1DRkxBR1M9IC1PCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci1MREZMQUdTPSAKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50Ci0jIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgotU1lTREVQTUVNPSBqbWVtbm9icy5vCi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLSMgbGlua2VyCi1MTj0gJChDQykKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gcm0gLWYKLSMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGFyIHJjCi0jIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQotQVIyPSByYW5saWIKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubwotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAotICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKLSAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAotICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubwotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLURPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAotICAgICAgICBjZGpwZWcubwotVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubwotCi0KLWFsbDogbGlianBlZy5hIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCi0KLWxpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQotCSQoUk0pIGxpYmpwZWcuYQotCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQotCSQoQVIyKSBsaWJqcGVnLmEKLQotY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1kanBlZzogJChET0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWpwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1yZGpwZ2NvbTogcmRqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKLQotd3JqcGdjb206IHdyanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQkkKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gbGlianBlZy5hIHJkanBnY29tIHdyanBnY29tCi0JJChSTSkgY29yZSB0ZXN0b3V0KgotCi10ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgotCSQoUk0pIHRlc3RvdXQqCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUuYmNjIGIvbGlianBlZ3R3cnAvbWFrZWZpbGUuYmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWNmY2RlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLmJjYworKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBCb3JsYW5kIEMgb24gTVMtRE9TIG9yIE9TLzIuCi0jIEl0IHdvcmtzIHdpdGggQm9ybGFuZCBDKysgZm9yIERPUywgcmV2aXNpb24gMy4wIG9yIGxhdGVyLAotIyBhbmQgaGFzIGJlZW4gdGVzdGVkIHdpdGggQm9ybGFuZCBDKysgZm9yIE9TLzIuCi0jIFdhdGNoIG91dCBmb3Igb3B0aW1pemF0aW9uIGJ1Z3MgaW4gdGhlIE9TLzIgY29tcGlsZXJzIC0tLSBzZWUgbm90ZXMgYmVsb3chCi0jIFRoYW5rcyB0byBUb20gV3JpZ2h0IGFuZCBHZScgV2VpamVycyAob3JpZ2luYWwgRE9TKSBhbmQKLSMgS2VuIFBvcnRlciAoT1MvMikgZm9yIHRoaXMgZmlsZS4KLQotIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKLQotIyBBcmUgd2UgdW5kZXIgRE9TIG9yIE9TLzI/Ci0haWYgISRkKERPUykgJiYgISRkKE9TMikKLSFpZiAkZChfX09TMl9fKQotT1MyPTEKLSFlbHNlCi1ET1M9MQotIWVuZGlmCi0hZW5kaWYKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gYmNjCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotIWlmICRkKERPUykKLUNGTEFHUz0gLU8yIC1tbSAtdy1wYXIgLXctc3R1IC13LWNjYyAtdy1yY2gKLSFlbHNlCi1DRkxBR1M9IC1PMSAtdy1wYXIgLXctc3R1IC13LWNjYyAtdy1yY2gKLSFlbmRpZgotIyAtTzIgZW5hYmxlcyBmdWxsIGNvZGUgb3B0aW1pemF0aW9uIChmb3IgcHJlLTMuMCBCb3JsYW5kIEMrKywgdXNlIC1PIC1HIC1aKS4KLSMgLU8yIGlzIGJ1Z2d5IGluIEJvcmxhbmQgT1MvMiBDKysgcmV2aXNpb24gMi4wLCBzbyB1c2UgLU8xIHRoZXJlIGZvciBub3cuCi0jIElmIHlvdSBoYXZlIEJvcmxhbmQgT1MvMiBDKysgcmV2aXNpb24gMS4wLCB1c2UgLU8gb3Igbm8gb3B0aW1pemF0aW9uIGF0IGFsbC4KLSMgLW1tIHNlbGVjdHMgbWVkaXVtIG1lbW9yeSBtb2RlbCAobmVhciBkYXRhLCBmYXIgY29kZSBwb2ludGVyczsgRE9TIG9ubHkhKQotIyAtdy1wYXIgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCB1bnVzZWQgZnVuY3Rpb24gcGFyYW1ldGVycwotIyAtdy1zdHUgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCBpbmNvbXBsZXRlIHN0cnVjdHVyZXMKLSMgLXctY2NjIHN1cHByZXNzZXMgd2FybmluZ3MgYWJvdXQgY29tcGlsZS10aW1lLWNvbnN0YW50IGNvbmRpdGlvbnMKLSMgLXctcmNoIHN1cHByZXNzZXMgd2FybmluZ3MgYWJvdXQgdW5yZWFjaGFibGUgY29kZQotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotIWlmICRkKERPUykKLUxERkxBR1M9IC1tbQotIyBtZW1vcnkgbW9kZWwgb3B0aW9uIGhlcmUgbXVzdCBtYXRjaCBDRkxBR1MhCi0hZWxzZQotTERGTEFHUz0KLSMgLWxhaSBmdWxsLXNjcmVlbiBhcHAKLSMgLWxjIGNhc2Utc2lnbmlmaWNhbnQgbGluawotIWVuZGlmCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4KLSMgRm9yIERPUywgd2UgcmVjb21tZW5kIGptZW1kb3MuYyBhbmQgam1lbWRvc2EuYXNtLgotIyBGb3IgT1MvMiwgd2UgcmVjb21tZW5kIGptZW1ub2JzLmMgKGZsYXQgbWVtb3J5ISkKLSMgU1lTREVQTUVNTElCIG11c3QgbGlzdCB0aGUgc2FtZSBmaWxlcyB3aXRoICIrIiBzaWducyBmb3IgdGhlIGxpYnJhcmlhbi4KLSFpZiAkZChET1MpCi1TWVNERVBNRU09IGptZW1kb3Mub2JqIGptZW1kb3NhLm9iagotU1lTREVQTUVNTElCPSAram1lbWRvcy5vYmogK2ptZW1kb3NhLm9iagotIWVsc2UKLVNZU0RFUE1FTT0gam1lbW5vYnMub2JqCi1TWVNERVBNRU1MSUI9ICtqbWVtbm9icy5vYmoKLSFlbmRpZgotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKLQktIGRlbCBsaWJqcGVnLmxpYgotCXRsaWIgbGlianBlZy5saWIgL0UgL0MgQCYmfAotK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY3RyYW5zLm9iaiAramNwYXJhbS5vYmogK2pkYXRhZHN0Lm9iaiAmCi0ramNpbml0Lm9iaiAramNtYXN0ZXIub2JqICtqY21hcmtlci5vYmogK2pjbWFpbmN0Lm9iaiAramNwcmVwY3Qub2JqICYKLStqY2NvZWZjdC5vYmogK2pjY29sb3Iub2JqICtqY3NhbXBsZS5vYmogK2pjaHVmZi5vYmogK2pjcGh1ZmYub2JqICYKLStqY2RjdG1nci5vYmogK2pmZGN0ZnN0Lm9iaiAramZkY3RmbHQub2JqICtqZmRjdGludC5vYmogK2pkYXBpbWluLm9iaiAmCi0ramRhcGlzdGQub2JqICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYKLStqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkcGh1ZmYub2JqICtqZG1haW5jdC5vYmogK2pkY29lZmN0Lm9iaiAmCi0ramRwb3N0Y3Qub2JqICtqZGRjdG1nci5vYmogK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJgotK2ppZGN0cmVkLm9iaiAramRzYW1wbGUub2JqICtqZGNvbG9yLm9iaiAranF1YW50MS5vYmogK2pxdWFudDIub2JqICYKLStqZG1lcmdlLm9iaiAramNvbWFwaS5vYmogK2p1dGlscy5vYmogK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYKLSQoU1lTREVQTUVNTElCKQotfAotCi1janBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0JJChDQykgJChMREZMQUdTKSAtZWNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCi1kanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChDQykgJChMREZMQUdTKSAtZWRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCi1qcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoQ0MpICQoTERGTEFHUykgLWVqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0KLXJkanBnY29tLmV4ZTogcmRqcGdjb20uYwotIWlmICRkKERPUykKLQkkKENDKSAtbXMgLU8gcmRqcGdjb20uYwotIWVsc2UKLQkkKENDKSAkKENGTEFHUykgcmRqcGdjb20uYwotIWVuZGlmCi0KLSMgT24gRE9TLCB3cmpwZ2NvbSBuZWVkcyBsYXJnZSBtb2RlbCBzbyBpdCBjYW4gbWFsbG9jIGEgNjRLIGNodW5rCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLmMKLSFpZiAkZChET1MpCi0JJChDQykgLW1sIC1PIHdyanBnY29tLmMKLSFlbHNlCi0JJChDQykgJChDRkxBR1MpIHdyanBnY29tLmMKLSFlbmRpZgotCi0jIFRoaXMgInt9IiBzeW50YXggYWxsb3dzIEJvcmxhbmQgTWFrZSB0byAiYmF0Y2giIHNvdXJjZSBmaWxlcy4KLSMgSW4gdGhpcyB3YXksIGVhY2ggcnVuIG9mIHRoZSBjb21waWxlciBjYW4gYnVpbGQgbWFueSBtb2R1bGVzLgotLmMub2JqOgotCSQoQ0MpICQoQ0ZMQUdTKSAtY3sgJDx9Ci0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQktIGRlbCAqLm9iagotCS0gZGVsIGxpYmpwZWcubGliCi0JLSBkZWwgY2pwZWcuZXhlCi0JLSBkZWwgZGpwZWcuZXhlCi0JLSBkZWwganBlZ3RyYW4uZXhlCi0JLSBkZWwgcmRqcGdjb20uZXhlCi0JLSBkZWwgd3JqcGdjb20uZXhlCi0JLSBkZWwgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQotCS0gZGVsIHRlc3RvdXQqLioKLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0haWYgJGQoRE9TKQotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0hZWxzZQotCWVjaG8gbiA+IG4udG1wCi0JY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbSA8IG4udG1wCi0JY29tcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcCA8IG4udG1wCi0JY29tcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZyA8IG4udG1wCi0JY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0gPCBuLnRtcAotCWNvbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZyA8IG4udG1wCi0JY29tcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnIDwgbi50bXAKLQlkZWwgbi50bXAKLSFlbmRpZgotCi0KLWpjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLWptZW1kb3NhLm9iajogam1lbWRvc2EuYXNtCi0JdGFzbSAvbXggam1lbWRvc2EuYXNtCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS5jZmcgYi9saWJqcGVndHdycC9tYWtlZmlsZS5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWU0MmUuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWZpbGUuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIG1ha2VmaWxlLmNmZyBpcyBlZGl0ZWQgYnkgY29uZmlndXJlIHRvIHByb2R1Y2UgYSBjdXN0b20gTWFrZWZpbGUuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgRm9yIGNvbXBpbGluZyB3aXRoIHNvdXJjZSBhbmQgb2JqZWN0IGZpbGVzIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KLXNyY2RpciA9IEBzcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLSMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIG1hbiBwYWdlcy4KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWJpbmRpciA9ICQoZXhlY19wcmVmaXgpL2JpbgotbGliZGlyID0gJChleGVjX3ByZWZpeCkvbGliCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLWJpbnByZWZpeCA9Ci1tYW5wcmVmaXggPQotbWFuZXh0ID0gMQotbWFuZGlyID0gJChwcmVmaXgpL21hbi9tYW4kKG1hbmV4dCkKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gQENDQAotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLUNGTEFHUz0gQENGTEFHU0AgQENQUEZMQUdTQCBASU5DTFVERUZMQUdTQAotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotIyBIb3dldmVyLCBhbnkgc3BlY2lhbCBkZWZpbmVzIGZvciBhbnNpMmtuci5jIG1heSBiZSBpbmNsdWRlZCBoZXJlOgotQU5TSTJLTlJGTEFHUz0gQEFOU0kyS05SRkxBR1NACi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci1MREZMQUdTPSBATERGTEFHU0AKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gQExJQlNACi0KLSMgSWYgdXNpbmcgR05VIGxpYnRvb2wsIExJQlRPT0wgcmVmZXJlbmNlcyBpdDsgaWYgbm90LCBMSUJUT09MIGlzIGVtcHR5LgotTElCVE9PTCA9IEBMSUJUT09MQAotIyAkKE8pIGV4cGFuZHMgdG8gImxvIiBpZiB1c2luZyBsaWJ0b29sLCBwbGFpbiAibyIgaWYgbm90LgotIyBTaW1pbGFybHksICQoQSkgZXhwYW5kcyB0byAibGEiIG9yICJhIi4KLU8gPSBAT0AKLUEgPSBAQUAKLQotIyBMaWJyYXJ5IHZlcnNpb24gSUQ7IGxpYnRvb2wgdXNlcyB0aGlzIGZvciB0aGUgc2hhcmVkIGxpYnJhcnkgdmVyc2lvbiBudW1iZXIuCi0jIE5vdGU6IHdlIHN1Z2dlc3QgdGhpcyBtYXRjaCB0aGUgbWFjcm8gb2YgdGhlIHNhbWUgbmFtZSBpbiBqcGVnbGliLmguCi1KUEVHX0xJQl9WRVJTSU9OID0gQEpQRUdfTElCX1ZFUlNJT05ACi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50Ci0jIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgotU1lTREVQTUVNPSBATUVNT1JZTUdSQAotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi1TSEVMTD0gL2Jpbi9zaAotIyBsaW5rZXIKLUxOPSBATE5ACi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IHJtIC1mCi0jIGRpcmVjdG9yeSBjcmVhdGlvbiBjb21tYW5kCi1NS0RJUj0gbWtkaXIKLSMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IGFyIHJjCi0jIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQotQVIyPSBAUkFOTElCQAotIyBpbnN0YWxsYXRpb24gcHJvZ3JhbQotSU5TVEFMTD0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU09IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0xJQj0gQElOU1RBTExfTElCQAotSU5TVEFMTF9EQVRBPSBASU5TVEFMTF9EQVRBQAotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLiQoTykganV0aWxzLiQoTykgamVycm9yLiQoTykgam1lbW1nci4kKE8pICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLiQoTykgamNhcGlzdGQuJChPKSBqY3RyYW5zLiQoTykgamNwYXJhbS4kKE8pIFwKLSAgICAgICAgamRhdGFkc3QuJChPKSBqY2luaXQuJChPKSBqY21hc3Rlci4kKE8pIGpjbWFya2VyLiQoTykgamNtYWluY3QuJChPKSBcCi0gICAgICAgIGpjcHJlcGN0LiQoTykgamNjb2VmY3QuJChPKSBqY2NvbG9yLiQoTykgamNzYW1wbGUuJChPKSBqY2h1ZmYuJChPKSBcCi0gICAgICAgIGpjcGh1ZmYuJChPKSBqY2RjdG1nci4kKE8pIGpmZGN0ZnN0LiQoTykgamZkY3RmbHQuJChPKSBcCi0gICAgICAgIGpmZGN0aW50LiQoTykKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLiQoTykgamRhcGlzdGQuJChPKSBqZHRyYW5zLiQoTykgamRhdGFzcmMuJChPKSBcCi0gICAgICAgIGpkbWFzdGVyLiQoTykgamRpbnB1dC4kKE8pIGpkbWFya2VyLiQoTykgamRodWZmLiQoTykgamRwaHVmZi4kKE8pIFwKLSAgICAgICAgamRtYWluY3QuJChPKSBqZGNvZWZjdC4kKE8pIGpkcG9zdGN0LiQoTykgamRkY3RtZ3IuJChPKSBcCi0gICAgICAgIGppZGN0ZnN0LiQoTykgamlkY3RmbHQuJChPKSBqaWRjdGludC4kKE8pIGppZGN0cmVkLiQoTykgXAotICAgICAgICBqZHNhbXBsZS4kKE8pIGpkY29sb3IuJChPKSBqcXVhbnQxLiQoTykganF1YW50Mi4kKE8pIGpkbWVyZ2UuJChPKQotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcuJChPKSByZHBwbS4kKE8pIHJkZ2lmLiQoTykgcmR0YXJnYS4kKE8pIHJkcmxlLiQoTykgXAotICAgICAgICByZGJtcC4kKE8pIHJkc3dpdGNoLiQoTykgY2RqcGVnLiQoTykKLURPQkpFQ1RTPSBkanBlZy4kKE8pIHdycHBtLiQoTykgd3JnaWYuJChPKSB3cnRhcmdhLiQoTykgd3JybGUuJChPKSBcCi0gICAgICAgIHdyYm1wLiQoTykgcmRjb2xtYXAuJChPKSBjZGpwZWcuJChPKQotVFJPQkpFQ1RTPSBqcGVndHJhbi4kKE8pIHJkc3dpdGNoLiQoTykgY2RqcGVnLiQoTykgdHJhbnN1cHAuJChPKQotCi0KLWFsbDogQEEyS19ERVBTQCBsaWJqcGVnLiQoQSkgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KLQotIyBTcGVjaWFsIGNvbXBpbGF0aW9uIHJ1bGVzIHRvIHN1cHBvcnQgYW5zaTJrbnIgYW5kIGxpYnRvb2wuCi0uU1VGRklYRVM6IC5sbyAubGEKLQotIyBIb3cgdG8gY29tcGlsZSB3aXRoIGxpYnRvb2wuCi1AQ09NX0xUQC5jLmxvOgotQENPTV9MVEAJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKENGTEFHUykgLWMgJChzcmNkaXIpLyQqLmMKLQotIyBIb3cgdG8gdXNlIGFuc2kya25yLCB3aGVuIG5vdCB1c2luZyBsaWJ0b29sLgotQENPTV9BMktALmMubzoKLUBDT01fQTJLQAkuL2Fuc2kya25yICQoc3JjZGlyKS8kKi5jIGtuci8kKi5jCi1AQ09NX0EyS0AJJChDQykgJChDRkxBR1MpIC1jIGtuci8kKi5jCi1AQ09NX0EyS0AJJChSTSkga25yLyQqLmMKLQotIyBIb3cgdG8gdXNlIGFuc2kya25yIEFORCBsaWJ0b29sLgotQENPTV9BMktALmMubG86Ci1AQ09NX0EyS0AJLi9hbnNpMmtuciAkKHNyY2RpcikvJCouYyBrbnIvJCouYwotQENPTV9BMktACSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChDRkxBR1MpIC1jIGtuci8kKi5jCi1AQ09NX0EyS0AJJChSTSkga25yLyQqLmMKLQotYW5zaTJrbnI6IGFuc2kya25yLmMKLQkkKENDKSAkKENGTEFHUykgJChBTlNJMktOUkZMQUdTKSAtbyBhbnNpMmtuciAkKHNyY2RpcikvYW5zaTJrbnIuYwotCSQoTUtESVIpIGtucgotCi0jIHRoZSBsaWJyYXJ5OgotCi0jIHdpdGhvdXQgbGlidG9vbDoKLWxpYmpwZWcuYTogQEEyS19ERVBTQCAkKExJQk9CSkVDVFMpCi0JJChSTSkgbGlianBlZy5hCi0JJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCi0JJChBUjIpIGxpYmpwZWcuYQotCi0jIHdpdGggbGlidG9vbDoKLWxpYmpwZWcubGE6IEBBMktfREVQU0AgJChMSUJPQkpFQ1RTKQotCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQykgLW8gbGlianBlZy5sYSAkKExJQk9CSkVDVFMpIFwKLQkJLXJwYXRoICQobGliZGlyKSAtdmVyc2lvbi1pbmZvICQoSlBFR19MSUJfVkVSU0lPTikKLQotIyBzYW1wbGUgcHJvZ3JhbXM6Ci0KLWNqcGVnOiAkKENPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKLQkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnICQoQ09CSkVDVFMpIGxpYmpwZWcuJChBKSAkKExETElCUykKLQotZGpwZWc6ICQoRE9CSkVDVFMpIGxpYmpwZWcuJChBKQotCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcgJChET0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQotCi1qcGVndHJhbjogJChUUk9CSkVDVFMpIGxpYmpwZWcuJChBKQotCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcuJChBKSAkKExETElCUykKLQotcmRqcGdjb206IHJkanBnY29tLiQoTykKLQkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLiQoTykgJChMRExJQlMpCi0KLXdyanBnY29tOiB3cmpwZ2NvbS4kKE8pCi0JJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS4kKE8pICQoTERMSUJTKQotCi0jIEluc3RhbGxhdGlvbiBydWxlczoKLQotaW5zdGFsbDogY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20gQEZPUkNFX0lOU1RBTExfTElCQAotCSQoSU5TVEFMTF9QUk9HUkFNKSBjanBlZyAkKGJpbmRpcikvJChiaW5wcmVmaXgpY2pwZWcKLQkkKElOU1RBTExfUFJPR1JBTSkgZGpwZWcgJChiaW5kaXIpLyQoYmlucHJlZml4KWRqcGVnCi0JJChJTlNUQUxMX1BST0dSQU0pIGpwZWd0cmFuICQoYmluZGlyKS8kKGJpbnByZWZpeClqcGVndHJhbgotCSQoSU5TVEFMTF9QUk9HUkFNKSByZGpwZ2NvbSAkKGJpbmRpcikvJChiaW5wcmVmaXgpcmRqcGdjb20KLQkkKElOU1RBTExfUFJPR1JBTSkgd3JqcGdjb20gJChiaW5kaXIpLyQoYmlucHJlZml4KXdyanBnY29tCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9janBlZy4xICQobWFuZGlyKS8kKG1hbnByZWZpeCljanBlZy4kKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2RqcGVnLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWRqcGVnLiQobWFuZXh0KQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvanBlZ3RyYW4uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpanBlZ3RyYW4uJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9yZGpwZ2NvbS4xICQobWFuZGlyKS8kKG1hbnByZWZpeClyZGpwZ2NvbS4kKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3dyanBnY29tLjEgJChtYW5kaXIpLyQobWFucHJlZml4KXdyanBnY29tLiQobWFuZXh0KQotCi1pbnN0YWxsLWxpYjogbGlianBlZy4kKEEpIGluc3RhbGwtaGVhZGVycwotCSQoSU5TVEFMTF9MSUIpIGxpYmpwZWcuJChBKSAkKGxpYmRpcikvJChiaW5wcmVmaXgpbGlianBlZy4kKEEpCi0KLWluc3RhbGwtaGVhZGVyczogamNvbmZpZy5oCi0JJChJTlNUQUxMX0RBVEEpIGpjb25maWcuaCAkKGluY2x1ZGVkaXIpL2pjb25maWcuaAotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvanBlZ2xpYi5oICQoaW5jbHVkZWRpcikvanBlZ2xpYi5oCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qbW9yZWNmZy5oICQoaW5jbHVkZWRpcikvam1vcmVjZmcuaAotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvamVycm9yLmggJChpbmNsdWRlZGlyKS9qZXJyb3IuaAotCi1jbGVhbjoKLQkkKFJNKSAqLm8gKi5sbyBsaWJqcGVnLmEgbGlianBlZy5sYQotCSQoUk0pIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCi0JJChSTSkgYW5zaTJrbnIgY29yZSB0ZXN0b3V0KiBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMKLQkkKFJNKSAtciBrbnIgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuOiBjbGVhbgotCSQoUk0pIE1ha2VmaWxlIGpjb25maWcuaCBsaWJ0b29sIGNvbmZpZy5jYWNoZQotCi10ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgotCSQoUk0pIHRlc3RvdXQqCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICAkKHNyY2RpcikvdGVzdG9yaWcuanBnCi0JLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICAkKHNyY2RpcikvdGVzdG9yaWcuanBnCi0JLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgJChzcmNkaXIpL3Rlc3RpbWcucHBtCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSAkKHNyY2RpcikvdGVzdHByb2cuanBnCi0JLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgJChzcmNkaXIpL3Rlc3RpbWcucHBtCi0JLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgJChzcmNkaXIpL3Rlc3Rwcm9nLmpwZwotCWNtcCAkKHNyY2RpcikvdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQljbXAgJChzcmNkaXIpL3Rlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWNtcCAkKHNyY2RpcikvdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JY21wICQoc3JjZGlyKS90ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JY21wICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLWNoZWNrOiB0ZXN0Ci0KLSMgTWlzdGFrZSBjYXRjaGVyOgotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotIyBHTlUgTWFrZSBsaWtlcyB0byBrbm93IHdoaWNoIHRhcmdldCBuYW1lcyBhcmUgbm90IHJlYWxseSBmaWxlcyB0byBiZSBtYWRlOgotLlBIT05ZOiBhbGwgaW5zdGFsbCBpbnN0YWxsLWxpYiBpbnN0YWxsLWhlYWRlcnMgY2xlYW4gZGlzdGNsZWFuIHRlc3QgY2hlY2sKLQotCi1qY2FwaW1pbi4kKE8pOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQuJChPKTogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0LiQoTyk6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLiQoTyk6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLiQoTyk6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLiQoTyk6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0LiQoTyk6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QuJChPKTogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLiQoTyk6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci4kKE8pOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS4kKE8pOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLiQoTyk6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYuJChPKTogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QuJChPKTogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLiQoTyk6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLiQoTyk6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLiQoTyk6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC4kKE8pOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QuJChPKTogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMuJChPKTogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QuJChPKTogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IuJChPKTogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3IuJChPKTogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYuJChPKTogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0LiQoTyk6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0LiQoTyk6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci4kKE8pOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIuJChPKTogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UuJChPKTogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi4kKE8pOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC4kKE8pOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUuJChPKTogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMuJChPKTogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLiQoTyk6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0LiQoTyk6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3QuJChPKTogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC4kKE8pOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0LiQoTyk6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3QuJChPKTogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC4kKE8pOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLiQoTyk6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS4kKE8pOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLiQoTyk6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy4kKE8pOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3IuJChPKTogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLiQoTyk6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUuJChPKTogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy4kKE8pOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3MuJChPKTogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMuJChPKTogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLiQoTyk6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLiQoTyk6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLiQoTyk6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20uJChPKTogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20uJChPKTogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLiQoTyk6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAuJChPKTogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLiQoTyk6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC4kKE8pOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS4kKE8pOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0uJChPKTogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLiQoTyk6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi4kKE8pOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS4kKE8pOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLiQoTyk6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLiQoTyk6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC4kKE8pOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUuJChPKTogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLiQoTyk6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS5kaiBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLmRqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY2ZDI1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLmRqCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCBvbiBNUy1ET1MpLCB2Mi4wIG9yIGxhdGVyLgotIyBUaGFua3MgdG8gRnJhbmsgSi4gRG9uYWhvZSBmb3IgdGhpcyB2ZXJzaW9uLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBnY2MKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci1DRkxBR1M9IC1PMiAtV2FsbCAtSS4KLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IC1zCi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgREpHUFAgdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgY291bGQKLSMgdXNlIGptZW1uYW1lLm8gaWYgeW91IHdhbnQgdG8gdXNlIG5hbWVkIHRlbXAgZmlsZXMgaW5zdGVhZCBvZiBzd2FwIHNwYWNlLgotU1lTREVQTUVNPSBqbWVtbm9icy5vCi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLSMgbGlua2VyCi1MTj0gJChDQykKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gZGVsCi0jIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBhciByYwotIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKLUFSMj0gcmFubGliCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCi0gICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAotICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmZGN0aW50Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKLSAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6IGxpYmpwZWcuYSBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCi0KLWxpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQotCSQoUk0pIGxpYmpwZWcuYQotCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQotCSQoQVIyKSBsaWJqcGVnLmEKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBkanBlZy5leGUgJChET0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1qcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tLmV4ZSByZGpwZ2NvbS5vICQoTERMSUJTKQotCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tLmV4ZSB3cmpwZ2NvbS5vICQoTERMSUJTKQotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46Ci0JJChSTSkgKi5vCi0JJChSTSkgY2pwZWcuZXhlCi0JJChSTSkgZGpwZWcuZXhlCi0JJChSTSkganBlZ3RyYW4uZXhlCi0JJChSTSkgcmRqcGdjb20uZXhlCi0JJChSTSkgd3JqcGdjb20uZXhlCi0JJChSTSkgbGlianBlZy5hCi0JJChSTSkgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQotCSQoUk0pIHRlc3RvdXQqLioKLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAotamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKLWpmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotanF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWNqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWpwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAotcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi10cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCi1yZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS5tYW54IGIvbGlianBlZ3R3cnAvbWFrZWZpbGUubWFueApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiNDJkMS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS5tYW54CisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0jIFRoaXMgbWFrZWZpbGUgaXMgZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgTWFueCBBenRlYyBDIHZlciA1LnguCi0jIFRoYW5rcyB0byBELkouIEphbWVzIChkamphbWVzQGN1cC5wb3J0YWwuY29tKSBmb3IgdGhpcyB2ZXJzaW9uLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBjYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLSMgVW5jb21tZW50IGZvciBnZW5lcmljIDY4MDAwIGNvZGUgKHdpbGwgd29yayBvbiBhbnkgQW1pZ2EpCi1BUkNIRkxBR1M9IC1zbgotCi0jIFVuY29tbWVudCBmb3IgNjgwMjAvNjgwMzAgY29kZSAoZmFzdGVyLCBidXQgd29uJ3QgcnVuIG9uIDY4MDAwIENQVSkKLSNBUkNIRkxBR1M9IC1jMgotCi1DRkxBR1M9IC1NQyAtTUQgJChBUkNIRkxBR1MpIC1zcGZhbSAtcjQKLQotIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKLUxERkxBR1M9IC1nCi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IC1sbWwgLWxjbAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgQW1pZ2Egd2UgcmVjb21tZW5kIGptZW1uYW1lLm8uCi1TWVNERVBNRU09IGptZW1uYW1lLm8KLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBsaW5rZXIKLUxOPSBsbgotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBkZWxldGUgcXVpZXQKLSMgbGlicmFyeSAoLmxpYikgZmlsZSBjcmVhdGlvbiBjb21tYW5kCi1BUj0gbGIKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubwotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAotICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKLSAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAotICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubwotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAotICAgICAgICBjZGpwZWcubwotRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCi0gICAgICAgIGNkanBlZy5vCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCi0KLQotYWxsOiBsaWJqcGVnLmxpYiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQotCS0kKFJNKSBsaWJqcGVnLmxpYgotCSQoQVIpIGxpYmpwZWcubGliICAkKExJQk9CSkVDVFMpCi0KLWNqcGVnOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLWRqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcgJChET0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCi0KLWpwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKLQotcmRqcGdjb206IHJkanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLm8gJChMRExJQlMpCi0KLXdyanBnY29tOiB3cmpwZ2NvbS5vCi0JJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS5vICQoTERMSUJTKQotCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCi0JZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KLQlleGl0IDEKLQotY2xlYW46Ci0JLSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBsaWJqcGVnLmxpYiByZGpwZ2NvbSB3cmpwZ2NvbQotCS0kKFJNKSBjb3JlIHRlc3RvdXQqLioKLQotdGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KLQktJChSTSkgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1jNiBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1jNgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmZjA1NC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS5tYzYKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgTWljcm9zb2Z0IEMgZm9yIE1TLURPUywgdmVyc2lvbiA2LjAwQSBhbmQgdXAuCi0jIFVzZSBOTUFLRSwgbm90IE1pY3Jvc29mdCdzIGJyYWluLWRhbWFnZWQgTUFLRS4KLSMgVGhhbmtzIHRvIEFsYW4gV3JpZ2h0IGFuZCBDaHJpcyBUdXJuZXIgb2YgT2xpdmV0dGkgUmVzZWFyY2ggTHRkLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJubWFrZSIgISEKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNvbXBpbGVyIG9wdGlvbnM6Ci1DRkxBR1MgPSAtQU0gLU9lY2lndCAtR3MgLVczCi0jIC1BTSBtZWRpdW0gbWVtb3J5IG1vZGVsIChvciB1c2UgLUFTIGZvciBzbWFsbCBtb2RlbCwgaWYgeW91IHJlbW92ZSBmZWF0dXJlcykKLSMgLU9lY2lndCAtR3MgIG1heGltdW0gc2FmZSBvcHRpbWlzYXRpb24gKC1PbCBoYXMgYnVncyBpbiBNU0MgNi4wMEEpCi0jIC1XMyB3YXJuaW5nIGxldmVsIDMKLSMgWW91IG1pZ2h0IGFsc28gd2FudCB0byBhZGQgLUcyIGlmIHlvdSBoYXZlIGFuIDgwMjg2LCBldGMuCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0KLSMgSmFuLUhlcm1hbiBCdWluaW5nIHN1Z2dlc3RzIHRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgZm9yIE1TIEMgOC4wIGFuZCBhIDQ4NjoKLSMgQ0ZMQUdTID0gL0FNIC9mLSAvRlBpODcgL0czIC9HcyAvR3kgL09iMSAvT2MgL09lIC9PZyAvT2kgL09sIC9PbiAvT28gL090IFwKLSMgICAgICAgICAgL09WNCAvVzMKLSMgZXhjZXB0IGZvciBqcXVhbnQxLmMsIHdoaWNoIG11c3QgYmUgY29tcGlsZWQgd2l0aCAvT28tIHRvIGF2b2lkIGEgY29tcGlsZXIKLSMgY3Jhc2guCi0KLSMgSW5nYXIgU3RlaW5zbGFuZCBzdWdnZXN0cyB0aGUgZm9sbG93aW5nIHN3aXRjaGVzIHdoZW4gYnVpbGRpbmcKLSMgYSAxNi1iaXQgV2luZG93cyBETEw6Ci0jIENGTEFHUyA9IC1BTHcgLUdzdyAtWnBlIC1XMyAtTzIgLVppIC1aZAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgRE9TLCB3ZSByZWNvbW1lbmQgam1lbWRvcy5jIGFuZCBqbWVtZG9zYS5hc20uCi0jIChCdXQgbm90IGZvciBXaW5kb3dzOyBzZWUgaW5zdGFsbC5kb2MgaWYgeW91IHVzZSB0aGlzIG1ha2VmaWxlIGZvciBXaW5kb3dzLikKLVNZU0RFUE1FTT0gam1lbWRvcy5vYmogam1lbWRvc2Eub2JqCi0jIFNZU0RFUE1FTUxJQiBtdXN0IGxpc3QgdGhlIHNhbWUgZmlsZXMgd2l0aCAiKyIgc2lnbnMgZm9yIHRoZSBsaWJyYXJpYW4uCi1TWVNERVBNRU1MSUI9ICtqbWVtZG9zLm9iaiAram1lbWRvc2Eub2JqCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKLSAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCi0jIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAotICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAotICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKLSAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKLURPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKLSAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKLVRST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagotCi0jIG5lZWQgbGlua2VyIHJlc3BvbnNlIGZpbGUgYmVjYXVzZSBmaWxlIGxpc3QgPiAxMjggY2hhcnMKLVJGSUxFID0gbGlianBlZy5hbnMKLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykgJChSRklMRSkKLQlkZWwgbGlianBlZy5saWIKLQlsaWIgQCQoUkZJTEUpCi0KLSMgbGlua2VyIHJlc3BvbnNlIGZpbGUgZm9yIGJ1aWxkaW5nIGxpYmpwZWcubGliCi0kKFJGSUxFKSA6IG1ha2VmaWxlCi0JZGVsICQoUkZJTEUpCi0JZWNobyBsaWJqcGVnLmxpYiA+JChSRklMRSkKLSMgc2lsbHkgd2FudC10by1jcmVhdGUtaXQgcHJvbXB0OgotCWVjaG8geSA+PiQoUkZJTEUpCi0JZWNobyAramNhcGltaW4ub2JqICtqY2FwaXN0ZC5vYmogK2pjdHJhbnMub2JqICtqY3BhcmFtLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZGF0YWRzdC5vYmogK2pjaW5pdC5vYmogK2pjbWFzdGVyLm9iaiAramNtYXJrZXIub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pjbWFpbmN0Lm9iaiAramNwcmVwY3Qub2JqICtqY2NvZWZjdC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramNjb2xvci5vYmogK2pjc2FtcGxlLm9iaiAramNodWZmLm9iaiAramNwaHVmZi5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramNkY3RtZ3Iub2JqICtqZmRjdGZzdC5vYmogK2pmZGN0Zmx0Lm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZmRjdGludC5vYmogK2pkYXBpbWluLm9iaiAramRhcGlzdGQub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pkdHJhbnMub2JqICtqZGF0YXNyYy5vYmogK2pkbWFzdGVyLm9iaiAramRpbnB1dC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramRtYXJrZXIub2JqICtqZGh1ZmYub2JqICtqZHBodWZmLm9iaiAramRtYWluY3Qub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pkY29lZmN0Lm9iaiAramRwb3N0Y3Qub2JqICtqZGRjdG1nci5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramlkY3Rmc3Qub2JqICtqaWRjdGZsdC5vYmogK2ppZGN0aW50Lm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqaWRjdHJlZC5vYmogK2pkc2FtcGxlLm9iaiAramRjb2xvci5vYmogK2pxdWFudDEub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pxdWFudDIub2JqICtqZG1lcmdlLm9iaiAramNvbWFwaS5vYmogK2p1dGlscy5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramVycm9yLm9iaiAram1lbW1nci5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAkKFNZU0RFUE1FTUxJQikgOyA+PiQoUkZJTEUpCi0KLWNqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKLQllY2hvICQoQ09CSkVDVFMpID5janBlZy5sc3QKLQlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLIEBjanBlZy5sc3QsIGNqcGVnLmV4ZSwgLCBsaWJqcGVnLmxpYiwgOwotCWRlbCBjanBlZy5sc3QKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCWVjaG8gJChET0JKRUNUUykgPmRqcGVnLmxzdAotCWxpbmsgL1NUQUNLOjQwOTYgL0VYRVBBQ0sgQGRqcGVnLmxzdCwgZGpwZWcuZXhlLCAsIGxpYmpwZWcubGliLCA7Ci0JZGVsIGRqcGVnLmxzdAotCi1qcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCWxpbmsgL1NUQUNLOjQwOTYgL0VYRVBBQ0sgJChUUk9CSkVDVFMpLCBqcGVndHJhbi5leGUsICwgbGlianBlZy5saWIsIDsKLQotcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5jCi0JJChDQykgLUFTIC1PIC1XMyByZGpwZ2NvbS5jCi0KLSMgd3JqcGdjb20gbmVlZHMgbGFyZ2UgbW9kZWwgc28gaXQgY2FuIG1hbGxvYyBhIDY0SyBjaHVuawotd3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5jCi0JJChDQykgLUFMIC1PIC1XMyB3cmpwZ2NvbS5jCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQlkZWwgKi5vYmoKLQlkZWwgbGlianBlZy5saWIKLQlkZWwgY2pwZWcuZXhlCi0JZGVsIGRqcGVnLmV4ZQotCWRlbCBqcGVndHJhbi5leGUKLQlkZWwgcmRqcGdjb20uZXhlCi0JZGVsIHdyanBnY29tLmV4ZQotCWRlbCB0ZXN0b3V0Ki4qCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JZGVsIHRlc3RvdXQqLioKLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKLQljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KLQlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1qbWVtZG9zYS5vYmogOiBqbWVtZG9zYS5hc20KLQltYXNtIC9teCAkKjsKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1tcyBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLm1tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMzBlNS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS5tbXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgdXNlIHdpdGggTU1TIG9uIERpZ2l0YWwgVk1TIHN5c3RlbXMuCi0jIFRoYW5rcyB0byBSaWNrIER5c29uIChkeXNvbkBpb3dhc3AucGh5c2ljcy51aW93YS5lZHUpCi0jIGFuZCBUaW0gQmVsbCAodGJlbGxAbmV0Y29tLmNvbSkgZm9yIHRoZWlyIGhlbHAuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIk1NUyIgISEKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci1DRkxBR1M9ICQoQ0ZMQUdTKSAvTm9EZWJ1ZyAvT3B0aW1pemUKLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgL0RlZmluZSBzd2l0Y2hlcyBoZXJlLgotLmlmZGVmIEFMUEhBCi1PUFQ9Ci0uZWxzZQotT1BUPSAsU3lzJERpc2s6W11NQUtWTVMuT1BUL09wdGlvbgotLmVuZGlmCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50Ci0jIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgotU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAotICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCi0gICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCi0gICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLm9sYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAotICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagotRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAotICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagotVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCi0jIG9iamVjdGZpbGUgbGlzdHMgd2l0aCBjb21tYXMgLS0tIHdoYXQgYSBjcm9jawotQ09CSkxJU1Q9IGNqcGVnLm9iaixyZHBwbS5vYmoscmRnaWYub2JqLHJkdGFyZ2Eub2JqLHJkcmxlLm9iaixyZGJtcC5vYmosXAotICAgICAgICAgIHJkc3dpdGNoLm9iaixjZGpwZWcub2JqCi1ET0JKTElTVD0gZGpwZWcub2JqLHdycHBtLm9iaix3cmdpZi5vYmosd3J0YXJnYS5vYmosd3JybGUub2JqLHdyYm1wLm9iaixcCi0gICAgICAgICAgcmRjb2xtYXAub2JqLGNkanBlZy5vYmoKLVRST0JKTElTVD0ganBlZ3RyYW4ub2JqLHJkc3dpdGNoLm9iaixjZGpwZWcub2JqLHRyYW5zdXBwLm9iagotTElCT0JKTElTVD0gamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaixqY3BhcmFtLm9iaixqZGF0YWRzdC5vYmosXAotICAgICAgICAgIGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaixqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLFwKLSAgICAgICAgICBqY2NvZWZjdC5vYmosamNjb2xvci5vYmosamNzYW1wbGUub2JqLGpjaHVmZi5vYmosamNwaHVmZi5vYmosXAotICAgICAgICAgIGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLGpmZGN0aW50Lm9iaixqZGFwaW1pbi5vYmosXAotICAgICAgICAgIGpkYXBpc3RkLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLFwKLSAgICAgICAgICBqZG1hcmtlci5vYmosamRodWZmLm9iaixqZHBodWZmLm9iaixqZG1haW5jdC5vYmosamRjb2VmY3Qub2JqLFwKLSAgICAgICAgICBqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaixqaWRjdGZsdC5vYmosamlkY3RpbnQub2JqLFwKLSAgICAgICAgICBqaWRjdHJlZC5vYmosamRzYW1wbGUub2JqLGpkY29sb3Iub2JqLGpxdWFudDEub2JqLGpxdWFudDIub2JqLFwKLSAgICAgICAgICBqZG1lcmdlLm9iaixqY29tYXBpLm9iaixqdXRpbHMub2JqLGplcnJvci5vYmosam1lbW1nci5vYmosJChTWVNERVBNRU0pCi0KLQotLmZpcnN0Ci0JQC0gRGVmaW5lIC9Ob0xvZyBTeXMgU3lzJExpYnJhcnkKLQotQUxMIDogbGlianBlZy5vbGIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCUAgQ29udGludWUKLQotbGlianBlZy5vbGIgOiAkKExJQk9CSkVDVFMpCi0JTGlicmFyeSAvQ3JlYXRlIGxpYmpwZWcub2xiICQoTElCT0JKTElTVCkKLQotY2pwZWcuZXhlIDogJChDT0JKRUNUUykgbGlianBlZy5vbGIKLQkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGNqcGVnLmV4ZSAkKENPQkpMSVNUKSxsaWJqcGVnLm9sYi9MaWJyYXJ5JChPUFQpCi0KLWRqcGVnLmV4ZSA6ICQoRE9CSkVDVFMpIGxpYmpwZWcub2xiCi0JJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBkanBlZy5leGUgJChET0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQotCi1qcGVndHJhbi5leGUgOiAkKFRST0JKRUNUUykgbGlianBlZy5vbGIKLQkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGpwZWd0cmFuLmV4ZSAkKFRST0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQotCi1yZGpwZ2NvbS5leGUgOiByZGpwZ2NvbS5vYmoKLQkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IHJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmokKE9QVCkKLQotd3JqcGdjb20uZXhlIDogd3JqcGdjb20ub2JqCi0JJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSB3cmpwZ2NvbS5leGUgd3JqcGdjb20ub2JqJChPUFQpCi0KLWpjb25maWcuaCA6IGpjb25maWcudm1zCi0JQC0gQ29weSBqY29uZmlnLnZtcyBqY29uZmlnLmgKLQotY2xlYW4gOgotCUAtIFNldCBQcm90ZWN0aW9uID0gT3duZXI6UldFRCAqLio7LTEKLQlALSBTZXQgUHJvdGVjdGlvbiA9IE93bmVyOlJXRUQgKi5PQkoKLQktIFB1cmdlIC9Ob0xvZyAvTm9Db25maXJtICouKgotCS0gRGVsZXRlIC9Ob0xvZyAvTm9Db25maXJtICouT0JKOwotCi10ZXN0IDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKLQltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtIHRlc3RvcmlnLmpwZwotCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgdGVzdG9yaWcuanBnCi0JbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgICAgICAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyB0ZXN0aW1nLnBwbQotCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCW1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCW1jciBzeXMkZGlzazpbXWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpjYXBpbWluLm9iaiA6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmogOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3Qub2JqIDogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3Iub2JqIDogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3Iub2JqIDogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYub2JqIDogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQub2JqIDogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmogOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIub2JqIDogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm9iaiA6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iaiA6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ub2JqIDogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmogOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmogOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUub2JqIDogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMub2JqIDogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ub2JqIDogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm9iaiA6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vYmogOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vYmogOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vYmogOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vYmogOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vYmogOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vYmogOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQub2JqIDogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqIDogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm9iaiA6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vYmogOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmogOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm9iaiA6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm9iaiA6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmogOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy5vYmogOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3Iub2JqIDogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQub2JqIDogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC5vYmogOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm9iaiA6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQub2JqIDogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC5vYmogOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm9iaiA6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqIDogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm9iaiA6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIub2JqIDoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iaiA6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vYmogOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kub2JqIDogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmogOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm9iaiA6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vYmogOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmogOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcub2JqIDogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcub2JqIDogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqIDoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vYmogOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vYmogOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqIDogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vYmogOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gub2JqIDogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iaiA6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm9iaiA6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vYmogOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqIDogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm9iaiA6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm9iaiA6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqIDogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAub2JqIDogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm9iaiA6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmogOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUub2JqIDogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLnNhcyBiL2xpYmpwZWd0d3JwL21ha2VmaWxlLnNhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5NmZhZi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS5zYXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBTQVMgQyA2LjAgYW5kIHVwLgotIyBUaGFua3MgdG8gRWQgSGFud2F5LCBNYXJrIFJpbmZyZXQsIGFuZCBKaW0gWmVwZWRhLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKLUNDPSBzYwotCi0jIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKLSMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgZm9yIGdlbmVyaWMgNjgweDAgdmVyc2lvbgotQVJDSEZMQUdTPSBjcHU9YW55Ci1TVUZGSVg9Ci0KLSMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgZm9yIDY4MDMwLW9ubHkgdmVyc2lvbgotI0FSQ0hGTEFHUz0gY3B1PTY4MDMwCi0jU1VGRklYPS4wMzAKLQotQ0ZMQUdTPSBub3N0YWNrY2hlY2sgZGF0YT1uZWFyIHBhcm1zPXJlZ2lzdGVyIG9wdGltaXplICQoQVJDSEZMQUdTKSBcCi0JaWdub3JlPTEwNCBpZ25vcmU9MzA0IGlnbm9yZT0zMDYKLSMgaWdub3JlPTEwNCBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgbWlzbWF0Y2hlZCBjb25zdCBxdWFsaWZpZXJzCi0jIGlnbm9yZT0zMDQgZGlzYWJsZXMgd2FybmluZ3MgZm9yIHZhcmlhYmxlcyBiZWluZyBvcHRpbWl6ZWQgb3V0Ci0jIGlnbm9yZT0zMDYgZGlzYWJsZXMgd2FybmluZ3MgZm9yIHRoZSBpbmxpbmluZyBvZiBmdW5jdGlvbnMKLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgZGVmaW5lIHN3aXRjaGVzIGhlcmUuCi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci1MREZMQUdTPSBTQyBTRCBORCBCQVRDSAotCi0jIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSBjb21tYW5kcyBoZXJlLgotTERMSUJTPSBMSUI6c2NtLmxpYiBMSUI6c2MubGliCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBBbWlnYSB3ZSByZWNvbW1lbmQgam1lbW5hbWUuby4KLVNZU0RFUE1FTT0gam1lbW5hbWUubwotCi0jIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCi0jIGxpbmtlcgotTE49IHNsaW5rCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbGV0ZSBxdWlldAotIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBvbWwKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKLSMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubwotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAotICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKLSAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAotICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubwotIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKLUxJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKLSMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKLUNPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAotICAgICAgICBjZGpwZWcubwotRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCi0gICAgICAgIGNkanBlZy5vCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCi0KLQotYWxsOiBsaWJqcGVnLmxpYiBjanBlZyQoU1VGRklYKSBkanBlZyQoU1VGRklYKSBqcGVndHJhbiQoU1VGRklYKSByZGpwZ2NvbSQoU1VGRklYKSB3cmpwZ2NvbSQoU1VGRklYKQotCi0jIG5vdGU6IGRvIHNldmVyYWwgQVIgc3RlcHMgdG8gYXZvaWQgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdGF0aW9ucwotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQotCS0kKFJNKSBsaWJqcGVnLmxpYgotCSQoQVIpIGxpYmpwZWcubGliIHIgJChDTElCT0JKRUNUUykKLQkkKEFSKSBsaWJqcGVnLmxpYiByICQoRExJQk9CSkVDVFMpCi0JJChBUikgbGlianBlZy5saWIgciAkKENPTU9CSkVDVFMpCi0KLWNqcGVnJChTVUZGSVgpOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIGNqcGVnJChTVUZGSVgpCi1GUk9NIExJQjpjLm8gJChDT0JKRUNUUykKLUxJQiBsaWJqcGVnLmxpYiAkKExETElCUykKLTwKLQotZGpwZWckKFNVRkZJWCk6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMTikgPFdJVEggPAotJChMREZMQUdTKQotVE8gZGpwZWckKFNVRkZJWCkKLUZST00gTElCOmMubyAkKERPQkpFQ1RTKQotTElCIGxpYmpwZWcubGliICQoTERMSUJTKQotPAotCi1qcGVndHJhbiQoU1VGRklYKTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChMTikgPFdJVEggPAotJChMREZMQUdTKQotVE8ganBlZ3RyYW4kKFNVRkZJWCkKLUZST00gTElCOmMubyAkKFRST0JKRUNUUykKLUxJQiBsaWJqcGVnLmxpYiAkKExETElCUykKLTwKLQotcmRqcGdjb20kKFNVRkZJWCk6IHJkanBnY29tLm8KLQkkKExOKSA8V0lUSCA8Ci0kKExERkxBR1MpCi1UTyByZGpwZ2NvbSQoU1VGRklYKQotRlJPTSBMSUI6Yy5vIHJkanBnY29tLm8KLUxJQiAkKExETElCUykKLTwKLQotd3JqcGdjb20kKFNVRkZJWCk6IHdyanBnY29tLm8KLQkkKExOKSA8V0lUSCA8Ci0kKExERkxBR1MpCi1UTyB3cmpwZ2NvbSQoU1VGRklYKQotRlJPTSBMSUI6Yy5vIHdyanBnY29tLm8KLUxJQiAkKExETElCUykKLTwKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOgotCS0kKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gY2pwZWcuMDMwIGRqcGVnLjAzMCBqcGVndHJhbi4wMzAKLQktJChSTSkgcmRqcGdjb20gd3JqcGdjb20gcmRqcGdjb20uMDMwIHdyanBnY29tLjAzMAotCS0kKFJNKSBsaWJqcGVnLmxpYiBjb3JlIHRlc3RvdXQqLioKLQotdGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KLQktJChSTSkgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLQljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKLQljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKLQljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi0KLWpjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKLWpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotam1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCi1yZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi13cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKLXJkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLnVuaXggYi9saWJqcGVndHdycC9tYWtlZmlsZS51bml4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ1NWFiLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLnVuaXgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0KLSMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgVW5peC1saWtlIHN5c3RlbXMgd2l0aCBub24tQU5TSSBjb21waWxlcnMuCi0jIElmIHlvdSBoYXZlIGFuIEFOU0kgY29tcGlsZXIsIG1ha2VmaWxlLmFuc2kgaXMgYSBiZXR0ZXIgc3RhcnRpbmcgcG9pbnQuCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IGNjCi0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotQ0ZMQUdTPSAtTwotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotIyBIb3dldmVyLCBhbnkgc3BlY2lhbCBkZWZpbmVzIGZvciBhbnNpMmtuci5jIG1heSBiZSBpbmNsdWRlZCBoZXJlOgotQU5TSTJLTlJGTEFHUz0gCi0KLSMgTGluay10aW1lIGNjIG9wdGlvbnM6Ci1MREZMQUdTPSAKLQotIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KLUxETElCUz0gCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50Ci0jIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgotU1lTREVQTUVNPSBqbWVtbm9icy5vCi0KLSMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKLSMgbGlua2VyCi1MTj0gJChDQykKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gcm0gLWYKLSMgZmlsZSByZW5hbWUgY29tbWFuZAotTVY9IG12Ci0jIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBhciByYwotIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKLUFSMj0gcmFubGliCi0KLSMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgotCi0KLSMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKLSAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwotIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKLVNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKLSMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KLUFQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCi0gICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAotICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKLVNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCi0jIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCi0jIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAotQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAotICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKLSAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCi1URVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAotICAgICAgICB0ZXN0aW1ncC5qcGcKLURJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAotICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQotIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCi0gICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAotICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmZGN0aW50Lm8KLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKLSAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCi0gICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKLSAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCi0gICAgICAgIGNkanBlZy5vCi1ET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKLSAgICAgICAgY2RqcGVnLm8KLVRST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KLQotCi1hbGw6IGFuc2kya25yIGxpYmpwZWcuYSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotCi0jIFRoaXMgcnVsZSBjYXVzZXMgYW5zaTJrbnIgdG8gYmUgaW52b2tlZC4KLS5jLm86Ci0JLi9hbnNpMmtuciAkKi5jIFQkKi5jCi0JJChDQykgJChDRkxBR1MpIC1jIFQkKi5jCi0JJChSTSkgVCQqLmMgJCoubwotCSQoTVYpIFQkKi5vICQqLm8KLQotYW5zaTJrbnI6IGFuc2kya25yLmMKLQkkKENDKSAkKENGTEFHUykgJChBTlNJMktOUkZMQUdTKSAtbyBhbnNpMmtuciBhbnNpMmtuci5jCi0KLWxpYmpwZWcuYTogYW5zaTJrbnIgJChMSUJPQkpFQ1RTKQotCSQoUk0pIGxpYmpwZWcuYQotCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQotCSQoQVIyKSBsaWJqcGVnLmEKLQotY2pwZWc6IGFuc2kya25yICQoQ09CSkVDVFMpIGxpYmpwZWcuYQotCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1kanBlZzogYW5zaTJrbnIgJChET0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCi0KLWpwZWd0cmFuOiBhbnNpMmtuciAkKFRST0JKRUNUUykgbGlianBlZy5hCi0JJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQotCi1yZGpwZ2NvbTogcmRqcGdjb20ubwotCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKLQotd3JqcGdjb206IHdyanBnY29tLm8KLQkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCi0KLWpjb25maWcuaDogamNvbmZpZy5kb2MKLQllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgotCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgotCWV4aXQgMQotCi1jbGVhbjoKLQkkKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gbGlianBlZy5hIHJkanBnY29tIHdyanBnY29tCi0JJChSTSkgYW5zaTJrbnIgY29yZSB0ZXN0b3V0KgotCi10ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgotCSQoUk0pIHRlc3RvdXQqCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKLQkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCi0JLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKLQkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZwotCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCi0KLQotamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUudmMgYi9saWJqcGVndHdycC9tYWtlZmlsZS52YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjZjA2OS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlZmlsZS52YworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIE5UIChhbmQgOTU/KS4KLSMgSXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyeSAoLkxJQiksCi0jIGFuZCBidWlsZHMgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgYXMgY29uc29sZS1tb2RlIGFwcHMuCi0jIFRoYW5rcyB0byBYaW5nb25nIENoYW5nLCBSYXltb25kIEV2ZXJseSBhbmQgb3RoZXJzLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJubWFrZSIgISEKLSMgVG8gYnVpbGQgYW4gb3B0aW1pemVkIGxpYnJhcnkgd2l0aG91dCBkZWJ1ZyBpbmZvLCBzYXkgIm5tYWtlIG5vZGVidWc9MSIuCi0KLSMgUHVsbCBpbiBzdGFuZGFyZCB2YXJpYWJsZSBkZWZpbml0aW9ucwotIWluY2x1ZGUgPHdpbjMyLm1haz4KLQotIyBZb3UgbWF5IHdhbnQgdG8gYWRqdXN0IHRoZXNlIGNvbXBpbGVyIG9wdGlvbnM6Ci1DRkxBR1M9ICQoY2ZsYWdzKSAkKGNkZWJ1ZykgJChjdmFycykgLUkuCi0jIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAotIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCi0KLSMgTGluay10aW1lIG9wdGlvbnM6Ci1MREZMQUdTPSAkKGxkZWJ1ZykgJChjb25sZmxhZ3MpCi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9ICQoY29ubGlicykKLQotIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKLSMgbWFuYWdlciBmaWxlLiAgRm9yIE5UIHdlIHN1Z2dlc3Qgam1lbW5vYnMub2JqLCB3aGljaCBleHBlY3RzIHRoZSBPUyB0bwotIyBwcm92aWRlIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5LgotU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBkZWwKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQotIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAotICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCi0gICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCi0gICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCi0jIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAotICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagotRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAotICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagotVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCi0KLSMgVGVtcGxhdGUgY29tbWFuZCBmb3IgY29tcGlsaW5nIC5jIHRvIC5vYmoKLS5jLm9iajoKLQkkKGNjKSAkKENGTEFHUykgJCouYwotCi0KLWFsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQotCi1saWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQotCSQoUk0pIGxpYmpwZWcubGliCi0JbGliIC1vdXQ6bGlianBlZy5saWIgICQoTElCT0JKRUNUUykKLQotY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQobGluaykgJChMREZMQUdTKSAtb3V0OmNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKLQotZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgotCSQobGluaykgJChMREZMQUdTKSAtb3V0OmRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKLQotanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQkkKGxpbmspICQoTERGTEFHUykgLW91dDpqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQotCi1yZGpwZ2NvbS5leGU6IHJkanBnY29tLm9iagotCSQobGluaykgJChMREZMQUdTKSAtb3V0OnJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmogJChMRExJQlMpCi0KLXdyanBnY29tLmV4ZTogd3JqcGdjb20ub2JqCi0JJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6d3JqcGdjb20uZXhlIHdyanBnY29tLm9iaiAkKExETElCUykKLQotCi1jbGVhbjoKLQkkKFJNKSAqLm9iaiAqLmV4ZSBsaWJqcGVnLmxpYgotCSQoUk0pIHRlc3RvdXQqCi0KLXRlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCi0JJChSTSkgdGVzdG91dCoKLQkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCS5cZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCi0JLlxjanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KLQkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCS5cY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCi0JLlxqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLQlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0JZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0JZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLQotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlZmlsZS52bXMgYi9saWJqcGVndHdycC9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjM1OGQuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSQhIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLSQhCi0kISBUaGlzIGlzIGEgY29tbWFuZCBwcm9jZWR1cmUgZm9yIERpZ2l0YWwgVk1TIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBNTVMuCi0kISBJdCBidWlsZHMgdGhlIEpQRUcgc29mdHdhcmUgYnkgYnJ1dGUgZm9yY2UsIHJlY29tcGlsaW5nIGV2ZXJ5dGhpbmcgd2hldGhlcgotJCEgb3Igbm90IGl0IGlzIG5lY2Vzc2FyeS4gIEl0IHRoZW4gcnVucyB0aGUgYmFzaWMgc2VsZi10ZXN0LgotJCEgVGhhbmtzIHRvIFJpY2sgRHlzb24gKGR5c29uQGlvd2FzcC5waHlzaWNzLnVpb3dhLmVkdSkKLSQhIGFuZCBUaW0gQmVsbCAodGJlbGxAbmV0Y29tLmNvbSkgZm9yIHRoZWlyIGhlbHAuCi0kIQotJCEgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBydW5uaW5nIHRoaXMhIQotJCEKLSQgSWYgRiRNb2RlICgpIC5lcXMuICJJTlRFUkFDVElWRSIKLSQgICBUaGVuCi0kICAgICAgIFZFUklGWSA9IEYkVmVyaWZ5ICgwKQotJCAgIEVsc2UKLSQgICAgICAgVkVSSUZZID0gRiRWZXJpZnkgKDEpCi0kIEVuZElmCi0kIE9uIENvbnRyb2xfWSBUaGVuIEdvVG8gRW5kCi0kIE9uIEVycm9yICAgICBUaGVuIEdvVG8gRW5kCi0kCi0kIElmIEYkR2V0U3lpICgiSFdfTU9ERUwiKSAuZ3QuIDEwMjMgCi0kICAgVGhlbgotJCAgICAgICBPUFQgPSAiIgotJCAgIEVsc2UKLSQgICAgICAgT1BUID0gIixTeXMkRGlzazpbXW1ha3Ztcy5vcHQvT3B0aW9uIgotJCBFbmRJZgotJCAKLSQgRG9Db21waWxlIDo9IENDIC9Ob0RlYnVnIC9PcHRpbWl6ZSAvTm9MaXN0Ci0kIQotJCBEb0NvbXBpbGUgamNhcGltaW4uYwotJCBEb0NvbXBpbGUgamNhcGlzdGQuYwotJCBEb0NvbXBpbGUgamN0cmFucy5jCi0kIERvQ29tcGlsZSBqY3BhcmFtLmMKLSQgRG9Db21waWxlIGpkYXRhZHN0LmMKLSQgRG9Db21waWxlIGpjaW5pdC5jCi0kIERvQ29tcGlsZSBqY21hc3Rlci5jCi0kIERvQ29tcGlsZSBqY21hcmtlci5jCi0kIERvQ29tcGlsZSBqY21haW5jdC5jCi0kIERvQ29tcGlsZSBqY3ByZXBjdC5jCi0kIERvQ29tcGlsZSBqY2NvZWZjdC5jCi0kIERvQ29tcGlsZSBqY2NvbG9yLmMKLSQgRG9Db21waWxlIGpjc2FtcGxlLmMKLSQgRG9Db21waWxlIGpjaHVmZi5jCi0kIERvQ29tcGlsZSBqY3BodWZmLmMKLSQgRG9Db21waWxlIGpjZGN0bWdyLmMKLSQgRG9Db21waWxlIGpmZGN0ZnN0LmMKLSQgRG9Db21waWxlIGpmZGN0Zmx0LmMKLSQgRG9Db21waWxlIGpmZGN0aW50LmMKLSQgRG9Db21waWxlIGpkYXBpbWluLmMKLSQgRG9Db21waWxlIGpkYXBpc3RkLmMKLSQgRG9Db21waWxlIGpkdHJhbnMuYwotJCBEb0NvbXBpbGUgamRhdGFzcmMuYwotJCBEb0NvbXBpbGUgamRtYXN0ZXIuYwotJCBEb0NvbXBpbGUgamRpbnB1dC5jCi0kIERvQ29tcGlsZSBqZG1hcmtlci5jCi0kIERvQ29tcGlsZSBqZGh1ZmYuYwotJCBEb0NvbXBpbGUgamRwaHVmZi5jCi0kIERvQ29tcGlsZSBqZG1haW5jdC5jCi0kIERvQ29tcGlsZSBqZGNvZWZjdC5jCi0kIERvQ29tcGlsZSBqZHBvc3RjdC5jCi0kIERvQ29tcGlsZSBqZGRjdG1nci5jCi0kIERvQ29tcGlsZSBqaWRjdGZzdC5jCi0kIERvQ29tcGlsZSBqaWRjdGZsdC5jCi0kIERvQ29tcGlsZSBqaWRjdGludC5jCi0kIERvQ29tcGlsZSBqaWRjdHJlZC5jCi0kIERvQ29tcGlsZSBqZHNhbXBsZS5jCi0kIERvQ29tcGlsZSBqZGNvbG9yLmMKLSQgRG9Db21waWxlIGpxdWFudDEuYwotJCBEb0NvbXBpbGUganF1YW50Mi5jCi0kIERvQ29tcGlsZSBqZG1lcmdlLmMKLSQgRG9Db21waWxlIGpjb21hcGkuYwotJCBEb0NvbXBpbGUganV0aWxzLmMKLSQgRG9Db21waWxlIGplcnJvci5jCi0kIERvQ29tcGlsZSBqbWVtbWdyLmMKLSQgRG9Db21waWxlIGptZW1ub2JzLmMKLSQhCi0kIExpYnJhcnkgL0NyZWF0ZSBsaWJqcGVnLm9sYiAgamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaiwgLQotICAgICAgICAgIGpjcGFyYW0ub2JqLGpkYXRhZHN0Lm9iaixqY2luaXQub2JqLGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosIC0KLSAgICAgICAgICBqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLGpjY29lZmN0Lm9iaixqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosIC0KLSAgICAgICAgICBqY2h1ZmYub2JqLGpjcGh1ZmYub2JqLGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLCAtCi0gICAgICAgICAgamZkY3RpbnQub2JqLGpkYXBpbWluLm9iaixqZGFwaXN0ZC5vYmosamR0cmFucy5vYmosamRhdGFzcmMub2JqLCAtCi0gICAgICAgICAgamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLGpkbWFya2VyLm9iaixqZGh1ZmYub2JqLGpkcGh1ZmYub2JqLCAtCi0gICAgICAgICAgamRtYWluY3Qub2JqLGpkY29lZmN0Lm9iaixqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaiwgLQotICAgICAgICAgIGppZGN0Zmx0Lm9iaixqaWRjdGludC5vYmosamlkY3RyZWQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaiwgLQotICAgICAgICAgIGpxdWFudDEub2JqLGpxdWFudDIub2JqLGpkbWVyZ2Uub2JqLGpjb21hcGkub2JqLGp1dGlscy5vYmosIC0KLSAgICAgICAgICBqZXJyb3Iub2JqLGptZW1tZ3Iub2JqLGptZW1ub2JzLm9iagotJCEKLSQgRG9Db21waWxlIGNqcGVnLmMKLSQgRG9Db21waWxlIHJkcHBtLmMKLSQgRG9Db21waWxlIHJkZ2lmLmMKLSQgRG9Db21waWxlIHJkdGFyZ2EuYwotJCBEb0NvbXBpbGUgcmRybGUuYwotJCBEb0NvbXBpbGUgcmRibXAuYwotJCBEb0NvbXBpbGUgcmRzd2l0Y2guYwotJCBEb0NvbXBpbGUgY2RqcGVnLmMKLSQhCi0kIExpbmsgL05vTWFwIC9FeGVjdXRhYmxlID0gY2pwZWcuZXhlICBjanBlZy5vYmoscmRwcG0ub2JqLHJkZ2lmLm9iaiwgLQotICAgICAgICAgIHJkdGFyZ2Eub2JqLHJkcmxlLm9iaixyZGJtcC5vYmoscmRzd2l0Y2gub2JqLGNkanBlZy5vYmosbGlianBlZy5vbGIvTGlicmFyeSdPUFQnCi0kIQotJCBEb0NvbXBpbGUgZGpwZWcuYwotJCBEb0NvbXBpbGUgd3JwcG0uYwotJCBEb0NvbXBpbGUgd3JnaWYuYwotJCBEb0NvbXBpbGUgd3J0YXJnYS5jCi0kIERvQ29tcGlsZSB3cnJsZS5jCi0kIERvQ29tcGlsZSB3cmJtcC5jCi0kIERvQ29tcGlsZSByZGNvbG1hcC5jCi0kIERvQ29tcGlsZSBjZGpwZWcuYwotJCEKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBkanBlZy5leGUgIGRqcGVnLm9iaix3cnBwbS5vYmosd3JnaWYub2JqLCAtCi0gICAgICAgICAgd3J0YXJnYS5vYmosd3JybGUub2JqLHdyYm1wLm9iaixyZGNvbG1hcC5vYmosY2RqcGVnLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKLSQhCi0kIERvQ29tcGlsZSBqcGVndHJhbi5jCi0kIERvQ29tcGlsZSByZHN3aXRjaC5jCi0kIERvQ29tcGlsZSBjZGpwZWcuYwotJCBEb0NvbXBpbGUgdHJhbnN1cHAuYwotJCEKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBqcGVndHJhbi5leGUgIGpwZWd0cmFuLm9iaixyZHN3aXRjaC5vYmosIC0KLSAgICAgICAgICBjZGpwZWcub2JqLHRyYW5zdXBwLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKLSQhCi0kIERvQ29tcGlsZSByZGpwZ2NvbS5jCi0kIExpbmsgL05vTWFwIC9FeGVjdXRhYmxlID0gcmRqcGdjb20uZXhlICByZGpwZ2NvbS5vYmonT1BUJwotJCEKLSQgRG9Db21waWxlIHdyanBnY29tLmMKLSQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSB3cmpwZ2NvbS5leGUgIHdyanBnY29tLm9iaidPUFQnCi0kIQotJCEgUnVuIHRoZSBzZWxmLXRlc3QKLSQhCi0kIG1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gdGVzdG9yaWcuanBnCi0kIG1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgdGVzdG9yaWcuanBnCi0kIG1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50ICAgICAgLW91dGZpbGUgdGVzdG91dC5qcGcgdGVzdGltZy5wcG0KLSQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCi0kIG1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotJCBtY3Igc3lzJGRpc2s6W11qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KLSQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCi0kIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKLSQhCi0kRW5kOgotJCAgIElmIFZlcmlmeSBUaGVuIFNldCBWZXJpZnkKLSQgRXhpdApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrZWZpbGUud2F0IGIvbGlianBlZ3R3cnAvbWFrZWZpbGUud2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTUzZTQ2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha2VmaWxlLndhdAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBXYXRjb20gQy9DKysgMTAuMCBvbiBNUy1ET1MgKHVzaW5nCi0jIGRvczRnIGV4dGVuZGVyKSwgT1MvMiwgYW5kIFdpbmRvd3MgTlQgY29uc29sZSBtb2RlLgotIyBUaGFua3MgdG8gSmFub3MgSGFpZGUsIGpoYWlkZUBidHJ2dGVjaC5jb20uCi0KLSMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIndtYWtlIiAhIQotCi0jIFVuY29tbWVudCBsaW5lIGZvciBkZXNpcmVkIHN5c3RlbQotU1lTVEVNPURPUwotI1NZU1RFTT1PUzIKLSNTWVNURU09TlQKLQotIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6Ci1DQz0gd2NsMzg2Ci0KLSMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgotQ0ZMQUdTPSAtNHIgLW9ydCAtd3ggLXpxIC1idD0kKFNZU1RFTSkKLSMgQ2F1dGlvbjogYXZvaWQgLW9sIG9yIC1veDsgdGhlc2UgZ2VuZXJhdGUgYmFkIGNvZGUgd2l0aCAxMC4wIG9yIDEwLjBhLgotIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKLSMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotIWlmZXEgU1lTVEVNIERPUwotTERGTEFHUz0gLXpxIC1sPWRvczRnCi0hZWxzZSBpZmVxIFNZU1RFTSBPUzIKLUxERkxBR1M9IC16cSAtbD1vczJ2MgotIWVsc2UgaWZlcSBTWVNURU0gTlQKLUxERkxBR1M9IC16cSAtbD1udAotIWVuZGlmCi0KLSMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5Ci0jIG1hbmFnZXIgZmlsZS4gIGptZW1ub2JzIHNob3VsZCB3b3JrIGZpbmUgZm9yIGRvczRnIG9yIE9TLzIgZW52aXJvbm1lbnQuCi1TWVNERVBNRU09IGptZW1ub2JzLm9iagotCi0jIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KLQotCi0jIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgJgotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jICYKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jICYKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgJgotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyAmCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jICYKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyAmCi0gICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKLSMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5Ci1TWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCi0jIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCi1BUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgJgotICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jICYKLSAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCi1TT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQotIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCAmCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAotIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xICYKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jICYKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjICYKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzICYKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0ICYKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyAmCi0gICAgICAgIG1ha3Ztcy5vcHQKLUNPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0ICYKLSAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyAmCi0gICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQotVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnICYKLSAgICAgICAgdGVzdGltZ3AuanBnCi1ESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpICYKLSAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKLSMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogJgotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiAmCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiAmCi0gICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagotIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogJgotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogJgotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqICYKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqICYKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCi1MSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCi0jIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCi1DT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiAmCi0gICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCi1ET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiAmCi0gICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCi1UUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKLQotCi1hbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKLQotbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKLQktIGRlbCBsaWJqcGVnLmxpYgotCSogd2xpYiAtbiBsaWJqcGVnLmxpYiAkKExJQk9CSkVDVFMpCi0KLWNqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCi0KLWRqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKLQkkKENDKSAkKExERkxBR1MpICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCi0KLWpwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCi0JJChDQykgJChMREZMQUdTKSAkKFRST0JKRUNUUykgbGlianBlZy5saWIKLQotcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5jCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgcmRqcGdjb20uYwotCi13cmpwZ2NvbS5leGU6IHdyanBnY29tLmMKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSB3cmpwZ2NvbS5jCi0KLS5jLm9iajoKLQkkKENDKSAkKENGTEFHUykgLWMgJDwKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLWNsZWFuOiAuU1lNQk9MSUMKLQktIGRlbCAqLm9iagotCS0gZGVsIGxpYmpwZWcubGliCi0JLSBkZWwgY2pwZWcuZXhlCi0JLSBkZWwgZGpwZWcuZXhlCi0JLSBkZWwganBlZ3RyYW4uZXhlCi0JLSBkZWwgcmRqcGdjb20uZXhlCi0JLSBkZWwgd3JqcGdjb20uZXhlCi0JLSBkZWwgdGVzdG91dCouKgotCi10ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSAgLlNZTUJPTElDCi0JLSBkZWwgdGVzdG91dCouKgotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZwotCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZwotCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQotCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZwotCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQotCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKLSFpZmVxIFNZU1RFTSBET1MKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQotCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCi0JZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KLQlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCi0JZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotIWVsc2UKLQllY2hvIG4gPiBuLnRtcAotCWNvbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0gPCBuLnRtcAotCWNvbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAgPCBuLnRtcAotCWNvbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcgPCBuLnRtcAotCWNvbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtIDwgbi50bXAKLQljb21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcgPCBuLnRtcAotCWNvbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZyA8IG4udG1wCi0JZGVsIG4udG1wCi0hZW5kaWYKLQotCi1qY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAotamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCi1qY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCi1qZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCi1qZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAotamZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKLWRqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAotanBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAotd3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCi1jZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXRyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWtlbGliLmRzIGIvbGlianBlZ3R3cnAvbWFrZWxpYi5kcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhZDM2ZC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlbGliLmRzCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NiArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKLQotIUlGICIkKENGRykiID09ICIiCi1DRkc9anBlZyAtIFdpbjMyCi0hTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8ganBlZyAtIFdpbjMyLgotIUVORElGIAotCi0hSUYgIiQoQ0ZHKSIgIT0gImpwZWcgLSBXaW4zMiIKLSFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImpwZWcubWFrIiBDRkc9ImpwZWcgLSBXaW4zMiIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQotIU1FU1NBR0UgCi0hRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KLSFFTkRJRiAKLQotIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCi1OVUxMPQotIUVMU0UgCi1OVUxMPW51bAotIUVORElGIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImpwZWcgLSBXaW4zMiIKLUNQUD1jbC5leGUKLQotIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLU9VVERJUj0uXFJlbGVhc2UKLUlOVERJUj0uXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxqcGVnLmxpYiIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcamNhcGltaW4ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjdHJhbnMub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY3BhcmFtLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRhdGFkc3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2luaXQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY21hc3Rlci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjbWFya2VyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNtYWluY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNjb2xvci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjc2FtcGxlLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNwaHVmZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamZkY3Rmc3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRhcGltaW4ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkdHJhbnMub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRpbnB1dC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWFya2VyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRwaHVmZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRjb2VmY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamlkY3Rmc3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGppZGN0aW50Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamlkY3RyZWQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkY29sb3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqcXVhbnQxLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcanF1YW50Mi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkbWVyZ2Uub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY29tYXBpLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcanV0aWxzLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamVycm9yLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcam1lbW1nci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKLQktQGVyYXNlICIkKE9VVERJUilcanBlZy5saWIiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIlwKLSAvRnAiJChJTlRESVIpL2pwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlxSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9qcGVnLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLUxJQjMyX0ZMQUdTPS9ub2xvZ28gL291dDoiJChPVVRESVIpL2pwZWcubGliIiAKLUxJQjMyX09CSlM9IFwKLQkiJChJTlRESVIpXGpjYXBpbWluLm9iaiIgXAotCSIkKElOVERJUilcamNhcGlzdGQub2JqIiBcCi0JIiQoSU5URElSKVxqY3RyYW5zLm9iaiIgXAotCSIkKElOVERJUilcamNwYXJhbS5vYmoiIFwKLQkiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgXAotCSIkKElOVERJUilcamNpbml0Lm9iaiIgXAotCSIkKElOVERJUilcamNtYXN0ZXIub2JqIiBcCi0JIiQoSU5URElSKVxqY21hcmtlci5vYmoiIFwKLQkiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgXAotCSIkKElOVERJUilcamNwcmVwY3Qub2JqIiBcCi0JIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIFwKLQkiJChJTlRESVIpXGpjY29sb3Iub2JqIiBcCi0JIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIFwKLQkiJChJTlRESVIpXGpjaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpjcGh1ZmYub2JqIiBcCi0JIiQoSU5URElSKVxqY2RjdG1nci5vYmoiIFwKLQkiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgXAotCSIkKElOVERJUilcamZkY3RmbHQub2JqIiBcCi0JIiQoSU5URElSKVxqZmRjdGludC5vYmoiIFwKLQkiJChJTlRESVIpXGpkYXBpbWluLm9iaiIgXAotCSIkKElOVERJUilcamRhcGlzdGQub2JqIiBcCi0JIiQoSU5URElSKVxqZHRyYW5zLm9iaiIgXAotCSIkKElOVERJUilcamRhdGFzcmMub2JqIiBcCi0JIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiIFwKLQkiJChJTlRESVIpXGpkaW5wdXQub2JqIiBcCi0JIiQoSU5URElSKVxqZG1hcmtlci5vYmoiIFwKLQkiJChJTlRESVIpXGpkaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpkcGh1ZmYub2JqIiBcCi0JIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIFwKLQkiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgXAotCSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiBcCi0JIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIFwKLQkiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgXAotCSIkKElOVERJUilcamlkY3RmbHQub2JqIiBcCi0JIiQoSU5URElSKVxqaWRjdGludC5vYmoiIFwKLQkiJChJTlRESVIpXGppZGN0cmVkLm9iaiIgXAotCSIkKElOVERJUilcamRzYW1wbGUub2JqIiBcCi0JIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgXAotCSIkKElOVERJUilcanF1YW50MS5vYmoiIFwKLQkiJChJTlRESVIpXGpxdWFudDIub2JqIiBcCi0JIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgXAotCSIkKElOVERJUilcamNvbWFwaS5vYmoiIFwKLQkiJChJTlRESVIpXGp1dGlscy5vYmoiIFwKLQkiJChJTlRESVIpXGplcnJvci5vYmoiIFwKLQkiJChJTlRESVIpXGptZW1tZ3Iub2JqIiBcCi0JIiQoSU5URElSKVxqbWVtbm9icy5vYmoiCi0KLSIkKE9VVERJUilcanBlZy5saWIiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSUIzMl9PQkpTKQotICAgICQoTElCMzIpIEA8PAotICAkKExJQjMyX0ZMQUdTKSAkKERFRl9GTEFHUykgJChMSUIzMl9PQkpTKQotPDwKLQotIUVORElGIAotCi0uY3skKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9PQkpTKX0ub2JqOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jcHB7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jeHh7JChDUFBfU0JSUyl9LnNicjoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImpwZWcgLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNhcGltaW4uYyIKLURFUF9DUFBfSkNBUEk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2FwaXN0ZC5jIgotREVQX0NQUF9KQ0FQSVM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSVMpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNjb2VmY3QuYyIKLURFUF9DUFBfSkNDT0U9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2NvbG9yLmMiCi1ERVBfQ1BQX0pDQ09MPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNjb2xvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPTCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2RjdG1nci5jIgotREVQX0NQUF9KQ0RDVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpjZGN0bWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDRENUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjaHVmZi5jIgotREVQX0NQUF9KQ0hVRj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqY2h1ZmYuaCJcCi0JCi0KLSIkKElOVERJUilcamNodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDSFVGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjaW5pdC5jIgotREVQX0NQUF9KQ0lOST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjaW5pdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0lOSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY21haW5jdC5jIgotREVQX0NQUF9KQ01BST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjbWFya2VyLmMiCi1ERVBfQ1BQX0pDTUFSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNtYXN0ZXIuYyIKLURFUF9DUFBfSkNNQVM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY29tYXBpLmMiCi1ERVBfQ1BQX0pDT01BPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNvbWFwaS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ09NQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3BhcmFtLmMiCi1ERVBfQ1BQX0pDUEFSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNwYXJhbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BBUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3BodWZmLmMiCi1ERVBfQ1BQX0pDUEhVPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpjaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqY3BodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUEhVKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjcHJlcGN0LmMiCi1ERVBfQ1BQX0pDUFJFPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNwcmVwY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQUkUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNzYW1wbGUuYyIKLURFUF9DUFBfSkNTQU09XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1NBTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3RyYW5zLmMiCi1ERVBfQ1BQX0pDVFJBPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamN0cmFucy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1RSQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGFwaW1pbi5jIgotREVQX0NQUF9KREFQST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXBpbWluLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXBpc3RkLmMiCi1ERVBfQ1BQX0pEQVBJUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGF0YWRzdC5jIgotREVQX0NQUF9KREFUQT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXRhc3JjLmMiCi1ERVBfQ1BQX0pEQVRBUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkYXRhc3JjLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGNvZWZjdC5jIgotREVQX0NQUF9KRENPRT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09FKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkY29sb3IuYyIKLURFUF9DUFBfSkRDT0w9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09MKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkZGN0bWdyLmMiCi1ERVBfQ1BQX0pERENUPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamRkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkREQ1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRodWZmLmMiCi1ERVBfQ1BQX0pESFVGPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqZGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRIVUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRpbnB1dC5jIgotREVQX0NQUF9KRElOUD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkaW5wdXQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRJTlApICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRtYWluY3QuYyIKLURFUF9DUFBfSkRNQUk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZG1hcmtlci5jIgotREVQX0NQUF9KRE1BUj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkbWFya2VyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkbWFzdGVyLmMiCi1ERVBfQ1BQX0pETUFTPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRtYXN0ZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQVMpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRtZXJnZS5jIgotREVQX0NQUF9KRE1FUj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkbWVyZ2Uub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNRVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRwaHVmZi5jIgotREVQX0NQUF9KRFBIVT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGh1ZmYuaCJcCi0JCi0KLSIkKElOVERJUilcamRwaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFBIVSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZHBvc3RjdC5jIgotREVQX0NQUF9KRFBPUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEUE9TKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Impkc2FtcGxlLmMiCi1ERVBfQ1BQX0pEU0FNPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRzYW1wbGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRTQU0pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamR0cmFucy5jIgotREVQX0NQUF9KRFRSQT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkdHJhbnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRUUkEpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamVycm9yLmMiCi1ERVBfQ1BQX0pFUlJPPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqdmVyc2lvbi5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGplcnJvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRVJSTykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZmRjdGZsdC5jIgotREVQX0NQUF9KRkRDVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpmZGN0ZnN0LmMiCi1ERVBfQ1BQX0pGRENURj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENURikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZmRjdGludC5jIgotREVQX0NQUF9KRkRDVEk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqZmRjdGludC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRkRDVEkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamlkY3RmbHQuYyIKLURFUF9DUFBfSklEQ1Q9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqaWRjdGZzdC5jIgotREVQX0NQUF9KSURDVEY9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVEYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamlkY3RpbnQuYyIKLURFUF9DUFBfSklEQ1RJPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamlkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImppZGN0cmVkLmMiCi1ERVBfQ1BQX0pJRENUUj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGppZGN0cmVkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqcXVhbnQxLmMiCi1ERVBfQ1BQX0pRVUFOPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcanF1YW50MS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUVVBTikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqcXVhbnQyLmMiCi1ERVBfQ1BQX0pRVUFOVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpxdWFudDIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlFVQU5UKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Imp1dGlscy5jIgotREVQX0NQUF9KVVRJTD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGp1dGlscy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KVVRJTCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqbWVtbWdyLmMiCi1ERVBfQ1BQX0pNRU1NPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImptZW1zeXMuaCJcCi0JCi0KLSIkKElOVERJUilcam1lbW1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KTUVNTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqbWVtbm9icy5jIgotREVQX0NQUF9KTUVNTj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqbWVtc3lzLmgiXAotCQotCi0iJChJTlRESVIpXGptZW1ub2JzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pNRU1OKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL21ha2Vwcm9qLm1hYyBiL2xpYmpwZWd0d3JwL21ha2Vwcm9qLm1hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyNzdjOC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtlcHJvai5tYWMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLS0KLS0tIG1ha2Vwcm9qLm1hYwotLS0KLS0tIFRoaXMgQXBwbGVTY3JpcHQgYnVpbGRzIENvZGUgV2FycmlvciBQUk8gUmVsZWFzZSAyIHByb2plY3QgZmlsZXMgZm9yIHRoZQotLS0gbGlianBlZyBsaWJyYXJ5IGFzIHdlbGwgYXMgdGhlIHRlc3QgcHJvZ3JhbXMgJ2NqcGVnJywgJ2RqcGVnJywgJ2pwZWd0cmFuJy4KLS0tIChXZSdkIGRpc3RyaWJ1dGUgcmVhbCBwcm9qZWN0IGZpbGVzLCBleGNlcHQgdGhleSdyZSBub3QgdGV4dAotLS0gYW5kIHdvdWxkIGNyZWF0ZSBtYWludGVuYW5jZSBoZWFkYWNoZXMuKQotLS0KLS0tIFRoZSBzY3JpcHQgdGhlbiBjb21waWxlcyBhbmQgbGlua3MgdGhlIGxpYnJhcnkgYW5kIHRoZSB0ZXN0IHByb2dyYW1zLgotLS0gTk9URTogaWYgeW91IGhhdmVuJ3QgYWxyZWFkeSBjcmVhdGVkIGEgJ2pjb25maWcuaCcgZmlsZSwgdGhlIHNjcmlwdAotLS0gYXV0b21hdGljYWxseSBjb3BpZXMgJ2pjb25maWcubWFjJyB0byAnamNvbmZpZy5oJy4KLS0tCi0tLSBUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGhhdmUgQXBwbGVTY3JpcHQgMS4xIG9yIGxhdGVyIGluc3RhbGxlZAotLS0gYW5kIGEgc3VpdGFibGUgQXBwbGVTY3JpcHQgZWRpdG9yIGxpa2UgU2NyaXB0IEVkaXRvciBvciBTY3JpcHQgRGVidWdnZXIKLS0tIChodHRwOi8vd3d3LmxhdGVuaWdodHN3LmNvbSkuIE9wZW4gdGhpcyBmaWxlIHdpdGggeW91ciBBcHBsZVNjcmlwdAotLS0gZWRpdG9yIGFuZCBleGVjdXRlIHRoZSAicnVuIiBjb21tYW5kIHRvIGJ1aWxkIHRoZSBwcm9qZWN0cy4KLS0tCi0tLSBUaGFua3MgdG8gRGFuIFNlYXJzIGFuZCBEb24gQWdybyBmb3IgdGhpcyBzY3JpcHQuCi0tLSBRdWVzdGlvbnMgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGFkZHJlc3NlZCB0byBkb2dwYXJrQGludGVybG9nLmNvbQotLS0KLQotb24gcnVuCi0KLQljaG9vc2UgZm9sZGVyIHdpdGggcHJvbXB0ICI+Pj4gU2VsZWN0IElKRyBzb3VyY2UgZm9sZGVyIDw8PCIKLQlzZXQgaWpnX2ZvbGRlciB0byByZXN1bHQKLQotCWNob29zZSBmb2xkZXIgd2l0aCBwcm9tcHQgIj4+PiBTZWxlY3QgTWV0cm9XZXJrcyBmb2xkZXIgPDw8IgotCXNldCBjd19mb2xkZXIgdG8gcmVzdWx0Ci0KLQktLSBpZiBqY29uZmlnLmggZG9lc24ndCBhbHJlYWR5IGV4aXN0LCBjb3B5IGpjb25maWcubWFjCi0KLQl0ZWxsIGFwcGxpY2F0aW9uICJGaW5kZXIiCi0JCWlmIG5vdCAoZXhpc3RzIGZpbGUgImpjb25maWcuaCIgb2YgaWpnX2ZvbGRlcikgdGhlbgotCQkJZHVwbGljYXRlIHtmaWxlICJqY29uZmlnLm1hYyIgb2YgZm9sZGVyIGlqZ19mb2xkZXJ9Ci0JCQlzZWxlY3QgZmlsZSAiamNvbmZpZy5tYWMgY29weSIgb2YgZm9sZGVyIGlqZ19mb2xkZXIKLQkJCXNldCBuYW1lIG9mIHNlbGVjdGlvbiB0byAiamNvbmZpZy5oIgotCQllbmQgaWYKLQllbmQgdGVsbAotCi0JdGVsbCBhcHBsaWNhdGlvbiAiQ29kZVdhcnJpb3IgSURFIDIuMSIKLQkgIHdpdGggdGltZW91dCBvZiAxMDAwMCBzZWNvbmRzCi0KLQkJLS0gY3JlYXRlIGxpYmpwZWcgcHJvamVjdAotCi0JCWFjdGl2YXRlCi0JCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZy5wcm9qIgotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJsaWJqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToibGlianBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge1Byb2plY3QgVHlwZTpsaWJyYXJ5fQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpbWluLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2FwaXN0ZC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamN0cmFucy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwYXJhbS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhdGFkc3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjaW5pdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNtYXN0ZXIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjbWFya2VyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY21haW5jdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwcmVwY3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjY29lZmN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2NvbG9yLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3NhbXBsZS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNodWZmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3BodWZmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2RjdG1nci5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3Rmc3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0Zmx0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGludC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcGltaW4uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXBpc3RkLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHRyYW5zLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGF0YXNyYy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYXN0ZXIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkaW5wdXQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFya2VyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGh1ZmYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkcGh1ZmYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFpbmN0LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGNvZWZjdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRwb3N0Y3QuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkZGN0bWdyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZzdC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RmbHQuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0aW50LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdHJlZC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRzYW1wbGUuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29sb3IuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDEuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDIuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWVyZ2UuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjb21hcGkuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImp1dGlscy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamVycm9yLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqbWVtbWdyLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqbWVtbWFjLmMiIFRvIFNlZ21lbnQgMQotCi0JCS0tIGNvbXBpbGUgYW5kIGxpbmsgdGhlIGxpYnJhcnkKLQotCQlNYWtlIFByb2plY3QKLQkJQ2xvc2UgUHJvamVjdAotCi0JCS0tIGNyZWF0ZSBjanBlZyBwcm9qZWN0Ci0KLQkJYWN0aXZhdGUKLQkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjanBlZy5wcm9qIgotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJjanBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIFByb2plY3QiIHRvIHtGaWxlIE5hbWU6ImNqcGVnIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNqcGVnLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZHBwbS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRnaWYuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkdGFyZ2EuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkcmxlLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZGJtcC5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRzd2l0Y2guYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKLQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnIiBUbyBTZWdtZW50IDIKLQotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgQy5QUEMuTGliIiBUbyBTZWdtZW50IDMKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIFNJT1VYLlBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6UnVudGltZTpSdW50aW1lIFBQQzpNU0wgUnVudGltZVBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246SW50ZXJmYWNlTGliIiBUbyBTZWdtZW50IDQKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpNYXRoTGliIiBUbyBTZWdtZW50IDQKLQotCQktLSBjb21waWxlIGFuZCBsaW5rIGNqcGVnCi0KLQkJTWFrZSBQcm9qZWN0Ci0JCUNsb3NlIFByb2plY3QKLQotCQktLSBjcmVhdGUgZGpwZWcgcHJvamVjdAotCi0JCWFjdGl2YXRlCi0JCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiZGpwZWcucHJvaiIKLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtUYXJnZXQgTmFtZToiZGpwZWcifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJkanBlZyJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0FOU0kgU3RyaWN0OnRydWV9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtFbnVtcyBBbHdheXMgSW50czp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBDb2RlZ2VuIiB0byB7U3RydWN0IEFsaWdubWVudDpQb3dlclBDfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBMaW5rZXIiIHRvIHtHZW5lcmF0ZSBTWU0gRmlsZTpmYWxzZX0KLQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJkanBlZy5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JwcG0uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndyZ2lmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnRhcmdhLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnJsZS5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JibXAuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkY29sbWFwLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjZGpwZWcuYyIgVG8gU2VnbWVudCAxCi0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZyIgVG8gU2VnbWVudCAyCi0KLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIEMuUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBTSU9VWC5QUEMuTGliIiBUbyBTZWdtZW50IDMKLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMuTGliIiBUbyBTZWdtZW50IDMKLQotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOkludGVyZmFjZUxpYiIgVG8gU2VnbWVudCA0Ci0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246TWF0aExpYiIgVG8gU2VnbWVudCA0Ci0KLQkJLS0gY29tcGlsZSBhbmQgbGluayBkanBlZwotCi0JCU1ha2UgUHJvamVjdAotCQlDbG9zZSBQcm9qZWN0Ci0KLQkJLS0gY3JlYXRlIGpwZWd0cmFuIHByb2plY3QKLQotCQlhY3RpdmF0ZQotCQlDcmVhdGUgUHJvamVjdCAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpwZWd0cmFuLnByb2oiCi0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImpwZWd0cmFuIn0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToianBlZ3RyYW4ifQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge0xpbmtlcjoiTWFjT1MgUFBDIExpbmtlciJ9Ci0JCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQotCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KLQkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9Ci0KLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianBlZ3RyYW4uYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkc3dpdGNoLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjZGpwZWcuYyIgVG8gU2VnbWVudCAxCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInRyYW5zdXBwLmMiIFRvIFNlZ21lbnQgMQotCi0JCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImxpYmpwZWciIFRvIFNlZ21lbnQgMgotCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBDLlBQQy5MaWIiIFRvIFNlZ21lbnQgMwotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgU0lPVVguUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0JCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLkxpYiIgVG8gU2VnbWVudCAzCi0KLQkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpJbnRlcmZhY2VMaWIiIFRvIFNlZ21lbnQgNAotCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOk1hdGhMaWIiIFRvIFNlZ21lbnQgNAotCi0JCS0tIGNvbXBpbGUgYW5kIGxpbmsganBlZ3RyYW4KLQotCQlNYWtlIFByb2plY3QKLQkJQ2xvc2UgUHJvamVjdAotCi0JCXF1aXQKLQotCSAgZW5kIHRpbWVvdXQKLQllbmQgdGVsbAotZW5kIHJ1bgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvbWFrbGpwZWcuc3QgYi9saWJqcGVndHdycC9tYWtsanBlZy5zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzNDkzZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWtsanBlZy5zdAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTsgUHJvamVjdCBmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLTsKLTsgVGhpcyBwcm9qZWN0IGZpbGUgaXMgZm9yIEF0YXJpIFNUL1NURS9UVCBzeXN0ZW1zIHVzaW5nIFB1cmUgQyBvciBUdXJibyBDLgotOyBUaGFua3MgdG8gRnJhbmsgTW9laGxlIChGcmFuay5Nb2VobGVAYXJiaS5pbmZvcm1hdGlrLnVuaS1vbGRlbmJ1cmcuZGUpLAotOyBEci4gQi4gU2V0emVwZmFuZHQgKGJlcm5kQGdpbmEudW5pLW11ZW5zdGVyLmRlKSwKLTsgYW5kIEd1aWRvIFZvbGxiZWRpbmcgKGd1aXZvbEBlc2MuZGUpLgotOwotOyBUbyB1c2UgdGhpcyBmaWxlLCByZW5hbWUgaXQgdG8gbGlianBlZy5wcmouCi07IFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgdHJ5aW5nIHRvIG1ha2UgdGhlIHByb2dyYW0hCi07Ci07Ci07ICAgICAgKiAqICogT3V0cHV0IGZpbGUgKiAqICoKLWxpYmpwZWcubGliCi07Ci07ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAotLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCi0uQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcwotLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncwotLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCi0uQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCi0uQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKLS5MWy1KXSAgICAgICAgOyBsaW5rIG5ldyBPYmotZm9ybWF0IChzbyB3ZSBnZXQgYSBsaWJyYXJ5KQotPQotOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAotamNhcGltaW4uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNhcGlzdGQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNjb2VmY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNjb2xvci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY2RjdG1nci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamNodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqY2h1ZmYuaCkKLWpjaW5pdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY21haW5jdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY21hcmtlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY21hc3Rlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY29tYXBpLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpjcGFyYW0uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNwaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamNodWZmLmgpCi1qY3ByZXBjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY3NhbXBsZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qY3RyYW5zLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkYXBpbWluLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkYXBpc3RkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkYXRhZHN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oKQotamRhdGFzcmMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgpCi1qZGNvZWZjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZGNvbG9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkZGN0bWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qZGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkaHVmZi5oKQotamRpbnB1dC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1haW5jdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1hcmtlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1hc3Rlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZG1lcmdlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkcGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkaHVmZi5oKQotamRwb3N0Y3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamRzYW1wbGUuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamR0cmFucy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCi1qZXJyb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanZlcnNpb24uaCxqZXJyb3IuaCkKLWpmZGN0Zmx0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qZmRjdGZzdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamZkY3RpbnQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWppZGN0Zmx0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qaWRjdGZzdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQotamlkY3RpbnQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWppZGN0cmVkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qcXVhbnQxLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpxdWFudDIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotanV0aWxzLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWptZW1tZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGptZW1zeXMuaCkKLWptZW1hbnNpLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqbWVtc3lzLmgpCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWt0anBlZy5zdCBiL2xpYmpwZWd0d3JwL21ha3RqcGVnLnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWY0ZDE2Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL21ha3RqcGVnLnN0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotOwotOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCi07Ci07IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBqcGVndHJhbi5wcmouCi07IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKLTsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKLTsKLTsKLTsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgotanBlZ3RyYW4udHRwCi07Ci07ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAotLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCi0uQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcwotLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncwotLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCi0uQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCi0uQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKLT0KLTsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKLXBjc3RhcnQubwotanBlZ3RyYW4uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLHRyYW5zdXBwLmgsanZlcnNpb24uaCkKLWNkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHN3aXRjaC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi10cmFuc3VwcC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsdHJhbnN1cHAuaCkKLWxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCi1wY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5Ci1wY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9tYWt2bXMub3B0IGIvbGlianBlZ3R3cnAvbWFrdm1zLm9wdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ZThmZS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9tYWt2bXMub3B0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0hIEEgcG9pbnRlciB0byB0aGUgVkFYL1ZNUyBDIFJ1bi1UaW1lIFNoYXJlYWJsZSBMaWJyYXJ5LgotISBUaGlzIGZpbGUgaXMgbmVlZGVkIGJ5IG1ha2VmaWxlLm1tcyBhbmQgbWFrZWZpbGUudm1zLAotISBidXQgb25seSBmb3IgdGhlIG9sZGVyIFZBWCBDIGNvbXBpbGVyLiAgREVDIEMgZG9lcyBub3QgbmVlZCBpdC4KLVN5cyRMaWJyYXJ5OlZBWENSVEwuRVhFIC9TaGFyZQpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRibXAuYyBiL2xpYmpwZWd0d3JwL3JkYm1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWZlMmEuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRibXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKgotICogcmRibXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIE1pY3Jvc29mdCAiQk1QIgotICogZm9ybWF0IChNUyBXaW5kb3dzIDMueCwgT1MvMiAxLngsIGFuZCBPUy8yIDIueCBmbGF2b3JzKS4KLSAqIEN1cnJlbnRseSwgb25seSA4LWJpdCBhbmQgMjQtYml0IGltYWdlcyBhcmUgc3VwcG9ydGVkLCBub3QgMS1iaXQgb3IKLSAqIDQtYml0IChmZWVkaW5nIHN1Y2ggbG93LWRlcHRoIGltYWdlcyBpbnRvIEpQRUcgd291bGQgYmUgc2lsbHkgYW55d2F5KS4KLSAqIEFsc28sIHdlIGRvbid0IHN1cHBvcnQgUkxFLWNvbXByZXNzZWQgZmlsZXMuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIGlucHV0IGZyb20KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4gIFRoZXkgZnVydGhlciBhc3N1bWUgdGhhdCByZWFkaW5nIGJlZ2lucwotICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlOyBzdGFydF9pbnB1dCBtYXkgbmVlZCB3b3JrIGlmIHRoZQotICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0Ci0gKiB0aGUgZmlsZSBpcyBpbmRlZWQgQk1QIGZvcm1hdCkuCi0gKgotICogVGhpcyBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEphbWVzIEFydGh1ciBCb3VjaGVyLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBCTVBfU1VQUE9SVEVECi0KLQotLyogTWFjcm9zIHRvIGRlYWwgd2l0aCB1bnNpZ25lZCBjaGFycyBhcyBlZmZpY2llbnRseSBhcyBjb21waWxlciBhbGxvd3MgKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCi0jZWxzZSAvKiAhSEFWRV9VTlNJR05FRF9DSEFSICovCi0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotdHlwZWRlZiBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCi0jZWxzZQotdHlwZWRlZiBjaGFyIFVfQ0hBUjsKLSNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkgJiAweEZGKQotI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLQotI2RlZmluZQlSZWFkT0soZmlsZSxidWZmZXIsbGVuKQkoSkZSRUFEKGZpbGUsYnVmZmVyLGxlbikgPT0gKChzaXplX3QpIChsZW4pKSkKLQotCi0vKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBzb3VyY2Ugb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IF9ibXBfc291cmNlX3N0cnVjdCAqIGJtcF9zb3VyY2VfcHRyOwotCi10eXBlZGVmIHN0cnVjdCBfYm1wX3NvdXJjZV9zdHJ1Y3QgewotICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KLQotICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogQk1QIGNvbG9ybWFwIChjb252ZXJ0ZWQgdG8gbXkgZm9ybWF0KSAqLwotCi0gIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIE5lZWRlZCB0byByZXZlcnNlIHJvdyBvcmRlciAqLwotICBKRElNRU5TSU9OIHNvdXJjZV9yb3c7CS8qIEN1cnJlbnQgc291cmNlIHJvdyBudW1iZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dfd2lkdGg7CQkvKiBQaHlzaWNhbCB3aWR0aCBvZiBzY2FubGluZXMgaW4gZmlsZSAqLwotCi0gIGludCBiaXRzX3Blcl9waXhlbDsJCS8qIHJlbWVtYmVycyA4LSBvciAyNC1iaXQgZm9ybWF0ICovCi19IGJtcF9zb3VyY2Vfc3RydWN0OwotCi0KLUxPQ0FMKGludCkKLXJlYWRfYnl0ZSAoYm1wX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBSZWFkIG5leHQgYnl0ZSBmcm9tIEJNUCBmaWxlICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0KLSAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCi0gICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXJlYWRfY29sb3JtYXAgKGJtcF9zb3VyY2VfcHRyIHNpbmZvLCBpbnQgY21hcGxlbiwgaW50IG1hcGVudHJ5c2l6ZSkKLS8qIFJlYWQgdGhlIGNvbG9ybWFwIGZyb20gYSBCTVAgZmlsZSAqLwotewotICBpbnQgaTsKLQotICBzd2l0Y2ggKG1hcGVudHJ5c2l6ZSkgewotICBjYXNlIDM6Ci0gICAgLyogQkdSIGZvcm1hdCAob2NjdXJzIGluIE9TLzIgZmlsZXMpICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNtYXBsZW47IGkrKykgewotICAgICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgICBzaW5mby0+Y29sb3JtYXBbMV1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICAgIHNpbmZvLT5jb2xvcm1hcFswXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSA0OgotICAgIC8qIEJHUjAgZm9ybWF0IChvY2N1cnMgaW4gTVMgV2luZG93cyBmaWxlcykgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7Ci0gICAgICBzaW5mby0+Y29sb3JtYXBbMl1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICAgIHNpbmZvLT5jb2xvcm1hcFsxXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7Ci0gICAgICAodm9pZCkgcmVhZF9ieXRlKHNpbmZvKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfQk1QX0JBRENNQVApOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCi0gKiBUaGUgaW1hZ2UgaGFzIGJlZW4gcmVhZCBpbnRvIHRoZSB3aG9sZV9pbWFnZSBhcnJheSwgYnV0IGlzIG90aGVyd2lzZQotICogdW5wcm9jZXNzZWQuICBXZSBtdXN0IHJlYWQgaXQgb3V0IGluIHRvcC10by1ib3R0b20gcm93IG9yZGVyLCBhbmQgaWYKLSAqIGl0IGlzIGFuIDgtYml0IGltYWdlLCB3ZSBtdXN0IGV4cGFuZCBjb2xvcm1hcHBlZCBwaXhlbHMgdG8gMjRiaXQgZm9ybWF0LgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0XzhiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyA4LWJpdCBjb2xvcm1hcCBpbmRleGVzICovCi17Ci0gIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBzb3VyY2UtPmNvbG9ybWFwOwotICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKLSAgcmVnaXN0ZXIgaW50IHQ7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIC8qIEZldGNoIG5leHQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLwotICBzb3VyY2UtPnNvdXJjZV9yb3ctLTsKLSAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAotICAgICBzb3VyY2UtPnNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0KLSAgLyogRXhwYW5kIHRoZSBjb2xvcm1hcCBpbmRleGVzIHRvIHJlYWwgZGF0YSAqLwotICBpbnB0ciA9IGltYWdlX3B0clswXTsKLSAgb3V0cHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICB0ID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7Ci0gICAgKm91dHB0cisrID0gY29sb3JtYXBbMF1bdF07CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KLSAgICAqb3V0cHRyKysgPSBjb2xvcm1hcFsxXVt0XTsKLSAgICAqb3V0cHRyKysgPSBjb2xvcm1hcFsyXVt0XTsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0XzI0Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgMjQtYml0IHBpeGVscyAqLwotewotICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOwotICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgLyogRmV0Y2ggbmV4dCByb3cgZnJvbSB2aXJ0dWFsIGFycmF5ICovCi0gIHNvdXJjZS0+c291cmNlX3Jvdy0tOwotICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCi0gICAgIHNvdXJjZS0+c291cmNlX3JvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLQotICAvKiBUcmFuc2ZlciBkYXRhLiAgTm90ZSBzb3VyY2UgdmFsdWVzIGFyZSBpbiBCR1Igb3JkZXIKLSAgICogKGV2ZW4gdGhvdWdoIE1pY3Jvc29mdCdzIG93biBkb2N1bWVudHMgc2F5IHRoZSBvcHBvc2l0ZSkuCi0gICAqLwotICBpbnB0ciA9IGltYWdlX3B0clswXTsKLSAgb3V0cHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBvdXRwdHJbMl0gPSAqaW5wdHIrKzsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLwotICAgIG91dHB0clsxXSA9ICppbnB0cisrOwotICAgIG91dHB0clswXSA9ICppbnB0cisrOwotICAgIG91dHB0ciArPSAzOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIFRoaXMgbWV0aG9kIGxvYWRzIHRoZSBpbWFnZSBpbnRvIHdob2xlX2ltYWdlIGR1cmluZyB0aGUgZmlyc3QgY2FsbCBvbgotICogZ2V0X3BpeGVsX3Jvd3MuICBUaGUgZ2V0X3BpeGVsX3Jvd3MgcG9pbnRlciBpcyB0aGVuIGFkanVzdGVkIHRvIGNhbGwKLSAqIGdldF84Yml0X3JvdyBvciBnZXRfMjRiaXRfcm93IG9uIHN1YnNlcXVlbnQgY2FsbHMuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1wcmVsb2FkX2ltYWdlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dF9wdHI7Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICBKRElNRU5TSU9OIHJvdywgY29sOwotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0KLSAgLyogUmVhZCB0aGUgZGF0YSBpbnRvIGEgdmlydHVhbCBhcnJheSBpbiBpbnB1dC1maWxlIHJvdyBvcmRlci4gKi8KLSAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgewotICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IChsb25nKSByb3c7Ci0gICAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKLSAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgIH0KLSAgICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKLSAgICAgICByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgICBvdXRfcHRyID0gaW1hZ2VfcHRyWzBdOwotICAgIGZvciAoY29sID0gc291cmNlLT5yb3dfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICAvKiBpbmxpbmUgY29weSBvZiByZWFkX2J5dGUoKSBmb3Igc3BlZWQgKi8KLSAgICAgIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgICAgICpvdXRfcHRyKysgPSAoSlNBTVBMRSkgYzsKLSAgICB9Ci0gIH0KLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpCi0gICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKLQotICAvKiBTZXQgdXAgdG8gcmVhZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IGluIHRvcC10by1ib3R0b20gb3JkZXIgKi8KLSAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7Ci0gIGNhc2UgODoKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF84Yml0X3JvdzsKLSAgICBicmVhazsKLSAgY2FzZSAyNDoKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF8yNGJpdF9yb3c7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOwotICB9Ci0gIHNvdXJjZS0+c291cmNlX3JvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0KLSAgLyogQW5kIHJlYWQgdGhlIGZpcnN0IHJvdyAqLwotICByZXR1cm4gKCpzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfYm1wIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgVV9DSEFSIGJtcGZpbGVoZWFkZXJbMTRdOwotICBVX0NIQVIgYm1waW5mb2hlYWRlcls2NF07Ci0jZGVmaW5lIEdFVF8yQihhcnJheSxvZmZzZXQpICAoKHVuc2lnbmVkIGludCkgVUNIKGFycmF5W29mZnNldF0pICsgXAotCQkJICAgICAgICgoKHVuc2lnbmVkIGludCkgVUNIKGFycmF5W29mZnNldCsxXSkpIDw8IDgpKQotI2RlZmluZSBHRVRfNEIoYXJyYXksb2Zmc2V0KSAgKChJTlQzMikgVUNIKGFycmF5W29mZnNldF0pICsgXAotCQkJICAgICAgICgoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0KzFdKSkgPDwgOCkgKyBcCi0JCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrMl0pKSA8PCAxNikgKyBcCi0JCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrM10pKSA8PCAyNCkpCi0gIElOVDMyIGJmT2ZmQml0czsKLSAgSU5UMzIgaGVhZGVyU2l6ZTsKLSAgSU5UMzIgYmlXaWR0aCA9IDA7CQkvKiBpbml0aWFsaXplIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KLSAgSU5UMzIgYmlIZWlnaHQgPSAwOwotICB1bnNpZ25lZCBpbnQgYmlQbGFuZXM7Ci0gIElOVDMyIGJpQ29tcHJlc3Npb247Ci0gIElOVDMyIGJpWFBlbHNQZXJNZXRlcixiaVlQZWxzUGVyTWV0ZXI7Ci0gIElOVDMyIGJpQ2xyVXNlZCA9IDA7Ci0gIGludCBtYXBlbnRyeXNpemUgPSAwOwkJLyogMCBpbmRpY2F0ZXMgbm8gY29sb3JtYXAgKi8KLSAgSU5UMzIgYlBhZDsKLSAgSkRJTUVOU0lPTiByb3dfd2lkdGg7Ci0KLSAgLyogUmVhZCBhbmQgdmVyaWZ5IHRoZSBiaXRtYXAgZmlsZSBoZWFkZXIgKi8KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIGlmIChHRVRfMkIoYm1wZmlsZWhlYWRlciwwKSAhPSAweDRENDIpIC8qICdCTScgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9OT1QpOwotICBiZk9mZkJpdHMgPSAoSU5UMzIpIEdFVF80QihibXBmaWxlaGVhZGVyLDEwKTsKLSAgLyogV2UgaWdub3JlIHRoZSByZW1haW5pbmcgZmlsZWhlYWRlciBmaWVsZHMgKi8KLQotICAvKiBUaGUgaW5mb2hlYWRlciBtaWdodCBiZSAxMiBieXRlcyAoT1MvMiAxLngpLCA0MCBieXRlcyAoV2luZG93cyksCi0gICAqIG9yIDY0IGJ5dGVzIChPUy8yIDIueCkuICBDaGVjayB0aGUgZmlyc3QgNCBieXRlcyB0byBmaW5kIG91dCB3aGljaC4KLSAgICovCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBibXBpbmZvaGVhZGVyLCA0KSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIGhlYWRlclNpemUgPSAoSU5UMzIpIEdFVF80QihibXBpbmZvaGVhZGVyLDApOwotICBpZiAoaGVhZGVyU2l6ZSA8IDEyIHx8IGhlYWRlclNpemUgPiA2NCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOwotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgYm1waW5mb2hlYWRlcis0LCBoZWFkZXJTaXplLTQpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLQotICBzd2l0Y2ggKChpbnQpIGhlYWRlclNpemUpIHsKLSAgY2FzZSAxMjoKLSAgICAvKiBEZWNvZGUgT1MvMiAxLnggaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUENPUkVIRUFERVIpICovCi0gICAgYmlXaWR0aCA9IChJTlQzMikgR0VUXzJCKGJtcGluZm9oZWFkZXIsNCk7Ci0gICAgYmlIZWlnaHQgPSAoSU5UMzIpIEdFVF8yQihibXBpbmZvaGVhZGVyLDYpOwotICAgIGJpUGxhbmVzID0gR0VUXzJCKGJtcGluZm9oZWFkZXIsOCk7Ci0gICAgc291cmNlLT5iaXRzX3Blcl9waXhlbCA9IChpbnQpIEdFVF8yQihibXBpbmZvaGVhZGVyLDEwKTsKLQotICAgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgewotICAgIGNhc2UgODoJCQkvKiBjb2xvcm1hcHBlZCBpbWFnZSAqLwotICAgICAgbWFwZW50cnlzaXplID0gMzsJCS8qIE9TLzIgdXNlcyBSR0JUUklQTEUgY29sb3JtYXAgKi8KLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUF9PUzJfTUFQUEVELCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgkJCS8qIFJHQiBpbWFnZSAqLwotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QX09TMiwgKGludCkgYmlXaWR0aCwgKGludCkgYmlIZWlnaHQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRERFUFRIKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoYmlQbGFuZXMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRFBMQU5FUyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDA6Ci0gIGNhc2UgNjQ6Ci0gICAgLyogRGVjb2RlIFdpbmRvd3MgMy54IGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBJTkZPSEVBREVSKSAqLwotICAgIC8qIG9yIE9TLzIgMi54IGhlYWRlciwgd2hpY2ggaGFzIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgd2UgaWdub3JlICovCi0gICAgYmlXaWR0aCA9IEdFVF80QihibXBpbmZvaGVhZGVyLDQpOwotICAgIGJpSGVpZ2h0ID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsOCk7Ci0gICAgYmlQbGFuZXMgPSBHRVRfMkIoYm1waW5mb2hlYWRlciwxMik7Ci0gICAgc291cmNlLT5iaXRzX3Blcl9waXhlbCA9IChpbnQpIEdFVF8yQihibXBpbmZvaGVhZGVyLDE0KTsKLSAgICBiaUNvbXByZXNzaW9uID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMTYpOwotICAgIGJpWFBlbHNQZXJNZXRlciA9IEdFVF80QihibXBpbmZvaGVhZGVyLDI0KTsKLSAgICBiaVlQZWxzUGVyTWV0ZXIgPSBHRVRfNEIoYm1waW5mb2hlYWRlciwyOCk7Ci0gICAgYmlDbHJVc2VkID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMzIpOwotICAgIC8qIGJpU2l6ZUltYWdlLCBiaUNsckltcG9ydGFudCBmaWVsZHMgYXJlIGlnbm9yZWQgKi8KLQotICAgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgewotICAgIGNhc2UgODoJCQkvKiBjb2xvcm1hcHBlZCBpbWFnZSAqLwotICAgICAgbWFwZW50cnlzaXplID0gNDsJCS8qIFdpbmRvd3MgdXNlcyBSR0JRVUFEIGNvbG9ybWFwICovCi0gICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVBfTUFQUEVELCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgkJCS8qIFJHQiBpbWFnZSAqLwotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QLCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChiaVBsYW5lcyAhPSAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEUExBTkVTKTsKLSAgICBpZiAoYmlDb21wcmVzc2lvbiAhPSAwKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQ09NUFJFU1NFRCk7Ci0KLSAgICBpZiAoYmlYUGVsc1Blck1ldGVyID4gMCAmJiBiaVlQZWxzUGVyTWV0ZXIgPiAwKSB7Ci0gICAgICAvKiBTZXQgSkZJRiBkZW5zaXR5IHBhcmFtZXRlcnMgZnJvbSB0aGUgQk1QIGRhdGEgKi8KLSAgICAgIGNpbmZvLT5YX2RlbnNpdHkgPSAoVUlOVDE2KSAoYmlYUGVsc1Blck1ldGVyLzEwMCk7IC8qIDEwMCBjbSBwZXIgbWV0ZXIgKi8KLSAgICAgIGNpbmZvLT5ZX2RlbnNpdHkgPSAoVUlOVDE2KSAoYmlZUGVsc1Blck1ldGVyLzEwMCk7Ci0gICAgICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMjsJLyogZG90cy9jbSAqLwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ29tcHV0ZSBkaXN0YW5jZSB0byBiaXRtYXAgZGF0YSAtLS0gd2lsbCBhZGp1c3QgZm9yIGNvbG9ybWFwIGJlbG93ICovCi0gIGJQYWQgPSBiZk9mZkJpdHMgLSAoaGVhZGVyU2l6ZSArIDE0KTsKLQotICAvKiBSZWFkIHRoZSBjb2xvcm1hcCwgaWYgYW55ICovCi0gIGlmIChtYXBlbnRyeXNpemUgPiAwKSB7Ci0gICAgaWYgKGJpQ2xyVXNlZCA8PSAwKQotICAgICAgYmlDbHJVc2VkID0gMjU2OwkJLyogYXNzdW1lIGl0J3MgMjU2ICovCi0gICAgZWxzZSBpZiAoYmlDbHJVc2VkID4gMjU2KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEQ01BUCk7Ci0gICAgLyogQWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGhlIGNvbG9ybWFwICovCi0gICAgc291cmNlLT5jb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAoSkRJTUVOU0lPTikgYmlDbHJVc2VkLCAoSkRJTUVOU0lPTikgMyk7Ci0gICAgLyogYW5kIHJlYWQgaXQgZnJvbSB0aGUgZmlsZSAqLwotICAgIHJlYWRfY29sb3JtYXAoc291cmNlLCAoaW50KSBiaUNsclVzZWQsIG1hcGVudHJ5c2l6ZSk7Ci0gICAgLyogYWNjb3VudCBmb3Igc2l6ZSBvZiBjb2xvcm1hcCAqLwotICAgIGJQYWQgLT0gYmlDbHJVc2VkICogbWFwZW50cnlzaXplOwotICB9Ci0KLSAgLyogU2tpcCBhbnkgcmVtYWluaW5nIHBhZCBieXRlcyAqLwotICBpZiAoYlBhZCA8IDApCQkJLyogaW5jb3JyZWN0IGJmT2ZmQml0cyB2YWx1ZT8gKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOwotICB3aGlsZSAoLS1iUGFkID49IDApIHsKLSAgICAodm9pZCkgcmVhZF9ieXRlKHNvdXJjZSk7Ci0gIH0KLQotICAvKiBDb21wdXRlIHJvdyB3aWR0aCBpbiBmaWxlLCBpbmNsdWRpbmcgcGFkZGluZyB0byA0LWJ5dGUgYm91bmRhcnkgKi8KLSAgaWYgKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwgPT0gMjQpCi0gICAgcm93X3dpZHRoID0gKEpESU1FTlNJT04pIChiaVdpZHRoICogMyk7Ci0gIGVsc2UKLSAgICByb3dfd2lkdGggPSAoSkRJTUVOU0lPTikgYmlXaWR0aDsKLSAgd2hpbGUgKChyb3dfd2lkdGggJiAzKSAhPSAwKSByb3dfd2lkdGgrKzsKLSAgc291cmNlLT5yb3dfd2lkdGggPSByb3dfd2lkdGg7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGludmVyc2lvbiBhcnJheSwgcHJlcGFyZSBmb3IgcHJlbG9hZCBwYXNzICovCi0gIHNvdXJjZS0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0gICAgIHJvd193aWR0aCwgKEpESU1FTlNJT04pIGJpSGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0gIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gcHJlbG9hZF9pbWFnZTsKLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCi0gIH0KLQotICAvKiBBbGxvY2F0ZSBvbmUtcm93IGJ1ZmZlciBmb3IgcmV0dXJuZWQgZGF0YSAqLwotICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAoSkRJTUVOU0lPTikgKGJpV2lkdGggKiAzKSwgKEpESU1FTlNJT04pIDEpOwotICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLQotICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7Ci0gIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IDg7Ci0gIGNpbmZvLT5pbWFnZV93aWR0aCA9IChKRElNRU5TSU9OKSBiaVdpZHRoOwotICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGJpSGVpZ2h0OwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9pbnB1dF9ibXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEJNUCBmb3JtYXQgaW5wdXQuCi0gKi8KLQotR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCi1qaW5pdF9yZWFkX2JtcCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGJtcF9zb3VyY2VfcHRyIHNvdXJjZTsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KLSAgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihibXBfc291cmNlX3N0cnVjdCkpOwotICBzb3VyY2UtPmNpbmZvID0gY2luZm87CS8qIG1ha2UgYmFjayBsaW5rIGZvciBzdWJyb3V0aW5lcyAqLwotICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzLCBleGNlcHQgZ2V0X3BpeGVsX3Jvd3Mgd2hpY2ggc3RhcnRfaW5wdXQgc2V0cyAqLwotICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X2JtcDsKLSAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X2JtcDsKLQotICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKLX0KLQotI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3JkY29sbWFwLmMgYi9saWJqcGVndHdycC9yZGNvbG1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIzNDM3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3JkY29sbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIHJkY29sbWFwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRqcGVnJ3MgIi1tYXAgZmlsZSIgc3dpdGNoLiAgSXQgcmVhZHMgYSBzb3VyY2UgaW1hZ2UKLSAqIGFuZCBjb25zdHJ1Y3RzIGEgY29sb3JtYXAgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIEpQRUcgZGVjb21wcmVzc29yLgotICoKLSAqIEN1cnJlbnRseSwgdGhlc2UgZmlsZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBtYXAgZmlsZToKLSAqICAgR0lGOiB0aGUgY29udGVudHMgb2YgdGhlIEdJRidzIGdsb2JhbCBjb2xvcm1hcCBhcmUgdXNlZC4KLSAqICAgUFBNIChlaXRoZXIgdGV4dCBvciByYXcgZmxhdm9yKTogdGhlIGVudGlyZSBmaWxlIGlzIHJlYWQgYW5kCi0gKiAgICAgIGVhY2ggdW5pcXVlIHBpeGVsIHZhbHVlIGlzIGVudGVyZWQgaW4gdGhlIG1hcC4KLSAqIE5vdGUgdGhhdCByZWFkaW5nIGEgbGFyZ2UgUFBNIGZpbGUgd2lsbCBiZSBob3JyZW5kb3VzbHkgc2xvdy4KLSAqIFR5cGljYWxseSwgYSBQUE0tZm9ybWF0IG1hcCBmaWxlIHNob3VsZCBjb250YWluIGp1c3Qgb25lIHBpeGVsCi0gKiBvZiBlYWNoIGRlc2lyZWQgY29sb3IuICBTdWNoIGEgZmlsZSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gYW4KLSAqIG9yZGluYXJ5IGltYWdlIFBQTSBmaWxlIHdpdGggcHBtdG9tYXAoMSkuCi0gKgotICogUmVzY2FsaW5nIGEgUFBNIHRoYXQgaGFzIGEgbWF4dmFsIHVuZXF1YWwgdG8gTUFYSlNBTVBMRSBpcyBub3QKLSAqIGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECS8qIG90aGVyd2lzZSBjYW4ndCBxdWFudGl6ZSB0byBzdXBwbGllZCBtYXAgKi8KLQotLyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiB0aGUgUEJNUExVUyBsaWJyYXJ5LCB3aGljaCBpczoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDE5ODggYnkgSmVmIFBvc2thbnplci4KLSoqCi0qKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSoqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSoqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0qKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0qKiBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotKiogaW1wbGllZCB3YXJyYW50eS4KLSovCi0KLQotLyoKLSAqIEFkZCBhIChwb3RlbnRpYWxseSkgbmV3IGNvbG9yIHRvIHRoZSBjb2xvciBtYXAuCi0gKi8KLQotTE9DQUwodm9pZCkKLWFkZF9tYXBfZW50cnkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBSLCBpbnQgRywgaW50IEIpCi17Ci0gIEpTQU1QUk9XIGNvbG9ybWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgSlNBTVBST1cgY29sb3JtYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOwotICBKU0FNUFJPVyBjb2xvcm1hcDIgPSBjaW5mby0+Y29sb3JtYXBbMl07Ci0gIGludCBuY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwotICBpbnQgaW5kZXg7Ci0KLSAgLyogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb2xvci4gKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmNvbG9yczsgaW5kZXgrKykgewotICAgIGlmIChHRVRKU0FNUExFKGNvbG9ybWFwMFtpbmRleF0pID09IFIgJiYKLQlHRVRKU0FNUExFKGNvbG9ybWFwMVtpbmRleF0pID09IEcgJiYKLQlHRVRKU0FNUExFKGNvbG9ybWFwMltpbmRleF0pID09IEIpCi0gICAgICByZXR1cm47CQkJLyogY29sb3IgaXMgYWxyZWFkeSBpbiBtYXAgKi8KLSAgfQotCi0gIC8qIENoZWNrIGZvciBtYXAgb3ZlcmZsb3cuICovCi0gIGlmIChuY29sb3JzID49IChNQVhKU0FNUExFKzEpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCAoTUFYSlNBTVBMRSsxKSk7Ci0KLSAgLyogT0ssIGFkZCBjb2xvciB0byBtYXAuICovCi0gIGNvbG9ybWFwMFtuY29sb3JzXSA9IChKU0FNUExFKSBSOwotICBjb2xvcm1hcDFbbmNvbG9yc10gPSAoSlNBTVBMRSkgRzsKLSAgY29sb3JtYXAyW25jb2xvcnNdID0gKEpTQU1QTEUpIEI7Ci0gIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycysrOwotfQotCi0KLS8qCi0gKiBFeHRyYWN0IGNvbG9yIG1hcCBmcm9tIGEgR0lGIGZpbGUuCi0gKi8KLQotTE9DQUwodm9pZCkKLXJlYWRfZ2lmX21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKLXsKLSAgaW50IGhlYWRlclsxM107Ci0gIGludCBpLCBjb2xvcm1hcGxlbjsKLSAgaW50IFIsIEcsIEI7Ci0KLSAgLyogSW5pdGlhbCAnRycgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IHJlYWRfY29sb3JfbWFwICovCi0gIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIEdJRiBoZWFkZXIgYW5kIGxvZ2ljYWwgc2NyZWVuIGRlc2NyaXB0b3IgKi8KLSAgZm9yIChpID0gMTsgaSA8IDEzOyBpKyspIHsKLSAgICBpZiAoKGhlYWRlcltpXSA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLSAgfQotCi0gIC8qIFZlcmlmeSBHSUYgSGVhZGVyICovCi0gIGlmIChoZWFkZXJbMV0gIT0gJ0knIHx8IGhlYWRlclsyXSAhPSAnRicpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLQotICAvKiBUaGVyZSBtdXN0IGJlIGEgZ2xvYmFsIGNvbG9yIG1hcC4gKi8KLSAgaWYgKChoZWFkZXJbMTBdICYgMHg4MCkgPT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotCi0gIC8qIE9LLCBmZXRjaCBpdC4gKi8KLSAgY29sb3JtYXBsZW4gPSAyIDw8IChoZWFkZXJbMTBdICYgMHgwNyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvbG9ybWFwbGVuOyBpKyspIHsKLSAgICBSID0gZ2V0YyhpbmZpbGUpOwotICAgIEcgPSBnZXRjKGluZmlsZSk7Ci0gICAgQiA9IGdldGMoaW5maWxlKTsKLSAgICBpZiAoUiA9PSBFT0YgfHwgRyA9PSBFT0YgfHwgQiA9PSBFT0YpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAgIGFkZF9tYXBfZW50cnkoY2luZm8sCi0JCSAgUiA8PCAoQklUU19JTl9KU0FNUExFLTgpLAotCQkgIEcgPDwgKEJJVFNfSU5fSlNBTVBMRS04KSwKLQkJICBCIDw8IChCSVRTX0lOX0pTQU1QTEUtOCkpOwotICB9Ci19Ci0KLQotLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgcmVhZGluZyBQUE0gKi8KLQotCi1MT0NBTChpbnQpCi1wYm1fZ2V0YyAoRklMRSAqIGluZmlsZSkKLS8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAqLwotLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgCi0gIGNoID0gZ2V0YyhpbmZpbGUpOwotICBpZiAoY2ggPT0gJyMnKSB7Ci0gICAgZG8gewotICAgICAgY2ggPSBnZXRjKGluZmlsZSk7Ci0gICAgfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSBFT0YpOwotICB9Ci0gIHJldHVybiBjaDsKLX0KLQotCi1MT0NBTCh1bnNpZ25lZCBpbnQpCi1yZWFkX3BibV9pbnRlZ2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSB0aGUgUFBNIGZpbGUgKi8KLS8qIFN3YWxsb3dzIG9uZSB0cmFpbGluZyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGludGVnZXIgKi8KLS8qIE5vdGUgdGhhdCBvbiBhIDE2LWJpdC1pbnQgbWFjaGluZSwgb25seSB2YWx1ZXMgdXAgdG8gNjRrIGNhbiBiZSByZWFkLiAqLwotLyogVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgdmFsOwotICAKLSAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIGRvIHsKLSAgICBjaCA9IHBibV9nZXRjKGluZmlsZSk7Ci0gICAgaWYgKGNoID09IEVPRikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0gIH0gd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyk7Ci0gIAotICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLSAgCi0gIHZhbCA9IGNoIC0gJzAnOwotICB3aGlsZSAoKGNoID0gcGJtX2dldGMoaW5maWxlKSkgPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgIHZhbCAqPSAxMDsKLSAgICB2YWwgKz0gY2ggLSAnMCc7Ci0gIH0KLSAgcmV0dXJuIHZhbDsKLX0KLQotCi0vKgotICogRXh0cmFjdCBjb2xvciBtYXAgZnJvbSBhIFBQTSBmaWxlLgotICovCi0KLUxPQ0FMKHZvaWQpCi1yZWFkX3BwbV9tYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCi17Ci0gIGludCBjOwotICB1bnNpZ25lZCBpbnQgdywgaCwgbWF4dmFsLCByb3csIGNvbDsKLSAgaW50IFIsIEcsIEI7Ci0KLSAgLyogSW5pdGlhbCAnUCcgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IHJlYWRfY29sb3JfbWFwICovCi0gIGMgPSBnZXRjKGluZmlsZSk7CQkvKiBzYXZlIGZvcm1hdCBkaXNjcmltaW5hdG9yIGZvciBhIHNlYyAqLwotCi0gIC8qIHdoaWxlIHdlIGZldGNoIHRoZSByZW1haW5pbmcgaGVhZGVyIGluZm8gKi8KLSAgdyA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7Ci0gIGggPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotICBtYXh2YWwgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOwotCi0gIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8IG1heHZhbCA8PSAwKSAvKiBlcnJvciBjaGVjayAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0KLSAgLyogRm9yIG5vdywgd2UgZG9uJ3Qgc3VwcG9ydCByZXNjYWxpbmcgZnJvbSBhbiB1bnVzdWFsIG1heHZhbC4gKi8KLSAgaWYgKG1heHZhbCAhPSAodW5zaWduZWQgaW50KSBNQVhKU0FNUExFKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7Ci0KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgJzMnOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQUE0gZmlsZSAqLwotICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93KyspIHsKLSAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdzsgY29sKyspIHsKLQlSID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLQlHID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLQlCID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKLQlhZGRfbWFwX2VudHJ5KGNpbmZvLCBSLCBHLCBCKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGg7IHJvdysrKSB7Ci0gICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHc7IGNvbCsrKSB7Ci0JUiA9IGdldGMoaW5maWxlKTsKLQlHID0gZ2V0YyhpbmZpbGUpOwotCUIgPSBnZXRjKGluZmlsZSk7Ci0JaWYgKFIgPT0gRU9GIHx8IEcgPT0gRU9GIHx8IEIgPT0gRU9GKQotCSAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKLQlhZGRfbWFwX2VudHJ5KGNpbmZvLCBSLCBHLCBCKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIE1haW4gZW50cnkgcG9pbnQgZnJvbSBkanBlZy5jLgotICogIElucHV0OiBvcGVuZWQgaW5wdXQgZmlsZSAoZnJvbSBmaWxlIG5hbWUgYXJndW1lbnQgb24gY29tbWFuZCBsaW5lKS4KLSAqICBPdXRwdXQ6IGNvbG9ybWFwIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBmaWVsZHMgYXJlIHNldCBpbiBjaW5mby4KLSAqLwotCi1HTE9CQUwodm9pZCkKLXJlYWRfY29sb3JfbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotewotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb2xvciBtYXAgb2YgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZS4gKi8KLSAgY2luZm8tPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgKEpESU1FTlNJT04pIChNQVhKU0FNUExFKzEpLCAoSkRJTUVOU0lPTikgMyk7Ci0gIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IDA7IC8qIGluaXRpYWxpemUgbWFwIHRvIGVtcHR5ICovCi0KLSAgLyogUmVhZCBmaXJzdCBieXRlIHRvIGRldGVybWluZSBmaWxlIGZvcm1hdCAqLwotICBzd2l0Y2ggKGdldGMoaW5maWxlKSkgewotICBjYXNlICdHJzoKLSAgICByZWFkX2dpZl9tYXAoY2luZm8sIGluZmlsZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgJ1AnOgotICAgIHJlYWRfcHBtX21hcChjaW5mbywgaW5maWxlKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3JkZ2lmLmMgYi9saWJqcGVndHdycC9yZGdpZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjdjMTY3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3JkZ2lmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogcmRnaWYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIEdJRiBmb3JtYXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOT1RFOiB0byBhdm9pZCBlbnRhbmdsZW1lbnRzIHdpdGggVW5pc3lzJyBwYXRlbnQgb24gTFpXIGNvbXByZXNzaW9uLCAgICAgICoKLSAqIHRoZSBhYmlsaXR5IHRvIHJlYWQgR0lGIGZpbGVzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSUpHIGRpc3RyaWJ1dGlvbi4gKgotICogU29ycnkgYWJvdXQgdGhhdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBXZSBhcmUgcmVxdWlyZWQgdG8gc3RhdGUgdGhhdAotICogICAgIlRoZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQoYykgaXMgdGhlIENvcHlyaWdodCBwcm9wZXJ0eSBvZgotICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIEdJRihzbSkgaXMgYSBTZXJ2aWNlIE1hcmsgcHJvcGVydHkgb2YKLSAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiIKLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotCi0vKgotICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgR0lGIGZvcm1hdCBpbnB1dC4KLSAqLwotCi1HTE9CQUwoY2pwZWdfc291cmNlX3B0cikKLWppbml0X3JlYWRfZ2lmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgZnByaW50ZihzdGRlcnIsICJHSUYgaW5wdXQgaXMgdW5zdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuICBTb3JyeS5cbiIpOwotICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIHJldHVybiBOVUxMOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KLX0KLQotI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3JkanBnY29tLjEgYi9saWJqcGVndHdycC9yZGpwZ2NvbS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmJhMDRlLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3JkanBnY29tLjEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0uVEggUkRKUEdDT00gMSAiMTEgT2N0b2JlciAxOTk3IgotLlNIIE5BTUUKLXJkanBnY29tIFwtIGRpc3BsYXkgdGV4dCBjb21tZW50cyBmcm9tIGEgSlBFRyBmaWxlCi0uU0ggU1lOT1BTSVMKLS5CIHJkanBnY29tCi1bCi0uQiBcLXZlcmJvc2UKLV0KLVsKLS5JIGZpbGVuYW1lCi1dCi0uTFAKLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiByZGpwZ2NvbQotcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKLWFuZCBwcmludHMgYW55IHRleHQgY29tbWVudHMgZm91bmQgaW4gdGhlIGZpbGUgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KLS5QUAotVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzICJjb21tZW50IiAoQ09NKSBibG9ja3MgdG8gb2NjdXIgd2l0aGluIGEgSlBFRyBmaWxlLgotQWx0aG91Z2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHdoYXQgQ09NIGJsb2NrcyBhcmUgZm9yLCB0aGV5Ci1hcmUgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQgc3RyaW5ncy4gIFRoaXMgbGV0cyB5b3UgYWRkCi1hbm5vdGF0aW9ucywgdGl0bGVzLCBpbmRleCB0ZXJtcywgZXRjIHRvIHlvdXIgSlBFRyBmaWxlcywgYW5kIGxhdGVyIHJldHJpZXZlCi10aGVtIGFzIHRleHQuICBDT00gYmxvY2tzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgaW1hZ2Ugc3RvcmVkIGluIHRoZSBKUEVHCi1maWxlLiAgVGhlIG1heGltdW0gc2l6ZSBvZiBhIENPTSBibG9jayBpcyA2NEssIGJ1dCB5b3UgY2FuIGhhdmUgYXMgbWFueSBvZgotdGhlbSBhcyB5b3UgbGlrZSBpbiBvbmUgSlBFRyBmaWxlLgotLlNIIE9QVElPTlMKLS5UUAotLkIgXC12ZXJib3NlCi1DYXVzZXMKLS5CIHJkanBnY29tCi10byBhbHNvIGRpc3BsYXkgdGhlIEpQRUcgaW1hZ2UgZGltZW5zaW9ucy4KLS5QUAotU3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCwgYW5kIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuCi0uU0ggSElOVFMKLS5CIHJkanBnY29tCi1kb2VzIG5vdCBkZXBlbmQgb24gdGhlIElKRyBKUEVHIGxpYnJhcnkuICBJdHMgc291cmNlIGNvZGUgaXMgaW50ZW5kZWQgYXMgYW4KLWlsbHVzdHJhdGlvbiBvZiB0aGUgbWluaW11bSBhbW91bnQgb2YgY29kZSByZXF1aXJlZCB0byBwYXJzZSBhIEpQRUcgZmlsZQotaGVhZGVyIGNvcnJlY3RseS4KLS5QUAotSW4KLS5CIFwtdmVyYm9zZQotbW9kZSwKLS5CIHJkanBnY29tCi13aWxsIGFsc28gYXR0ZW1wdCB0byBwcmludCB0aGUgY29udGVudHMgb2YgYW55ICJBUFAxMiIgbWFya2VycyBhcyB0ZXh0LgotU29tZSBkaWdpdGFsIGNhbWVyYXMgcHJvZHVjZSBBUFAxMiBtYXJrZXJzIGNvbnRhaW5pbmcgdXNlZnVsIHRleHR1YWwKLWluZm9ybWF0aW9uLiAgSWYgeW91IGxpa2UsIHlvdSBjYW4gbW9kaWZ5IHRoZSBzb3VyY2UgY29kZSB0byBwcmludAotb3RoZXIgQVBQbiBtYXJrZXIgdHlwZXMgYXMgd2VsbC4KLS5TSCBTRUUgQUxTTwotLkJSIGNqcGVnICgxKSwKLS5CUiBkanBlZyAoMSksCi0uQlIganBlZ3RyYW4gKDEpLAotLkJSIHdyanBnY29tICgxKQotLlNIIEFVVEhPUgotSW5kZXBlbmRlbnQgSlBFRyBHcm91cApkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRqcGdjb20uYyBiL2xpYmpwZWd0d3JwL3JkanBnY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTZmYzYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRqcGdjb20uYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKgotICogcmRqcGdjb20uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gdGhhdCBkaXNwbGF5cwotICogdGhlIHRleHQgaW4gQ09NIChjb21tZW50KSBtYXJrZXJzIGluIGEgSkZJRiBmaWxlLgotICogVGhpcyBtYXkgYmUgdXNlZnVsIGFzIGFuIGV4YW1wbGUgb2YgdGhlIG1pbmltdW0gbG9naWMgbmVlZGVkIHRvIHBhcnNlCi0gKiBKUEVHIG1hcmtlcnMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0NKUEVHX0RKUEVHCS8qIHRvIGdldCB0aGUgY29tbWFuZC1saW5lIGNvbmZpZyBzeW1ib2xzICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIJCS8qIGdldCBhdXRvLWNvbmZpZyBzeW1ib2xzLCA8c3RkaW8uaD4gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzdXBwZXIoKSwgdG9sb3dlcigpICovCi0jaWZkZWYgVVNFX1NFVE1PREUKLSNpbmNsdWRlIDxmY250bC5oPgkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkncyBwYXJhbWV0ZXIgbWFjcm9zICovCi0vKiBJZiB5b3UgaGF2ZSBzZXRtb2RlKCkgYnV0IG5vdCA8aW8uaD4sIGp1c3QgZGVsZXRlIHRoaXMgbGluZTogKi8KLSNpbmNsdWRlIDxpby5oPgkJCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpICovCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9DQ09NTUFORAkJLyogY29tbWFuZC1saW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCi0jaWZkZWYgX19NV0VSS1NfXwotI2luY2x1ZGUgPFNJT1VYLmg+ICAgICAgICAgICAgICAvKiBNZXRyb3dlcmtzIG5lZWRzIHRoaXMgKi8KLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiAuLi4gYW5kIHRoaXMgKi8KLSNlbmRpZgotI2lmZGVmIFRISU5LX0MKLSNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBUaGluayBkZWNsYXJlcyBpdCBoZXJlICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyIgotI2Vsc2UKLSNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKLSNlbHNlCQkJCS8qIHN0YW5kYXJkIEFOU0ktY29tcGxpYW50IGNhc2UgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQotI2VuZGlmCi0jaWZuZGVmIEVYSVRfU1VDQ0VTUwotI2lmZGVmIFZNUwotI2RlZmluZSBFWElUX1NVQ0NFU1MgIDEJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZWxzZQotI2RlZmluZSBFWElUX1NVQ0NFU1MgIDAKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byByZWFkIHRoZSBpbnB1dCBmaWxlLgotICogVG8gcmV1c2UgdGhpcyBjb2RlIGluIGFub3RoZXIgYXBwbGljYXRpb24sIHlvdSBtaWdodCBuZWVkIHRvIGNoYW5nZSB0aGVzZS4KLSAqLwotCi1zdGF0aWMgRklMRSAqIGluZmlsZTsJCS8qIGlucHV0IEpQRUcgZmlsZSAqLwotCi0vKiBSZXR1cm4gbmV4dCBpbnB1dCBieXRlLCBvciBFT0YgaWYgbm8gbW9yZSAqLwotI2RlZmluZSBORVhUQllURSgpICBnZXRjKGluZmlsZSkKLQotCi0vKiBFcnJvciBleGl0IGhhbmRsZXIgKi8KLSNkZWZpbmUgRVJSRVhJVChtc2cpICAoZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKSwgZXhpdChFWElUX0ZBSUxVUkUpKQotCi0KLS8qIFJlYWQgb25lIGJ5dGUsIHRlc3RpbmcgZm9yIEVPRiAqLwotc3RhdGljIGludAotcmVhZF8xX2J5dGUgKHZvaWQpCi17Ci0gIGludCBjOwotCi0gIGMgPSBORVhUQllURSgpOwotICBpZiAoYyA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIFJlYWQgMiBieXRlcywgY29udmVydCB0byB1bnNpZ25lZCBpbnQgKi8KLS8qIEFsbCAyLWJ5dGUgcXVhbnRpdGllcyBpbiBKUEVHIG1hcmtlcnMgYXJlIE1TQiBmaXJzdCAqLwotc3RhdGljIHVuc2lnbmVkIGludAotcmVhZF8yX2J5dGVzICh2b2lkKQotewotICBpbnQgYzEsIGMyOwotCi0gIGMxID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMxID09IEVPRikKLSAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOwotICBjMiA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjMiA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkgYzEpIDw8IDgpICsgKCh1bnNpZ25lZCBpbnQpIGMyKTsKLX0KLQotCi0vKgotICogSlBFRyBtYXJrZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgMHhGRiBieXRlcywgZm9sbG93ZWQgYnkgYSBtYXJrZXIKLSAqIGNvZGUgYnl0ZSAod2hpY2ggaXMgbm90IGFuIEZGKS4gIEhlcmUgYXJlIHRoZSBtYXJrZXIgY29kZXMgb2YgaW50ZXJlc3QKLSAqIGluIHRoaXMgcHJvZ3JhbS4gIChTZWUgamRtYXJrZXIuYyBmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3QuKQotICovCi0KLSNkZWZpbmUgTV9TT0YwICAweEMwCQkvKiBTdGFydCBPZiBGcmFtZSBOICovCi0jZGVmaW5lIE1fU09GMSAgMHhDMQkJLyogTiBpbmRpY2F0ZXMgd2hpY2ggY29tcHJlc3Npb24gcHJvY2VzcyAqLwotI2RlZmluZSBNX1NPRjIgIDB4QzIJCS8qIE9ubHkgU09GMC1TT0YyIGFyZSBub3cgaW4gY29tbW9uIHVzZSAqLwotI2RlZmluZSBNX1NPRjMgIDB4QzMKLSNkZWZpbmUgTV9TT0Y1ICAweEM1CQkvKiBOQjogY29kZXMgQzQgYW5kIENDIGFyZSBOT1QgU09GIG1hcmtlcnMgKi8KLSNkZWZpbmUgTV9TT0Y2ICAweEM2Ci0jZGVmaW5lIE1fU09GNyAgMHhDNwotI2RlZmluZSBNX1NPRjkgIDB4QzkKLSNkZWZpbmUgTV9TT0YxMCAweENBCi0jZGVmaW5lIE1fU09GMTEgMHhDQgotI2RlZmluZSBNX1NPRjEzIDB4Q0QKLSNkZWZpbmUgTV9TT0YxNCAweENFCi0jZGVmaW5lIE1fU09GMTUgMHhDRgotI2RlZmluZSBNX1NPSSAgIDB4RDgJCS8qIFN0YXJ0IE9mIEltYWdlIChiZWdpbm5pbmcgb2YgZGF0YXN0cmVhbSkgKi8KLSNkZWZpbmUgTV9FT0kgICAweEQ5CQkvKiBFbmQgT2YgSW1hZ2UgKGVuZCBvZiBkYXRhc3RyZWFtKSAqLwotI2RlZmluZSBNX1NPUyAgIDB4REEJCS8qIFN0YXJ0IE9mIFNjYW4gKGJlZ2lucyBjb21wcmVzc2VkIGRhdGEpICovCi0jZGVmaW5lIE1fQVBQMAkweEUwCQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBtYXJrZXIsIHR5cGUgTiAqLwotI2RlZmluZSBNX0FQUDEyCTB4RUMJCS8qICh3ZSBkb24ndCBib3RoZXIgdG8gbGlzdCBhbGwgMTYgQVBQbidzKSAqLwotI2RlZmluZSBNX0NPTSAgIDB4RkUJCS8qIENPTW1lbnQgKi8KLQotCi0vKgotICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciBhbmQgcmV0dXJuIGl0cyBtYXJrZXIgY29kZS4KLSAqIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgRkYgYnl0ZSwgcG9zc2libHkgbW9yZSBpZiB0aGUgY29tcHJlc3NvciB1c2VkIEZGcwotICogdG8gcGFkIHRoZSBmaWxlLgotICogVGhlcmUgY291bGQgYWxzbyBiZSBub24tRkYgZ2FyYmFnZSBiZXR3ZWVuIG1hcmtlcnMuICBUaGUgdHJlYXRtZW50IG9mIHN1Y2gKLSAqIGdhcmJhZ2UgaXMgdW5zcGVjaWZpZWQ7IHdlIGNob29zZSB0byBza2lwIG92ZXIgaXQgYnV0IGVtaXQgYSB3YXJuaW5nIG1zZy4KLSAqIE5COiB0aGlzIHJvdXRpbmUgbXVzdCBub3QgYmUgdXNlZCBhZnRlciBzZWVpbmcgU09TIG1hcmtlciwgc2luY2UgaXQgd2lsbAotICogbm90IGRlYWwgY29ycmVjdGx5IHdpdGggRkYvMDAgc2VxdWVuY2VzIGluIHRoZSBjb21wcmVzc2VkIGltYWdlIGRhdGEuLi4KLSAqLwotCi1zdGF0aWMgaW50Ci1uZXh0X21hcmtlciAodm9pZCkKLXsKLSAgaW50IGM7Ci0gIGludCBkaXNjYXJkZWRfYnl0ZXMgPSAwOwotCi0gIC8qIEZpbmQgMHhGRiBieXRlOyBjb3VudCBhbmQgc2tpcCBhbnkgbm9uLUZGcy4gKi8KLSAgYyA9IHJlYWRfMV9ieXRlKCk7Ci0gIHdoaWxlIChjICE9IDB4RkYpIHsKLSAgICBkaXNjYXJkZWRfYnl0ZXMrKzsKLSAgICBjID0gcmVhZF8xX2J5dGUoKTsKLSAgfQotICAvKiBHZXQgbWFya2VyIGNvZGUgYnl0ZSwgc3dhbGxvd2luZyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzCi0gICAqIGFyZSBsZWdhbCBhcyBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLgotICAgKi8KLSAgZG8gewotICAgIGMgPSByZWFkXzFfYnl0ZSgpOwotICB9IHdoaWxlIChjID09IDB4RkYpOwotCi0gIGlmIChkaXNjYXJkZWRfYnl0ZXMgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogZ2FyYmFnZSBkYXRhIGZvdW5kIGluIEpQRUcgZmlsZVxuIik7Ci0gIH0KLQotICByZXR1cm4gYzsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgaW5pdGlhbCBtYXJrZXIsIHdoaWNoIHNob3VsZCBiZSBTT0kuCi0gKiBGb3IgYSBKRklGIGZpbGUsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIGxpdGVyYWxseQotICogMHhGRiBNX1NPSS4gIFRvIGJlIG1vcmUgZ2VuZXJhbCwgd2UgY291bGQgdXNlIG5leHRfbWFya2VyLCBidXQgaWYgdGhlCi0gKiBpbnB1dCBmaWxlIHdlcmVuJ3QgYWN0dWFsbHkgSlBFRyBhdCBhbGwsIG5leHRfbWFya2VyIG1pZ2h0IHJlYWQgdGhlIHdob2xlCi0gKiBmaWxlIGFuZCB0aGVuIHJldHVybiBhIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZS4uLgotICovCi0KLXN0YXRpYyBpbnQKLWZpcnN0X21hcmtlciAodm9pZCkKLXsKLSAgaW50IGMxLCBjMjsKLQotICBjMSA9IE5FWFRCWVRFKCk7Ci0gIGMyID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMxICE9IDB4RkYgfHwgYzIgIT0gTV9TT0kpCi0gICAgRVJSRVhJVCgiTm90IGEgSlBFRyBmaWxlIik7Ci0gIHJldHVybiBjMjsKLX0KLQotCi0vKgotICogTW9zdCB0eXBlcyBvZiBtYXJrZXIgYXJlIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUtbGVuZ3RoIHBhcmFtZXRlciBzZWdtZW50LgotICogVGhpcyByb3V0aW5lIHNraXBzIG92ZXIgdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBtYXJrZXIgd2UgZG9uJ3Qgb3RoZXJ3aXNlCi0gKiB3YW50IHRvIHByb2Nlc3MuCi0gKiBOb3RlIHRoYXQgd2UgTVVTVCBza2lwIHRoZSBwYXJhbWV0ZXIgc2VnbWVudCBleHBsaWNpdGx5IGluIG9yZGVyIG5vdCB0bwotICogYmUgZm9vbGVkIGJ5IDB4RkYgYnl0ZXMgdGhhdCBtaWdodCBhcHBlYXIgd2l0aGluIHRoZSBwYXJhbWV0ZXIgc2VnbWVudDsKLSAqIHN1Y2ggYnl0ZXMgZG8gTk9UIGludHJvZHVjZSBuZXcgbWFya2Vycy4KLSAqLwotCi1zdGF0aWMgdm9pZAotc2tpcF92YXJpYWJsZSAodm9pZCkKLS8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLwotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KLSAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7Ci0gIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLwotICBpZiAobGVuZ3RoIDwgMikKLSAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7Ci0gIGxlbmd0aCAtPSAyOwotICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwotICAgIGxlbmd0aC0tOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3MgYSBDT00gbWFya2VyLgotICogV2Ugd2FudCB0byBwcmludCBvdXQgdGhlIG1hcmtlciBjb250ZW50cyBhcyBsZWdpYmxlIHRleHQ7Ci0gKiB3ZSBtdXN0IGd1YXJkIGFnYWluc3Qgbm9uLXRleHQganVuayBhbmQgdmFyeWluZyBuZXdsaW5lIHJlcHJlc2VudGF0aW9ucy4KLSAqLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19DT00gKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gIGludCBjaDsKLSAgaW50IGxhc3RjaCA9IDA7Ci0KLSAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLwotICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKLSAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCi0gIGlmIChsZW5ndGggPCAyKQotICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKLSAgbGVuZ3RoIC09IDI7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICBjaCA9IHJlYWRfMV9ieXRlKCk7Ci0gICAgLyogRW1pdCB0aGUgY2hhcmFjdGVyIGluIGEgcmVhZGFibGUgZm9ybS4KLSAgICAgKiBOb25wcmludGFibGVzIGFyZSBjb252ZXJ0ZWQgdG8gXG5ubiBmb3JtLAotICAgICAqIHdoaWxlIFwgaXMgY29udmVydGVkIHRvIFxcLgotICAgICAqIE5ld2xpbmVzIGluIENSLCBDUi9MRiwgb3IgTEYgZm9ybSB3aWxsIGJlIHByaW50ZWQgYXMgb25lIG5ld2xpbmUuCi0gICAgICovCi0gICAgaWYgKGNoID09ICdccicpIHsKLSAgICAgIHByaW50ZigiXG4iKTsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKLSAgICAgIGlmIChsYXN0Y2ggIT0gJ1xyJykKLQlwcmludGYoIlxuIik7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7Ci0gICAgICBwcmludGYoIlxcXFwiKTsKLSAgICB9IGVsc2UgaWYgKGlzcHJpbnQoY2gpKSB7Ci0gICAgICBwdXRjKGNoLCBzdGRvdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIlxcJTAzbyIsIGNoKTsKLSAgICB9Ci0gICAgbGFzdGNoID0gY2g7Ci0gICAgbGVuZ3RoLS07Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotfQotCi0KLS8qCi0gKiBQcm9jZXNzIGEgU09GbiBtYXJrZXIuCi0gKiBUaGlzIGNvZGUgaXMgb25seSBuZWVkZWQgaWYgeW91IHdhbnQgdG8ga25vdyB0aGUgaW1hZ2UgZGltZW5zaW9ucy4uLgotICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX1NPRm4gKGludCBtYXJrZXIpCi17Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCBpbWFnZV9oZWlnaHQsIGltYWdlX3dpZHRoOwotICBpbnQgZGF0YV9wcmVjaXNpb24sIG51bV9jb21wb25lbnRzOwotICBjb25zdCBjaGFyICogcHJvY2VzczsKLSAgaW50IGNpOwotCi0gIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwkvKiB1c3VhbCBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCi0KLSAgZGF0YV9wcmVjaXNpb24gPSByZWFkXzFfYnl0ZSgpOwotICBpbWFnZV9oZWlnaHQgPSByZWFkXzJfYnl0ZXMoKTsKLSAgaW1hZ2Vfd2lkdGggPSByZWFkXzJfYnl0ZXMoKTsKLSAgbnVtX2NvbXBvbmVudHMgPSByZWFkXzFfYnl0ZSgpOwotCi0gIHN3aXRjaCAobWFya2VyKSB7Ci0gIGNhc2UgTV9TT0YwOglwcm9jZXNzID0gIkJhc2VsaW5lIjsgIGJyZWFrOwotICBjYXNlIE1fU09GMToJcHJvY2VzcyA9ICJFeHRlbmRlZCBzZXF1ZW50aWFsIjsgIGJyZWFrOwotICBjYXNlIE1fU09GMjoJcHJvY2VzcyA9ICJQcm9ncmVzc2l2ZSI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjM6CXByb2Nlc3MgPSAiTG9zc2xlc3MiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0Y1Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBzZXF1ZW50aWFsIjsgIGJyZWFrOwotICBjYXNlIE1fU09GNjoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUiOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0Y3Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBsb3NzbGVzcyI7ICBicmVhazsKLSAgY2FzZSBNX1NPRjk6CXByb2Nlc3MgPSAiRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxMDoJcHJvY2VzcyA9ICJQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxMToJcHJvY2VzcyA9ICJMb3NzbGVzcywgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxMzoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxNDoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgY29kaW5nIjsgYnJlYWs7Ci0gIGNhc2UgTV9TT0YxNToJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgY29kaW5nIjsgIGJyZWFrOwotICBkZWZhdWx0Oglwcm9jZXNzID0gIlVua25vd24iOyAgYnJlYWs7Ci0gIH0KLQotICBwcmludGYoIkpQRUcgaW1hZ2UgaXMgJXV3ICogJXVoLCAlZCBjb2xvciBjb21wb25lbnRzLCAlZCBiaXRzIHBlciBzYW1wbGVcbiIsCi0JIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIG51bV9jb21wb25lbnRzLCBkYXRhX3ByZWNpc2lvbik7Ci0gIHByaW50ZigiSlBFRyBwcm9jZXNzOiAlc1xuIiwgcHJvY2Vzcyk7Ci0KLSAgaWYgKGxlbmd0aCAhPSAodW5zaWduZWQgaW50KSAoOCArIG51bV9jb21wb25lbnRzICogMykpCi0gICAgRVJSRVhJVCgiQm9ndXMgU09GIG1hcmtlciBsZW5ndGgiKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBudW1fY29tcG9uZW50czsgY2krKykgewotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBDb21wb25lbnQgSUQgY29kZSAqLwotICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBILCBWIHNhbXBsaW5nIGZhY3RvcnMgKi8KLSAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsJLyogUXVhbnRpemF0aW9uIHRhYmxlIG51bWJlciAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFBhcnNlIHRoZSBtYXJrZXIgc3RyZWFtIHVudGlsIFNPUyBvciBFT0kgaXMgc2VlbjsKLSAqIGRpc3BsYXkgYW55IENPTSBtYXJrZXJzLgotICogV2hpbGUgdGhlIGNvbXBhbmlvbiBwcm9ncmFtIHdyanBnY29tIHdpbGwgYWx3YXlzIGluc2VydCBDT00gbWFya2VycyBiZWZvcmUKLSAqIFNPRm4sIG90aGVyIGltcGxlbWVudGF0aW9ucyBtaWdodCBub3QsIHNvIHdlIHNjYW4gdG8gU09TIGJlZm9yZSBzdG9wcGluZy4KLSAqIElmIHdlIHdlcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBpbWFnZSBkaW1lbnNpb25zLCB3ZSB3b3VsZCBzdG9wIGF0IFNPRm4uCi0gKiAoQ29udmVyc2VseSwgaWYgd2Ugb25seSBjYXJlZCBhYm91dCBDT00gbWFya2VycywgdGhlcmUgd291bGQgYmUgbm8gbmVlZAotICogZm9yIHNwZWNpYWwgY29kZSB0byBoYW5kbGUgU09Gbjsgd2UgY291bGQgdHJlYXQgaXQgbGlrZSBvdGhlciBtYXJrZXJzLikKLSAqLwotCi1zdGF0aWMgaW50Ci1zY2FuX0pQRUdfaGVhZGVyIChpbnQgdmVyYm9zZSkKLXsKLSAgaW50IG1hcmtlcjsKLQotICAvKiBFeHBlY3QgU09JIGF0IHN0YXJ0IG9mIGZpbGUgKi8KLSAgaWYgKGZpcnN0X21hcmtlcigpICE9IE1fU09JKQotICAgIEVSUkVYSVQoIkV4cGVjdGVkIFNPSSBtYXJrZXIgZmlyc3QiKTsKLQotICAvKiBTY2FuIG1pc2NlbGxhbmVvdXMgbWFya2VycyB1bnRpbCB3ZSByZWFjaCBTT1MuICovCi0gIGZvciAoOzspIHsKLSAgICBtYXJrZXIgPSBuZXh0X21hcmtlcigpOwotICAgIHN3aXRjaCAobWFya2VyKSB7Ci0gICAgICAvKiBOb3RlIHRoYXQgbWFya2VyIGNvZGVzIDB4QzQsIDB4QzgsIDB4Q0MgYXJlIG5vdCwgYW5kIG11c3Qgbm90IGJlLAotICAgICAgICogdHJlYXRlZCBhcyBTT0ZuLiAgQzQgaW4gcGFydGljdWxhciBpcyBhY3R1YWxseSBESFQuCi0gICAgICAgKi8KLSAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCi0gICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgICAgaWYgKHZlcmJvc2UpCi0JcHJvY2Vzc19TT0ZuKG1hcmtlcik7Ci0gICAgICBlbHNlCi0Jc2tpcF92YXJpYWJsZSgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09TOgkJCS8qIHN0b3AgYmVmb3JlIGhpdHRpbmcgY29tcHJlc3NlZCBkYXRhICovCi0gICAgICByZXR1cm4gbWFya2VyOwotCi0gICAgY2FzZSBNX0VPSToJCQkvKiBpbiBjYXNlIGl0J3MgYSB0YWJsZXMtb25seSBKUEVHIHN0cmVhbSAqLwotICAgICAgcmV0dXJuIG1hcmtlcjsKLQotICAgIGNhc2UgTV9DT006Ci0gICAgICBwcm9jZXNzX0NPTSgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQVBQMTI6Ci0gICAgICAvKiBTb21lIGRpZ2l0YWwgY2FtZXJhIG1ha2VycyBwdXQgdXNlZnVsIHRleHR1YWwgaW5mb3JtYXRpb24gaW50bwotICAgICAgICogQVBQMTIgbWFya2Vycywgc28gd2UgcHJpbnQgdGhvc2Ugb3V0IHRvbyB3aGVuIGluIC12ZXJib3NlIG1vZGUuCi0gICAgICAgKi8KLSAgICAgIGlmICh2ZXJib3NlKSB7Ci0JcHJpbnRmKCJBUFAxMiBjb250YWluczpcbiIpOwotCXByb2Nlc3NfQ09NKCk7Ci0gICAgICB9IGVsc2UKLQlza2lwX3ZhcmlhYmxlKCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6CQkJLyogQW55dGhpbmcgZWxzZSBqdXN0IGdldHMgc2tpcHBlZCAqLwotICAgICAgc2tpcF92YXJpYWJsZSgpOwkJLyogd2UgYXNzdW1lIGl0IGhhcyBhIHBhcmFtZXRlciBjb3VudC4uLiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IC8qIGVuZCBsb29wICovCi19Ci0KLQotLyogQ29tbWFuZCBsaW5lIHBhcnNpbmcgY29kZSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi0KLQotc3RhdGljIHZvaWQKLXVzYWdlICh2b2lkKQotLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLwotewotICBmcHJpbnRmKHN0ZGVyciwgInJkanBnY29tIGRpc3BsYXlzIGFueSB0ZXh0dWFsIGNvbW1lbnRzIGluIGEgSlBFRyBmaWxlLlxuIik7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW3N3aXRjaGVzXSBbaW5wdXRmaWxlXVxuIiwgcHJvZ25hbWUpOwotCi0gIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICAgIEFsc28gZGlzcGxheSBkaW1lbnNpb25zIG9mIEpQRUcgaW1hZ2VcbiIpOwotCi0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1rZXltYXRjaCAoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykKLS8qIENhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb2YgKHBvc3NpYmx5IGFiYnJldmlhdGVkKSBrZXl3b3JkIHN3aXRjaGVzLiAqLwotLyoga2V5d29yZCBpcyB0aGUgY29uc3RhbnQga2V5d29yZCAobXVzdCBiZSBsb3dlciBjYXNlIGFscmVhZHkpLCAqLwotLyogbWluY2hhcnMgaXMgbGVuZ3RoIG9mIG1pbmltdW0gbGVnYWwgYWJicmV2aWF0aW9uLiAqLwotewotICByZWdpc3RlciBpbnQgY2EsIGNrOwotICByZWdpc3RlciBpbnQgbm1hdGNoZWQgPSAwOwotCi0gIHdoaWxlICgoY2EgPSAqYXJnKyspICE9ICdcMCcpIHsKLSAgICBpZiAoKGNrID0gKmtleXdvcmQrKykgPT0gJ1wwJykKLSAgICAgIHJldHVybiAwOwkJCS8qIGFyZyBsb25nZXIgdGhhbiBrZXl3b3JkLCBubyBnb29kICovCi0gICAgaWYgKGlzdXBwZXIoY2EpKQkJLyogZm9yY2UgYXJnIHRvIGxjYXNlIChhc3N1bWUgY2sgaXMgYWxyZWFkeSkgKi8KLSAgICAgIGNhID0gdG9sb3dlcihjYSk7Ci0gICAgaWYgKGNhICE9IGNrKQotICAgICAgcmV0dXJuIDA7CQkJLyogbm8gZ29vZCAqLwotICAgIG5tYXRjaGVkKys7CQkJLyogY291bnQgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCi0gIH0KLSAgLyogcmVhY2hlZCBlbmQgb2YgYXJndW1lbnQ7IGZhaWwgaWYgaXQncyB0b28gc2hvcnQgZm9yIHVuaXF1ZSBhYmJyZXYgKi8KLSAgaWYgKG5tYXRjaGVkIDwgbWluY2hhcnMpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwkJCS8qIEEtT0sgKi8KLX0KLQotCi0vKgotICogVGhlIG1haW4gcHJvZ3JhbS4KLSAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgaW50IGFyZ247Ci0gIGNoYXIgKiBhcmc7Ci0gIGludCB2ZXJib3NlID0gMDsKLQotICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLwotI2lmZGVmIFVTRV9DQ09NTUFORAotICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOwotI2VuZGlmCi0KLSAgcHJvZ25hbWUgPSBhcmd2WzBdOwotICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQotICAgIHByb2duYW1lID0gInJkanBnY29tIjsJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCi0KLSAgLyogUGFyc2Ugc3dpdGNoZXMsIGlmIGFueSAqLwotICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7Ci0gICAgYXJnID0gYXJndlthcmduXTsKLSAgICBpZiAoYXJnWzBdICE9ICctJykKLSAgICAgIGJyZWFrOwkJCS8qIG5vdCBzd2l0Y2gsIG11c3QgYmUgZmlsZSBuYW1lICovCi0gICAgYXJnKys7CQkJLyogYWR2YW5jZSBvdmVyICctJyAqLwotICAgIGlmIChrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKLSAgICAgIHZlcmJvc2UrKzsKLSAgICB9IGVsc2UKLSAgICAgIHVzYWdlKCk7Ci0gIH0KLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLwotICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCi0gIGlmIChhcmduIDwgYXJnYy0xKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOwotICAgIHVzYWdlKCk7Ci0gIH0KLSAgaWYgKGFyZ24gPCBhcmdjKSB7Ci0gICAgaWYgKChpbmZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCi0jaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCi0gICAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCi0gICAgaWYgKChpbmZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIHN0ZGluXG4iLCBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotI2Vsc2UKLSAgICBpbmZpbGUgPSBzdGRpbjsKLSNlbmRpZgotICB9Ci0KLSAgLyogU2NhbiB0aGUgSlBFRyBoZWFkZXJzLiAqLwotICAodm9pZCkgc2Nhbl9KUEVHX2hlYWRlcih2ZXJib3NlKTsKLQotICAvKiBBbGwgZG9uZS4gKi8KLSAgZXhpdChFWElUX1NVQ0NFU1MpOwotICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3JkcHBtLmMgYi9saWJqcGVndHdycC9yZHBwbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGYzNWMxLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3JkcHBtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoKLSAqIHJkcHBtLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBQUE0vUEdNIGZvcm1hdC4KLSAqIFRoZSBleHRlbmRlZCAyLWJ5dGUtcGVyLXNhbXBsZSByYXcgUFBNL1BHTSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCi0gKiBUaGUgUEJNUExVUyBsaWJyYXJ5IGlzIE5PVCByZXF1aXJlZCB0byBjb21waWxlIHRoaXMgc29mdHdhcmUKLSAqIChidXQgaXQgaXMgaGlnaGx5IHVzZWZ1bCBhcyBhIHNldCBvZiBQUE0gaW1hZ2UgbWFuaXB1bGF0aW9uIHByb2dyYW1zKS4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCi0gKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCi0gKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKLSAqIHRoZSBmaWxlIGlzIGluZGVlZCBQUE0gZm9ybWF0KS4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgUFBNX1NVUFBPUlRFRAotCi0KLS8qIFBvcnRpb25zIG9mIHRoaXMgY29kZSBhcmUgYmFzZWQgb24gdGhlIFBCTVBMVVMgbGlicmFyeSwgd2hpY2ggaXM6Ci0qKgotKiogQ29weXJpZ2h0IChDKSAxOTg4IGJ5IEplZiBQb3NrYW56ZXIuCi0qKgotKiogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0qKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCi0qKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotKiogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotKiogZG9jdW1lbnRhdGlvbi4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKLSoqIGltcGxpZWQgd2FycmFudHkuCi0qLwotCi0KLS8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQotI2Vsc2UKLXR5cGVkZWYgY2hhciBVX0NIQVI7Ci0jZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKLSNlbmRpZgotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0KLSNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCi0KLQotLyoKLSAqIE9uIG1vc3Qgc3lzdGVtcywgcmVhZGluZyBpbmRpdmlkdWFsIGJ5dGVzIHdpdGggZ2V0YygpIGlzIGRyYXN0aWNhbGx5IGxlc3MKLSAqIGVmZmljaWVudCB0aGFuIGJ1ZmZlcmluZyBhIHJvdyBhdCBhIHRpbWUgd2l0aCBmcmVhZCgpLiAgT24gUENzLCB3ZSBtdXN0Ci0gKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUgYXNzdW1pbmcgc21hbGwtZGF0YQotICogbWVtb3J5IG1vZGVsLCB3aGVyZWluIGZyZWFkKCkgY2FuJ3QgcmVhY2ggZmFyIG1lbW9yeS4gIElmIHlvdSBuZWVkIHRvCi0gKiBwcm9jZXNzIHZlcnkgd2lkZSBpbWFnZXMgb24gYSBQQywgeW91IG1pZ2h0IGhhdmUgdG8gY29tcGlsZSBpbiBsYXJnZS1tZW1vcnkKLSAqIG1vZGVsLCBvciBlbHNlIHJlcGxhY2UgZnJlYWQoKSB3aXRoIGEgZ2V0YygpIGxvb3AgLS0tIHdoaWNoIHdpbGwgYmUgbXVjaAotICogc2xvd2VyLgotICovCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIFVfQ0hBUiAqaW9idWZmZXI7CQkvKiBub24tRkFSIHBvaW50ZXIgdG8gSS9PIGJ1ZmZlciAqLwotICBKU0FNUFJPVyBwaXhyb3c7CQkvKiBGQVIgcG9pbnRlciB0byBzYW1lICovCi0gIHNpemVfdCBidWZmZXJfd2lkdGg7CQkvKiB3aWR0aCBvZiBJL08gYnVmZmVyICovCi0gIEpTQU1QTEUgKnJlc2NhbGU7CQkvKiA9PiBtYXh2YWwtcmVtYXBwaW5nIGFycmF5LCBvciBOVUxMICovCi19IHBwbV9zb3VyY2Vfc3RydWN0OwotCi10eXBlZGVmIHBwbV9zb3VyY2Vfc3RydWN0ICogcHBtX3NvdXJjZV9wdHI7Ci0KLQotTE9DQUwoaW50KQotcGJtX2dldGMgKEZJTEUgKiBpbmZpbGUpCi0vKiBSZWFkIG5leHQgY2hhciwgc2tpcHBpbmcgb3ZlciBhbnkgY29tbWVudHMgKi8KLS8qIEEgY29tbWVudC9uZXdsaW5lIHNlcXVlbmNlIGlzIHJldHVybmVkIGFzIGEgbmV3bGluZSAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0KLSAgY2ggPSBnZXRjKGluZmlsZSk7Ci0gIGlmIChjaCA9PSAnIycpIHsKLSAgICBkbyB7Ci0gICAgICBjaCA9IGdldGMoaW5maWxlKTsKLSAgICB9IHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7Ci0gIH0KLSAgcmV0dXJuIGNoOwotfQotCi0KLUxPQ0FMKHVuc2lnbmVkIGludCkKLXJlYWRfcGJtX2ludGVnZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQotLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSB0aGUgUFBNIGZpbGUgKi8KLS8qIFN3YWxsb3dzIG9uZSB0cmFpbGluZyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGludGVnZXIgKi8KLS8qIE5vdGUgdGhhdCBvbiBhIDE2LWJpdC1pbnQgbWFjaGluZSwgb25seSB2YWx1ZXMgdXAgdG8gNjRrIGNhbiBiZSByZWFkLiAqLwotLyogVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgdmFsOwotCi0gIC8qIFNraXAgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICBkbyB7Ci0gICAgY2ggPSBwYm1fZ2V0YyhpbmZpbGUpOwotICAgIGlmIChjaCA9PSBFT0YpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIH0gd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyk7Ci0KLSAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX05PTk5VTUVSSUMpOwotCi0gIHZhbCA9IGNoIC0gJzAnOwotICB3aGlsZSAoKGNoID0gcGJtX2dldGMoaW5maWxlKSkgPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgIHZhbCAqPSAxMDsKLSAgICB2YWwgKz0gY2ggLSAnMCc7Ci0gIH0KLSAgcmV0dXJuIHZhbDsKLX0KLQotCi0vKgotICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KLSAqCi0gKiBXZSBwcm92aWRlIHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zIGRlcGVuZGluZyBvbiBpbnB1dCBmaWxlIGZvcm1hdC4KLSAqIEluIGFsbCBjYXNlcywgaW5wdXQgaXMgc2NhbGVkIHRvIHRoZSBzaXplIG9mIEpTQU1QTEUuCi0gKgotICogQSByZWFsbHkgZmFzdCBwYXRoIGlzIHByb3ZpZGVkIGZvciByZWFkaW5nIGJ5dGUvc2FtcGxlIHJhdyBmaWxlcyB3aXRoCi0gKiBtYXh2YWwgPSBNQVhKU0FNUExFLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UgZm9yIDgtYml0IGRhdGEuCi0gKi8KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF90ZXh0X2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyB0ZXh0LWZvcm1hdCBQR00gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCi17Ci0gIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87Ci0gIEZJTEUgKiBpbmZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7Ci0gIEpESU1FTlNJT04gY29sOwotCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF90ZXh0X3JnYl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHRleHQtZm9ybWF0IFBQTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgRklMRSAqIGluZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOwotICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07Ci0gICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF9zY2FsZWRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy1ieXRlLWZvcm1hdCBQR00gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCi17Ci0gIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOwotICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOwotICBKRElNRU5TSU9OIGNvbDsKLQotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOwotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqcHRyKysgPSByZXNjYWxlW1VDSCgqYnVmZmVycHRyKyspXTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF9zY2FsZWRfcmdiX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IFBQTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7Ci0gIEpESU1FTlNJT04gY29sOwotCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOwotICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOwotICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3Jhd19yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy1ieXRlLWZvcm1hdCBmaWxlcyB3aXRoIG1heHZhbCA9IE1BWEpTQU1QTEUuCi0gKiBJbiB0aGlzIGNhc2Ugd2UganVzdCByZWFkIHJpZ2h0IGludG8gdGhlIEpTQU1QTEUgYnVmZmVyIQotICogTm90ZSB0aGF0IHNhbWUgY29kZSB3b3JrcyBmb3IgUFBNIGFuZCBQR00gZmlsZXMuCi0gKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLQotICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfd29yZF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LXdvcmQtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7Ci0gIEpESU1FTlNJT04gY29sOwotCi0gIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIHJlZ2lzdGVyIGludCB0ZW1wOwotICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7Ci0gICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OwotICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfd29yZF9yZ2Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctd29yZC1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLwotewotICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKLSAgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7Ci0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7Ci0gICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKLSAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOwotICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKLSAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOwotICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7Ci0gICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OwotICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfaW5wdXRfcHBtIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgaW50IGM7Ci0gIHVuc2lnbmVkIGludCB3LCBoLCBtYXh2YWw7Ci0gIGJvb2xlYW4gbmVlZF9pb2J1ZmZlciwgdXNlX3Jhd19idWZmZXIsIG5lZWRfcmVzY2FsZTsKLQotICBpZiAoZ2V0Yyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKSAhPSAnUCcpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKLQotICBjID0gZ2V0Yyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsgLyogc3ViZm9ybWF0IGRpc2NyaW1pbmF0b3IgY2hhcmFjdGVyICovCi0KLSAgLyogZGV0ZWN0IHVuc3VwcG9ydGVkIHZhcmlhbnRzIChpZSwgUEJNKSBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgaGVhZGVyICovCi0gIHN3aXRjaCAoYykgewotICBjYXNlICcyJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUEdNIGZpbGUgKi8KLSAgY2FzZSAnMyc6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBQTSBmaWxlICovCi0gIGNhc2UgJzUnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBHTSBmaWxlICovCi0gIGNhc2UgJzYnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBQTSBmaWxlICovCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIGZldGNoIHRoZSByZW1haW5pbmcgaGVhZGVyIGluZm8gKi8KLSAgdyA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOwotICBoID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7Ci0gIG1heHZhbCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOwotCi0gIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8IG1heHZhbCA8PSAwKSAvKiBlcnJvciBjaGVjayAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX05PVCk7Ci0KLSAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gQklUU19JTl9KU0FNUExFOyAvKiB3ZSBhbHdheXMgcmVzY2FsZSBkYXRhIHRvIHRoaXMgKi8KLSAgY2luZm8tPmltYWdlX3dpZHRoID0gKEpESU1FTlNJT04pIHc7Ci0gIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSAoSkRJTUVOU0lPTikgaDsKLQotICAvKiBpbml0aWFsaXplIGZsYWdzIHRvIG1vc3QgY29tbW9uIHNldHRpbmdzICovCi0gIG5lZWRfaW9idWZmZXIgPSBUUlVFOwkJLyogZG8gd2UgbmVlZCBhbiBJL08gYnVmZmVyPyAqLwotICB1c2VfcmF3X2J1ZmZlciA9IEZBTFNFOwkvKiBkbyB3ZSBtYXAgaW5wdXQgYnVmZmVyIG9udG8gSS9PIGJ1ZmZlcj8gKi8KLSAgbmVlZF9yZXNjYWxlID0gVFJVRTsJCS8qIGRvIHdlIG5lZWQgYSByZXNjYWxlIGFycmF5PyAqLwotCi0gIHN3aXRjaCAoYykgewotICBjYXNlICcyJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUEdNIGZpbGUgKi8KLSAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDE7Ci0gICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QR01fVEVYVCwgdywgaCk7Ci0gICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfdGV4dF9ncmF5X3JvdzsKLSAgICBuZWVkX2lvYnVmZmVyID0gRkFMU0U7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnMyc6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBQTSBmaWxlICovCi0gICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOwotICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUFBNX1RFWFQsIHcsIGgpOwotICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3RleHRfcmdiX3JvdzsKLSAgICBuZWVkX2lvYnVmZmVyID0gRkFMU0U7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnNSc6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUEdNIGZpbGUgKi8KLSAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDE7Ci0gICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QR00sIHcsIGgpOwotICAgIGlmIChtYXh2YWwgPiAyNTUpIHsKLSAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3dvcmRfZ3JheV9yb3c7Ci0gICAgfSBlbHNlIGlmIChtYXh2YWwgPT0gTUFYSlNBTVBMRSAmJiBTSVpFT0YoSlNBTVBMRSkgPT0gU0laRU9GKFVfQ0hBUikpIHsKLSAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3Jhd19yb3c7Ci0gICAgICB1c2VfcmF3X2J1ZmZlciA9IFRSVUU7Ci0gICAgICBuZWVkX3Jlc2NhbGUgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfc2NhbGVkX2dyYXlfcm93OwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlICc2JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQUE0gZmlsZSAqLwotICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMzsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BQTSwgdywgaCk7Ci0gICAgaWYgKG1heHZhbCA+IDI1NSkgewotICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfd29yZF9yZ2Jfcm93OwotICAgIH0gZWxzZSBpZiAobWF4dmFsID09IE1BWEpTQU1QTEUgJiYgU0laRU9GKEpTQU1QTEUpID09IFNJWkVPRihVX0NIQVIpKSB7Ci0gICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9yYXdfcm93OwotICAgICAgdXNlX3Jhd19idWZmZXIgPSBUUlVFOwotICAgICAgbmVlZF9yZXNjYWxlID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3NjYWxlZF9yZ2Jfcm93OwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBJL08gYnVmZmVyOiAxIG9yIDMgYnl0ZXMgb3Igd29yZHMvcGl4ZWwuICovCi0gIGlmIChuZWVkX2lvYnVmZmVyKSB7Ci0gICAgc291cmNlLT5idWZmZXJfd2lkdGggPSAoc2l6ZV90KSB3ICogY2luZm8tPmlucHV0X2NvbXBvbmVudHMgKgotICAgICAgKChtYXh2YWw8PTI1NSkgPyBTSVpFT0YoVV9DSEFSKSA6ICgyKlNJWkVPRihVX0NIQVIpKSk7Ci0gICAgc291cmNlLT5pb2J1ZmZlciA9IChVX0NIQVIgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBzb3VyY2UtPmJ1ZmZlcl93aWR0aCk7Ci0gIH0KLQotICAvKiBDcmVhdGUgY29tcHJlc3NvciBpbnB1dCBidWZmZXIuICovCi0gIGlmICh1c2VfcmF3X2J1ZmZlcikgewotICAgIC8qIEZvciB1bnNjYWxlZCByYXctaW5wdXQgY2FzZSwgd2UgY2FuIGp1c3QgbWFwIGl0IG9udG8gdGhlIEkvTyBidWZmZXIuICovCi0gICAgLyogU3ludGhlc2l6ZSBhIEpTQU1QQVJSQVkgcG9pbnRlciBzdHJ1Y3R1cmUgKi8KLSAgICAvKiBDYXN0IGhlcmUgaW1wbGllcyBuZWFyLT5mYXIgcG9pbnRlciBjb252ZXJzaW9uIG9uIFBDcyAqLwotICAgIHNvdXJjZS0+cGl4cm93ID0gKEpTQU1QUk9XKSBzb3VyY2UtPmlvYnVmZmVyOwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICYgc291cmNlLT5waXhyb3c7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTmVlZCB0byB0cmFuc2xhdGUgYW55d2F5LCBzbyBtYWtlIGEgc2VwYXJhdGUgc2FtcGxlIGJ1ZmZlci4gKi8KLSAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgICAgKEpESU1FTlNJT04pIHcgKiBjaW5mby0+aW5wdXRfY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOwotICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVzY2FsaW5nIGFycmF5IGlmIHJlcXVpcmVkLiAqLwotICBpZiAobmVlZF9yZXNjYWxlKSB7Ci0gICAgSU5UMzIgdmFsLCBoYWxmX21heHZhbDsKLQotICAgIC8qIE9uIDE2LWJpdC1pbnQgbWFjaGluZXMgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIG9mIG1heHZhbCA9IDY1NTM1ICovCi0gICAgc291cmNlLT5yZXNjYWxlID0gKEpTQU1QTEUgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAoc2l6ZV90KSAoKChsb25nKSBtYXh2YWwgKyAxTCkgKiBTSVpFT0YoSlNBTVBMRSkpKTsKLSAgICBoYWxmX21heHZhbCA9IG1heHZhbCAvIDI7Ci0gICAgZm9yICh2YWwgPSAwOyB2YWwgPD0gKElOVDMyKSBtYXh2YWw7IHZhbCsrKSB7Ci0gICAgICAvKiBUaGUgbXVsdGlwbGljYXRpb24gaGVyZSBtdXN0IGJlIGRvbmUgaW4gMzIgYml0cyB0byBhdm9pZCBvdmVyZmxvdyAqLwotICAgICAgc291cmNlLT5yZXNjYWxlW3ZhbF0gPSAoSlNBTVBMRSkgKCh2YWwqTUFYSlNBTVBMRSArIGhhbGZfbWF4dmFsKS9tYXh2YWwpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9pbnB1dF9wcG0gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFBQTSBmb3JtYXQgaW5wdXQuCi0gKi8KLQotR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCi1qaW5pdF9yZWFkX3BwbSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBwbV9zb3VyY2VfcHRyIHNvdXJjZTsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KLSAgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihwcG1fc291cmNlX3N0cnVjdCkpOwotICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzLCBleGNlcHQgZ2V0X3BpeGVsX3Jvd3Mgd2hpY2ggc3RhcnRfaW5wdXQgc2V0cyAqLwotICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X3BwbTsKLSAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X3BwbTsKLQotICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKLX0KLQotI2VuZGlmIC8qIFBQTV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3JkcmxlLmMgYi9saWJqcGVndHdycC9yZHJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJiYzM3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3JkcmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqIHJkcmxlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBVdGFoIFJMRSBmb3JtYXQuCi0gKiBUaGUgVXRhaCBSYXN0ZXIgVG9vbGtpdCBsaWJyYXJ5IGlzIHJlcXVpcmVkICh2ZXJzaW9uIDMuMSBvciBsYXRlcikuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIGlucHV0IGZyb20KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4gIFRoZXkgZnVydGhlciBhc3N1bWUgdGhhdCByZWFkaW5nIGJlZ2lucwotICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlOyBzdGFydF9pbnB1dCBtYXkgbmVlZCB3b3JrIGlmIHRoZQotICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0Ci0gKiB0aGUgZmlsZSBpcyBpbmRlZWQgUkxFIGZvcm1hdCkuCi0gKgotICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBNaWtlIExpamV3c2tpLAotICogd2l0aCB1cGRhdGVzIGZyb20gUm9iZXJ0IEh1dGNoaW5zb24uCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIFJMRV9TVVBQT1JURUQKLQotLyogcmxlLmggaXMgcHJvdmlkZWQgYnkgdGhlIFV0YWggUmFzdGVyIFRvb2xraXQuICovCi0KLSNpbmNsdWRlIDxybGUuaD4KLQotLyoKLSAqIFdlIGFzc3VtZSB0aGF0IEpTQU1QTEUgaGFzIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFzIHJsZV9waXhlbCwKLSAqIHRvIHdpdCwgInVuc2lnbmVkIGNoYXIiLiAgSGVuY2Ugd2UgY2FuJ3QgY29wZSB3aXRoIDEyLSBvciAxNi1iaXQgc2FtcGxlcy4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLS8qCi0gKiBXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgUkxFIGZpbGVzOgotICogICAKLSAqICAgR1JBWVNDQUxFICAgLSA4IGJpdHMsIG5vIGNvbG9ybWFwCi0gKiAgIE1BUFBFREdSQVkgIC0gOCBiaXRzLCAxIGNoYW5uZWwgY29sb21hcAotICogICBQU0VVRE9DT0xPUiAtIDggYml0cywgMyBjaGFubmVsIGNvbG9ybWFwCi0gKiAgIFRSVUVDT0xPUiAgIC0gMjQgYml0cywgMyBjaGFubmVsIGNvbG9ybWFwCi0gKiAgIERJUkVDVENPTE9SIC0gMjQgYml0cywgbm8gY29sb3JtYXAKLSAqCi0gKiBGb3Igbm93LCB3ZSBpZ25vcmUgYW55IGFscGhhIGNoYW5uZWwgaW4gdGhlIGltYWdlLgotICovCi0KLXR5cGVkZWYgZW51bQotICB7IEdSQVlTQ0FMRSwgTUFQUEVER1JBWSwgUFNFVURPQ09MT1IsIFRSVUVDT0xPUiwgRElSRUNUQ09MT1IgfSBybGVfa2luZDsKLQotCi0vKgotICogU2luY2UgUkxFIHN0b3JlcyBzY2FubGluZXMgYm90dG9tLXRvLXRvcCwgd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGltYWdlCi0gKiB0byBjb25mb3JtIHRvIEpQRUcncyB0b3AtdG8tYm90dG9tIG9yZGVyLiAgVG8gZG8gdGhpcywgd2UgcmVhZCB0aGUKLSAqIGluY29taW5nIGltYWdlIGludG8gYSB2aXJ0dWFsIGFycmF5IG9uIHRoZSBmaXJzdCBnZXRfcGl4ZWxfcm93cyBjYWxsLAotICogdGhlbiBmZXRjaCB0aGUgcmVxdWlyZWQgcm93IGZyb20gdGhlIHZpcnR1YWwgYXJyYXkgb24gc3Vic2VxdWVudCBjYWxscy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBfcmxlX3NvdXJjZV9zdHJ1Y3QgKiBybGVfc291cmNlX3B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgX3JsZV9zb3VyY2Vfc3RydWN0IHsKLSAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgcmxlX2tpbmQgdmlzdWFsOyAgICAgICAgICAgICAgLyogYWN0dWFsIHR5cGUgb2YgaW5wdXQgZmlsZSAqLwotICBqdmlydF9zYXJyYXlfcHRyIGltYWdlOyAgICAgICAvKiB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlICovCi0gIEpESU1FTlNJT04gcm93OwkJLyogY3VycmVudCByb3cgIyBpbiB0aGUgdmlydHVhbCBhcnJheSAqLwotICBybGVfaGRyIGhlYWRlcjsgICAgICAgICAgICAgICAvKiBJbnB1dCBmaWxlIGluZm9ybWF0aW9uICovCi0gIHJsZV9waXhlbCoqIHJsZV9yb3c7ICAgICAgICAgIC8qIGhvbGRzIGEgcm93IHJldHVybmVkIGJ5IHJsZV9nZXRyb3coKSAqLwotCi19IHJsZV9zb3VyY2Vfc3RydWN0OwotCi0KLS8qCi0gKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X2lucHV0X3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87Ci0gIEpESU1FTlNJT04gd2lkdGgsIGhlaWdodDsKLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOwotI2VuZGlmCi0KLSAgLyogVXNlIFJMRSBsaWJyYXJ5IHJvdXRpbmUgdG8gZ2V0IHRoZSBoZWFkZXIgaW5mbyAqLwotICBzb3VyY2UtPmhlYWRlciA9ICpybGVfaGRyX2luaXQoTlVMTCk7Ci0gIHNvdXJjZS0+aGVhZGVyLnJsZV9maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKLSAgc3dpdGNoIChybGVfZ2V0X3NldHVwKCYoc291cmNlLT5oZWFkZXIpKSkgewotICBjYXNlIFJMRV9TVUNDRVNTOgotICAgIC8qIEEtT0sgKi8KLSAgICBicmVhazsKLSAgY2FzZSBSTEVfTk9UX1JMRToKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9OT1QpOwotICAgIGJyZWFrOwotICBjYXNlIFJMRV9OT19TUEFDRToKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9NRU0pOwotICAgIGJyZWFrOwotICBjYXNlIFJMRV9FTVBUWToKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9FTVBUWSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUkxFX0VPRjoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9FT0YpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0JBREVSUk9SKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgd2hhdCB3ZSBoYXZlLCBzZXQgcHJpdmF0ZSB2YXJzIGFuZCByZXR1cm4gdmFsdWVzIGFjY29yZGluZ2x5ICovCi0gIAotICB3aWR0aCAgPSBzb3VyY2UtPmhlYWRlci54bWF4IC0gc291cmNlLT5oZWFkZXIueG1pbiArIDE7Ci0gIGhlaWdodCA9IHNvdXJjZS0+aGVhZGVyLnltYXggLSBzb3VyY2UtPmhlYWRlci55bWluICsgMTsKLSAgc291cmNlLT5oZWFkZXIueG1pbiA9IDA7CQkvKiByZWFsaWduIGhvcml6b250YWxseSAqLwotICBzb3VyY2UtPmhlYWRlci54bWF4ID0gd2lkdGgtMTsKLQotICBjaW5mby0+aW1hZ2Vfd2lkdGggICAgICA9IHdpZHRoOwotICBjaW5mby0+aW1hZ2VfaGVpZ2h0ICAgICA9IGhlaWdodDsKLSAgY2luZm8tPmRhdGFfcHJlY2lzaW9uICAgPSA4OyAgLyogd2UgY2FuIG9ubHkgaGFuZGxlIDggYml0IGRhdGEgKi8KLQotICBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDApIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBHUkFZU0NBTEU7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUkxFX0dSQVksIHdpZHRoLCBoZWlnaHQpOwotICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMSAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAxKSB7Ci0gICAgc291cmNlLT52aXN1YWwgICAgID0gTUFQUEVER1JBWTsKLSAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfTUFQR1JBWSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAxIDw8IHNvdXJjZS0+aGVhZGVyLmNtYXBsZW4pOwotICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMSAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAzKSB7Ci0gICAgc291cmNlLT52aXN1YWwgICAgID0gUFNFVURPQ09MT1I7Ci0gICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfUkxFX01BUFBFRCwgd2lkdGgsIGhlaWdodCwKLQkgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7Ci0gIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAzICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDMpIHsKLSAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBUUlVFQ09MT1I7Ci0gICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfUkxFX0ZVTExNQVAsIHdpZHRoLCBoZWlnaHQsCi0JICAgICAxIDw8IHNvdXJjZS0+aGVhZGVyLmNtYXBsZW4pOwotICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMyAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAwKSB7Ci0gICAgc291cmNlLT52aXN1YWwgICAgID0gRElSRUNUQ09MT1I7Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUkxFLCB3aWR0aCwgaGVpZ2h0KTsKLSAgfSBlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfVU5TVVBQT1JURUQpOwotICAKLSAgaWYgKHNvdXJjZS0+dmlzdWFsID09IEdSQVlTQ0FMRSB8fCBzb3VyY2UtPnZpc3VhbCA9PSBNQVBQRURHUkFZKSB7Ci0gICAgY2luZm8tPmluX2NvbG9yX3NwYWNlICAgPSBKQ1NfR1JBWVNDQUxFOwotICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKLSAgfSBlbHNlIHsKLSAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgICA9IEpDU19SR0I7Ci0gICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOwotICB9Ci0KLSAgLyoKLSAgICogQSBwbGFjZSB0byBob2xkIGVhY2ggc2NhbmxpbmUgd2hpbGUgaXQncyBjb252ZXJ0ZWQuCi0gICAqIChHUkFZU0NBTEUgc2NhbmxpbmVzIGRvbid0IG5lZWQgY29udmVydGluZykKLSAgICovCi0gIGlmIChzb3VyY2UtPnZpc3VhbCAhPSBHUkFZU0NBTEUpIHsKLSAgICBzb3VyY2UtPnJsZV9yb3cgPSAocmxlX3BpeGVsKiopICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAoSkRJTUVOU0lPTikgd2lkdGgsIChKRElNRU5TSU9OKSBjaW5mby0+aW5wdXRfY29tcG9uZW50cyk7Ci0gIH0KLQotICAvKiByZXF1ZXN0IGEgdmlydHVhbCBhcnJheSB0byBob2xkIHRoZSBpbWFnZSAqLwotICBzb3VyY2UtPmltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotICAgICAoSkRJTUVOU0lPTikgKHdpZHRoICogc291cmNlLT5oZWFkZXIubmNvbG9ycyksCi0gICAgIChKRElNRU5TSU9OKSBoZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLwotICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsKLSAgfQotI2VuZGlmCi0KLSAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci19Ci0KLQotLyoKLSAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCi0gKiBDYWxsZWQgb25seSBhZnRlciBsb2FkX2ltYWdlIGhhcyByZWFkIHRoZSBpbWFnZSBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5LgotICogVXNlZCBmb3IgR1JBWVNDQUxFLCBNQVBQRURHUkFZLCBUUlVFQ09MT1IsIGFuZCBESVJFQ1RDT0xPUiBpbWFnZXMuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfcmxlX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87Ci0KLSAgc291cmNlLT5yb3ctLTsKLSAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCBzb3VyY2UtPnJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCi0gKiBDYWxsZWQgb25seSBhZnRlciBsb2FkX2ltYWdlIGhhcyByZWFkIHRoZSBpbWFnZSBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5LgotICogVXNlZCBmb3IgUFNFVURPQ09MT1IgaW1hZ2VzLgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X3BzZXVkb2NvbG9yX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi17Ci0gIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87Ci0gIEpTQU1QUk9XIHNyY19yb3csIGRlc3Rfcm93OwotICBKRElNRU5TSU9OIGNvbDsKLSAgcmxlX21hcCAqY29sb3JtYXA7Ci0gIGludCB2YWw7Ci0KLSAgY29sb3JtYXAgPSBzb3VyY2UtPmhlYWRlci5jbWFwOwotICBkZXN0X3JvdyA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgc291cmNlLT5yb3ctLTsKLSAgc3JjX3JvdyA9ICogKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCBzb3VyY2UtPnJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKLQotICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICB2YWwgPSBHRVRKU0FNUExFKCpzcmNfcm93KyspOwotICAgICpkZXN0X3JvdysrID0gKEpTQU1QTEUpIChjb2xvcm1hcFt2YWwgICAgICBdID4+IDgpOwotICAgICpkZXN0X3JvdysrID0gKEpTQU1QTEUpIChjb2xvcm1hcFt2YWwgKyAyNTZdID4+IDgpOwotICAgICpkZXN0X3JvdysrID0gKEpTQU1QTEUpIChjb2xvcm1hcFt2YWwgKyA1MTJdID4+IDgpOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIExvYWQgdGhlIGltYWdlIGludG8gYSB2aXJ0dWFsIGFycmF5LiAgV2UgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2UgUkxFCi0gKiBmaWxlcyBzdGFydCBhdCB0aGUgbG93ZXIgbGVmdCB3aGlsZSB0aGUgSlBFRyBzdGFuZGFyZCBoYXMgdGhlbSBzdGFydGluZwotICogaW4gdGhlIHVwcGVyIGxlZnQuICBUaGlzIGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZSB3ZSB3YW50IHRvIGdldCBhIHJvdwotICogb2YgaW5wdXQuICBXaGF0IHdlIGRvIGlzIGxvYWQgdGhlIFJMRSBkYXRhIGludG8gdGhlIGFycmF5IGFuZCB0aGVuIGNhbGwKLSAqIHRoZSBhcHByb3ByaWF0ZSByb3V0aW5lIHRvIHJlYWQgb25lIHJvdyBmcm9tIHRoZSBhcnJheS4gIEJlZm9yZSByZXR1cm5pbmcsCi0gKiB3ZSBzZXQgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3Mgc28gdGhhdCBzdWJzZXF1ZW50IGNhbGxzIGdvIHN0cmFpZ2h0IHRvCi0gKiB0aGUgYXBwcm9wcmlhdGUgcm93LXJlYWRpbmcgcm91dGluZS4KLSAqLwotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWxvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICBybGVfc291cmNlX3B0ciBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpIHNpbmZvOwotICBKRElNRU5TSU9OIHJvdywgY29sOwotICBKU0FNUFJPVyAgc2NhbmxpbmUsIHJlZF9wdHIsIGdyZWVuX3B0ciwgYmx1ZV9wdHI7Ci0gIHJsZV9waXhlbCAqKnJsZV9yb3c7Ci0gIHJsZV9tYXAgKmNvbG9ybWFwOwotICBjaGFyIGNoYW5uZWw7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSNlbmRpZgotCi0gIGNvbG9ybWFwID0gc291cmNlLT5oZWFkZXIuY21hcDsKLSAgcmxlX3JvdyA9IHNvdXJjZS0+cmxlX3JvdzsKLQotICAvKiBSZWFkIHRoZSBSTEUgZGF0YSBpbnRvIG91ciB2aXJ0dWFsIGFycmF5LgotICAgKiBXZSBhc3N1bWUgaGVyZSB0aGF0IChhKSBybGVfcGl4ZWwgaXMgcmVwcmVzZW50ZWQgdGhlIHNhbWUgYXMgSlNBTVBMRSwKLSAgICogYW5kIChiKSB3ZSBhcmUgbm90IG9uIGEgbWFjaGluZSB3aGVyZSBGQVIgcG9pbnRlcnMgZGlmZmVyIGZyb20gcmVndWxhci4KLSAgICovCi0gIFJMRV9DTFJfQklUKHNvdXJjZS0+aGVhZGVyLCBSTEVfQUxQSEEpOyAvKiBkb24ndCByZWFkIHRoZSBhbHBoYSBjaGFubmVsICovCi0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gMDsKLSAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgfQotI2VuZGlmCi0KLSAgc3dpdGNoIChzb3VyY2UtPnZpc3VhbCkgewotCi0gIGNhc2UgR1JBWVNDQUxFOgotICBjYXNlIFBTRVVET0NPTE9SOgotICAgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKLSAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT5pbWFnZSwgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7Ci0gICAgICBybGVfZ2V0cm93KCZzb3VyY2UtPmhlYWRlciwgcmxlX3Jvdyk7Ci0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIE1BUFBFREdSQVk6Ci0gIGNhc2UgVFJVRUNPTE9SOgotICAgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKLSAgICAgIHNjYW5saW5lID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgICAgIHJsZV9yb3cgPSBzb3VyY2UtPnJsZV9yb3c7Ci0gICAgICBybGVfZ2V0cm93KCZzb3VyY2UtPmhlYWRlciwgcmxlX3Jvdyk7Ci0KLSAgICAgIGZvciAoY29sID0gMDsgY29sIDwgY2luZm8tPmltYWdlX3dpZHRoOyBjb2wrKykgewotICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgc291cmNlLT5oZWFkZXIubmNvbG9yczsgY2hhbm5lbCsrKSB7Ci0gICAgICAgICAgKnNjYW5saW5lKysgPSAoSlNBTVBMRSkKLSAgICAgICAgICAgIChjb2xvcm1hcFtHRVRKU0FNUExFKHJsZV9yb3dbY2hhbm5lbF1bY29sXSkgKyAyNTYgKiBjaGFubmVsXSA+PiA4KTsKLSAgICAgICAgfQotICAgICAgfQotCi0jaWZkZWYgUFJPR1JFU1NfUkVQT1JUCi0gICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOwotICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIERJUkVDVENPTE9SOgotICAgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKLSAgICAgIHNjYW5saW5lID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKLQotICAgICAgcmVkX3B0ciAgID0gcmxlX3Jvd1swXTsKLSAgICAgIGdyZWVuX3B0ciA9IHJsZV9yb3dbMV07Ci0gICAgICBibHVlX3B0ciAgPSBybGVfcm93WzJdOwotCi0gICAgICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAgICAgKnNjYW5saW5lKysgPSAqcmVkX3B0cisrOwotICAgICAgICAqc2NhbmxpbmUrKyA9ICpncmVlbl9wdHIrKzsKLSAgICAgICAgKnNjYW5saW5lKysgPSAqYmx1ZV9wdHIrKzsKLSAgICAgIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKLSAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOwotI2VuZGlmCi0KLSAgLyogU2V0IHVwIHRvIGNhbGwgcHJvcGVyIHJvdy1leHRyYWN0aW9uIHJvdXRpbmUgaW4gZnV0dXJlICovCi0gIGlmIChzb3VyY2UtPnZpc3VhbCA9PSBQU0VVRE9DT0xPUikgewotICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9IHNvdXJjZS0+cmxlX3JvdzsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9wc2V1ZG9jb2xvcl9yb3c7Ci0gIH0gZWxzZSB7Ci0gICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcmxlX3JvdzsKLSAgfQotICBzb3VyY2UtPnJvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0KLSAgLyogQW5kIGZldGNoIHRoZSB0b3Btb3N0IChib3R0b21tb3N0KSByb3cgKi8KLSAgcmV0dXJuICgqc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MpIChjaW5mbywgc2luZm8pOyAgIAotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9pbnB1dF9ybGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFJMRSBmb3JtYXQgaW5wdXQuCi0gKi8KLQotR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCi1qaW5pdF9yZWFkX3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHJsZV9zb3VyY2VfcHRyIHNvdXJjZTsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KLSAgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YocmxlX3NvdXJjZV9zdHJ1Y3QpKTsKLSAgLyogRmlsbCBpbiBtZXRob2QgcHRycyAqLwotICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X3JsZTsKLSAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X3JsZTsKLSAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBsb2FkX2ltYWdlOwotCi0gIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOwotfQotCi0jZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvcmRzd2l0Y2guYyBiL2xpYmpwZWd0d3JwL3Jkc3dpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGJiNGYuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvcmRzd2l0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKgotICogcmRzd2l0Y2guYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHByb2Nlc3Mgc29tZSBvZiBjanBlZydzIG1vcmUgY29tcGxpY2F0ZWQKLSAqIGNvbW1hbmQtbGluZSBzd2l0Y2hlcy4gIFN3aXRjaGVzIHByb2Nlc3NlZCBoZXJlIGFyZToKLSAqCS1xdGFibGVzIGZpbGUJCVJlYWQgcXVhbnRpemF0aW9uIHRhYmxlcyBmcm9tIHRleHQgZmlsZQotICoJLXNjYW5zIGZpbGUJCVJlYWQgc2NhbiBzY3JpcHQgZnJvbSB0ZXh0IGZpbGUKLSAqCS1xc2xvdHMgTlssTiwuLi5dCVNldCBjb21wb25lbnQgcXVhbnRpemF0aW9uIHRhYmxlIHNlbGVjdG9ycwotICoJLXNhbXBsZSBIeFZbLEh4ViwuLi5dCVNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9ycwotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXNkaWdpdCgpLCBpc3NwYWNlKCkgKi8KLQotCi1MT0NBTChpbnQpCi10ZXh0X2dldGMgKEZJTEUgKiBmaWxlKQotLyogUmVhZCBuZXh0IGNoYXIsIHNraXBwaW5nIG92ZXIgYW55IGNvbW1lbnRzICgjIHRvIGVuZCBvZiBsaW5lKSAqLwotLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCi17Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgCi0gIGNoID0gZ2V0YyhmaWxlKTsKLSAgaWYgKGNoID09ICcjJykgewotICAgIGRvIHsKLSAgICAgIGNoID0gZ2V0YyhmaWxlKTsKLSAgICB9IHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7Ci0gIH0KLSAgcmV0dXJuIGNoOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1yZWFkX3RleHRfaW50ZWdlciAoRklMRSAqIGZpbGUsIGxvbmcgKiByZXN1bHQsIGludCAqIHRlcm1jaGFyKQotLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSBhIGZpbGUsIHN0b3JlIGl0IGluIHJlc3VsdCAqLwotLyogUmVhZHMgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlcjsgcmV0dXJucyBpdCBpbiB0ZXJtY2hhciAqLwotewotICByZWdpc3RlciBpbnQgY2g7Ci0gIHJlZ2lzdGVyIGxvbmcgdmFsOwotICAKLSAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLCBkZXRlY3QgRU9GICovCi0gIGRvIHsKLSAgICBjaCA9IHRleHRfZ2V0YyhmaWxlKTsKLSAgICBpZiAoY2ggPT0gRU9GKSB7Ci0gICAgICAqdGVybWNoYXIgPSBjaDsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gIH0gd2hpbGUgKGlzc3BhY2UoY2gpKTsKLSAgCi0gIGlmICghIGlzZGlnaXQoY2gpKSB7Ci0gICAgKnRlcm1jaGFyID0gY2g7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgdmFsID0gY2ggLSAnMCc7Ci0gIHdoaWxlICgoY2ggPSB0ZXh0X2dldGMoZmlsZSkpICE9IEVPRikgewotICAgIGlmICghIGlzZGlnaXQoY2gpKQotICAgICAgYnJlYWs7Ci0gICAgdmFsICo9IDEwOwotICAgIHZhbCArPSBjaCAtICcwJzsKLSAgfQotICAqcmVzdWx0ID0gdmFsOwotICAqdGVybWNoYXIgPSBjaDsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotR0xPQkFMKGJvb2xlYW4pCi1yZWFkX3F1YW50X3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKLQkJICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKLS8qIFJlYWQgYSBzZXQgb2YgcXVhbnRpemF0aW9uIHRhYmxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAqIFRoZSBmaWxlIGlzIHBsYWluIEFTQ0lJIHRleHQ6IGRlY2ltYWwgbnVtYmVycyB3aXRoIHdoaXRlc3BhY2UgYmV0d2Vlbi4KLSAqIENvbW1lbnRzIHByZWNlZGVkIGJ5ICcjJyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGUuCi0gKiBUaGVyZSBtYXkgYmUgb25lIHRvIE5VTV9RVUFOVF9UQkxTIHRhYmxlcyBpbiB0aGUgZmlsZSwgZWFjaCBvZiA2NCB2YWx1ZXMuCi0gKiBUaGUgdGFibGVzIGFyZSBpbXBsaWNpdGx5IG51bWJlcmVkIDAsMSxldGMuCi0gKiBOT1RFOiBkb2VzIG5vdCBhZmZlY3QgdGhlIHFzbG90cyBtYXBwaW5nLCB3aGljaCB3aWxsIGRlZmF1bHQgdG8gc2VsZWN0aW5nCi0gKiB0YWJsZSAwIGZvciBsdW1pbmFuY2UgKG9yIHByaW1hcnkpIGNvbXBvbmVudHMsIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCi0gKiBZb3UgbXVzdCB1c2UgLXFzbG90cyBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBjb21wb25lbnQtPnRhYmxlIG1hcHBpbmcuCi0gKi8KLXsKLSAgRklMRSAqIGZwOwotICBpbnQgdGJsbm8sIGksIHRlcm1jaGFyOwotICBsb25nIHZhbDsKLSAgdW5zaWduZWQgaW50IHRhYmxlW0RDVFNJWkUyXTsKLQotICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gdGFibGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotICB0YmxubyA9IDA7Ci0KLSAgd2hpbGUgKHJlYWRfdGV4dF9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKSB7IC8qIHJlYWQgMXN0IGVsZW1lbnQgb2YgdGFibGUgKi8KLSAgICBpZiAodGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgdGFibGVzIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHRhYmxlWzBdID0gKHVuc2lnbmVkIGludCkgdmFsOwotICAgIGZvciAoaSA9IDE7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0gICAgICBpZiAoISByZWFkX3RleHRfaW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkgewotCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0YWJsZSBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLQlmY2xvc2UoZnApOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICAgIHRhYmxlW2ldID0gKHVuc2lnbmVkIGludCkgdmFsOwotICAgIH0KLSAgICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgdGJsbm8sIHRhYmxlLCBzY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKTsKLSAgICB0YmxubysrOwotICB9Ci0KLSAgaWYgKHRlcm1jaGFyICE9IEVPRikgewotICAgIGZwcmludGYoc3RkZXJyLCAiTm9uLW51bWVyaWMgZGF0YSBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBmY2xvc2UoZnApOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLUxPQ0FMKGJvb2xlYW4pCi1yZWFkX3NjYW5faW50ZWdlciAoRklMRSAqIGZpbGUsIGxvbmcgKiByZXN1bHQsIGludCAqIHRlcm1jaGFyKQotLyogVmFyaWFudCBvZiByZWFkX3RleHRfaW50ZWdlciB0aGF0IGFsd2F5cyBsb29rcyBmb3IgYSBub24tc3BhY2UgdGVybWNoYXI7Ci0gKiB0aGlzIHNpbXBsaWZpZXMgcGFyc2luZyBvZiBwdW5jdHVhdGlvbiBpbiBzY2FuIHNjcmlwdHMuCi0gKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGNoOwotCi0gIGlmICghIHJlYWRfdGV4dF9pbnRlZ2VyKGZpbGUsIHJlc3VsdCwgdGVybWNoYXIpKQotICAgIHJldHVybiBGQUxTRTsKLSAgY2ggPSAqdGVybWNoYXI7Ci0gIHdoaWxlIChjaCAhPSBFT0YgJiYgaXNzcGFjZShjaCkpCi0gICAgY2ggPSB0ZXh0X2dldGMoZmlsZSk7Ci0gIGlmIChpc2RpZ2l0KGNoKSkgewkJLyogb29wcywgcHV0IGl0IGJhY2sgKi8KLSAgICBpZiAodW5nZXRjKGNoLCBmaWxlKSA9PSBFT0YpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgY2ggPSAnICc7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQW55IHNlcGFyYXRvcnMgb3RoZXIgdGhhbiAnOycgYW5kICc6JyBhcmUgaWdub3JlZDsKLSAgICAgKiB0aGlzIGFsbG93cyB1c2VyIHRvIGluc2VydCBjb21tYXMsIGV0YywgaWYgZGVzaXJlZC4KLSAgICAgKi8KLSAgICBpZiAoY2ggIT0gRU9GICYmIGNoICE9ICc7JyAmJiBjaCAhPSAnOicpCi0gICAgICBjaCA9ICcgJzsKLSAgfQotICAqdGVybWNoYXIgPSBjaDsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotR0xPQkFMKGJvb2xlYW4pCi1yZWFkX3NjYW5fc2NyaXB0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKQotLyogUmVhZCBhIHNjYW4gc2NyaXB0IGZyb20gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi0gKiBFYWNoIGVudHJ5IGluIHRoZSBmaWxlIGRlZmluZXMgb25lIHNjYW4gdG8gYmUgZW1pdHRlZC4KLSAqIEVudHJpZXMgYXJlIHNlcGFyYXRlZCBieSBzZW1pY29sb25zICc7Jy4KLSAqIEFuIGVudHJ5IGNvbnRhaW5zIG9uZSB0byBmb3VyIGNvbXBvbmVudCBpbmRleGVzLAotICogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGNvbG9uICc6JyBhbmQgZm91ciBwcm9ncmVzc2l2ZS1KUEVHIHBhcmFtZXRlcnMuCi0gKiBUaGUgY29tcG9uZW50IGluZGV4ZXMgZGVub3RlIHdoaWNoIGNvbXBvbmVudChzKSBhcmUgdG8gYmUgdHJhbnNtaXR0ZWQKLSAqIGluIHRoZSBjdXJyZW50IHNjYW4uICBUaGUgZmlyc3QgY29tcG9uZW50IGhhcyBpbmRleCAwLgotICogU2VxdWVudGlhbCBKUEVHIGlzIHVzZWQgaWYgdGhlIHByb2dyZXNzaXZlLUpQRUcgcGFyYW1ldGVycyBhcmUgb21pdHRlZC4KLSAqIFRoZSBmaWxlIGlzIGZyZWUgZm9ybWF0IHRleHQ6IGFueSB3aGl0ZXNwYWNlIG1heSBhcHBlYXIgYmV0d2VlbiBudW1iZXJzCi0gKiBhbmQgdGhlICc6JyBhbmQgJzsnIHB1bmN0dWF0aW9uIG1hcmtzLiAgQWxzbywgb3RoZXIgcHVuY3R1YXRpb24gKHN1Y2gKLSAqIGFzIGNvbW1hcyBvciBkYXNoZXMpIGNhbiBiZSBwbGFjZWQgYmV0d2VlbiBudW1iZXJzIGlmIGRlc2lyZWQuCi0gKiBDb21tZW50cyBwcmVjZWRlZCBieSAnIycgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBmaWxlLgotICogTm90ZTogd2UgZG8gdmVyeSBsaXR0bGUgdmFsaWRpdHkgY2hlY2tpbmcgaGVyZTsKLSAqIGpjbWFzdGVyLmMgd2lsbCB2YWxpZGF0ZSB0aGUgc2NyaXB0IHBhcmFtZXRlcnMuCi0gKi8KLXsKLSAgRklMRSAqIGZwOwotICBpbnQgc2Nhbm5vLCBuY29tcHMsIHRlcm1jaGFyOwotICBsb25nIHZhbDsKLSAganBlZ19zY2FuX2luZm8gKiBzY2FucHRyOwotI2RlZmluZSBNQVhfU0NBTlMgIDEwMAkJLyogcXVpdGUgYXJiaXRyYXJ5IGxpbWl0ICovCi0gIGpwZWdfc2Nhbl9pbmZvIHNjYW5zW01BWF9TQ0FOU107Ci0KLSAgaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIHNjYW4gZGVmaW5pdGlvbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIHNjYW5wdHIgPSBzY2FuczsKLSAgc2Nhbm5vID0gMDsKLQotICB3aGlsZSAocmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpIHsKLSAgICBpZiAoc2Nhbm5vID49IE1BWF9TQ0FOUykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBzY2FucyBkZWZpbmVkIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IChpbnQpIHZhbDsKLSAgICBuY29tcHMgPSAxOwotICAgIHdoaWxlICh0ZXJtY2hhciA9PSAnICcpIHsKLSAgICAgIGlmIChuY29tcHMgPj0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGNvbXBvbmVudHMgaW4gb25lIHNjYW4gaW4gZmlsZSAlc1xuIiwKLQkJZmlsZW5hbWUpOwotCWZjbG9zZShmcCk7Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpCi0JZ290byBib2d1czsKLSAgICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtuY29tcHNdID0gKGludCkgdmFsOwotICAgICAgbmNvbXBzKys7Ci0gICAgfQotICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7Ci0gICAgaWYgKHRlcm1jaGFyID09ICc6JykgewotICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikgfHwgdGVybWNoYXIgIT0gJyAnKQotCWdvdG8gYm9ndXM7Ci0gICAgICBzY2FucHRyLT5TcyA9IChpbnQpIHZhbDsKLSAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpIHx8IHRlcm1jaGFyICE9ICcgJykKLQlnb3RvIGJvZ3VzOwotICAgICAgc2NhbnB0ci0+U2UgPSAoaW50KSB2YWw7Ci0gICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSB8fCB0ZXJtY2hhciAhPSAnICcpCi0JZ290byBib2d1czsKLSAgICAgIHNjYW5wdHItPkFoID0gKGludCkgdmFsOwotICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpCi0JZ290byBib2d1czsKLSAgICAgIHNjYW5wdHItPkFsID0gKGludCkgdmFsOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBzZXQgbm9uLXByb2dyZXNzaXZlIHBhcmFtZXRlcnMgKi8KLSAgICAgIHNjYW5wdHItPlNzID0gMDsKLSAgICAgIHNjYW5wdHItPlNlID0gRENUU0laRTItMTsKLSAgICAgIHNjYW5wdHItPkFoID0gMDsKLSAgICAgIHNjYW5wdHItPkFsID0gMDsKLSAgICB9Ci0gICAgaWYgKHRlcm1jaGFyICE9ICc7JyAmJiB0ZXJtY2hhciAhPSBFT0YpIHsKLWJvZ3VzOgotICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNjYW4gZW50cnkgZm9ybWF0IGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHNjYW5wdHIrKywgc2Nhbm5vKys7Ci0gIH0KLQotICBpZiAodGVybWNoYXIgIT0gRU9GKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJOb24tbnVtZXJpYyBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGlmIChzY2Fubm8gPiAwKSB7Ci0gICAgLyogU3Rhc2ggY29tcGxldGVkIHNjYW4gbGlzdCBpbiBjaW5mbyBzdHJ1Y3R1cmUuCi0gICAgICogTk9URTogZm9yIGNqcGVnJ3MgdXNlLCBKUE9PTF9JTUFHRSBpcyB0aGUgcmlnaHQgbGlmZXRpbWUgZm9yIHRoaXMgZGF0YSwKLSAgICAgKiBidXQgaWYgeW91IHdhbnQgdG8gY29tcHJlc3MgbXVsdGlwbGUgaW1hZ2VzIHlvdSdkIHdhbnQgSlBPT0xfUEVSTUFORU5ULgotICAgICAqLwotICAgIHNjYW5wdHIgPSAoanBlZ19zY2FuX2luZm8gKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBzY2Fubm8gKiBTSVpFT0YoanBlZ19zY2FuX2luZm8pKTsKLSAgICBNRU1DT1BZKHNjYW5wdHIsIHNjYW5zLCBzY2Fubm8gKiBTSVpFT0YoanBlZ19zY2FuX2luZm8pKTsKLSAgICBjaW5mby0+c2Nhbl9pbmZvID0gc2NhbnB0cjsKLSAgICBjaW5mby0+bnVtX3NjYW5zID0gc2Nhbm5vOwotICB9Ci0KLSAgZmNsb3NlKGZwKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbmRpZiAvKiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KLQotCi1HTE9CQUwoYm9vbGVhbikKLXNldF9xdWFudF9zbG90cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykKLS8qIFByb2Nlc3MgYSBxdWFudGl6YXRpb24tdGFibGUtc2VsZWN0b3JzIHBhcmFtZXRlciBzdHJpbmcsIG9mIHRoZSBmb3JtCi0gKiAgICAgTlssTiwuLi5dCi0gKiBJZiB0aGVyZSBhcmUgbW9yZSBjb21wb25lbnRzIHRoYW4gcGFyYW1ldGVycywgdGhlIGxhc3QgdmFsdWUgaXMgcmVwbGljYXRlZC4KLSAqLwotewotICBpbnQgdmFsID0gMDsJCQkvKiBkZWZhdWx0IHRhYmxlICMgKi8KLSAgaW50IGNpOwotICBjaGFyIGNoOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IE1BWF9DT01QT05FTlRTOyBjaSsrKSB7Ci0gICAgaWYgKCphcmcpIHsKLSAgICAgIGNoID0gJywnOwkJCS8qIGlmIG5vdCBzZXQgYnkgc3NjYW5mLCB3aWxsIGJlICcsJyAqLwotICAgICAgaWYgKHNzY2FuZihhcmcsICIlZCVjIiwgJnZhbCwgJmNoKSA8IDEpCi0JcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKGNoICE9ICcsJykJCS8qIHN5bnRheCBjaGVjayAqLwotCXJldHVybiBGQUxTRTsKLSAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+PSBOVU1fUVVBTlRfVEJMUykgewotCWZwcmludGYoc3RkZXJyLCAiSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4lZFxuIiwKLQkJTlVNX1FVQU5UX1RCTFMtMSk7Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0ucXVhbnRfdGJsX25vID0gdmFsOwotICAgICAgd2hpbGUgKCphcmcgJiYgKmFyZysrICE9ICcsJykgLyogYWR2YW5jZSB0byBuZXh0IHNlZ21lbnQgb2YgYXJnIHN0cmluZyAqLwotCTsKLSAgICB9IGVsc2UgewotICAgICAgLyogcmVhY2hlZCBlbmQgb2YgcGFyYW1ldGVyLCBzZXQgcmVtYWluaW5nIGNvbXBvbmVudHMgdG8gbGFzdCB0YWJsZSAqLwotICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0ucXVhbnRfdGJsX25vID0gdmFsOwotICAgIH0KLSAgfQotICByZXR1cm4gVFJVRTsKLX0KLQotCi1HTE9CQUwoYm9vbGVhbikKLXNldF9zYW1wbGVfZmFjdG9ycyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykKLS8qIFByb2Nlc3MgYSBzYW1wbGUtZmFjdG9ycyBwYXJhbWV0ZXIgc3RyaW5nLCBvZiB0aGUgZm9ybQotICogICAgIEh4VlssSHhWLC4uLl0KLSAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbXBvbmVudHMgdGhhbiBwYXJhbWV0ZXJzLCAiMXgxIiBpcyBhc3N1bWVkIGZvciB0aGUgcmVzdC4KLSAqLwotewotICBpbnQgY2ksIHZhbDEsIHZhbDI7Ci0gIGNoYXIgY2gxLCBjaDI7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgTUFYX0NPTVBPTkVOVFM7IGNpKyspIHsKLSAgICBpZiAoKmFyZykgewotICAgICAgY2gyID0gJywnOwkJLyogaWYgbm90IHNldCBieSBzc2NhbmYsIHdpbGwgYmUgJywnICovCi0gICAgICBpZiAoc3NjYW5mKGFyZywgIiVkJWMlZCVjIiwgJnZhbDEsICZjaDEsICZ2YWwyLCAmY2gyKSA8IDMpCi0JcmV0dXJuIEZBTFNFOwotICAgICAgaWYgKChjaDEgIT0gJ3gnICYmIGNoMSAhPSAnWCcpIHx8IGNoMiAhPSAnLCcpIC8qIHN5bnRheCBjaGVjayAqLwotCXJldHVybiBGQUxTRTsKLSAgICAgIGlmICh2YWwxIDw9IDAgfHwgdmFsMSA+IDQgfHwgdmFsMiA8PSAwIHx8IHZhbDIgPiA0KSB7Ci0JZnByaW50ZihzdGRlcnIsICJKUEVHIHNhbXBsaW5nIGZhY3RvcnMgbXVzdCBiZSAxLi40XG4iKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yID0gdmFsMTsKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3IgPSB2YWwyOwotICAgICAgd2hpbGUgKCphcmcgJiYgKmFyZysrICE9ICcsJykgLyogYWR2YW5jZSB0byBuZXh0IHNlZ21lbnQgb2YgYXJnIHN0cmluZyAqLwotCTsKLSAgICB9IGVsc2UgewotICAgICAgLyogcmVhY2hlZCBlbmQgb2YgcGFyYW1ldGVyLCBzZXQgcmVtYWluaW5nIGNvbXBvbmVudHMgdG8gMXgxIHNhbXBsaW5nICovCi0gICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yID0gMTsKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3IgPSAxOwotICAgIH0KLSAgfQotICByZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3JkdGFyZ2EuYyBiL2xpYmpwZWd0d3JwL3JkdGFyZ2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyY2QyNi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9yZHRhcmdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyoKLSAqIHJkdGFyZ2EuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFRhcmdhIGZvcm1hdC4KLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgotICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCi0gKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCi0gKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKLSAqIHRoZSBmaWxlIGlzIGluZGVlZCBUYXJnYSBmb3JtYXQpLgotICoKLSAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTGVlIERhbmllbCBDcm9ja2VyLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLQotCi0vKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHVuc2lnbmVkIGNoYXJzIGFzIGVmZmljaWVudGx5IGFzIGNvbXBpbGVyIGFsbG93cyAqLwotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVV9DSEFSOwotI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKLSNlbHNlIC8qICFIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLSNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECi10eXBlZGVmIGNoYXIgVV9DSEFSOwotI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKLSNlbHNlCi10eXBlZGVmIGNoYXIgVV9DSEFSOwotI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSAmIDB4RkYpCi0jZW5kaWYKLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotCi0jZGVmaW5lCVJlYWRPSyhmaWxlLGJ1ZmZlcixsZW4pCShKRlJFQUQoZmlsZSxidWZmZXIsbGVuKSA9PSAoKHNpemVfdCkgKGxlbikpKQotCi0KLS8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIHNvdXJjZSBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3RnYV9zb3VyY2Vfc3RydWN0ICogdGdhX3NvdXJjZV9wdHI7Ci0KLXR5cGVkZWYgc3RydWN0IF90Z2Ffc291cmNlX3N0cnVjdCB7Ci0gIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogYmFjayBsaW5rIHNhdmVzIHBhc3Npbmcgc2VwYXJhdGUgcGFybSAqLwotCi0gIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBUYXJnYSBjb2xvcm1hcCAoY29udmVydGVkIHRvIG15IGZvcm1hdCkgKi8KLQotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiBOZWVkZWQgaWYgZnVubnkgaW5wdXQgcm93IG9yZGVyICovCi0gIEpESU1FTlNJT04gY3VycmVudF9yb3c7CS8qIEN1cnJlbnQgbG9naWNhbCByb3cgbnVtYmVyIHRvIHJlYWQgKi8KLQotICAvKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZXh0cmFjdCBuZXh0IFRhcmdhIHBpeGVsIGZyb20gaW5wdXQgZmlsZSAqLwotICBKTUVUSE9EKHZvaWQsIHJlYWRfcGl4ZWwsICh0Z2Ffc291cmNlX3B0ciBzaW5mbykpOwotCi0gIC8qIFJlc3VsdCBvZiByZWFkX3BpeGVsIGlzIGRlbGl2ZXJlZCBoZXJlOiAqLwotICBVX0NIQVIgdGdhX3BpeGVsWzRdOwotCi0gIGludCBwaXhlbF9zaXplOwkJLyogQnl0ZXMgcGVyIFRhcmdhIHBpeGVsICgxIHRvIDQpICovCi0KLSAgLyogU3RhdGUgaW5mbyBmb3IgcmVhZGluZyBSTEUtY29kZWQgcGl4ZWxzOyBib3RoIGNvdW50cyBtdXN0IGJlIGluaXQgdG8gMCAqLwotICBpbnQgYmxvY2tfY291bnQ7CQkvKiAjIG9mIHBpeGVscyByZW1haW5pbmcgaW4gUkxFIGJsb2NrICovCi0gIGludCBkdXBfcGl4ZWxfY291bnQ7CQkvKiAjIG9mIHRpbWVzIHRvIGR1cGxpY2F0ZSBwcmV2aW91cyBwaXhlbCAqLwotCi0gIC8qIFRoaXMgc2F2ZXMgdGhlIGNvcnJlY3QgcGl4ZWwtcm93LWV4cGFuc2lvbiBtZXRob2QgZm9yIHByZWxvYWRfaW1hZ2UgKi8KLSAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Ci19IHRnYV9zb3VyY2Vfc3RydWN0OwotCi0KLS8qIEZvciBleHBhbmRpbmcgNS1iaXQgcGl4ZWwgdmFsdWVzIHRvIDgtYml0IHdpdGggYmVzdCByb3VuZGluZyAqLwotCi1zdGF0aWMgY29uc3QgVUlOVDggYzV0bzhiaXRzWzMyXSA9IHsKLSAgICAwLCAgIDgsICAxNiwgIDI1LCAgMzMsICA0MSwgIDQ5LCAgNTgsCi0gICA2NiwgIDc0LCAgODIsICA5MCwgIDk5LCAxMDcsIDExNSwgMTIzLAotICAxMzIsIDE0MCwgMTQ4LCAxNTYsIDE2NSwgMTczLCAxODEsIDE4OSwKLSAgMTk3LCAyMDYsIDIxNCwgMjIyLCAyMzAsIDIzOSwgMjQ3LCAyNTUKLX07Ci0KLQotCi1MT0NBTChpbnQpCi1yZWFkX2J5dGUgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKQotLyogUmVhZCBuZXh0IGJ5dGUgZnJvbSBUYXJnYSBmaWxlICovCi17Ci0gIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0KLSAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCi0gICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXJlYWRfY29sb3JtYXAgKHRnYV9zb3VyY2VfcHRyIHNpbmZvLCBpbnQgY21hcGxlbiwgaW50IG1hcGVudHJ5c2l6ZSkKLS8qIFJlYWQgdGhlIGNvbG9ybWFwIGZyb20gYSBUYXJnYSBmaWxlICovCi17Ci0gIGludCBpOwotCi0gIC8qIFByZXNlbnRseSBvbmx5IGhhbmRsZXMgMjQtYml0IEJHUiBmb3JtYXQgKi8KLSAgaWYgKG1hcGVudHJ5c2l6ZSAhPSAyNCkKLSAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9UR0FfQkFEQ01BUCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNtYXBsZW47IGkrKykgewotICAgIHNpbmZvLT5jb2xvcm1hcFsyXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgIHNpbmZvLT5jb2xvcm1hcFsxXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICAgIHNpbmZvLT5jb2xvcm1hcFswXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOwotICB9Ci19Ci0KLQotLyoKLSAqIHJlYWRfcGl4ZWwgbWV0aG9kczogZ2V0IGEgc2luZ2xlIHBpeGVsIGZyb20gVGFyZ2EgZmlsZSBpbnRvIHRnYV9waXhlbFtdCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFkX25vbl9ybGVfcGl4ZWwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKQotLyogUmVhZCBvbmUgVGFyZ2EgcGl4ZWwgZnJvbSB0aGUgaW5wdXQgZmlsZTsgbm8gUkxFIGV4cGFuc2lvbiAqLwotewotICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaW5mby0+cGl4ZWxfc2l6ZTsgaSsrKSB7Ci0gICAgc2luZm8tPnRnYV9waXhlbFtpXSA9IChVX0NIQVIpIGdldGMoaW5maWxlKTsKLSAgfQotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhZF9ybGVfcGl4ZWwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKQotLyogUmVhZCBvbmUgVGFyZ2EgcGl4ZWwgZnJvbSB0aGUgaW5wdXQgZmlsZSwgZXhwYW5kaW5nIFJMRSBkYXRhIGFzIG5lZWRlZCAqLwotewotICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIC8qIER1cGxpY2F0ZSBwcmV2aW91c2x5IHJlYWQgcGl4ZWw/ICovCi0gIGlmIChzaW5mby0+ZHVwX3BpeGVsX2NvdW50ID4gMCkgewotICAgIHNpbmZvLT5kdXBfcGl4ZWxfY291bnQtLTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUaW1lIHRvIHJlYWQgUkxFIGJsb2NrIGhlYWRlcj8gKi8KLSAgaWYgKC0tc2luZm8tPmJsb2NrX2NvdW50IDwgMCkgeyAvKiBkZWNyZW1lbnQgcGl4ZWxzIHJlbWFpbmluZyBpbiBibG9jayAqLwotICAgIGkgPSByZWFkX2J5dGUoc2luZm8pOwotICAgIGlmIChpICYgMHg4MCkgewkJLyogU3RhcnQgb2YgZHVwbGljYXRlLXBpeGVsIGJsb2NrPyAqLwotICAgICAgc2luZm8tPmR1cF9waXhlbF9jb3VudCA9IGkgJiAweDdGOyAvKiBudW1iZXIgb2YgZHVwcyBhZnRlciB0aGlzIG9uZSAqLwotICAgICAgc2luZm8tPmJsb2NrX2NvdW50ID0gMDsJLyogdGhlbiByZWFkIG5ldyBibG9jayBoZWFkZXIgKi8KLSAgICB9IGVsc2UgewotICAgICAgc2luZm8tPmJsb2NrX2NvdW50ID0gaSAmIDB4N0Y7IC8qIG51bWJlciBvZiBwaXhlbHMgYWZ0ZXIgdGhpcyBvbmUgKi8KLSAgICB9Ci0gIH0KLQotICAvKiBSZWFkIG5leHQgcGl4ZWwgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpbmZvLT5waXhlbF9zaXplOyBpKyspIHsKLSAgICBzaW5mby0+dGdhX3BpeGVsW2ldID0gKFVfQ0hBUikgZ2V0YyhpbmZpbGUpOwotICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCi0gKgotICogV2UgcHJvdmlkZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZSBmb3JtYXQuCi0gKi8KLQotCi1NRVRIT0RERUYoSkRJTUVOU0lPTikKLWdldF84Yml0X2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyA4LWJpdCBncmF5c2NhbGUgcGl4ZWxzICovCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIAotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCi0gICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0XzhiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyA4LWJpdCBjb2xvcm1hcCBpbmRleGVzICovCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIGludCB0OwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICByZWdpc3RlciBKU0FNUEFSUkFZIGNvbG9ybWFwID0gc291cmNlLT5jb2xvcm1hcDsKLQotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCi0gICAgdCA9IFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7Ci0gICAgKnB0cisrID0gY29sb3JtYXBbMF1bdF07Ci0gICAgKnB0cisrID0gY29sb3JtYXBbMV1bdF07Ci0gICAgKnB0cisrID0gY29sb3JtYXBbMl1bdF07Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0XzE2Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCi0vKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgMTYtYml0IHBpeGVscyAqLwotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOwotICByZWdpc3RlciBpbnQgdDsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgCi0gIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KLSAgICB0ID0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKLSAgICB0ICs9IFVDSChzb3VyY2UtPnRnYV9waXhlbFsxXSkgPDwgODsKLSAgICAvKiBXZSBleHBhbmQgNSBiaXQgZGF0YSB0byA4IGJpdCBzYW1wbGUgd2lkdGguCi0gICAgICogVGhlIGZvcm1hdCBvZiB0aGUgMTYtYml0IChMU0IgZmlyc3QpIGlucHV0IHdvcmQgaXMKLSAgICAgKiAgICAgeFJSUlJSR0dHR0dCQkJCQgotICAgICAqLwotICAgIHB0clsyXSA9IChKU0FNUExFKSBjNXRvOGJpdHNbdCAmIDB4MUZdOwotICAgIHQgPj49IDU7Ci0gICAgcHRyWzFdID0gKEpTQU1QTEUpIGM1dG84Yml0c1t0ICYgMHgxRl07Ci0gICAgdCA+Pj0gNTsKLSAgICBwdHJbMF0gPSAoSlNBTVBMRSkgYzV0bzhiaXRzW3QgJiAweDFGXTsKLSAgICBwdHIgKz0gMzsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1nZXRfMjRiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAyNC1iaXQgcGl4ZWxzICovCi17Ci0gIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIAotICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07Ci0gIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCi0gICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFsyXSk7IC8qIGNoYW5nZSBCR1IgdG8gUkdCIG9yZGVyICovCi0gICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFsxXSk7Ci0gICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBUYXJnYSBhbHNvIGRlZmluZXMgYSAzMi1iaXQgcGl4ZWwgZm9ybWF0IHdpdGggb3JkZXIgQixHLFIsQS4KLSAqIFdlIHByZXNlbnRseSBpZ25vcmUgdGhlIGF0dHJpYnV0ZSBieXRlLCBzbyB0aGUgY29kZSBmb3IgcmVhZGluZwotICogdGhlc2UgcGl4ZWxzIGlzIGlkZW50aWNhbCB0byB0aGUgMjQtYml0IHJvdXRpbmUgYWJvdmUuCi0gKiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGFjdHVhbCBwaXhlbCBsZW5ndGggaXMgb25seSBrbm93biB0byByZWFkX3BpeGVsLgotICovCi0KLSNkZWZpbmUgZ2V0XzMyYml0X3JvdyAgZ2V0XzI0Yml0X3JvdwotCi0KLS8qCi0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgcmUtcmVhZGluZyB0aGUgaW5wdXQgZGF0YSBpbiBzdGFuZGFyZCB0b3AtZG93bgotICogcm93IG9yZGVyLiAgVGhlIGVudGlyZSBpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW50byB3aG9sZV9pbWFnZQotICogd2l0aCBwcm9wZXIgY29udmVyc2lvbiBvZiBwaXhlbCBmb3JtYXQsIGJ1dCBpdCdzIGluIGEgZnVubnkgcm93IG9yZGVyLgotICovCi0KLU1FVEhPRERFRihKRElNRU5TSU9OKQotZ2V0X21lbW9yeV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOwotICBKRElNRU5TSU9OIHNvdXJjZV9yb3c7Ci0KLSAgLyogQ29tcHV0ZSByb3cgb2Ygc291cmNlIHRoYXQgbWFwcyB0byBjdXJyZW50X3JvdyBvZiBub3JtYWwgb3JkZXIgKi8KLSAgLyogRm9yIG5vdywgYXNzdW1lIGltYWdlIGlzIGJvdHRvbS11cCBhbmQgbm90IGludGVybGFjZWQuICovCi0gIC8qIE5FRURTIFdPUksgdG8gc3VwcG9ydCBpbnRlcmxhY2VkIGltYWdlcyEgKi8KLSAgc291cmNlX3JvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBzb3VyY2UtPmN1cnJlbnRfcm93IC0gMTsKLQotICAvKiBGZXRjaCB0aGF0IHJvdyBmcm9tIHZpcnR1YWwgYXJyYXkgKi8KLSAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAotICAgICBzb3VyY2Vfcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOwotCi0gIHNvdXJjZS0+Y3VycmVudF9yb3crKzsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIFRoaXMgbWV0aG9kIGxvYWRzIHRoZSBpbWFnZSBpbnRvIHdob2xlX2ltYWdlIGR1cmluZyB0aGUgZmlyc3QgY2FsbCBvbgotICogZ2V0X3BpeGVsX3Jvd3MuICBUaGUgZ2V0X3BpeGVsX3Jvd3MgcG9pbnRlciBpcyB0aGVuIGFkanVzdGVkIHRvIGNhbGwKLSAqIGdldF9tZW1vcnlfcm93IG9uIHN1YnNlcXVlbnQgY2FsbHMuCi0gKi8KLQotTUVUSE9EREVGKEpESU1FTlNJT04pCi1wcmVsb2FkX2ltYWdlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKLSAgSkRJTUVOU0lPTiByb3c7Ci0gIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLQotICAvKiBSZWFkIHRoZSBkYXRhIGludG8gYSB2aXJ0dWFsIGFycmF5IGluIGlucHV0LWZpbGUgcm93IG9yZGVyLiAqLwotICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7Ci0gICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIHJvdzsKLSAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgfQotICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgICAoKnNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MpIChjaW5mbywgc2luZm8pOwotICB9Ci0gIGlmIChwcm9ncmVzcyAhPSBOVUxMKQotICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7Ci0KLSAgLyogU2V0IHVwIHRvIHJlYWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheSBpbiB1bnNjcmFtYmxlZCBvcmRlciAqLwotICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9tZW1vcnlfcm93OwotICBzb3VyY2UtPmN1cnJlbnRfcm93ID0gMDsKLSAgLyogQW5kIHJlYWQgdGhlIGZpcnN0IHJvdyAqLwotICByZXR1cm4gZ2V0X21lbW9yeV9yb3coY2luZm8sIHNpbmZvKTsKLX0KLQotCi0vKgotICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF90Z2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQotewotICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOwotICBVX0NIQVIgdGFyZ2FoZWFkZXJbMThdOwotICBpbnQgaWRsZW4sIGNtYXB0eXBlLCBzdWJ0eXBlLCBmbGFncywgaW50ZXJsYWNlX3R5cGUsIGNvbXBvbmVudHM7Ci0gIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0LCBtYXBsZW47Ci0gIGJvb2xlYW4gaXNfYm90dG9tX3VwOwotCi0jZGVmaW5lIEdFVF8yQihvZmZzZXQpCSgodW5zaWduZWQgaW50KSBVQ0godGFyZ2FoZWFkZXJbb2Zmc2V0XSkgKyBcCi0JCQkgKCgodW5zaWduZWQgaW50KSBVQ0godGFyZ2FoZWFkZXJbb2Zmc2V0KzFdKSkgPDwgOCkpCi0KLSAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHRhcmdhaGVhZGVyLCAxOCkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOwotCi0gIC8qIFByZXRlbmQgIjE1LWJpdCIgcGl4ZWxzIGFyZSAxNi1iaXQgLS0tIHdlIGlnbm9yZSBhdHRyaWJ1dGUgYml0IGFueXdheSAqLwotICBpZiAodGFyZ2FoZWFkZXJbMTZdID09IDE1KQotICAgIHRhcmdhaGVhZGVyWzE2XSA9IDE2OwotCi0gIGlkbGVuID0gVUNIKHRhcmdhaGVhZGVyWzBdKTsKLSAgY21hcHR5cGUgPSBVQ0godGFyZ2FoZWFkZXJbMV0pOwotICBzdWJ0eXBlID0gVUNIKHRhcmdhaGVhZGVyWzJdKTsKLSAgbWFwbGVuID0gR0VUXzJCKDUpOwotICB3aWR0aCA9IEdFVF8yQigxMik7Ci0gIGhlaWdodCA9IEdFVF8yQigxNCk7Ci0gIHNvdXJjZS0+cGl4ZWxfc2l6ZSA9IFVDSCh0YXJnYWhlYWRlclsxNl0pID4+IDM7Ci0gIGZsYWdzID0gVUNIKHRhcmdhaGVhZGVyWzE3XSk7CS8qIEltYWdlIERlc2NyaXB0b3IgYnl0ZSAqLwotCi0gIGlzX2JvdHRvbV91cCA9ICgoZmxhZ3MgJiAweDIwKSA9PSAwKTsJLyogYml0IDUgc2V0ID0+IHRvcC1kb3duICovCi0gIGludGVybGFjZV90eXBlID0gZmxhZ3MgPj4gNjsJLyogYml0cyA2LzcgYXJlIGludGVybGFjZSBjb2RlICovCi0KLSAgaWYgKGNtYXB0eXBlID4gMSB8fAkJLyogY21hcHR5cGUgbXVzdCBiZSAwIG9yIDEgKi8KLSAgICAgIHNvdXJjZS0+cGl4ZWxfc2l6ZSA8IDEgfHwgc291cmNlLT5waXhlbF9zaXplID4gNCB8fAotICAgICAgKFVDSCh0YXJnYWhlYWRlclsxNl0pICYgNykgIT0gMCB8fCAvKiBiaXRzL3BpeGVsIG11c3QgYmUgbXVsdGlwbGUgb2YgOCAqLwotICAgICAgaW50ZXJsYWNlX3R5cGUgIT0gMCkJLyogY3VycmVudGx5IGRvbid0IGFsbG93IGludGVybGFjZWQgaW1hZ2UgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7Ci0gIAotICBpZiAoc3VidHlwZSA+IDgpIHsKLSAgICAvKiBJdCdzIGFuIFJMRS1jb2RlZCBmaWxlICovCi0gICAgc291cmNlLT5yZWFkX3BpeGVsID0gcmVhZF9ybGVfcGl4ZWw7Ci0gICAgc291cmNlLT5ibG9ja19jb3VudCA9IHNvdXJjZS0+ZHVwX3BpeGVsX2NvdW50ID0gMDsKLSAgICBzdWJ0eXBlIC09IDg7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTm9uLVJMRSBmaWxlICovCi0gICAgc291cmNlLT5yZWFkX3BpeGVsID0gcmVhZF9ub25fcmxlX3BpeGVsOwotICB9Ci0KLSAgLyogTm93IHNob3VsZCBoYXZlIHN1YnR5cGUgMSwgMiwgb3IgMyAqLwotICBjb21wb25lbnRzID0gMzsJCS8qIHVudGlsIHByb3ZlbiBkaWZmZXJlbnQgKi8KLSAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLQotICBzd2l0Y2ggKHN1YnR5cGUpIHsKLSAgY2FzZSAxOgkJCS8qIENvbG9ybWFwcGVkIGltYWdlICovCi0gICAgaWYgKHNvdXJjZS0+cGl4ZWxfc2l6ZSA9PSAxICYmIGNtYXB0eXBlID09IDEpCi0gICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzhiaXRfcm93OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19UR0FfTUFQUEVELCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBicmVhazsKLSAgY2FzZSAyOgkJCS8qIFJHQiBpbWFnZSAqLwotICAgIHN3aXRjaCAoc291cmNlLT5waXhlbF9zaXplKSB7Ci0gICAgY2FzZSAyOgotICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF8xNmJpdF9yb3c7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzI0Yml0X3JvdzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfMzJiaXRfcm93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19UR0EsIHdpZHRoLCBoZWlnaHQpOwotICAgIGJyZWFrOwotICBjYXNlIDM6CQkJLyogR3JheXNjYWxlIGltYWdlICovCi0gICAgY29tcG9uZW50cyA9IDE7Ci0gICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBpZiAoc291cmNlLT5waXhlbF9zaXplID09IDEpCi0gICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzhiaXRfZ3JheV9yb3c7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOwotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQV9HUkFZLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoaXNfYm90dG9tX3VwKSB7Ci0gICAgLyogQ3JlYXRlIGEgdmlydHVhbCBhcnJheSB0byBidWZmZXIgdGhlIHVwc2lkZS1kb3duIGltYWdlLiAqLwotICAgIHNvdXJjZS0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLSAgICAgICAoSkRJTUVOU0lPTikgd2lkdGggKiBjb21wb25lbnRzLCAoSkRJTUVOU0lPTikgaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0gICAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7IC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLwotICAgIH0KLSAgICAvKiBzb3VyY2UtPnB1Yi5idWZmZXIgd2lsbCBwb2ludCB0byB0aGUgdmlydHVhbCBhcnJheS4gKi8KLSAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsgLyogaW4gY2FzZSBhbnlvbmUgbG9va3MgYXQgaXQgKi8KLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IHByZWxvYWRfaW1hZ2U7Ci0gIH0gZWxzZSB7Ci0gICAgLyogRG9uJ3QgbmVlZCBhIHZpcnR1YWwgYXJyYXksIGJ1dCBkbyBuZWVkIGEgb25lLXJvdyBpbnB1dCBidWZmZXIuICovCi0gICAgc291cmNlLT53aG9sZV9pbWFnZSA9IE5VTEw7Ci0gICAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCAqIGNvbXBvbmVudHMsIChKRElNRU5TSU9OKSAxKTsKLSAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLSAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3M7Ci0gIH0KLSAgCi0gIHdoaWxlIChpZGxlbi0tKQkJLyogVGhyb3cgYXdheSBJRCBmaWVsZCAqLwotICAgICh2b2lkKSByZWFkX2J5dGUoc291cmNlKTsKLQotICBpZiAobWFwbGVuID4gMCkgewotICAgIGlmIChtYXBsZW4gPiAyNTYgfHwgR0VUXzJCKDMpICE9IDApCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURDTUFQKTsKLSAgICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB0aGUgY29sb3JtYXAgKi8KLSAgICBzb3VyY2UtPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCAoSkRJTUVOU0lPTikgbWFwbGVuLCAoSkRJTUVOU0lPTikgMyk7Ci0gICAgLyogYW5kIHJlYWQgaXQgZnJvbSB0aGUgZmlsZSAqLwotICAgIHJlYWRfY29sb3JtYXAoc291cmNlLCAoaW50KSBtYXBsZW4sIFVDSCh0YXJnYWhlYWRlcls3XSkpOwotICB9IGVsc2UgewotICAgIGlmIChjbWFwdHlwZSkJCS8qIGJ1dCB5b3UgcHJvbWlzZWQgYSBjbWFwISAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOwotICAgIHNvdXJjZS0+Y29sb3JtYXAgPSBOVUxMOwotICB9Ci0KLSAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSBjb21wb25lbnRzOwotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSA4OwotICBjaW5mby0+aW1hZ2Vfd2lkdGggPSB3aWR0aDsKLSAgY2luZm8tPmltYWdlX2hlaWdodCA9IGhlaWdodDsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfaW5wdXRfdGdhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKLXsKLSAgLyogbm8gd29yayAqLwotfQotCi0KLS8qCi0gKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBUYXJnYSBmb3JtYXQgaW5wdXQuCi0gKi8KLQotR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCi1qaW5pdF9yZWFkX3RhcmdhIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgdGdhX3NvdXJjZV9wdHIgc291cmNlOwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLwotICBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKHRnYV9zb3VyY2Vfc3RydWN0KSk7Ci0gIHNvdXJjZS0+Y2luZm8gPSBjaW5mbzsJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCi0gIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCi0gIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfdGdhOwotICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfdGdhOwotCi0gIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOwotfQotCi0jZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC9zdHJ1Y3R1cmUuZG9jIGIvbGlianBlZ3R3cnAvc3RydWN0dXJlLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjOWRlZi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC9zdHJ1Y3R1cmUuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsOTQ4ICswLDAgQEAKLUlKRyBKUEVHIExJQlJBUlk6ICBTWVNURU0gQVJDSElURUNUVVJFCi0KLUNvcHlyaWdodCAoQykgMTk5MS0xOTk1LCBUaG9tYXMgRy4gTGFuZS4KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0KLQotVGhpcyBmaWxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIElKRyBKUEVHIHNvZnR3YXJlOwotdGhhdCBpcywgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgdmFyaW91cyBtb2R1bGVzIGluIHRoZSBzeXN0ZW0gYW5kIHRoZSBpbnRlcmZhY2VzCi1iZXR3ZWVuIG1vZHVsZXMuICBGb3IgbW9yZSBwcmVjaXNlIGRldGFpbHMgYWJvdXQgYW55IGRhdGEgc3RydWN0dXJlIG9yIGNhbGxpbmcKLWNvbnZlbnRpb24sIHNlZSB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgY29tbWVudHMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCi1XZSBhc3N1bWUgdGhhdCB0aGUgcmVhZGVyIGlzIGFscmVhZHkgc29tZXdoYXQgZmFtaWxpYXIgd2l0aCB0aGUgSlBFRyBzdGFuZGFyZC4KLVRoZSBSRUFETUUgZmlsZSBpbmNsdWRlcyByZWZlcmVuY2VzIGZvciBsZWFybmluZyBhYm91dCBKUEVHLiAgVGhlIGZpbGUKLWxpYmpwZWcuZG9jIGRlc2NyaWJlcyB0aGUgbGlicmFyeSBmcm9tIHRoZSB2aWV3cG9pbnQgb2YgYW4gYXBwbGljYXRpb24KLXByb2dyYW1tZXIgdXNpbmcgdGhlIGxpYnJhcnk7IGl0J3MgYmVzdCB0byByZWFkIHRoYXQgZmlsZSBiZWZvcmUgdGhpcyBvbmUuCi1BbHNvLCB0aGUgZmlsZSBjb2RlcnVsZXMuZG9jIGRlc2NyaWJlcyB0aGUgY29kaW5nIHN0eWxlIGNvbnZlbnRpb25zIHdlIHVzZS4KLQotSW4gdGhpcyBkb2N1bWVudCwgSlBFRy1zcGVjaWZpYyB0ZXJtaW5vbG9neSBmb2xsb3dzIHRoZSBKUEVHIHN0YW5kYXJkOgotICBBICJjb21wb25lbnQiIG1lYW5zIGEgY29sb3IgY2hhbm5lbCwgZS5nLiwgUmVkIG9yIEx1bWluYW5jZS4KLSAgQSAic2FtcGxlIiBpcyBhIHNpbmdsZSBjb21wb25lbnQgdmFsdWUgKGkuZS4sIG9uZSBudW1iZXIgaW4gdGhlIGltYWdlIGRhdGEpLgotICBBICJjb2VmZmljaWVudCIgaXMgYSBmcmVxdWVuY3kgY29lZmZpY2llbnQgKGEgRENUIHRyYW5zZm9ybSBvdXRwdXQgbnVtYmVyKS4KLSAgQSAiYmxvY2siIGlzIGFuIDh4OCBncm91cCBvZiBzYW1wbGVzIG9yIGNvZWZmaWNpZW50cy4KLSAgQW4gIk1DVSIgKG1pbmltdW0gY29kZWQgdW5pdCkgaXMgYW4gaW50ZXJsZWF2ZWQgc2V0IG9mIGJsb2NrcyBvZiBzaXplCi0JZGV0ZXJtaW5lZCBieSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgb3IgYSBzaW5nbGUgYmxvY2sgaW4gYQotCW5vbmludGVybGVhdmVkIHNjYW4uCi1XZSBkbyBub3QgdXNlIHRoZSB0ZXJtcyAicGl4ZWwiIGFuZCAic2FtcGxlIiBpbnRlcmNoYW5nZWFibHkuICBXaGVuIHdlIHNheQotcGl4ZWwsIHdlIG1lYW4gYW4gZWxlbWVudCBvZiB0aGUgZnVsbC1zaXplIGltYWdlLCB3aGlsZSBhIHNhbXBsZSBpcyBhbiBlbGVtZW50Ci1vZiB0aGUgZG93bnNhbXBsZWQgaW1hZ2UuICBUaHVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBtYXkgdmFyeSBhY3Jvc3MKLWNvbXBvbmVudHMgd2hpbGUgdGhlIG51bWJlciBvZiBwaXhlbHMgZG9lcyBub3QuICAoVGhpcyB0ZXJtaW5vbG9neSBpcyBub3QgdXNlZAotcmlnb3JvdXNseSB0aHJvdWdob3V0IHRoZSBjb2RlLCBidXQgaXQgaXMgdXNlZCBpbiBwbGFjZXMgd2hlcmUgY29uZnVzaW9uIHdvdWxkCi1vdGhlcndpc2UgcmVzdWx0LikKLQotCi0qKiogU3lzdGVtIGZlYXR1cmVzICoqKgotCi1UaGUgSUpHIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0d28gcGFydHM6Ci0gICogQSBzdWJyb3V0aW5lIGxpYnJhcnkgZm9yIEpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCi0gICogY2pwZWcvZGpwZWcsIHR3byBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBsaWJyYXJ5IHRvIHRyYW5zZm9ybQotICAgIEpGSUYgSlBFRyBmaWxlcyB0byBhbmQgZnJvbSBzZXZlcmFsIG90aGVyIGltYWdlIGZvcm1hdHMuCi1janBlZy9kanBlZyBhcmUgb2Ygbm8gZ3JlYXQgaW50ZWxsZWN0dWFsIGNvbXBsZXhpdHk6IHRoZXkgbWVyZWx5IGFkZCBhIHNpbXBsZQotY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGFuZCBJL08gcm91dGluZXMgZm9yIHNldmVyYWwgdW5jb21wcmVzc2VkIGltYWdlCi1mb3JtYXRzLiAgVGhpcyBkb2N1bWVudCBjb25jZW50cmF0ZXMgb24gdGhlIGxpYnJhcnkgaXRzZWxmLgotCi1XZSBkZXNpcmUgdGhlIGxpYnJhcnkgdG8gYmUgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGFsbCBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZAotc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlIERDVCBwcm9jZXNzZXMuICBIaWVyYXJjaGljYWwgcHJvY2Vzc2VzIGFyZSBub3QKLXN1cHBvcnRlZC4KLQotVGhlIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbG9zc2xlc3MgKHNwYXRpYWwpIEpQRUcgcHJvY2Vzcy4gIExvc3NsZXNzCi1KUEVHIHNoYXJlcyBsaXR0bGUgb3Igbm8gY29kZSB3aXRoIGxvc3N5IEpQRUcsIGFuZCB3b3VsZCBub3JtYWxseSBiZSB1c2VkCi13aXRob3V0IHRoZSBleHRlbnNpdmUgcHJlLSBhbmQgcG9zdC1wcm9jZXNzaW5nIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeS4KLVdlIGZlZWwgdGhhdCBsb3NzbGVzcyBKUEVHIGlzIGJldHRlciBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgbGlicmFyeS4KLQotV2l0aGluIHRoZXNlIGxpbWl0cywgYW55IHNldCBvZiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFsbG93ZWQgYnkgdGhlIEpQRUcKLXNwZWMgc2hvdWxkIGJlIHJlYWRhYmxlIGZvciBkZWNvbXByZXNzaW9uLiAgKFdlIGNhbiBiZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0Ci13aGF0IGZvcm1hdHMgd2UgY2FuIGdlbmVyYXRlLikgIEFsdGhvdWdoIHRoZSBzeXN0ZW0gZGVzaWduIGFsbG93cyBmb3IgYWxsCi1wYXJhbWV0ZXIgdmFsdWVzLCBzb21lIHVuY29tbW9uIHNldHRpbmdzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkIGFuZCBtYXkKLW5ldmVyIGJlOyBub25pbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MgYXJlIHRoZSBwcmltZSBleGFtcGxlLiAgRnVydGhlcm1vcmUsCi13ZSB0cmVhdCA4LWJpdCB2cy4gMTItYml0IGRhdGEgcHJlY2lzaW9uIGFzIGEgY29tcGlsZS10aW1lIHN3aXRjaCwgbm90IGEKLXJ1bi10aW1lIG9wdGlvbiwgYmVjYXVzZSBtb3N0IG1hY2hpbmVzIGNhbiBzdG9yZSA4LWJpdCBwaXhlbHMgbXVjaCBtb3JlCi1jb21wYWN0bHkgdGhhbiAxMi1iaXQuCi0KLUZvciBsZWdhbCByZWFzb25zLCBKUEVHIGFyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCBidXQKLWV4dGVuZGluZyB0aGUgbGlicmFyeSB0byBpbmNsdWRlIGl0IHdvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZC4KLQotQnkgaXRzZWxmLCB0aGUgbGlicmFyeSBoYW5kbGVzIG9ubHkgaW50ZXJjaGFuZ2UgSlBFRyBkYXRhc3RyZWFtcyAtLS0gaW4KLXBhcnRpY3VsYXIgdGhlIHdpZGVseSB1c2VkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCBieQotc3Vycm91bmRpbmcgY29kZSB0byBwcm9jZXNzIGludGVyY2hhbmdlIG9yIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMgdGhhdAotYXJlIGVtYmVkZGVkIGluIG1vcmUgY29tcGxleCBmaWxlIGZvcm1hdHMuICAoRm9yIGV4YW1wbGUsIGxpYnRpZmYgdXNlcyB0aGlzCi1saWJyYXJ5IHRvIGltcGxlbWVudCBKUEVHIGNvbXByZXNzaW9uIHdpdGhpbiB0aGUgVElGRiBmaWxlIGZvcm1hdC4pCi0KLVRoZSBsaWJyYXJ5IGluY2x1ZGVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIGNvZGUgdGhhdCBpcyBub3QgY292ZXJlZCBieSB0aGUKLUpQRUcgc3RhbmRhcmQgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgdHlwaWNhbCBhcHBsaWNhdGlvbnMgb2YgSlBFRy4gIFRoZXNlCi1mdW5jdGlvbnMgcHJlcHJvY2VzcyB0aGUgaW1hZ2UgYmVmb3JlIEpQRUcgY29tcHJlc3Npb24gb3IgcG9zdHByb2Nlc3MgaXQgYWZ0ZXIKLWRlY29tcHJlc3Npb24uICBUaGV5IGluY2x1ZGUgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBkb3duc2FtcGxpbmcvdXBzYW1wbGluZywKLWFuZCBjb2xvciBxdWFudGl6YXRpb24uICBUaGlzIGNvZGUgY2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KLQotQSB3aWRlIHJhbmdlIG9mIHF1YWxpdHkgdnMuIHNwZWVkIHRyYWRlb2ZmcyBhcmUgcG9zc2libGUgaW4gSlBFRyBwcm9jZXNzaW5nLAotYW5kIGV2ZW4gbW9yZSBzbyBpbiBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nLiAgVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeQotcHJvdmlkZXMgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIHRoYXQgY292ZXIgbW9zdCBvZiB0aGUgdXNlZnVsIHRyYWRlb2ZmcywKLXJhbmdpbmcgZnJvbSB2ZXJ5LWhpZ2gtcXVhbGl0eSBkb3duIHRvIGZhc3QtcHJldmlldyBvcGVyYXRpb24uICBPbiB0aGUKLWNvbXByZXNzaW9uIHNpZGUgd2UgaGF2ZSBnZW5lcmFsbHkgbm90IHByb3ZpZGVkIGxvdy1xdWFsaXR5IGNob2ljZXMsIHNpbmNlCi1jb21wcmVzc2lvbiBpcyBub3JtYWxseSBsZXNzIHRpbWUtY3JpdGljYWwuICBJdCBzaG91bGQgYmUgdW5kZXJzdG9vZCB0aGF0IHRoZQotbG93LXF1YWxpdHkgbW9kZXMgbWF5IG5vdCBtZWV0IHRoZSBKUEVHIHN0YW5kYXJkJ3MgYWNjdXJhY3kgcmVxdWlyZW1lbnRzOwotbm9uZXRoZWxlc3MsIHRoZXkgYXJlIHVzZWZ1bCBmb3Igdmlld2Vycy4KLQotCi0qKiogUG9ydGFiaWxpdHkgaXNzdWVzICoqKgotCi1Qb3J0YWJpbGl0eSBpcyBhbiBlc3NlbnRpYWwgcmVxdWlyZW1lbnQgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlIGtleSBwb3J0YWJpbGl0eQotaXNzdWVzIHRoYXQgc2hvdyB1cCBhdCB0aGUgbGV2ZWwgb2Ygc3lzdGVtIGFyY2hpdGVjdHVyZSBhcmU6Ci0KLTEuICBNZW1vcnkgdXNhZ2UuICBXZSB3YW50IHRoZSBjb2RlIHRvIGJlIGFibGUgdG8gcnVuIG9uIFBDLWNsYXNzIG1hY2hpbmVzCi13aXRoIGxpbWl0ZWQgbWVtb3J5LiAgSW1hZ2VzIHNob3VsZCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkIHNlcXVlbnRpYWxseSAoaW4KLXN0cmlwcyksIHRvIGF2b2lkIGhvbGRpbmcgdGhlIHdob2xlIGltYWdlIGluIG1lbW9yeSBhdCBvbmNlLiAgV2hlcmUgYQotZnVsbC1pbWFnZSBidWZmZXIgaXMgbmVjZXNzYXJ5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgZWl0aGVyIHZpcnR1YWwgbWVtb3J5Ci1vciB0ZW1wb3JhcnkgZmlsZXMuCi0KLTIuICBOZWFyL2ZhciBwb2ludGVyIGRpc3RpbmN0aW9uLiAgVG8gcnVuIGVmZmljaWVudGx5IG9uIDgweDg2IG1hY2hpbmVzLCB0aGUKLWNvZGUgc2hvdWxkIGRpc3Rpbmd1aXNoICJzbWFsbCIgb2JqZWN0cyAoa2VwdCBpbiBuZWFyIGRhdGEgc3BhY2UpIGZyb20KLSJsYXJnZSIgb25lcyAoa2VwdCBpbiBmYXIgZGF0YSBzcGFjZSkuICBUaGlzIGlzIGFuIGFubm95aW5nIHJlc3RyaWN0aW9uLCBidXQKLWZvcnR1bmF0ZWx5IGl0IGRvZXMgbm90IGltcGFjdCBjb2RlIHF1YWxpdHkgZm9yIGxlc3MgYnJhaW4tZGFtYWdlZCBtYWNoaW5lcywKLWFuZCB0aGUgc291cmNlIGNvZGUgY2x1dHRlciB0dXJucyBvdXQgdG8gYmUgbWluaW1hbCB3aXRoIHN1ZmZpY2llbnQgdXNlIG9mCi1wb2ludGVyIHR5cGVkZWZzLgotCi0zLiBEYXRhIHByZWNpc2lvbi4gIFdlIGFzc3VtZSB0aGF0ICJjaGFyIiBpcyBhdCBsZWFzdCA4IGJpdHMsICJzaG9ydCIgYW5kCi0iaW50IiBhdCBsZWFzdCAxNiwgImxvbmciIGF0IGxlYXN0IDMyLiAgVGhlIGNvZGUgd2lsbCB3b3JrIGZpbmUgd2l0aCBsYXJnZXIKLWRhdGEgc2l6ZXMsIGFsdGhvdWdoIG1lbW9yeSBtYXkgYmUgdXNlZCBpbmVmZmljaWVudGx5IGluIHNvbWUgY2FzZXMuICBIb3dldmVyLAotdGhlIEpQRUcgY29tcHJlc3NlZCBkYXRhc3RyZWFtIG11c3QgdWx0aW1hdGVseSBhcHBlYXIgb24gZXh0ZXJuYWwgc3RvcmFnZSBhcyBhCi1zZXF1ZW5jZSBvZiA4LWJpdCBieXRlcyBpZiBpdCBpcyB0byBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZC4gIFRoaXMgbWF5IHBvc2UgYQotcHJvYmxlbSBvbiBtYWNoaW5lcyB3aGVyZSBjaGFyIGlzIHdpZGVyIHRoYW4gOCBiaXRzLiAgVGhlIGxpYnJhcnkgcmVwcmVzZW50cwotY29tcHJlc3NlZCBkYXRhIGFzIGFuIGFycmF5IG9mIHZhbHVlcyBvZiB0eXBlZGVmIEpPQ1RFVC4gIElmIG5vIGRhdGEgdHlwZQotZXhhY3RseSA4IGJpdHMgd2lkZSBpcyBhdmFpbGFibGUsIGN1c3RvbSBkYXRhIHNvdXJjZSBhbmQgZGF0YSBkZXN0aW5hdGlvbgotbW9kdWxlcyBtdXN0IGJlIHdyaXR0ZW4gdG8gdW5wYWNrIGFuZCBwYWNrIHRoZSBjaG9zZW4gSk9DVEVUIGRhdGF0eXBlIGludG8KLTgtYml0IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLgotCi0KLSoqKiBTeXN0ZW0gb3ZlcnZpZXcgKioqCi0KLVRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYXJlIGVhY2ggZGl2aWRlZCBpbnRvIHR3byBtYWluIHNlY3Rpb25zOgotdGhlIEpQRUcgY29tcHJlc3NvciBvciBkZWNvbXByZXNzb3IgcHJvcGVyLCBhbmQgdGhlIHByZXByb2Nlc3Npbmcgb3IKLXBvc3Rwcm9jZXNzaW5nIGZ1bmN0aW9ucy4gIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGVzZSB0d28gc2VjdGlvbnMgaXMgdGhlCi1pbWFnZSBkYXRhIHRoYXQgdGhlIG9mZmljaWFsIEpQRUcgc3BlYyByZWdhcmRzIGFzIGl0cyBpbnB1dCBvciBvdXRwdXQ6IHRoaXMKLWRhdGEgaXMgaW4gdGhlIGNvbG9yc3BhY2UgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3Npb24sIGFuZCBpdCBpcyBkb3duc2FtcGxlZAotdG8gdGhlIHNhbXBsaW5nIGZhY3RvcnMgdG8gYmUgdXNlZC4gIFRoZSBwcmVwcm9jZXNzaW5nIGFuZCBwb3N0cHJvY2Vzc2luZwotc3RlcHMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGEgbm9ybWFsIGltYWdlIHJlcHJlc2VudGF0aW9uIHRvIG9yIGZyb20KLXRoaXMgZm9ybS4gIChUaG9zZSBmZXcgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBkZWFsIHdpdGggWUNiQ3IgZG93bnNhbXBsZWQKLWRhdGEgY2FuIHNraXAgdGhlIHByZXByb2Nlc3Npbmcgb3IgcG9zdHByb2Nlc3Npbmcgc3RlcC4pCi0KLUxvb2tpbmcgbW9yZSBjbG9zZWx5LCB0aGUgY29tcHJlc3NvciBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWFpbgotZWxlbWVudHM6Ci0KLSAgUHJlcHJvY2Vzc2luZzoKLSAgICAqIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gKGUuZy4sIFJHQiB0byBZQ2JDcikuCi0gICAgKiBFZGdlIGV4cGFuc2lvbiBhbmQgZG93bnNhbXBsaW5nLiAgT3B0aW9uYWxseSwgdGhpcyBzdGVwIGNhbiBkbyBzaW1wbGUKLSAgICAgIHNtb290aGluZyAtLS0gdGhpcyBpcyBvZnRlbiBoZWxwZnVsIGZvciBsb3ctcXVhbGl0eSBzb3VyY2UgZGF0YS4KLSAgSlBFRyBwcm9wZXI6Ci0gICAgKiBNQ1UgYXNzZW1ibHksIERDVCwgcXVhbnRpemF0aW9uLgotICAgICogRW50cm9weSBjb2RpbmcgKHNlcXVlbnRpYWwgb3IgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYykuCi0KLUluIGFkZGl0aW9uIHRvIHRoZXNlIG1vZHVsZXMgd2UgbmVlZCBvdmVyYWxsIGNvbnRyb2wsIG1hcmtlciBnZW5lcmF0aW9uLAotYW5kIHN1cHBvcnQgY29kZSAobWVtb3J5IG1hbmFnZW1lbnQgJiBlcnJvciBoYW5kbGluZykuICBUaGVyZSBpcyBhbHNvIGEKLW1vZHVsZSByZXNwb25zaWJsZSBmb3IgcGh5c2ljYWxseSB3cml0aW5nIHRoZSBvdXRwdXQgZGF0YSAtLS0gdHlwaWNhbGx5Ci10aGlzIGlzIGp1c3QgYW4gaW50ZXJmYWNlIHRvIGZ3cml0ZSgpLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8KLWRvIHNvbWV0aGluZyBlbHNlIHdpdGggdGhlIGRhdGEuCi0KLVRoZSBkZWNvbXByZXNzb3IgbGlicmFyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1haW4gZWxlbWVudHM6Ci0KLSAgSlBFRyBwcm9wZXI6Ci0gICAgKiBFbnRyb3B5IGRlY29kaW5nIChzZXF1ZW50aWFsIG9yIHByb2dyZXNzaXZlLCBIdWZmbWFuIG9yIGFyaXRobWV0aWMpLgotICAgICogRGVxdWFudGl6YXRpb24sIGludmVyc2UgRENULCBNQ1UgZGlzYXNzZW1ibHkuCi0gIFBvc3Rwcm9jZXNzaW5nOgotICAgICogVXBzYW1wbGluZy4gIE9wdGlvbmFsbHksIHRoaXMgc3RlcCBtYXkgYmUgYWJsZSB0byBkbyBtb3JlIGdlbmVyYWwKLSAgICAgIHJlc2NhbGluZyBvZiB0aGUgaW1hZ2UuCi0gICAgKiBDb2xvciBzcGFjZSBjb252ZXJzaW9uIChlLmcuLCBZQ2JDciB0byBSR0IpLiAgVGhpcyBzdGVwIG1heSBhbHNvCi0gICAgICBwcm92aWRlIGdhbW1hIGFkanVzdG1lbnQgWyBjdXJyZW50bHkgaXQgZG9lcyBub3QgXS4KLSAgICAqIE9wdGlvbmFsIGNvbG9yIHF1YW50aXphdGlvbiAoZS5nLiwgcmVkdWN0aW9uIHRvIDI1NiBjb2xvcnMpLgotICAgICogT3B0aW9uYWwgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiAoZS5nLiwgMjQtYml0IHRvIDE1LWJpdCBjb2xvcikuCi0gICAgICBbVGhpcyBmZWF0dXJlIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXQotCi1XZSBhbHNvIG5lZWQgb3ZlcmFsbCBjb250cm9sLCBtYXJrZXIgcGFyc2luZywgYW5kIGEgZGF0YSBzb3VyY2UgbW9kdWxlLgotVGhlIHN1cHBvcnQgY29kZSAobWVtb3J5IG1hbmFnZW1lbnQgJiBlcnJvciBoYW5kbGluZykgY2FuIGJlIHNoYXJlZCB3aXRoCi10aGUgY29tcHJlc3Npb24gaGFsZiBvZiB0aGUgbGlicmFyeS4KLQotVGhlcmUgbWF5IGJlIHNldmVyYWwgaW1wbGVtZW50YXRpb25zIG9mIGVhY2ggb2YgdGhlc2UgZWxlbWVudHMsIHBhcnRpY3VsYXJseQotaW4gdGhlIGRlY29tcHJlc3Nvciwgd2hlcmUgYSB3aWRlIHJhbmdlIG9mIHNwZWVkL3F1YWxpdHkgdHJhZGVvZmZzIGlzIHZlcnkKLXVzZWZ1bC4gIEl0IG11c3QgYmUgdW5kZXJzdG9vZCB0aGF0IHNvbWUgb2YgdGhlIGJlc3Qgc3BlZWR1cHMgaW52b2x2ZQotbWVyZ2luZyBhZGphY2VudCBzdGVwcyBpbiB0aGUgcGlwZWxpbmUuICBGb3IgZXhhbXBsZSwgdXBzYW1wbGluZywgY29sb3Igc3BhY2UKLWNvbnZlcnNpb24sIGFuZCBjb2xvciBxdWFudGl6YXRpb24gbWlnaHQgYWxsIGJlIGRvbmUgYXQgb25jZSB3aGVuIHVzaW5nIGEKLWxvdy1xdWFsaXR5IG9yZGVyZWQtZGl0aGVyIHRlY2huaXF1ZS4gIFRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIGlzIGRlc2lnbmVkIHRvCi1hbGxvdyBzdWNoIG1lcmdpbmcgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQotTm90ZTogaXQgaXMgY29udmVuaWVudCB0byByZWdhcmQgZWRnZSBleHBhbnNpb24gKHBhZGRpbmcgdG8gYmxvY2sgYm91bmRhcmllcykKLWFzIGEgcHJlcHJvY2Vzc2luZy9wb3N0cHJvY2Vzc2luZyBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggdGhlIEpQRUcgc3BlYyBpbmNsdWRlcwotaXQgaW4gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4gIFdlIGRvIHRoaXMgYmVjYXVzZSBkb3duc2FtcGxpbmcvdXBzYW1wbGluZwotY2FuIGJlIHNpbXBsaWZpZWQgYSBsaXR0bGUgaWYgdGhleSB3b3JrIG9uIHBhZGRlZCBkYXRhOiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8KLWhhdmUgc3BlY2lhbCBjYXNlcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcy4gIFRoZXJlZm9yZSB0aGUgaW50ZXJmYWNlCi1idWZmZXIgaXMgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiBibG9ja3Mgd2lkZSBhbmQgaGlnaCwgYW5kIHdlIGV4cGVjdAotY29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyB0byBwYWQgdGhlIHNvdXJjZSBkYXRhIHByb3Blcmx5LiAgUGFkZGluZyB3aWxsIG9jY3VyCi1vbmx5IHRvIHRoZSBuZXh0IGJsb2NrICg4LXNhbXBsZSkgYm91bmRhcnkuICBJbiBhbiBpbnRlcmxlYXZlZC1zY2FuIHNpdHVhdGlvbiwKLWFkZGl0aW9uYWwgZHVtbXkgYmxvY2tzIG1heSBiZSB1c2VkIHRvIGZpbGwgb3V0IE1DVXMsIGJ1dCB0aGUgTUNVIGFzc2VtYmx5IGFuZAotZGlzYXNzZW1ibHkgbG9naWMgd2lsbCBjcmVhdGUgb3IgZGlzY2FyZCB0aGVzZSBibG9ja3MgaW50ZXJuYWxseS4gIChUaGlzIGlzCi1hZHZhbnRhZ2VvdXMgZm9yIHNwZWVkIHJlYXNvbnMsIHNpbmNlIHdlIGF2b2lkIERDVGluZyB0aGUgZHVtbXkgYmxvY2tzLgotSXQgYWxzbyBwZXJtaXRzIGEgc21hbGwgcmVkdWN0aW9uIGluIGZpbGUgc2l6ZSwgYmVjYXVzZSB0aGUgY29tcHJlc3NvciBjYW4KLWNob29zZSBkdW1teSBibG9jayBjb250ZW50cyBzbyBhcyB0byBtaW5pbWl6ZSB0aGVpciBzaXplIGluIGNvbXByZXNzZWQgZm9ybS4KLUZpbmFsbHksIGl0IG1ha2VzIHRoZSBpbnRlcmZhY2UgYnVmZmVyIHNwZWNpZmljYXRpb24gaW5kZXBlbmRlbnQgb2Ygd2hldGhlcgotdGhlIGZpbGUgaXMgYWN0dWFsbHkgaW50ZXJsZWF2ZWQgb3Igbm90LikgIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gZGVhbAotZGlyZWN0bHkgd2l0aCB0aGUgZG93bnNhbXBsZWQgZGF0YSBtdXN0IHByb3ZpZGUgc2ltaWxhciBidWZmZXJpbmcgYW5kIHBhZGRpbmcKLWZvciBvZGQtc2l6ZWQgaW1hZ2VzLgotCi0KLSoqKiBQb29yIG1hbidzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyAqKioKLQotSXQgc2hvdWxkIGJlIGNsZWFyIGJ5IG5vdyB0aGF0IHdlIGhhdmUgYSBsb3Qgb2YgcXVhc2ktaW5kZXBlbmRlbnQgcHJvY2Vzc2luZwotc3RlcHMsIG1hbnkgb2Ygd2hpY2ggaGF2ZSBzZXZlcmFsIHBvc3NpYmxlIGJlaGF2aW9ycy4gIFRvIGF2b2lkIGNsdXR0ZXJpbmcgdGhlCi1jb2RlIHdpdGggbG90cyBvZiBzd2l0Y2ggc3RhdGVtZW50cywgd2UgdXNlIGEgc2ltcGxlIGZvcm0gb2Ygb2JqZWN0LXN0eWxlCi1wcm9ncmFtbWluZyB0byBzZXBhcmF0ZSBvdXQgdGhlIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLgotCi1Gb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudCBjb2xvciBxdWFudGl6YXRpb24gYWxnb3JpdGhtcyBjb3VsZCBiZSBpbXBsZW1lbnRlZAotYXMgdHdvIHNlcGFyYXRlIG1vZHVsZXMgdGhhdCBwcmVzZW50IHRoZSBzYW1lIGV4dGVybmFsIGludGVyZmFjZTsgYXQgcnVudGltZSwKLXRoZSBjYWxsaW5nIGNvZGUgd2lsbCBhY2Nlc3MgdGhlIHByb3BlciBtb2R1bGUgaW5kaXJlY3RseSB0aHJvdWdoIGFuICJvYmplY3QiLgotCi1XZSBjYW4gZ2V0IHRoZSBsaW1pdGVkIGZlYXR1cmVzIHdlIG5lZWQgd2hpbGUgc3RheWluZyB3aXRoaW4gcG9ydGFibGUgQy4KLVRoZSBiYXNpYyB0b29sIGlzIGEgZnVuY3Rpb24gcG9pbnRlci4gIEFuICJvYmplY3QiIGlzIGp1c3QgYSBzdHJ1Y3QKLWNvbnRhaW5pbmcgb25lIG9yIG1vcmUgZnVuY3Rpb24gcG9pbnRlciBmaWVsZHMsIGVhY2ggb2Ygd2hpY2ggY29ycmVzcG9uZHMgdG8KLWEgbWV0aG9kIG5hbWUgaW4gcmVhbCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLiAgRHVyaW5nIGluaXRpYWxpemF0aW9uIHdlCi1maWxsIGluIHRoZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHJlZmVyZW5jZXMgdG8gd2hpY2hldmVyIG1vZHVsZSB3ZSBoYXZlCi1kZXRlcm1pbmVkIHdlIG5lZWQgdG8gdXNlIGluIHRoaXMgcnVuLiAgVGhlbiBpbnZvY2F0aW9uIG9mIHRoZSBtb2R1bGUgaXMgZG9uZQotYnkgaW5kaXJlY3RpbmcgdGhyb3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXI7IG9uIG1vc3QgbWFjaGluZXMgdGhpcyBpcyBubyBtb3JlCi1leHBlbnNpdmUgdGhhbiBhIHN3aXRjaCBzdGF0ZW1lbnQsIHdoaWNoIHdvdWxkIGJlIHRoZSBvbmx5IG90aGVyIHdheSBvZgotbWFraW5nIHRoZSByZXF1aXJlZCBydW4tdGltZSBjaG9pY2UuICBUaGUgcmVhbGx5IHNpZ25pZmljYW50IGJlbmVmaXQsIG9mCi1jb3Vyc2UsIGlzIGtlZXBpbmcgdGhlIHNvdXJjZSBjb2RlIGNsZWFuIGFuZCB3ZWxsIHN0cnVjdHVyZWQuCi0KLVdlIGNhbiBhbHNvIGFycmFuZ2UgdG8gaGF2ZSBwcml2YXRlIHN0b3JhZ2UgdGhhdCB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQKLWltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBraW5kIG9mIG9iamVjdC4gIFdlIGRvIHRoaXMgYnkgbWFraW5nIGFsbCB0aGUKLW1vZHVsZS1zcGVjaWZpYyBvYmplY3Qgc3RydWN0cyBiZSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCBlbnRpdGllcywgd2hpY2ggd2lsbAotYmUgYWNjZXNzZWQgdmlhIHBvaW50ZXJzIGluIHRoZSBtYXN0ZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBzdHJ1Y3QuCi1UaGUgInB1YmxpYyIgZmllbGRzIG9yIG1ldGhvZHMgZm9yIGEgZ2l2ZW4ga2luZCBvZiBvYmplY3QgYXJlIHNwZWNpZmllZCBieQotYSBjb21tb25seSBrbm93biBzdHJ1Y3QuICBCdXQgYSBtb2R1bGUncyBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBhbGxvY2F0ZQotYSBsYXJnZXIgc3RydWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbW1vbiBzdHJ1Y3QgYXMgaXRzIGZpcnN0IG1lbWJlciwgcGx1cwotYWRkaXRpb25hbCBwcml2YXRlIGZpZWxkcy4gIFdpdGggYXBwcm9wcmlhdGUgcG9pbnRlciBjYXN0aW5nLCB0aGUgbW9kdWxlJ3MKLWludGVybmFsIGZ1bmN0aW9ucyBjYW4gYWNjZXNzIHRoZXNlIHByaXZhdGUgZmllbGRzLiAgKEZvciBhIHNpbXBsZSBleGFtcGxlLAotc2VlIGpkYXRhZHN0LmMsIHdoaWNoIGltcGxlbWVudHMgdGhlIGV4dGVybmFsIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgc3RydWN0Ci1qcGVnX2Rlc3RpbmF0aW9uX21nciwgYnV0IGFkZHMgZXh0cmEgZmllbGRzLikKLQotKE9mIGNvdXJzZSB0aGlzIHdvdWxkIGFsbCBiZSBhIGxvdCBlYXNpZXIgaWYgd2Ugd2VyZSB1c2luZyBDKyssIGJ1dCB3ZSBhcmUKLW5vdCB5ZXQgcHJlcGFyZWQgdG8gYXNzdW1lIHRoYXQgZXZlcnlvbmUgaGFzIGEgQysrIGNvbXBpbGVyLikKLQotQW4gaW1wb3J0YW50IGJlbmVmaXQgb2YgdGhpcyBzY2hlbWUgaXMgdGhhdCBpdCBpcyBlYXN5IHRvIHByb3ZpZGUgbXVsdGlwbGUKLXZlcnNpb25zIG9mIGFueSBtZXRob2QsIGVhY2ggdHVuZWQgdG8gYSBwYXJ0aWN1bGFyIGNhc2UuICBXaGlsZSBhIGxvdCBvZgotcHJlY2FsY3VsYXRpb24gbWlnaHQgYmUgZG9uZSB0byBzZWxlY3QgYW4gb3B0aW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBhIG1ldGhvZCwKLXRoZSBjb3N0IHBlciBpbnZvY2F0aW9uIGlzIGNvbnN0YW50LiAgRm9yIGV4YW1wbGUsIHRoZSB1cHNhbXBsaW5nIHN0ZXAgbWlnaHQKLWhhdmUgYSAiZ2VuZXJpYyIgbWV0aG9kLCBwbHVzIG9uZSBvciBtb3JlICJoYXJkd2lyZWQiIG1ldGhvZHMgZm9yIHRoZSBtb3N0Ci1wb3B1bGFyIHNhbXBsaW5nIGZhY3RvcnM7IHRoZSBoYXJkd2lyZWQgbWV0aG9kcyB3b3VsZCBiZSBmYXN0ZXIgYmVjYXVzZSB0aGV5J2QKLXVzZSBzdHJhaWdodC1saW5lIGNvZGUgaW5zdGVhZCBvZiBmb3ItbG9vcHMuICBUaGUgY29zdCB0byBkZXRlcm1pbmUgd2hpY2gKLW1ldGhvZCB0byB1c2UgaXMgcGFpZCBvbmx5IG9uY2UsIGF0IHN0YXJ0dXAsIGFuZCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhIGFyZQotaGlkZGVuIGZyb20gdGhlIGNhbGxlcnMgb2YgdGhlIG1ldGhvZC4KLQotVGhpcyBwbGFuIGRpZmZlcnMgYSBsaXR0bGUgYml0IGZyb20gdXN1YWwgb2JqZWN0LW9yaWVudGVkIHN0cnVjdHVyZXMsIGluIHRoYXQKLW9ubHkgb25lIGluc3RhbmNlIG9mIGVhY2ggb2JqZWN0IGNsYXNzIHdpbGwgZXhpc3QgZHVyaW5nIGV4ZWN1dGlvbi4gIFRoZQotcmVhc29uIGZvciBoYXZpbmcgdGhlIGNsYXNzIHN0cnVjdHVyZSBpcyB0aGF0IG9uIGRpZmZlcmVudCBydW5zIHdlIG1heSBjcmVhdGUKLWRpZmZlcmVudCBpbnN0YW5jZXMgKGNob29zZSB0byBleGVjdXRlIGRpZmZlcmVudCBtb2R1bGVzKS4gIFlvdSBjYW4gdGhpbmsgb2YKLXRoZSB0ZXJtICJtZXRob2QiIGFzIGRlbm90aW5nIHRoZSBjb21tb24gaW50ZXJmYWNlIHByZXNlbnRlZCBieSBhIHBhcnRpY3VsYXIKLXNldCBvZiBpbnRlcmNoYW5nZWFibGUgZnVuY3Rpb25zLCBhbmQgIm9iamVjdCIgYXMgZGVub3RpbmcgYSBncm91cCBvZiByZWxhdGVkCi1tZXRob2RzLCBvciB0aGUgdG90YWwgc2hhcmVkIGludGVyZmFjZSBiZWhhdmlvciBvZiBhIGdyb3VwIG9mIG1vZHVsZXMuCi0KLQotKioqIE92ZXJhbGwgY29udHJvbCBzdHJ1Y3R1cmUgKioqCi0KLVdlIHByZXZpb3VzbHkgbWVudGlvbmVkIHRoZSBuZWVkIGZvciBvdmVyYWxsIGNvbnRyb2wgbG9naWMgaW4gdGhlIGNvbXByZXNzaW9uCi1hbmQgZGVjb21wcmVzc2lvbiBsaWJyYXJpZXMuICBJbiBJSkcgaW1wbGVtZW50YXRpb25zIHByaW9yIHRvIHY1LCBvdmVyYWxsCi1jb250cm9sIHdhcyBtb3N0bHkgcHJvdmlkZWQgYnkgInBpcGVsaW5lIGNvbnRyb2wiIG1vZHVsZXMsIHdoaWNoIHByb3ZlZCB0byBiZQotbGFyZ2UsIHVud2llbGR5LCBhbmQgaGFyZCB0byB1bmRlcnN0YW5kLiAgVG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uLCB0aGUKLWNvbnRyb2wgbG9naWMgaGFzIGJlZW4gc3ViZGl2aWRlZCBpbnRvIG11bHRpcGxlIG1vZHVsZXMuICBUaGUgY29udHJvbCBtb2R1bGVzCi1jb25zaXN0IG9mOgotCi0xLiBNYXN0ZXIgY29udHJvbCBmb3IgbW9kdWxlIHNlbGVjdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uICBUaGlzIGhhcyB0d28KLXJlc3BvbnNpYmlsaXRpZXM6Ci0KLSAgIDFBLiAgU3RhcnR1cCBpbml0aWFsaXphdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGltYWdlIHByb2Nlc3NpbmcuCi0gICAgICAgIFRoZSBpbmRpdmlkdWFsIHByb2Nlc3NpbmcgbW9kdWxlcyB0byBiZSB1c2VkIGluIHRoaXMgcnVuIGFyZSBzZWxlY3RlZAotICAgICAgICBhbmQgZ2l2ZW4gaW5pdGlhbGl6YXRpb24gY2FsbHMuCi0KLSAgIDFCLiAgUGVyLXBhc3MgY29udHJvbC4gIFRoaXMgZGV0ZXJtaW5lcyBob3cgbWFueSBwYXNzZXMgd2lsbCBiZSBwZXJmb3JtZWQKLSAgICAgICAgYW5kIGNhbGxzIGVhY2ggYWN0aXZlIHByb2Nlc3NpbmcgbW9kdWxlIHRvIGNvbmZpZ3VyZSBpdHNlbGYKLSAgICAgICAgYXBwcm9wcmlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIEVuZC1vZi1wYXNzIHByb2Nlc3NpbmcsCi0Jd2hlcmUgbmVjZXNzYXJ5LCBpcyBhbHNvIGludm9rZWQgZnJvbSB0aGUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlLgotCi0gICBNZXRob2Qgc2VsZWN0aW9uIGlzIHBhcnRpYWxseSBkaXN0cmlidXRlZCwgaW4gdGhhdCBhIHBhcnRpY3VsYXIgcHJvY2Vzc2luZwotICAgbW9kdWxlIG1heSBjb250YWluIHNldmVyYWwgcG9zc2libGUgaW1wbGVtZW50YXRpb25zIG9mIGEgcGFydGljdWxhciBtZXRob2QsCi0gICB3aGljaCBpdCB3aWxsIHNlbGVjdCBhbW9uZyB3aGVuIGdpdmVuIGl0cyBpbml0aWFsaXphdGlvbiBjYWxsLiAgVGhlIG1hc3RlcgotICAgY29udHJvbCBjb2RlIG5lZWQgb25seSBiZSBjb25jZXJuZWQgd2l0aCBkZWNpc2lvbnMgdGhhdCBhZmZlY3QgbW9yZSB0aGFuCi0gICBvbmUgbW9kdWxlLgotIAotMi4gRGF0YSBidWZmZXJpbmcgY29udHJvbC4gIEEgc2VwYXJhdGUgY29udHJvbCBtb2R1bGUgZXhpc3RzIGZvciBlYWNoCi0gICBpbnRlci1wcm9jZXNzaW5nLXN0ZXAgZGF0YSBidWZmZXIuICBUaGlzIG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IKLSAgIGludm9raW5nIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIHRoYXQgd3JpdGUgb3IgcmVhZCB0aGF0IGRhdGEgYnVmZmVyLgotCi1FYWNoIGJ1ZmZlciBjb250cm9sbGVyIHNlZXMgdGhlIHdvcmxkIGFzIGZvbGxvd3M6Ci0KLWlucHV0IGRhdGEgPT4gcHJvY2Vzc2luZyBzdGVwIEEgPT4gYnVmZmVyID0+IHByb2Nlc3Npbmcgc3RlcCBCID0+IG91dHB1dCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnRyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBjb250cm9sbGVyIGtub3dzIHRoZSBkYXRhZmxvdyByZXF1aXJlbWVudHMgb2Ygc3RlcHMgQSBhbmQgQjogaG93IG11Y2ggZGF0YQotdGhleSB3YW50IHRvIGFjY2VwdCBpbiBvbmUgY2h1bmsgYW5kIGhvdyBtdWNoIHRoZXkgb3V0cHV0IGluIG9uZSBjaHVuay4gIEl0cwotZnVuY3Rpb24gaXMgdG8gbWFuYWdlIGl0cyBidWZmZXIgYW5kIGNhbGwgQSBhbmQgQiBhdCB0aGUgcHJvcGVyIHRpbWVzLgotCi1BIGRhdGEgYnVmZmVyIGNvbnRyb2wgbW9kdWxlIG1heSBpdHNlbGYgYmUgdmlld2VkIGFzIGEgcHJvY2Vzc2luZyBzdGVwIGJ5IGEKLWhpZ2hlci1sZXZlbCBjb250cm9sIG1vZHVsZTsgdGh1cyB0aGUgY29udHJvbCBtb2R1bGVzIGZvcm0gYSBiaW5hcnkgdHJlZSB3aXRoCi1lbGVtZW50YXJ5IHByb2Nlc3Npbmcgc3RlcHMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZS4KLQotVGhlIGNvbnRyb2wgbW9kdWxlcyBhcmUgb2JqZWN0cy4gIEEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBmbGV4aWJpbGl0eSBjYW4KLWJlIGhhZCBieSByZXBsYWNpbmcgaW1wbGVtZW50YXRpb25zIG9mIGEgY29udHJvbCBtb2R1bGUuICBGb3IgZXhhbXBsZToKLSogTWVyZ2luZyBvZiBhZGphY2VudCBzdGVwcyBpbiB0aGUgcGlwZWxpbmUgaXMgZG9uZSBieSByZXBsYWNpbmcgYSBjb250cm9sCi0gIG1vZHVsZSBhbmQgaXRzIHBhaXIgb2YgcHJvY2Vzc2luZy1zdGVwIG1vZHVsZXMgd2l0aCBhIHNpbmdsZSBwcm9jZXNzaW5nLQotICBzdGVwIG1vZHVsZS4gIChIZW5jZSB0aGUgcG9zc2libGUgbWVyZ2VzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0cmVlIG9mCi0gIGNvbnRyb2wgbW9kdWxlcy4pCi0qIEluIHNvbWUgcHJvY2Vzc2luZyBtb2RlcywgYSBnaXZlbiBpbnRlcnN0ZXAgYnVmZmVyIG5lZWQgb25seSBiZSBhICJzdHJpcCIKLSAgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSB0aGUgZGVzaXJlZCBkYXRhIGNodW5rIHNpemVzLiAgSW4gb3RoZXIKLSAgbW9kZXMsIGEgZnVsbC1pbWFnZSBidWZmZXIgaXMgbmVlZGVkIGFuZCBzZXZlcmFsIHBhc3NlcyBhcmUgcmVxdWlyZWQuCi0gIFRoZSBjb250cm9sIG1vZHVsZSBkZXRlcm1pbmVzIHdoaWNoIGtpbmQgb2YgYnVmZmVyIGlzIHVzZWQgYW5kIG1hbmlwdWxhdGVzCi0gIHZpcnR1YWwgYXJyYXkgYnVmZmVycyBhcyBuZWVkZWQuICBPbmUgb3IgYm90aCBwcm9jZXNzaW5nIHN0ZXBzIG1heSBiZQotICB1bmF3YXJlIG9mIHRoZSBtdWx0aS1wYXNzIGJlaGF2aW9yLgotCi1JbiB0aGVvcnksIHdlIG1pZ2h0IGJlIGFibGUgdG8gbWFrZSBhbGwgb2YgdGhlIGRhdGEgYnVmZmVyIGNvbnRyb2xsZXJzCi1pbnRlcmNoYW5nZWFibGUgYW5kIHByb3ZpZGUganVzdCBvbmUgc2V0IG9mIGltcGxlbWVudGF0aW9ucyBmb3IgYWxsLiAgSW4KLXByYWN0aWNlLCBlYWNoIG9uZSBjb250YWlucyBjb25zaWRlcmFibGUgc3BlY2lhbC1jYXNlIHByb2Nlc3NpbmcgZm9yIGl0cwotcGFydGljdWxhciBqb2IuICBUaGUgYnVmZmVyIGNvbnRyb2xsZXIgY29uY2VwdCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYW4KLW92ZXJhbGwgc3lzdGVtIHN0cnVjdHVyaW5nIHByaW5jaXBsZSwgbm90IGFzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlCi10YXNrIHBlcmZvcm1lZCBieSBhbnkgb25lIGNvbnRyb2xsZXIuCi0KLQotKioqIENvbXByZXNzaW9uIG9iamVjdCBzdHJ1Y3R1cmUgKioqCi0KLUhlcmUgaXMgYSBza2V0Y2ggb2YgdGhlIGxvZ2ljYWwgc3RydWN0dXJlIG9mIHRoZSBKUEVHIGNvbXByZXNzaW9uIGxpYnJhcnk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gQ29sb3JzcGFjZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICB8LS0gUHJlcHJvY2Vzc2luZyBjb250cm9sbGVyIC0tfAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBEb3duc2FtcGxpbmcKLU1haW4gY29udHJvbGxlciAtLXwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEZvcndhcmQgRENULCBxdWFudGl6ZQotICAgICAgICAgICAgICAgICAgfC0tIENvZWZmaWNpZW50IGNvbnRyb2xsZXIgLS18Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBFbnRyb3B5IGVuY29kaW5nCi0KLVRoaXMgc2tldGNoIGFsc28gZGVzY3JpYmVzIHRoZSBmbG93IG9mIGNvbnRyb2wgKHN1YnJvdXRpbmUgY2FsbHMpIGR1cmluZwotdHlwaWNhbCBpbWFnZSBkYXRhIHByb2Nlc3NpbmcuICBFYWNoIG9mIHRoZSBjb21wb25lbnRzIHNob3duIGluIHRoZSBkaWFncmFtIGlzCi1hbiAib2JqZWN0IiB3aGljaCBtYXkgaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgYXZhaWxhYmxlLiAgT25lCi1vciBtb3JlIHNvdXJjZSBjb2RlIGZpbGVzIGNvbnRhaW4gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbihzKSBvZiBlYWNoIG9iamVjdC4KLQotVGhlIG9iamVjdHMgc2hvd24gYWJvdmUgYXJlOgotCi0qIE1haW4gY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJzYW1wbGVkLWRhdGEgYnVmZmVyLCB3aGljaAotICBob2xkcyB0aGUgcHJlcHJvY2Vzc2VkIGlucHV0IGRhdGEuICBUaGlzIGNvbnRyb2xsZXIgaW52b2tlcyBwcmVwcm9jZXNzaW5nIHRvCi0gIGZpbGwgdGhlIHN1YnNhbXBsZWQtZGF0YSBidWZmZXIsIGFuZCBKUEVHIGNvbXByZXNzaW9uIHRvIGVtcHR5IGl0LiAgVGhlcmUgaXMKLSAgdXN1YWxseSBubyBuZWVkIGZvciBhIGZ1bGwtaW1hZ2UgYnVmZmVyIGhlcmU7IGEgc3RyaXAgYnVmZmVyIGlzIGFkZXF1YXRlLgotCi0qIFByZXByb2Nlc3NpbmcgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBkb3duc2FtcGxpbmcgaW5wdXQgZGF0YQotICBidWZmZXIsIHdoaWNoIGxpZXMgYmV0d2VlbiBjb2xvcnNwYWNlIGNvbnZlcnNpb24gYW5kIGRvd25zYW1wbGluZy4gIE5vdGUKLSAgdGhhdCBhIHVuaWZpZWQgY29udmVyc2lvbi9kb3duc2FtcGxpbmcgbW9kdWxlIHdvdWxkIHByb2JhYmx5IHJlcGxhY2UgdGhpcwotICBjb250cm9sbGVyIGVudGlyZWx5LgotCi0qIENvbG9yc3BhY2UgY29udmVyc2lvbjogY29udmVydHMgYXBwbGljYXRpb24gaW1hZ2UgZGF0YSBpbnRvIHRoZSBkZXNpcmVkCi0gIEpQRUcgY29sb3Igc3BhY2U7IGFsc28gY2hhbmdlcyB0aGUgZGF0YSBmcm9tIHBpeGVsLWludGVybGVhdmVkIGxheW91dCB0bwotICBzZXBhcmF0ZSBjb21wb25lbnQgcGxhbmVzLiAgUHJvY2Vzc2VzIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lLgotCi0qIERvd25zYW1wbGluZzogcGVyZm9ybXMgcmVkdWN0aW9uIG9mIGNocm9tYSBjb21wb25lbnRzIGFzIHJlcXVpcmVkLgotICBPcHRpb25hbGx5IG1heSBwZXJmb3JtIHBpeGVsLWxldmVsIHNtb290aGluZyBhcyB3ZWxsLiAgUHJvY2Vzc2VzIGEgInJvdwotICBncm91cCIgYXQgYSB0aW1lLCB3aGVyZSBhIHJvdyBncm91cCBpcyBkZWZpbmVkIGFzIFZtYXggcGl4ZWwgcm93cyBvZiBlYWNoCi0gIGNvbXBvbmVudCBiZWZvcmUgZG93bnNhbXBsaW5nLCBhbmQgVmsgc2FtcGxlIHJvd3MgYWZ0ZXJ3YXJkcyAocmVtZW1iZXIgVmsKLSAgZGlmZmVycyBhY3Jvc3MgY29tcG9uZW50cykuICBTb21lIGRvd25zYW1wbGluZyBvciBzbW9vdGhpbmcgYWxnb3JpdGhtcyBtYXkKLSAgcmVxdWlyZSBjb250ZXh0IHJvd3MgYWJvdmUgYW5kIGJlbG93IHRoZSBjdXJyZW50IHJvdyBncm91cDsgdGhlCi0gIHByZXByb2Nlc3NpbmcgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIHRoZXNlIHJvd3MgdmlhIHByb3BlcgotICBidWZmZXJpbmcuICBUaGUgZG93bnNhbXBsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVkZ2UgZXhwYW5zaW9uIGF0IHRoZSByaWdodAotICBlZGdlIChpLmUuLCBleHRlbmRpbmcgZWFjaCBzYW1wbGUgcm93IHRvIGEgbXVsdGlwbGUgb2YgOCBzYW1wbGVzKTsgYnV0IHRoZQotICBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIHZlcnRpY2FsIGVkZ2UgZXhwYW5zaW9uIChpLmUuLAotICBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHNhbXBsZSByb3cgYXMgbmVlZGVkIHRvIG1ha2UgYSBtdWx0aXBsZSBvZiA4IHJvd3MpLgotCi0qIENvZWZmaWNpZW50IGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgRENULWNvZWZmaWNpZW50IGRhdGEuCi0gIFRoaXMgY29udHJvbGxlciBoYW5kbGVzIE1DVSBhc3NlbWJseSwgaW5jbHVkaW5nIGluc2VydGlvbiBvZiBkdW1teSBEQ1QKLSAgYmxvY2tzIHdoZW4gbmVlZGVkIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZS4gIFdoZW4gcGVyZm9ybWluZwotICBIdWZmbWFuLWNvZGUgb3B0aW1pemF0aW9uIG9yIGVtaXR0aW5nIGEgbXVsdGlzY2FuIEpQRUcgZmlsZSwgdGhpcwotICBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwgaW1hZ2UuICBUaGUgZXF1aXZhbGVudCBvZgotICBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyBvZiBzdWJzYW1wbGVkIGRhdGEgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLAotICBldmVuIHdoZW4gdGhlIEpQRUcgZmlsZSBpcyBub25pbnRlcmxlYXZlZC4KLQotKiBGb3J3YXJkIERDVCBhbmQgcXVhbnRpemF0aW9uOiBQZXJmb3JtIERDVCwgcXVhbnRpemUsIGFuZCBlbWl0IGNvZWZmaWNpZW50cy4KLSAgV29ya3Mgb24gb25lIG9yIG1vcmUgRENUIGJsb2NrcyBhdCBhIHRpbWUuICAoTm90ZTogdGhlIGNvZWZmaWNpZW50cyBhcmUgbm93Ci0gIGVtaXR0ZWQgaW4gbm9ybWFsIGFycmF5IG9yZGVyLCB3aGljaCB0aGUgZW50cm9weSBlbmNvZGVyIGlzIGV4cGVjdGVkIHRvCi0gIGNvbnZlcnQgdG8gemlnemFnIG9yZGVyIGFzIG5lY2Vzc2FyeS4gIFByaW9yIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSBkaWQKLSAgdGhlIGNvbnZlcnNpb24gdG8gemlnemFnIG9yZGVyIHdpdGhpbiB0aGUgcXVhbnRpemF0aW9uIHN0ZXAuKQotCi0qIEVudHJvcHkgZW5jb2Rpbmc6IFBlcmZvcm0gSHVmZm1hbiBvciBhcml0aG1ldGljIGVudHJvcHkgY29kaW5nIGFuZCBlbWl0IHRoZQotICBjb2RlZCBkYXRhIHRvIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZS4gIFdvcmtzIG9uIG9uZSBNQ1UgcGVyIGNhbGwuCi0gIEZvciBwcm9ncmVzc2l2ZSBKUEVHLCB0aGUgc2FtZSBEQ1QgYmxvY2tzIGFyZSBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIKLSAgZHVyaW5nIGVhY2ggcGFzcywgYW5kIHRoZSBjb2RlciBtdXN0IGVtaXQgdGhlIGFwcHJvcHJpYXRlIHN1YnNldCBvZgotICBjb2VmZmljaWVudHMuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBvYmplY3RzLCB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBpbmNsdWRlcyB0aGVzZQotb2JqZWN0czoKLQotKiBNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyByZXF1aXJlZCwgY29udHJvbHMgb3ZlcmFsbAotICBhbmQgcGVyLXBhc3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG90aGVyIG1vZHVsZXMuCi0KLSogTWFya2VyIHdyaXRpbmc6IGdlbmVyYXRlcyBKUEVHIG1hcmtlcnMgKGV4Y2VwdCBmb3IgUlNUbiwgd2hpY2ggaXMgZW1pdHRlZAotICBieSB0aGUgZW50cm9weSBlbmNvZGVyIHdoZW4gbmVlZGVkKS4KLQotKiBEYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXI6IHdyaXRlcyB0aGUgb3V0cHV0IEpQRUcgZGF0YXN0cmVhbSB0byBpdHMgZmluYWwKLSAgZGVzdGluYXRpb24gKGUuZy4sIGEgZmlsZSkuICBUaGUgZGVzdGluYXRpb24gbWFuYWdlciBzdXBwbGllZCB3aXRoIHRoZQotICBsaWJyYXJ5IGtub3dzIGhvdyB0byB3cml0ZSB0byBhIHN0ZGlvIHN0cmVhbTsgZm9yIG90aGVyIGJlaGF2aW9ycywgdGhlCi0gIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBwcm92aWRlIGl0cyBvd24gZGVzdGluYXRpb24gbWFuYWdlci4KLQotKiBNZW1vcnkgbWFuYWdlcjogYWxsb2NhdGVzIGFuZCByZWxlYXNlcyBtZW1vcnksIGNvbnRyb2xzIHZpcnR1YWwgYXJyYXlzCi0gICh3aXRoIGJhY2tpbmcgc3RvcmUgbWFuYWdlbWVudCwgd2hlcmUgcmVxdWlyZWQpLgotCi0qIEVycm9yIGhhbmRsZXI6IHBlcmZvcm1zIGZvcm1hdHRpbmcgYW5kIG91dHB1dCBvZiBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZXM7Ci0gIGRldGVybWluZXMgaGFuZGxpbmcgb2Ygbm9uZmF0YWwgZXJyb3JzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heQotICBvdmVycmlkZSBzb21lIG9yIGFsbCBvZiB0aGlzIG9iamVjdCdzIG1ldGhvZHMgdG8gY2hhbmdlIGVycm9yIGhhbmRsaW5nLgotCi0qIFByb2dyZXNzIG1vbml0b3I6IHN1cHBvcnRzIG91dHB1dCBvZiAicGVyY2VudC1kb25lIiBwcm9ncmVzcyByZXBvcnRzLgotICBUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbjoKLSAgaWYgd2FudGVkLCBpdCBtdXN0IGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQotVGhlIGVycm9yIGhhbmRsZXIsIGRlc3RpbmF0aW9uIG1hbmFnZXIsIGFuZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdHMgYXJlCi1kZWZpbmVkIGFzIHNlcGFyYXRlIG9iamVjdHMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgYXBwbGljYXRpb24tc3BlY2lmaWMKLWN1c3RvbWl6YXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeS4gIEEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlCi1pbmRpdmlkdWFsIG1ldGhvZHMgb3Igc3VwcGx5IGl0cyBvd24gYWxsLW5ldyBpbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlc2UKLW9iamVjdHMuICBUaGUgb2JqZWN0IGludGVyZmFjZXMgZm9yIHRoZXNlIG9iamVjdHMgYXJlIHRoZXJlZm9yZSB0cmVhdGVkIGFzCi1wYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugb2YgdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIG90aGVyIG9iamVjdHMKLWFyZSBpbnRlcm5hbCB0byB0aGUgbGlicmFyeS4KLQotVGhlIGVycm9yIGhhbmRsZXIgYW5kIG1lbW9yeSBtYW5hZ2VyIGFyZSBzaGFyZWQgYnkgSlBFRyBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb247IHRoZSBwcm9ncmVzcyBtb25pdG9yLCBpZiB1c2VkLCBtYXkgYmUgc2hhcmVkIGFzIHdlbGwuCi0KLQotKioqIERlY29tcHJlc3Npb24gb2JqZWN0IHN0cnVjdHVyZSAqKioKLQotSGVyZSBpcyBhIHNrZXRjaCBvZiB0aGUgbG9naWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBsaWJyYXJ5OgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBFbnRyb3B5IGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICB8LS0gQ29lZmZpY2llbnQgY29udHJvbGxlciAtLXwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIERlcXVhbnRpemUsIEludmVyc2UgRENUCi1NYWluIGNvbnRyb2xsZXIgLS18Ci0gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBVcHNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICB8LS0gUG9zdHByb2Nlc3NpbmcgY29udHJvbGxlciAtLXwgICB8LS0gQ29sb3JzcGFjZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBDb2xvciBxdWFudGl6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIENvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24KLQotQXMgYmVmb3JlLCB0aGlzIGRpYWdyYW0gYWxzbyByZXByZXNlbnRzIHR5cGljYWwgY29udHJvbCBmbG93LiAgVGhlIG9iamVjdHMKLXNob3duIGFyZToKLQotKiBNYWluIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgc3Vic2FtcGxlZC1kYXRhIGJ1ZmZlciwgd2hpY2gKLSAgaG9sZHMgdGhlIG91dHB1dCBvZiBKUEVHIGRlY29tcHJlc3Npb24gcHJvcGVyLiAgVGhpcyBjb250cm9sbGVyJ3MgcHJpbWFyeQotICB0YXNrIGlzIHRvIGZlZWQgdGhlIHBvc3Rwcm9jZXNzaW5nIHByb2NlZHVyZS4gIFNvbWUgdXBzYW1wbGluZyBhbGdvcml0aG1zCi0gIG1heSByZXF1aXJlIGNvbnRleHQgcm93cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGN1cnJlbnQgcm93IGdyb3VwOyB3aGVuIHRoaXMKLSAgaXMgdHJ1ZSwgdGhlIG1haW4gY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgaXRzIGJ1ZmZlciBzbyBhcwotICB0byBtYWtlIGNvbnRleHQgcm93cyBhdmFpbGFibGUuICBJbiB0aGUgY3VycmVudCBkZXNpZ24sIHRoZSBtYWluIGJ1ZmZlciBpcwotICBhbHdheXMgYSBzdHJpcCBidWZmZXI7IGEgZnVsbC1pbWFnZSBidWZmZXIgaXMgbmV2ZXIgcmVxdWlyZWQuCi0KLSogQ29lZmZpY2llbnQgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBEQ1QtY29lZmZpY2llbnQgZGF0YS4KLSAgVGhpcyBjb250cm9sbGVyIGhhbmRsZXMgTUNVIGRpc2Fzc2VtYmx5LCBpbmNsdWRpbmcgZGVsZXRpb24gb2YgYW55IGR1bW15Ci0gIERDVCBibG9ja3MgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlLiAgV2hlbiByZWFkaW5nIGEgbXVsdGlzY2FuIEpQRUcKLSAgZmlsZSwgdGhpcyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwgaW1hZ2UuCi0gIChCdWZmZXJpbmcgRENUIGNvZWZmaWNpZW50cywgcmF0aGVyIHRoYW4gc2FtcGxlcywgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQKLSAgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyBvZgotICBzdWJzYW1wbGVkIGRhdGEgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLCBldmVuIHdoZW4gdGhlIHNvdXJjZSBKUEVHIGZpbGUgaXMKLSAgbm9uaW50ZXJsZWF2ZWQuCi0KLSogRW50cm9weSBkZWNvZGluZzogUmVhZCBjb2RlZCBkYXRhIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZSBhbmQgcGVyZm9ybQotICBIdWZmbWFuIG9yIGFyaXRobWV0aWMgZW50cm9weSBkZWNvZGluZy4gIFdvcmtzIG9uIG9uZSBNQ1UgcGVyIGNhbGwuCi0gIEZvciBwcm9ncmVzc2l2ZSBKUEVHIGRlY29kaW5nLCB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBzdXBwbGllcyB0aGUgcHJpb3IKLSAgY29lZmZpY2llbnRzIG9mIGVhY2ggTUNVIChpbml0aWFsbHkgYWxsIHplcm9lcyksIHdoaWNoIHRoZSBlbnRyb3B5IGRlY29kZXIKLSAgbW9kaWZpZXMgaW4gZWFjaCBzY2FuLgotCi0qIERlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVDogbGlrZSBpdCBzYXlzLiAgTm90ZSB0aGF0IHRoZSBjb2VmZmljaWVudHMKLSAgYnVmZmVyZWQgYnkgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgaGF2ZSBOT1QgYmVlbiBkZXF1YW50aXplZDsgd2UKLSAgbWVyZ2UgZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIGludG8gYSBzaW5nbGUgc3RlcCBmb3Igc3BlZWQgcmVhc29ucy4KLSAgV2hlbiBzY2FsZWQtZG93biBvdXRwdXQgaXMgYXNrZWQgZm9yLCBzaW1wbGlmaWVkIERDVCBhbGdvcml0aG1zIG1heSBiZSB1c2VkCi0gIHRoYXQgZW1pdCBvbmx5IDF4MSwgMngyLCBvciA0eDQgc2FtcGxlcyBwZXIgRENUIGJsb2NrLCBub3QgdGhlIGZ1bGwgOHg4LgotICBXb3JrcyBvbiBvbmUgRENUIGJsb2NrIGF0IGEgdGltZS4KLQotKiBQb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIGNvbG9yIHF1YW50aXphdGlvbgotICBpbnB1dCBidWZmZXIsIHdoZW4gcXVhbnRpemF0aW9uIGlzIGluIHVzZS4gIChXaXRob3V0IHF1YW50aXphdGlvbiwgdGhpcwotICBjb250cm9sbGVyIGp1c3QgY2FsbHMgdGhlIHVwc2FtcGxlci4pICBGb3IgdHdvLXBhc3MgcXVhbnRpemF0aW9uLCB0aGlzCi0gIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbC1pbWFnZSBkYXRhLgotCi0qIFVwc2FtcGxpbmc6IHJlc3RvcmVzIGNocm9tYSBjb21wb25lbnRzIHRvIGZ1bGwgc2l6ZS4gIChNYXkgc3VwcG9ydCBtb3JlCi0gIGdlbmVyYWwgb3V0cHV0IHJlc2NhbGluZywgdG9vLiAgTm90ZSB0aGF0IGlmIHVuZGVyc2l6ZWQgRENUIG91dHB1dHMgaGF2ZQotICBiZWVuIGVtaXR0ZWQgYnkgdGhlIERDVCBtb2R1bGUsIHRoaXMgbW9kdWxlIG11c3QgYWRqdXN0IHNvIHRoYXQgcHJvcGVybHkKLSAgc2l6ZWQgb3V0cHV0cyBhcmUgY3JlYXRlZC4pICBXb3JrcyBvbiBvbmUgcm93IGdyb3VwIGF0IGEgdGltZS4gIFRoaXMgbW9kdWxlCi0gIGFsc28gY2FsbHMgdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLCBzbyBpdHMgdG9wIGxldmVsIGlzIGVmZmVjdGl2ZWx5IGEKLSAgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSB1cHNhbXBsaW5nLT5jb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4gIEhvd2V2ZXIsIGluCi0gIGFsbCBidXQgdGhlIGhpZ2hlc3QtcXVhbGl0eSBvcGVyYXRpbmcgbW9kZXMsIHVwc2FtcGxpbmcgYW5kIGNvbG9yCi0gIGNvbnZlcnNpb24gYXJlIGxpa2VseSB0byBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBzdGVwLgotCi0qIENvbG9yc3BhY2UgY29udmVyc2lvbjogY29udmVydCBmcm9tIEpQRUcgY29sb3Igc3BhY2UgdG8gb3V0cHV0IGNvbG9yIHNwYWNlLAotICBhbmQgY2hhbmdlIGRhdGEgbGF5b3V0IGZyb20gc2VwYXJhdGUgY29tcG9uZW50IHBsYW5lcyB0byBwaXhlbC1pbnRlcmxlYXZlZC4KLSAgV29ya3Mgb24gb25lIHBpeGVsIHJvdyBhdCBhIHRpbWUuCi0KLSogQ29sb3IgcXVhbnRpemF0aW9uOiByZWR1Y2UgdGhlIGRhdGEgdG8gY29sb3JtYXBwZWQgZm9ybSwgdXNpbmcgZWl0aGVyIGFuCi0gIGV4dGVybmFsbHkgc3BlY2lmaWVkIGNvbG9ybWFwIG9yIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkIG9uZS4gIFRoaXMgbW9kdWxlCi0gIGlzIG5vdCB1c2VkIGZvciBmdWxsLWNvbG9yIG91dHB1dC4gIFdvcmtzIG9uIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lOyBtYXkKLSAgcmVxdWlyZSB0d28gcGFzc2VzIHRvIGdlbmVyYXRlIGEgY29sb3IgbWFwLiAgTm90ZSB0aGF0IHRoZSBvdXRwdXQgd2lsbAotICBhbHdheXMgYmUgYSBzaW5nbGUgY29tcG9uZW50IHJlcHJlc2VudGluZyBjb2xvcm1hcCBpbmRleGVzLiAgSW4gdGhlIGN1cnJlbnQKLSAgZGVzaWduLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgSlNBTVBMRXMsIHNvIGFuIDgtYml0IGNvbXBpbGF0aW9uIGNhbm5vdAotICBxdWFudGl6ZSB0byBtb3JlIHRoYW4gMjU2IGNvbG9ycy4gIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBwcm9ibGVtIGluCi0gIHByYWN0aWNlLgotCi0qIENvbG9yIHJlZHVjdGlvbjogdGhpcyBtb2R1bGUgaGFuZGxlcyBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uLCBlLmcuLAotICBnZW5lcmF0aW5nIDE1LWJpdCBjb2xvciAoNSBiaXRzL3ByaW1hcnkpIGZyb20gSlBFRydzIDI0LWJpdCBvdXRwdXQuCi0gIE5vdCBxdWl0ZSBjbGVhciB5ZXQgaG93IHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuLi4gc2hvdWxkIHdlIG1lcmdlIGl0IHdpdGgKLSAgY29sb3JzcGFjZSBjb252ZXJzaW9uPz8/Ci0KLU5vdGUgdGhhdCBzb21lIGhpZ2gtc3BlZWQgb3BlcmF0aW5nIG1vZGVzIG1pZ2h0IGNvbmRlbnNlIHRoZSBlbnRpcmUKLXBvc3Rwcm9jZXNzaW5nIHNlcXVlbmNlIHRvIGEgc2luZ2xlIG1vZHVsZSAodXBzYW1wbGUsIGNvbG9yIGNvbnZlcnQsIGFuZAotcXVhbnRpemUgaW4gb25lIHN0ZXApLgotCi1JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgb2JqZWN0cywgdGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBpbmNsdWRlcyB0aGVzZQotb2JqZWN0czoKLQotKiBNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyByZXF1aXJlZCwgY29udHJvbHMgb3ZlcmFsbAotICBhbmQgcGVyLXBhc3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG90aGVyIG1vZHVsZXMuICBUaGlzIGlzIHN1YmRpdmlkZWQgaW50bwotICBpbnB1dCBhbmQgb3V0cHV0IGNvbnRyb2w6IGpkaW5wdXQuYyBjb250cm9scyBvbmx5IGlucHV0LXNpZGUgcHJvY2Vzc2luZywKLSAgd2hpbGUgamRtYXN0ZXIuYyBoYW5kbGVzIG92ZXJhbGwgaW5pdGlhbGl6YXRpb24gYW5kIG91dHB1dC1zaWRlIGNvbnRyb2wuCi0KLSogTWFya2VyIHJlYWRpbmc6IGRlY29kZXMgSlBFRyBtYXJrZXJzIChleGNlcHQgZm9yIFJTVG4pLgotCi0qIERhdGEgc291cmNlIG1hbmFnZXI6IHN1cHBsaWVzIHRoZSBpbnB1dCBKUEVHIGRhdGFzdHJlYW0uICBUaGUgc291cmNlCi0gIG1hbmFnZXIgc3VwcGxpZWQgd2l0aCB0aGUgbGlicmFyeSBrbm93cyBob3cgdG8gcmVhZCBmcm9tIGEgc3RkaW8gc3RyZWFtOwotICBmb3Igb3RoZXIgYmVoYXZpb3JzLCB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IHByb3ZpZGUgaXRzIG93biBzb3VyY2UKLSAgbWFuYWdlci4KLQotKiBNZW1vcnkgbWFuYWdlcjogc2FtZSBhcyBmb3IgY29tcHJlc3Npb24gbGlicmFyeS4KLQotKiBFcnJvciBoYW5kbGVyOiBzYW1lIGFzIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5LgotCi0qIFByb2dyZXNzIG1vbml0b3I6IHNhbWUgYXMgZm9yIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0KLUFzIHdpdGggY29tcHJlc3Npb24sIHRoZSBkYXRhIHNvdXJjZSBtYW5hZ2VyLCBlcnJvciBoYW5kbGVyLCBhbmQgcHJvZ3Jlc3MKLW1vbml0b3IgYXJlIGNhbmRpZGF0ZXMgZm9yIHJlcGxhY2VtZW50IGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0KLQotKioqIERlY29tcHJlc3Npb24gaW5wdXQgYW5kIG91dHB1dCBzZXBhcmF0aW9uICoqKgotCi1UbyBzdXBwb3J0IGVmZmljaWVudCBpbmNyZW1lbnRhbCBkaXNwbGF5IG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMsIHRoZQotZGVjb21wcmVzc29yIGlzIGRpdmlkZWQgaW50byB0d28gc2VjdGlvbnMgdGhhdCBjYW4gcnVuIGluZGVwZW5kZW50bHk6Ci0KLTEuIERhdGEgaW5wdXQgaW5jbHVkZXMgbWFya2VyIHBhcnNpbmcsIGVudHJvcHkgZGVjb2RpbmcsIGFuZCBpbnB1dCBpbnRvIHRoZQotICAgY29lZmZpY2llbnQgY29udHJvbGxlcidzIERDVCBjb2VmZmljaWVudCBidWZmZXIuICBOb3RlIHRoYXQgdGhpcwotICAgcHJvY2Vzc2luZyBpcyByZWxhdGl2ZWx5IGNoZWFwIGFuZCBmYXN0LgotCi0yLiBEYXRhIG91dHB1dCByZWFkcyBmcm9tIHRoZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyIGFuZCBwZXJmb3JtcyB0aGUgSURDVAotICAgYW5kIGFsbCBwb3N0cHJvY2Vzc2luZyBzdGVwcy4KLQotRm9yIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCB0aGUgZGF0YSBpbnB1dCBwcm9jZXNzaW5nIGlzIGFsbG93ZWQgdG8gZ2V0Ci1hcmJpdHJhcmlseSBmYXIgYWhlYWQgb2YgdGhlIGRhdGEgb3V0cHV0IHByb2Nlc3NpbmcuICAoVGhpcyBvY2N1cnMgb25seQotaWYgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIGpwZWdfY29uc3VtZV9pbnB1dCgpOyBvdGhlcndpc2UgaW5wdXQgYW5kIG91dHB1dAotcnVuIGluIGxvY2tzdGVwLCBzaW5jZSB0aGUgaW5wdXQgc2VjdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBvdXRwdXQKLXNlY3Rpb24gbmVlZHMgbW9yZSBkYXRhLikgIEluIHRoaXMgd2F5IHRoZSBhcHBsaWNhdGlvbiBjYW4gYXZvaWQgbWFraW5nCi1leHRyYSBkaXNwbGF5IHBhc3NlcyB3aGVuIGRhdGEgaXMgYXJyaXZpbmcgZmFzdGVyIHRoYW4gdGhlIGRpc3BsYXkgcGFzcwotY2FuIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpdCBpcyBwb3NzaWJsZSB0byBhYm9ydCBhbiBvdXRwdXQgcGFzcyB3aXRob3V0Ci1sb3NpbmcgYW55dGhpbmcsIHNpbmNlIHRoZSBjb2VmZmljaWVudCBidWZmZXIgaXMgcmVhZC1vbmx5IGFzIGZhciBhcyB0aGUKLW91dHB1dCBzZWN0aW9uIGlzIGNvbmNlcm5lZC4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBkZXRhaWwuCi0KLUEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBhcnJheSBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIEpQRUcgZmlsZSBoYXMgbXVsdGlwbGUKLXNjYW5zIChvciBpZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGJ1ZmZlcmVkLWltYWdlIG1vZGUgYW55d2F5KS4gIFdoZW4KLXJlYWRpbmcgYSBzaW5nbGUtc2NhbiBmaWxlLCB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBub3JtYWxseSBjcmVhdGVzIG9ubHkKLWEgb25lLU1DVSBidWZmZXIsIHNvIGlucHV0IGFuZCBvdXRwdXQgcHJvY2Vzc2luZyBtdXN0IHJ1biBpbiBsb2Nrc3RlcCBpbiB0aGlzCi1jYXNlLiAganBlZ19jb25zdW1lX2lucHV0KCkgaXMgZWZmZWN0aXZlbHkgYSBuby1vcCBpbiB0aGlzIHNpdHVhdGlvbi4KLQotVGhlIG1haW4gaW1wYWN0IG9mIGRpdmlkaW5nIHRoZSBkZWNvbXByZXNzb3IgaW4gdGhpcyBmYXNoaW9uIGlzIHRoYXQgd2UgbXVzdAotYmUgdmVyeSBjYXJlZnVsIHdpdGggc2hhcmVkIHZhcmlhYmxlcyBpbiB0aGUgY2luZm8gZGF0YSBzdHJ1Y3R1cmUuICBFYWNoCi12YXJpYWJsZSB0aGF0IGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgZGVjb21wcmVzc2lvbiBtdXN0IGJlCi1jbGFzc2lmaWVkIGFzIGJlbG9uZ2luZyB0byBkYXRhIGlucHV0IG9yIGRhdGEgb3V0cHV0LCBhbmQgZWFjaCBzZWN0aW9uIG11c3QKLWxvb2sgb25seSBhdCBpdHMgb3duIHZhcmlhYmxlcy4gIEZvciBleGFtcGxlLCB0aGUgZGF0YSBvdXRwdXQgc2VjdGlvbiBtYXkgbm90Ci1kZXBlbmQgb24gYW55IG9mIHRoZSB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY3VycmVudCBzY2FuIGluIHRoZSBKUEVHCi1maWxlLCBiZWNhdXNlIHRoZXNlIG1heSBjaGFuZ2UgYXMgdGhlIGRhdGEgaW5wdXQgc2VjdGlvbiBhZHZhbmNlcyBpbnRvIGEgbmV3Ci1zY2FuLgotCi1UaGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyAoc29tZXdoYXQgYXJiaXRyYXJpbHkpIGRlZmluZWQgdG8gdHJlYXQgaW5wdXQgb2YgdGhlCi1maWxlIGFzIG9uZSBwYXNzIHdoZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyBub3QgdXNlZCwgYW5kIHRvIGlnbm9yZSBkYXRhCi1pbnB1dCB3b3JrIGNvbXBsZXRlbHkgd2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIHVzZWQuICBOb3RlIHRoYXQgdGhlCi1saWJyYXJ5IGhhcyBubyByZWxpYWJsZSB3YXkgdG8gcHJlZGljdCB0aGUgbnVtYmVyIG9mIHBhc3NlcyB3aGVuIGRlYWxpbmcKLXdpdGggYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIG5vciBjYW4gaXQgcHJlZGljdCB0aGUgbnVtYmVyIG9mIG91dHB1dCBwYXNzZXMKLWluIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICBTbyB0aGUgd29yayBlc3RpbWF0ZSBpcyBpbmhlcmVudGx5IGJvZ3VzIGFueXdheS4KLQotTm8gY29tcGFyYWJsZSBkaXZpc2lvbiBpcyBjdXJyZW50bHkgbWFkZSBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwgYmVjYXVzZQotdGhlcmUgaXNuJ3QgYW55IHJlYWwgbmVlZCBmb3IgaXQuCi0KLQotKioqIERhdGEgZm9ybWF0cyAqKioKLQotQXJyYXlzIG9mIHBpeGVsIHNhbXBsZSB2YWx1ZXMgdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmU6Ci0KLSAgICB0eXBlZGVmIHNvbWV0aGluZyBKU0FNUExFOwkJYSBwaXhlbCBjb21wb25lbnQgdmFsdWUsIDAuLk1BWEpTQU1QTEUKLSAgICB0eXBlZGVmIEpTQU1QTEUgKkpTQU1QUk9XOwkJcHRyIHRvIGEgcm93IG9mIHNhbXBsZXMKLSAgICB0eXBlZGVmIEpTQU1QUk9XICpKU0FNUEFSUkFZOwlwdHIgdG8gYSBsaXN0IG9mIHJvd3MKLSAgICB0eXBlZGVmIEpTQU1QQVJSQVkgKkpTQU1QSU1BR0U7CXB0ciB0byBhIGxpc3Qgb2YgY29sb3ItY29tcG9uZW50IGFycmF5cwotCi1UaGUgYmFzaWMgZWxlbWVudCB0eXBlIEpTQU1QTEUgd2lsbCB0eXBpY2FsbHkgYmUgb25lIG9mIHVuc2lnbmVkIGNoYXIsCi0oc2lnbmVkKSBjaGFyLCBvciBzaG9ydC4gIFNob3J0IHdpbGwgYmUgdXNlZCBpZiBzYW1wbGVzIHdpZGVyIHRoYW4gOCBiaXRzIGFyZQotdG8gYmUgc3VwcG9ydGVkICh0aGlzIGlzIGEgY29tcGlsZS10aW1lIG9wdGlvbikuICBPdGhlcndpc2UsIHVuc2lnbmVkIGNoYXIgaXMKLXVzZWQgaWYgcG9zc2libGUuICBJZiB0aGUgY29tcGlsZXIgb25seSBzdXBwb3J0cyBzaWduZWQgY2hhcnMsIHRoZW4gaXQgaXMKLW5lY2Vzc2FyeSB0byBtYXNrIG9mZiB0aGUgdmFsdWUgd2hlbiByZWFkaW5nLiAgVGh1cywgYWxsIHJlYWRzIG9mIEpTQU1QTEUKLXZhbHVlcyBtdXN0IGJlIGNvZGVkIGFzICJHRVRKU0FNUExFKHZhbHVlKSIsIHdoZXJlIHRoZSBtYWNybyB3aWxsIGJlIGRlZmluZWQKLWFzICIoKHZhbHVlKSAmIDB4RkYpIiBvbiBzaWduZWQtY2hhciBtYWNoaW5lcyBhbmQgIigoaW50KSAodmFsdWUpKSIgZWxzZXdoZXJlLgotCi1XaXRoIHRoZXNlIGNvbnZlbnRpb25zLCBKU0FNUExFIHZhbHVlcyBjYW4gYmUgYXNzdW1lZCB0byBiZSA+PSAwLiAgVGhpcyBoZWxwcwotc2ltcGxpZnkgY29ycmVjdCByb3VuZGluZyBkdXJpbmcgZG93bnNhbXBsaW5nLCBldGMuICBUaGUgSlBFRyBzdGFuZGFyZCdzCi1zcGVjaWZpY2F0aW9uIHRoYXQgc2FtcGxlIHZhbHVlcyBydW4gZnJvbSAtMTI4Li4xMjcgaXMgYWNjb21tb2RhdGVkIGJ5Ci1zdWJ0cmFjdGluZyAxMjgganVzdCBhcyB0aGUgc2FtcGxlIHZhbHVlIGlzIGNvcGllZCBpbnRvIHRoZSBzb3VyY2UgYXJyYXkgZm9yCi10aGUgRENUIHN0ZXAgKHRoaXMgd2lsbCBiZSBhbiBhcnJheSBvZiBzaWduZWQgaW50cykuICBTaW1pbGFybHksIGR1cmluZwotZGVjb21wcmVzc2lvbiB0aGUgb3V0cHV0IG9mIHRoZSBJRENUIHN0ZXAgd2lsbCBiZSBpbW1lZGlhdGVseSBzaGlmdGVkIGJhY2sgdG8KLTAuLjI1NS4gIChOQjogZGlmZmVyZW50IHZhbHVlcyBhcmUgcmVxdWlyZWQgd2hlbiAxMi1iaXQgc2FtcGxlcyBhcmUgaW4gdXNlLgotVGhlIGNvZGUgaXMgd3JpdHRlbiBpbiB0ZXJtcyBvZiBNQVhKU0FNUExFIGFuZCBDRU5URVJKU0FNUExFLCB3aGljaCB3aWxsIGJlCi1kZWZpbmVkIGFzIDI1NSBhbmQgMTI4IHJlc3BlY3RpdmVseSBpbiBhbiA4LWJpdCBpbXBsZW1lbnRhdGlvbiwgYW5kIGFzIDQwOTUKLWFuZCAyMDQ4IGluIGEgMTItYml0IGltcGxlbWVudGF0aW9uLikKLQotV2UgdXNlIGEgcG9pbnRlciBwZXIgcm93LCByYXRoZXIgdGhhbiBhIHR3by1kaW1lbnNpb25hbCBKU0FNUExFIGFycmF5LiAgVGhpcwotY2hvaWNlIGNvc3RzIG9ubHkgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGFuZCBoYXMgc2V2ZXJhbCBiZW5lZml0czoKLSogQ29kZSB1c2luZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZG9lc24ndCBuZWVkIHRvIGtub3cgdGhlIGFsbG9jYXRlZCB3aWR0aCBvZgotICB0aGUgcm93cy4gIFRoaXMgc2ltcGxpZmllcyBlZGdlIGV4cGFuc2lvbi9jb21wcmVzc2lvbiwgc2luY2Ugd2UgY2FuIHdvcmsKLSAgaW4gYW4gYXJyYXkgdGhhdCdzIHdpZGVyIHRoYW4gdGhlIGxvZ2ljYWwgcGljdHVyZSB3aWR0aC4KLSogSW5kZXhpbmcgZG9lc24ndCByZXF1aXJlIG11bHRpcGxpY2F0aW9uOyB0aGlzIGlzIGEgcGVyZm9ybWFuY2Ugd2luIG9uIG1hbnkKLSAgbWFjaGluZXMuCi0qIEFycmF5cyB3aXRoIG1vcmUgdGhhbiA2NEsgdG90YWwgZWxlbWVudHMgY2FuIGJlIHN1cHBvcnRlZCBldmVuIG9uIG1hY2hpbmVzCi0gIHdoZXJlIG1hbGxvYygpIGNhbm5vdCBhbGxvY2F0ZSBjaHVua3MgbGFyZ2VyIHRoYW4gNjRLLgotKiBUaGUgcm93cyBmb3JtaW5nIGEgY29tcG9uZW50IGFycmF5IG1heSBiZSBhbGxvY2F0ZWQgYXQgZGlmZmVyZW50IHRpbWVzCi0gIHdpdGhvdXQgZXh0cmEgY29weWluZy4gIFRoaXMgdHJpY2sgYWxsb3dzIHNvbWUgc3BlZWR1cHMgaW4gc21vb3RoaW5nIHN0ZXBzCi0gIHRoYXQgbmVlZCBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGFuZCBuZXh0IHJvd3MuCi0KLU5vdGUgdGhhdCBlYWNoIGNvbG9yIGNvbXBvbmVudCBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBhcnJheTsgd2UgZG9uJ3QgdXNlIHRoZQotdHJhZGl0aW9uYWwgbGF5b3V0IGluIHdoaWNoIHRoZSBjb21wb25lbnRzIG9mIGEgcGl4ZWwgYXJlIHN0b3JlZCB0b2dldGhlci4KLVRoaXMgc2ltcGxpZmllcyBjb2Rpbmcgb2YgbW9kdWxlcyB0aGF0IHdvcmsgb24gZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseSwKLWJlY2F1c2UgdGhleSBkb24ndCBuZWVkIHRvIGtub3cgaG93IG1hbnkgY29tcG9uZW50cyB0aGVyZSBhcmUuICBGdXJ0aGVybW9yZSwKLXdlIGNhbiByZWFkIG9yIHdyaXRlIGVhY2ggY29tcG9uZW50IHRvIGEgdGVtcG9yYXJ5IGZpbGUgaW5kZXBlbmRlbnRseSwgd2hpY2gKLWlzIGhlbHBmdWwgd2hlbiBkZWFsaW5nIHdpdGggbm9uaW50ZXJsZWF2ZWQgSlBFRyBmaWxlcy4KLQotSW4gZ2VuZXJhbCwgYSBzcGVjaWZpYyBzYW1wbGUgdmFsdWUgaXMgYWNjZXNzZWQgYnkgY29kZSBzdWNoIGFzCi0JR0VUSlNBTVBMRShpbWFnZVtjb2xvcmNvbXBvbmVudF1bcm93XVtjb2xdKQotd2hlcmUgY29sIGlzIG1lYXN1cmVkIGZyb20gdGhlIGltYWdlIGxlZnQgZWRnZSwgYnV0IHJvdyBpcyBtZWFzdXJlZCBmcm9tIHRoZQotZmlyc3Qgc2FtcGxlIHJvdyBjdXJyZW50bHkgaW4gbWVtb3J5LiAgRWl0aGVyIG9mIHRoZSBmaXJzdCB0d28gaW5kZXhpbmdzIGNhbgotYmUgcHJlY29tcHV0ZWQgYnkgY29weWluZyB0aGUgcmVsZXZhbnQgcG9pbnRlci4KLQotCi1TaW5jZSBtb3N0IGltYWdlLXByb2Nlc3NpbmcgYXBwbGljYXRpb25zIHByZWZlciB0byB3b3JrIG9uIGltYWdlcyBpbiB3aGljaAotdGhlIGNvbXBvbmVudHMgb2YgYSBwaXhlbCBhcmUgc3RvcmVkIHRvZ2V0aGVyLCB0aGUgZGF0YSBwYXNzZWQgdG8gb3IgZnJvbSB0aGUKLXN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHRyYWRpdGlvbmFsIGNvbnZlbnRpb246IGEgc2luZ2xlIHBpeGVsIGlzCi1yZXByZXNlbnRlZCBieSBOIGNvbnNlY3V0aXZlIEpTQU1QTEUgdmFsdWVzLCBhbmQgYW4gaW1hZ2Ugcm93IGlzIGFuIGFycmF5IG9mCi0oIyBvZiBjb2xvciBjb21wb25lbnRzKSooaW1hZ2Ugd2lkdGgpIEpTQU1QTEVzLiAgT25lIG9yIG1vcmUgcm93cyBvZiBkYXRhIGNhbgotYmUgcmVwcmVzZW50ZWQgYnkgYSBwb2ludGVyIG9mIHR5cGUgSlNBTVBBUlJBWSBpbiB0aGlzIHNjaGVtZS4gIFRoaXMgc2NoZW1lIGlzCi1jb252ZXJ0ZWQgdG8gY29tcG9uZW50LXdpc2Ugc3RvcmFnZSBpbnNpZGUgdGhlIEpQRUcgbGlicmFyeS4gIChBcHBsaWNhdGlvbnMKLXRoYXQgd2FudCB0byBza2lwIEpQRUcgcHJlcHJvY2Vzc2luZyBvciBwb3N0cHJvY2Vzc2luZyB3aWxsIGhhdmUgdG8gY29udGVuZAotd2l0aCBjb21wb25lbnQtd2lzZSBzdG9yYWdlLikKLQotCi1BcnJheXMgb2YgRENULWNvZWZmaWNpZW50IHZhbHVlcyB1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZToKLQotICAgIHR5cGVkZWYgc2hvcnQgSkNPRUY7CQlhIDE2LWJpdCBzaWduZWQgaW50ZWdlcgotICAgIHR5cGVkZWYgSkNPRUYgSkJMT0NLW0RDVFNJWkUyXTsJYW4gOHg4IGJsb2NrIG9mIGNvZWZmaWNpZW50cwotICAgIHR5cGVkZWYgSkJMT0NLICpKQkxPQ0tST1c7CQlwdHIgdG8gb25lIGhvcml6b250YWwgcm93IG9mIDh4OCBibG9ja3MKLSAgICB0eXBlZGVmIEpCTE9DS1JPVyAqSkJMT0NLQVJSQVk7CXB0ciB0byBhIGxpc3Qgb2Ygc3VjaCByb3dzCi0gICAgdHlwZWRlZiBKQkxPQ0tBUlJBWSAqSkJMT0NLSU1BR0U7CXB0ciB0byBhIGxpc3Qgb2YgY29sb3IgY29tcG9uZW50IGFycmF5cwotCi1UaGUgdW5kZXJseWluZyB0eXBlIGlzIGF0IGxlYXN0IGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyOyB3aGlsZSAic2hvcnQiIGlzIGJpZwotZW5vdWdoIG9uIGFsbCBtYWNoaW5lcyBvZiBpbnRlcmVzdCwgb24gc29tZSBtYWNoaW5lcyBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZQotImludCIgZm9yIHNwZWVkIHJlYXNvbnMsIGRlc3BpdGUgdGhlIHN0b3JhZ2UgY29zdC4gIENvZWZmaWNpZW50cyBhcmUgZ3JvdXBlZAotaW50byA4eDggYmxvY2tzIChidXQgd2UgYWx3YXlzIHVzZSAjZGVmaW5lcyBEQ1RTSVpFIGFuZCBEQ1RTSVpFMiByYXRoZXIgdGhhbgotIjgiIGFuZCAiNjQiKS4KLQotVGhlIGNvbnRlbnRzIG9mIGEgY29lZmZpY2llbnQgYmxvY2sgbWF5IGJlIGluIGVpdGhlciAibmF0dXJhbCIgb3IgemlnemFnZ2VkCi1vcmRlciwgYW5kIG1heSBiZSB0cnVlIHZhbHVlcyBvciBkaXZpZGVkIGJ5IHRoZSBxdWFudGl6YXRpb24gY29lZmZpY2llbnRzLAotZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBibG9jayBpcyBpbiB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZS4gIEluIHRoZSBjdXJyZW50Ci1saWJyYXJ5LCBjb2VmZmljaWVudCBibG9ja3MgYXJlIGtlcHQgaW4gbmF0dXJhbCBvcmRlciBldmVyeXdoZXJlOyB0aGUgZW50cm9weQotY29kZWNzIHppZ3phZyBvciBkZXppZ3phZyB0aGUgZGF0YSBhcyBpdCBpcyB3cml0dGVuIG9yIHJlYWQuICBUaGUgYmxvY2tzCi1jb250YWluIHF1YW50aXplZCBjb2VmZmljaWVudHMgZXZlcnl3aGVyZSBvdXRzaWRlIHRoZSBEQ1QvSURDVCBzdWJzeXN0ZW1zLgotKFRoaXMgbGF0dGVyIGRlY2lzaW9uIG1heSBuZWVkIHRvIGJlIHJldmlzaXRlZCB0byBzdXBwb3J0IHZhcmlhYmxlCi1xdWFudGl6YXRpb24gYSBsYSBKUEVHIFBhcnQgMy4pCi0KLU5vdGljZSB0aGF0IHRoZSBhbGxvY2F0aW9uIHVuaXQgaXMgbm93IGEgcm93IG9mIDh4OCBibG9ja3MsIGNvcnJlc3BvbmRpbmcgdG8KLWVpZ2h0IHJvd3Mgb2Ygc2FtcGxlcy4gIE90aGVyd2lzZSB0aGUgc3RydWN0dXJlIGlzIG11Y2ggdGhlIHNhbWUgYXMgZm9yCi1zYW1wbGVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMuCi0KLU9uIG1hY2hpbmVzIHdoZXJlIG1hbGxvYygpIGNhbid0IGhhbmRsZSBhIHJlcXVlc3QgYmlnZ2VyIHRoYW4gNjRLYiwgdGhpcyBkYXRhCi1zdHJ1Y3R1cmUgbGltaXRzIHVzIHRvIHJvd3Mgb2YgbGVzcyB0aGFuIDUxMiBKQkxPQ0tzLCBvciBhIHBpY3R1cmUgd2lkdGggb2YKLTQwMDArIHBpeGVscy4gIFRoaXMgc2VlbXMgYW4gYWNjZXB0YWJsZSByZXN0cmljdGlvbi4KLQotCi1PbiA4MHg4NiBtYWNoaW5lcywgdGhlIGJvdHRvbS1sZXZlbCBwb2ludGVyIHR5cGVzIChKU0FNUFJPVyBhbmQgSkJMT0NLUk9XKQotbXVzdCBiZSBkZWNsYXJlZCBhcyAiZmFyIiBwb2ludGVycywgYnV0IHRoZSB1cHBlciBsZXZlbHMgY2FuIGJlICJuZWFyIgotKGltcGx5aW5nIHRoYXQgdGhlIHBvaW50ZXIgbGlzdHMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgRFMgc2VnbWVudCkuCi1XZSB1c2UgYSAjZGVmaW5lIHN5bWJvbCBGQVIsIHdoaWNoIGV4cGFuZHMgdG8gdGhlICJmYXIiIGtleXdvcmQgd2hlbgotY29tcGlsaW5nIG9uIDgweDg2IG1hY2hpbmVzIGFuZCB0byBub3RoaW5nIGVsc2V3aGVyZS4KLQotCi0qKiogU3VzcGVuZGFibGUgcHJvY2Vzc2luZyAqKioKLQotSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgaXMgZGVzaXJhYmxlIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGFzIGFuCi1pbmNyZW1lbnRhbCwgbWVtb3J5LXRvLW1lbW9yeSBmaWx0ZXIuICBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgZGF0YSBzb3VyY2Ugb3IKLWRlc3RpbmF0aW9uIG1heSBiZSBhIGxpbWl0ZWQtc2l6ZSBidWZmZXIsIGFuZCB3ZSBjYW4ndCByZWx5IG9uIGJlaW5nIGFibGUgdG8KLWVtcHR5IG9yIHJlZmlsbCB0aGUgYnVmZmVyIGF0IGFyYml0cmFyeSB0aW1lcy4gIEluc3RlYWQgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCi1saWtlIHRvIGhhdmUgY29udHJvbCByZXR1cm4gZnJvbSB0aGUgbGlicmFyeSBhdCBidWZmZXIgb3ZlcmZsb3cvdW5kZXJydW4sIGFuZAotdGhlbiByZXN1bWUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBhdCBhIGxhdGVyIHRpbWUuCi0KLVRoaXMgc2NlbmFyaW8gaXMgc3VwcG9ydGVkIGZvciBzaW1wbGUgY2FzZXMuICAoRm9yIGFueXRoaW5nIG1vcmUgY29tcGxleCwgd2UKLXJlY29tbWVuZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgZGV2ZWxvcCByZWFsIG11bHRpdGFza2luZwotY2FwYWJpbGl0eS4pICBUaGUgbGlianBlZy5kb2MgZmlsZSBnb2VzIGludG8gbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHVzYWdlIGFuZAotbGltaXRhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5OyBoZXJlIHdlIGFkZHJlc3MgdGhlIGltcGxpY2F0aW9ucyBmb3IgbGlicmFyeQotc3RydWN0dXJlLgotCi1UaGUgZXNzZW5jZSBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBlbnRyb3B5IGNvZGVjIChjb2RlciBvciBkZWNvZGVyKSBtdXN0Ci1iZSBwcmVwYXJlZCB0byBzdG9wIGF0IGFyYml0cmFyeSB0aW1lcy4gIEluIHR1cm4sIHRoZSBjb250cm9sbGVycyB0aGF0IGNhbGwKLXRoZSBlbnRyb3B5IGNvZGVjIG11c3QgYmUgYWJsZSB0byBzdG9wIGJlZm9yZSBoYXZpbmcgcHJvZHVjZWQgb3IgY29uc3VtZWQgYWxsCi10aGUgZGF0YSB0aGF0IHRoZXkgbm9ybWFsbHkgd291bGQgaGFuZGxlIGluIG9uZSBjYWxsLiAgVGhhdCBwYXJ0IGlzIHJlYXNvbmFibHkKLXN0cmFpZ2h0Zm9yd2FyZDogd2UgbWFrZSB0aGUgY29udHJvbGxlciBjYWxsIGludGVyZmFjZXMgaW5jbHVkZSAicHJvZ3Jlc3MKLWNvdW50ZXJzIiB3aGljaCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGRhdGEgY2h1bmtzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGFuZAotd2UgcmVxdWlyZSBjYWxsZXJzIHRvIHRlc3QgdGhlIGNvdW50ZXIgcmF0aGVyIHRoYW4ganVzdCBhc3N1bWUgYWxsIG9mIHRoZSBkYXRhCi13YXMgcHJvY2Vzc2VkLgotCi1SYXRoZXIgdGhhbiB0cnlpbmcgdG8gcmVzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBjdXJyZW50IEh1ZmZtYW4KLWNvZGVjcyBhcmUgZGVzaWduZWQgdG8gcmVzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IE1DVSBhZnRlciBhCi1zdXNwZW5zaW9uIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3cvdW5kZXJydW4uICBBdCB0aGUgc3RhcnQgb2YgZWFjaCBjYWxsLCB0aGUKLWNvZGVjJ3MgaW50ZXJuYWwgc3RhdGUgaXMgbG9hZGVkIGZyb20gcGVybWFuZW50IHN0b3JhZ2UgKGluIHRoZSBKUEVHIG9iamVjdAotc3RydWN0dXJlcykgaW50byBsb2NhbCB2YXJpYWJsZXMuICBPbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIE1DVSwgdGhlCi1wZXJtYW5lbnQgc3RhdGUgaXMgdXBkYXRlZC4gIChUaGlzIGNvcHlpbmcgaXMgbm90IHZlcnkgZXhwZW5zaXZlLCBhbmQgbWF5IGV2ZW4KLWxlYWQgdG8gKmltcHJvdmVkKiBwZXJmb3JtYW5jZSBpZiB0aGUgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSByZWdpc3Rlcml6ZWQuKQotSWYgYSBzdXNwZW5zaW9uIG9jY3VycywgdGhlIGNvZGVjIHNpbXBseSByZXR1cm5zIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHN0YXRlLAotdGh1cyBlZmZlY3RpdmVseSByZXZlcnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBNQ1UuICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzCi1sZWF2aW5nIHNvbWUgZGF0YSB1bnByb2Nlc3NlZCBpbiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGJ1ZmZlciAoaWUsIHRoZQotY29tcHJlc3NlZCBwYXJ0aWFsIE1DVSkuICBUaGUgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlIGludGVyZmFjZXMgYXJlCi1zcGVjaWZpZWQgc28gYXMgdG8gbWFrZSB0aGlzIHBvc3NpYmxlLiAgVGhpcyBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZGF0YSBidWZmZXIKLW11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSB3b3JzdC1jYXNlIGNvbXByZXNzZWQgTUNVOyBhIGNvdXBsZSB0aG91c2FuZAotYnl0ZXMgc2hvdWxkIGJlIGVub3VnaC4KLQotSW4gYSBzdWNjZXNzaXZlLWFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBzY2FuLCB0aGUgcHJvZ3Jlc3NpdmUgSHVmZm1hbgotZGVjb2RlciBoYXMgdG8gYmUgYWJsZSB0byB1bmRvIGFzc2lnbm1lbnRzIG9mIG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnRzIGlmIGl0Ci1zdXNwZW5kcyBiZWZvcmUgdGhlIE1DVSBpcyBjb21wbGV0ZSwgc2luY2UgZGVjb2RpbmcgcmVxdWlyZXMgZGlzdGluZ3Vpc2hpbmcKLXByZXZpb3VzbHktemVybyBhbmQgcHJldmlvdXNseS1ub256ZXJvIGNvZWZmaWNpZW50cy4gIFRoaXMgaXMgYSBiaXQgdGVkaW91cwotYnV0IHByb2JhYmx5IHdvbid0IGhhdmUgbXVjaCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuICBPdGhlciB2YXJpYW50cyBvZiBIdWZmbWFuCi1kZWNvZGluZyBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGlzLCBzaW5jZSB0aGV5IHdpbGwganVzdCBzdG9yZSB0aGUgc2FtZSB2YWx1ZXMKLWFnYWluIGlmIGZvcmNlZCB0byByZXBlYXQgdGhlIE1DVS4KLQotVGhpcyBhcHByb2FjaCB3b3VsZCBwcm9iYWJseSBub3Qgd29yayBmb3IgYW4gYXJpdGhtZXRpYyBjb2RlYywgc2luY2UgaXRzCi1tb2RpZmlhYmxlIHN0YXRlIGlzIHF1aXRlIGxhcmdlIGFuZCBjb3VsZG4ndCBiZSBjb3BpZWQgY2hlYXBseS4gIEluc3RlYWQgaXQKLXdvdWxkIGhhdmUgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIGV4YWN0bHkgYXQgdGhlIHBvaW50IG9mIHRoZSBidWZmZXIgZW5kLgotCi1UaGUgSlBFRyBtYXJrZXIgcmVhZGVyIGlzIGRlc2lnbmVkIHRvIGNvcGUgd2l0aCBzdXNwZW5zaW9uIGF0IGFuIGFyYml0cmFyeQotcG9pbnQuICBJdCBkb2VzIHNvIGJ5IGJhY2tpbmcgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXJrZXIgcGFyYW1ldGVyIHNlZ21lbnQsCi1zbyB0aGUgZGF0YSBidWZmZXIgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGxhcmdlc3QgbWFya2VyIG9mIGludGVyZXN0LgotQWdhaW4sIGEgY291cGxlIEtCIHNob3VsZCBiZSBhZGVxdWF0ZS4gIChBIHNwZWNpYWwgInNraXAiIGNvbnZlbnRpb24gaXMgdXNlZAotdG8gYnlwYXNzIENPTSBhbmQgQVBQbiBtYXJrZXJzLCBzbyB0aGVzZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplCi13aXRob3V0IGNhdXNpbmcgcHJvYmxlbXM7IG90aGVyd2lzZSBhIDY0SyBidWZmZXIgd291bGQgYmUgbmVlZGVkIGluIHRoZSB3b3JzdAotY2FzZS4pCi0KLVRoZSBKUEVHIG1hcmtlciB3cml0ZXIgY3VycmVudGx5IGRvZXMgKm5vdCogY29wZSB3aXRoIHN1c3BlbnNpb24uICBJIGZlZWwgdGhhdAotdGhpcyBpcyBub3QgbmVjZXNzYXJ5OyBpdCBpcyBtdWNoIGVhc2llciBzaW1wbHkgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KLWVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHNwYWNlIGJlZm9yZSBzdGFydGluZy4gIChBbiBlbXB0eSAySyBidWZmZXIgaXMKLW1vcmUgdGhhbiBzdWZmaWNpZW50IGZvciB0aGUgaGVhZGVyIG1hcmtlcnM7IGFuZCBlbnN1cmluZyB0aGVyZSBhcmUgYSBkb3plbiBvcgotdHdvIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHdpbGwgc3VmZmljZSBmb3IgdGhlCi10cmFpbGVyLikgIFRoaXMgd291bGQgbm90IHdvcmsgZm9yIHdyaXRpbmcgbXVsdGktc2NhbiBKUEVHIGZpbGVzLCBidXQKLXdlIHNpbXBseSBkbyBub3QgaW50ZW5kIHRvIHN1cHBvcnQgdGhhdCBjYXBhYmlsaXR5IHdpdGggc3VzcGVuc2lvbi4KLQotCi0qKiogTWVtb3J5IG1hbmFnZXIgc2VydmljZXMgKioqCi0KLVRoZSBKUEVHIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciBjb250cm9scyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gb2YKLW1lbW9yeSwgYW5kIGl0IG1hbmFnZXMgbGFyZ2UgInZpcnR1YWwiIGRhdGEgYXJyYXlzIG9uIG1hY2hpbmVzIHdoZXJlIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHZpcnR1YWwgbWVtb3J5LiAgTm90ZSB0aGF0IHRoZSBzYW1lCi1tZW1vcnkgbWFuYWdlciBzZXJ2ZXMgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zLgotCi1JbiBhbGwgY2FzZXMsIGFsbG9jYXRlZCBvYmplY3RzIGFyZSB0aWVkIHRvIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiBvcgotZGVjb21wcmVzc2lvbiBtYXN0ZXIgcmVjb3JkLCBhbmQgdGhleSB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gdGhhdCBtYXN0ZXIKLXJlY29yZCBpcyBkZXN0cm95ZWQuCi0KLVRoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBwcm92aWRlIGV4cGxpY2l0IGRlYWxsb2NhdGlvbiBvZiBvYmplY3RzLgotSW5zdGVhZCwgb2JqZWN0cyBhcmUgY3JlYXRlZCBpbiAicG9vbHMiIG9mIGZyZWUgc3RvcmFnZSwgYW5kIGEgd2hvbGUgcG9vbAotY2FuIGJlIGZyZWVkIGF0IG9uY2UuICBUaGlzIGFwcHJvYWNoIGhlbHBzIHByZXZlbnQgc3RvcmFnZS1sZWFrIGJ1Z3MsIGFuZAotaXQgc3BlZWRzIHVwIG9wZXJhdGlvbnMgd2hlbmV2ZXIgbWFsbG9jL2ZyZWUgYXJlIHNsb3cgKGFzIHRoZXkgb2Z0ZW4gYXJlKS4KLVRoZSBwb29scyBjYW4gYmUgcmVnYXJkZWQgYXMgbGlmZXRpbWUgaWRlbnRpZmllcnMgZm9yIG9iamVjdHMuICBUd28KLXBvb2xzL2xpZmV0aW1lcyBhcmUgZGVmaW5lZDoKLSAgKiBKUE9PTF9QRVJNQU5FTlQJbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQKLSAgKiBKUE9PTF9JTUFHRQkJbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlIChKUEVHIGRhdGFzdHJlYW0pCi1QZXJtYW5lbnQgbGlmZXRpbWUgaXMgdXNlZCBmb3IgcGFyYW1ldGVycyBhbmQgdGFibGVzIHRoYXQgc2hvdWxkIGJlIGNhcnJpZWQKLWFjcm9zcyBmcm9tIG9uZSBkYXRhc3RyZWFtIHRvIGFub3RoZXI7IHRoaXMgaW5jbHVkZXMgYWxsIGFwcGxpY2F0aW9uLXZpc2libGUKLXBhcmFtZXRlcnMuICBJbWFnZSBsaWZldGltZSBpcyB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuICAoQSB0aGlyZCBsaWZldGltZSwKLUpQT09MX1BBU1MgPSBvbmUgcHJvY2Vzc2luZyBwYXNzLCB3YXMgb3JpZ2luYWxseSBwbGFubmVkLiAgSG93ZXZlciBpdCB3YXMKLWRyb3BwZWQgYXMgbm90IGJlaW5nIHdvcnRod2hpbGUuICBUaGUgYWN0dWFsIHVzYWdlIHBhdHRlcm5zIGFyZSBzdWNoIHRoYXQgdGhlCi1wZWFrIG1lbW9yeSB1c2FnZSB3b3VsZCBiZSBhYm91dCB0aGUgc2FtZSBhbnl3YXk7IGFuZCBoYXZpbmcgcGVyLXBhc3Mgc3RvcmFnZQotc3Vic3RhbnRpYWxseSBjb21wbGljYXRlcyB0aGUgdmlydHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBydWxlcyAtLS0gc2VlIGJlbG93LikKLQotVGhlIG1lbW9yeSBtYW5hZ2VyIGRlYWxzIHdpdGggdGhyZWUga2luZHMgb2Ygb2JqZWN0OgotMS4gIlNtYWxsIiBvYmplY3RzLiAgVHlwaWNhbGx5IHRoZXNlIHJlcXVpcmUgbm8gbW9yZSB0aGFuIDEwSy0yMEsgdG90YWwuCi0yLiAiTGFyZ2UiIG9iamVjdHMuICBUaGVzZSBtYXkgcmVxdWlyZSB0ZW5zIHRvIGh1bmRyZWRzIG9mIEsgZGVwZW5kaW5nIG9uCi0gICBpbWFnZSBzaXplLiAgU2VtYW50aWNhbGx5IHRoZXkgYmVoYXZlIHRoZSBzYW1lIGFzIHNtYWxsIG9iamVjdHMsIGJ1dCB3ZQotICAgZGlzdGluZ3Vpc2ggdGhlbSBmb3IgdHdvIHJlYXNvbnM6Ci0gICAgICogT24gTVMtRE9TIG1hY2hpbmVzLCBsYXJnZSBvYmplY3RzIGFyZSByZWZlcmVuY2VkIGJ5IEZBUiBwb2ludGVycywKLSAgICAgICBzbWFsbCBvYmplY3RzIGJ5IE5FQVIgcG9pbnRlcnMuCi0gICAgICogUG9vbCBhbGxvY2F0aW9uIGhldXJpc3RpY3MgbWF5IGRpZmZlciBmb3IgbGFyZ2UgYW5kIHNtYWxsIG9iamVjdHMuCi0gICBOb3RlIHRoYXQgaW5kaXZpZHVhbCAibGFyZ2UiIG9iamVjdHMgY2Fubm90IGV4Y2VlZCB0aGUgc2l6ZSBhbGxvd2VkIGJ5Ci0gICB0eXBlIHNpemVfdCwgd2hpY2ggbWF5IGJlIDY0SyBvciBsZXNzIG9uIHNvbWUgbWFjaGluZXMuCi0zLiAiVmlydHVhbCIgb2JqZWN0cy4gIFRoZXNlIGFyZSBsYXJnZSAyLUQgYXJyYXlzIG9mIEpTQU1QTEVzIG9yIEpCTE9DS3MKLSAgICh0eXBpY2FsbHkgbGFyZ2UgZW5vdWdoIGZvciB0aGUgZW50aXJlIGltYWdlIGJlaW5nIHByb2Nlc3NlZCkuICBUaGUKLSAgIG1lbW9yeSBtYW5hZ2VyIHByb3ZpZGVzIHN0cmlwd2lzZSBhY2Nlc3MgdG8gdGhlc2UgYXJyYXlzLiAgT24gbWFjaGluZXMKLSAgIHdpdGhvdXQgdmlydHVhbCBtZW1vcnksIHRoZSByZXN0IG9mIHRoZSBhcnJheSBtYXkgYmUgc3dhcHBlZCBvdXQgdG8gYQotICAgdGVtcG9yYXJ5IGZpbGUuCi0KLShOb3RlOiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWSBkYXRhIHN0cnVjdHVyZXMgYXJlIGEgY29tYmluYXRpb24gb2YgbGFyZ2UKLW9iamVjdHMgZm9yIHRoZSBkYXRhIHByb3BlciBhbmQgc21hbGwgb2JqZWN0cyBmb3IgdGhlIHJvdyBwb2ludGVycy4gIEZvcgotY29udmVuaWVuY2UgYW5kIHNwZWVkLCB0aGUgbWVtb3J5IG1hbmFnZXIgcHJvdmlkZXMgc2luZ2xlIHJvdXRpbmVzIHRvIGNyZWF0ZQotdGhlc2Ugc3RydWN0dXJlcy4gIFNpbWlsYXJseSwgdmlydHVhbCBhcnJheXMgaW5jbHVkZSBhIHNtYWxsIGNvbnRyb2wgYmxvY2sKLWFuZCBhIEpTQU1QQVJSQVkgb3IgSkJMT0NLQVJSQVkgd29ya2luZyBidWZmZXIsIGFsbCBjcmVhdGVkIHdpdGggb25lIGNhbGwuKQotCi1JbiB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiwgdmlydHVhbCBhcnJheXMgYXJlIG9ubHkgcGVybWl0dGVkIHRvIGhhdmUgaW1hZ2UKLWxpZmVzcGFuLiAgKFBlcm1hbmVudCBsaWZlc3BhbiB3b3VsZCBub3QgYmUgcmVhc29uYWJsZSwgYW5kIHBhc3MgbGlmZXNwYW4gaXMKLW5vdCB2ZXJ5IHVzZWZ1bCBzaW5jZSBhIHZpcnR1YWwgYXJyYXkncyByYWlzb24gZCdldHJlIGlzIHRvIHN0b3JlIGRhdGEgZm9yCi1tdWx0aXBsZSBwYXNzZXMgdGhyb3VnaCB0aGUgaW1hZ2UuKSAgV2UgYWxzbyBleHBlY3QgdGhhdCBvbmx5ICJzbWFsbCIgb2JqZWN0cwotd2lsbCBiZSBnaXZlbiBwZXJtYW5lbnQgbGlmZXNwYW4sIHRob3VnaCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdCByZXF1aXJlZCBieQotdGhlIG1lbW9yeSBtYW5hZ2VyLgotCi1JbiBhIG5vbi12aXJ0dWFsLW1lbW9yeSBtYWNoaW5lLCBzb21lIHBlcmZvcm1hbmNlIGJlbmVmaXQgY2FuIGJlIGdhaW5lZCBieQotbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBmb3IgdmlydHVhbCBhcnJheXMgYmUgYXMgbGFyZ2UgYXMgcG9zc2libGUuCi0oRm9yIHNtYWxsIGltYWdlcywgdGhlIGJ1ZmZlcnMgbWlnaHQgZml0IGVudGlyZWx5IGluIG1lbW9yeSwgc28gYmxpbmQKLXN3YXBwaW5nIHdvdWxkIGJlIHZlcnkgd2FzdGVmdWwuKSAgVGhlIG1lbW9yeSBtYW5hZ2VyIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQKLW9mIHRoZSBidWZmZXJzIHRvIGZpdCB3aXRoaW4gYSBwcmVzcGVjaWZpZWQgbWF4aW11bSBtZW1vcnkgdXNhZ2UuICBJbiBvcmRlcgotdG8gZG8gdGhpcyBpbiBhIHJlYXNvbmFibHkgb3B0aW1hbCBmYXNoaW9uLCB0aGUgbWFuYWdlciBuZWVkcyB0byBhbGxvY2F0ZSBhbGwKLW9mIHRoZSB2aXJ0dWFsIGFycmF5cyBhdCBvbmNlLiAgVGhlcmVmb3JlLCB0aGVyZSBpc24ndCBhIG9uZS1zdGVwIGFsbG9jYXRpb24KLXJvdXRpbmUgZm9yIHZpcnR1YWwgYXJyYXlzOyBpbnN0ZWFkLCB0aGVyZSBpcyBhICJyZXF1ZXN0IiByb3V0aW5lIHRoYXQgc2ltcGx5Ci1hbGxvY2F0ZXMgdGhlIGNvbnRyb2wgYmxvY2ssIGFuZCBhICJyZWFsaXplIiByb3V0aW5lIChjYWxsZWQganVzdCBvbmNlKSB0aGF0Ci1kZXRlcm1pbmVzIHNwYWNlIGFsbG9jYXRpb24gYW5kIGNyZWF0ZXMgYWxsIG9mIHRoZSBhY3R1YWwgYnVmZmVycy4gIFRoZQotcmVhbGl6ZSByb3V0aW5lIG11c3QgYWxsb3cgZm9yIHNwYWNlIG9jY3VwaWVkIGJ5IG5vbi12aXJ0dWFsIGxhcmdlIG9iamVjdHMuCi0oV2UgZG9uJ3QgYm90aGVyIHRvIGZhY3RvciBpbiB0aGUgc3BhY2UgbmVlZGVkIGZvciBzbWFsbCBvYmplY3RzLCBvbiB0aGUKLWdyb3VuZHMgdGhhdCBpdCBpc24ndCB3b3J0aCB0aGUgdHJvdWJsZS4pCi0KLVRvIHN1cHBvcnQgYWxsIHRoaXMsIHdlIGVzdGFibGlzaCB0aGUgZm9sbG93aW5nIHByb3RvY29sIGZvciBkb2luZyBidXNpbmVzcwotd2l0aCB0aGUgbWVtb3J5IG1hbmFnZXI6Ci0gIDEuIE1vZHVsZXMgbXVzdCByZXF1ZXN0IHZpcnR1YWwgYXJyYXlzICh3aGljaCBtYXkgaGF2ZSBvbmx5IGltYWdlIGxpZmVzcGFuKQotICAgICBkdXJpbmcgdGhlIGluaXRpYWwgc2V0dXAgcGhhc2UsIGkuZS4sIGluIHRoZWlyIGppbml0X3h4eCByb3V0aW5lcy4KLSAgMi4gQWxsICJsYXJnZSIgb2JqZWN0cyAoaW5jbHVkaW5nIEpTQU1QQVJSQVlzIGFuZCBKQkxPQ0tBUlJBWXMpIG11c3QgYWxzbyBiZQotICAgICBhbGxvY2F0ZWQgZHVyaW5nIGluaXRpYWwgc2V0dXAuCi0gIDMuIHJlYWxpemVfdmlydF9hcnJheXMgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaW5pdGlhbCBzZXR1cC4KLSAgICAgVGhlIGFib3ZlIGNvbnZlbnRpb25zIGVuc3VyZSB0aGF0IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCi0gICAgIGZvciBpdCB0byBjaG9vc2UgYSBnb29kIHNpemUgZm9yIHZpcnR1YWwgYXJyYXkgYnVmZmVycy4KLVNtYWxsIG9iamVjdHMgb2YgYW55IGxpZmVzcGFuIG1heSBiZSBhbGxvY2F0ZWQgYXQgYW55IHRpbWUuICBXZSBleHBlY3QgdGhhdAotdGhlIHRvdGFsIHNwYWNlIHVzZWQgZm9yIHNtYWxsIG9iamVjdHMgd2lsbCBiZSBzbWFsbCBlbm91Z2ggdG8gYmUgbmVnbGlnaWJsZQotaW4gdGhlIHJlYWxpemVfdmlydF9hcnJheXMgY29tcHV0YXRpb24uCi0KLUluIGEgdmlydHVhbC1tZW1vcnkgbWFjaGluZSwgd2Ugc2ltcGx5IHByZXRlbmQgdGhhdCB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzCi1pbmZpbml0ZSwgdGh1cyBjYXVzaW5nIHJlYWxpemVfdmlydF9hcnJheXMgdG8gZGVjaWRlIHRoYXQgaXQgY2FuIGFsbG9jYXRlIGFsbAotdGhlIHZpcnR1YWwgYXJyYXlzIGFzIGZ1bGwtc2l6ZSBpbi1tZW1vcnkgYnVmZmVycy4gIFRoZSBvdmVyaGVhZCBvZiB0aGUKLXZpcnR1YWwtYXJyYXkgYWNjZXNzIHByb3RvY29sIGlzIHZlcnkgc21hbGwgd2hlbiBubyBzd2FwcGluZyBvY2N1cnMuCi0KLUEgdmlydHVhbCBhcnJheSBjYW4gYmUgc3BlY2lmaWVkIHRvIGJlICJwcmUtemVyb2VkIjsgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LAotbmV2ZXIteWV0LXdyaXR0ZW4gc2VjdGlvbnMgb2YgdGhlIGFycmF5IGFyZSBzZXQgdG8gemVybyBiZWZvcmUgYmVpbmcgbWFkZQotYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuICBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbmV2ZXItd3JpdHRlbiBzZWN0aW9ucwotb2YgdGhlIGFycmF5IGNvbnRhaW4gZ2FyYmFnZS4gIChUaGlzIGZlYXR1cmUgZXhpc3RzIHByaW1hcmlseSBiZWNhdXNlIHRoZQotZXF1aXZhbGVudCBsb2dpYyB3b3VsZCBvdGhlcndpc2UgYmUgbmVlZGVkIGluIGpkY29lZmN0LmMgZm9yIHByb2dyZXNzaXZlCi1KUEVHIG1vZGU7IHdlIG1heSBhcyB3ZWxsIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBwb3NzaWJsZSBvdGhlciB1c2VzLikKLQotVGhlIGZpcnN0IHdyaXRlIHBhc3Mgb24gYSB2aXJ0dWFsIGFycmF5IGlzIHJlcXVpcmVkIHRvIG9jY3VyIGluIHRvcC10by1ib3R0b20KLW9yZGVyOyByZWFkIHBhc3NlcywgYXMgd2VsbCBhcyBhbnkgd3JpdGUgcGFzc2VzIGFmdGVyIHRoZSBmaXJzdCBvbmUsIG1heQotYWNjZXNzIHRoZSBhcnJheSBpbiBhbnkgb3JkZXIuICBUaGlzIHJlc3RyaWN0aW9uIGV4aXN0cyBwYXJ0bHkgdG8gc2ltcGxpZnkKLXRoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgbG9naWMsIGFuZCBwYXJ0bHkgYmVjYXVzZSBzb21lIGZpbGUgc3lzdGVtcyBtYXkgbm90Ci1zdXBwb3J0IHNlZWtpbmcgYmV5b25kIHRoZSBjdXJyZW50IGVuZC1vZi1maWxlIGluIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGUgbWFpbgotaW1wbGljYXRpb24gb2YgdGhpcyByZXN0cmljdGlvbiBpcyB0aGF0IHJlYXJyYW5nZW1lbnQgb2Ygcm93cyAoc3VjaCBhcwotY29udmVydGluZyB0b3AtdG8tYm90dG9tIGRhdGEgb3JkZXIgdG8gYm90dG9tLXRvLXRvcCkgbXVzdCBiZSBoYW5kbGVkIHdoaWxlCi1yZWFkaW5nIGRhdGEgb3V0IG9mIHRoZSB2aXJ0dWFsIGFycmF5LCBub3Qgd2hpbGUgcHV0dGluZyBpdCBpbi4KLQotCi0qKiogTWVtb3J5IG1hbmFnZXIgaW50ZXJuYWwgc3RydWN0dXJlICoqKgotCi1UbyBpc29sYXRlIHN5c3RlbSBkZXBlbmRlbmNpZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2UgaGF2ZSBicm9rZW4gdGhlCi1tZW1vcnkgbWFuYWdlciBpbnRvIHR3byBwYXJ0cy4gIFRoZXJlIGlzIGEgcmVhc29uYWJseSBzeXN0ZW0taW5kZXBlbmRlbnQKLSJmcm9udCBlbmQiIChqbWVtbWdyLmMpIGFuZCBhICJiYWNrIGVuZCIgdGhhdCBjb250YWlucyBvbmx5IHRoZSBjb2RlCi1saWtlbHkgdG8gY2hhbmdlIGFjcm9zcyBzeXN0ZW1zLiAgQWxsIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBtZXRob2RzCi1vdXRsaW5lZCBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIGZyb250IGVuZC4gIFRoZSBiYWNrIGVuZCBwcm92aWRlcwotdGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdXNlIGJ5IHRoZSBmcm9udCBlbmQgKG5vbmUgb2YgdGhlc2Ugcm91dGluZXMKLWFyZSBrbm93biB0byB0aGUgcmVzdCBvZiB0aGUgSlBFRyBjb2RlKToKLQotanBlZ19tZW1faW5pdCwganBlZ19tZW1fdGVybQlzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uL3NodXRkb3duCi0KLWpwZWdfZ2V0X3NtYWxsLCBqcGVnX2ZyZWVfc21hbGwJaW50ZXJmYWNlIHRvIG1hbGxvYyBhbmQgZnJlZSBsaWJyYXJ5IHJvdXRpbmVzCi0JCQkJKG9yIHRoZWlyIGVxdWl2YWxlbnRzKQotCi1qcGVnX2dldF9sYXJnZSwganBlZ19mcmVlX2xhcmdlCWludGVyZmFjZSB0byBGQVIgbWFsbG9jL2ZyZWUgaW4gTVNET1MgbWFjaGluZXM7Ci0JCQkJZWxzZSB1c3VhbGx5IHRoZSBzYW1lIGFzCi0JCQkJanBlZ19nZXRfc21hbGwvanBlZ19mcmVlX3NtYWxsCi0KLWpwZWdfbWVtX2F2YWlsYWJsZQkJZXN0aW1hdGUgYXZhaWxhYmxlIG1lbW9yeQotCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZQkJY3JlYXRlIGEgYmFja2luZy1zdG9yZSBvYmplY3QKLQotcmVhZF9iYWNraW5nX3N0b3JlLAkJbWFuaXB1bGF0ZSBhIGJhY2tpbmctc3RvcmUgb2JqZWN0Ci13cml0ZV9iYWNraW5nX3N0b3JlLAotY2xvc2VfYmFja2luZ19zdG9yZQotCi1PbiBzb21lIHN5c3RlbXMgdGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgYmFja2luZy1zdG9yZSBvYmplY3QKLShzcGVjaWZpY2FsbHksIGluIE1TLURPUyBhIGJhY2tpbmcgc3RvcmUgZmlsZSBtaWdodCBiZSBhbiBhcmVhIG9mIGV4dGVuZGVkCi1tZW1vcnkgYXMgd2VsbCBhcyBhIGRpc2sgZmlsZSkuICBqcGVnX29wZW5fYmFja2luZ19zdG9yZSBpcyByZXNwb25zaWJsZSBmb3IKLWNob29zaW5nIGhvdyB0byBpbXBsZW1lbnQgYSBnaXZlbiBvYmplY3QuICBUaGUgcmVhZC93cml0ZS9jbG9zZSByb3V0aW5lcwotYXJlIG1ldGhvZCBwb2ludGVycyBpbiB0aGUgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgZ2l2ZW4gb2JqZWN0OyB0aGlzCi1sZXRzIHRoZW0gYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgotCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgZXhwbGljaXRseQotcmVsZWFzZWQgdXBvbiBhYm5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uLiAgRm9yIGV4YW1wbGUsIE1TLURPUyB3b24ndCBmcmVlCi1leHRlbmRlZCBtZW1vcnkgYnkgaXRzZWxmLiAgVG8gc3VwcG9ydCB0aGlzLCB3ZSB3aWxsIGV4cGVjdCB0aGUgbWFpbiBwcm9ncmFtCi1vciBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiB0byBhcnJhbmdlIHRvIGNhbGwgc2VsZl9kZXN0cnVjdCAodHlwaWNhbGx5IHZpYQotanBlZ19kZXN0cm95KSB1cG9uIGFibm9ybWFsIHRlcm1pbmF0aW9uLiAgVGhpcyBtYXkgcmVxdWlyZSBhIFNJR0lOVCBzaWduYWwKLWhhbmRsZXIgb3IgZXF1aXZhbGVudC4gIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0aGUgYmFjayBlbmQgbW9kdWxlIGluc3RhbGwgaXRzCi1vd24gc2lnbmFsIGhhbmRsZXIsIGJlY2F1c2UgdGhhdCB3b3VsZCBwcmUtZW1wdCB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24ncwotYWJpbGl0eSB0byBjb250cm9sIHNpZ25hbCBoYW5kbGluZy4KLQotVGhlIElKRyBkaXN0cmlidXRpb24gaW5jbHVkZXMgc2V2ZXJhbCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBpbXBsZW1lbnRhdGlvbnMuCi1Vc3VhbGx5IHRoZSBzYW1lIGJhY2sgZW5kIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYWxsIGFwcGxpY2F0aW9ucyBvbiBhIGdpdmVuCi1zeXN0ZW0sIGJ1dCBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdG8gc3VwcGx5IGl0cyBvd24gYmFjayBlbmQgYXQKLW5lZWQuCi0KLQotKioqIEltcGxpY2F0aW9ucyBvZiBETkwgbWFya2VyICoqKgotCi1Tb21lIEpQRUcgZmlsZXMgbWF5IHVzZSBhIEROTCBtYXJrZXIgdG8gcG9zdHBvbmUgZGVmaW5pdGlvbiBvZiB0aGUgaW1hZ2UKLWhlaWdodCAodGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEgZmF4LWxpa2Ugc2Nhbm5lcidzIG91dHB1dCwgZm9yIGluc3RhbmNlKS4KLUluIHRoZXNlIGZpbGVzIHRoZSBTT0YgbWFya2VyIGNsYWltcyB0aGUgaW1hZ2UgaGVpZ2h0IGlzIDAsIGFuZCB5b3Ugb25seQotZmluZCBvdXQgdGhlIHRydWUgaW1hZ2UgaGVpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNjYW4uCi0KLVdlIGNvdWxkIHJlYWQgdGhlc2UgZmlsZXMgYXMgZm9sbG93czoKLTEuIFVwb24gc2VlaW5nIHplcm8gaW1hZ2UgaGVpZ2h0LCByZXBsYWNlIGl0IGJ5IDY1NTM1ICh0aGUgbWF4aW11bSBhbGxvd2VkKS4KLTIuIFdoZW4gdGhlIEROTCBpcyBmb3VuZCwgdXBkYXRlIHRoZSBpbWFnZSBoZWlnaHQgaW4gdGhlIGdsb2JhbCBpbWFnZQotICAgZGVzY3JpcHRvci4KLVRoaXMgaW1wbGllcyB0aGF0IGNvbnRyb2wgbW9kdWxlcyBtdXN0IGF2b2lkIG1ha2luZyBjb3BpZXMgb2YgdGhlIGltYWdlCi1oZWlnaHQsIGFuZCBtdXN0IHJlLXRlc3QgZm9yIHRlcm1pbmF0aW9uIGFmdGVyIGVhY2ggTUNVIHJvdy4gIFRoaXMgd291bGQKLWJlIGVhc3kgZW5vdWdoIHRvIGRvLgotCi1JbiBjYXNlcyB3aGVyZSBpbWFnZS1zaXplIGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCB0aGlzIGFwcHJvYWNoIHdpbGwKLXJlc3VsdCBpbiB2ZXJ5IGluZWZmaWNpZW50IHVzZSBvZiB2aXJ0dWFsIG1lbW9yeSBvciBtdWNoLWxhcmdlci10aGFuLW5lY2Vzc2FyeQotdGVtcG9yYXJ5IGZpbGVzLiAgVGhpcyBzZWVtcyBhY2NlcHRhYmxlIGZvciBzb21ldGhpbmcgdGhhdCBwcm9iYWJseSB3b24ndCBiZSBhCi1tYWluc3RyZWFtIHVzYWdlLiAgUGVvcGxlIG1pZ2h0IGhhdmUgdG8gZm9yZ28gdXNlIG9mIG1lbW9yeS1ob2dnaW5nIG9wdGlvbnMKLShzdWNoIGFzIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiBvciBub25pbnRlcmxlYXZlZCBKUEVHIGZpbGVzKSBpZiB0aGV5Ci13YW50IGVmZmljaWVudCBjb252ZXJzaW9uIG9mIHN1Y2ggZmlsZXMuICAoT25lIGNvdWxkIGltcHJvdmUgZWZmaWNpZW5jeSBieQotZGVtYW5kaW5nIGEgdXNlci1zdXBwbGllZCB1cHBlciBib3VuZCBmb3IgdGhlIGhlaWdodCwgbGVzcyB0aGFuIDY1NTM2OyBpbiBtb3N0Ci1jYXNlcyBpdCBjb3VsZCBiZSBtdWNoIGxlc3MuKQotCi1UaGUgc3RhbmRhcmQgYWxzbyBwZXJtaXRzIHRoZSBTT0YgbWFya2VyIHRvIG92ZXJlc3RpbWF0ZSB0aGUgaW1hZ2UgaGVpZ2h0LAotd2l0aCBhIEROTCB0byBnaXZlIHRoZSB0cnVlLCBzbWFsbGVyIGhlaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzY2FuLgotVGhpcyB3b3VsZCBzb2x2ZSB0aGUgc3BhY2UgcHJvYmxlbXMgaWYgdGhlIG92ZXJlc3RpbWF0ZSB3YXNuJ3QgdG9vIGdyZWF0LgotSG93ZXZlciwgaXQgaW1wbGllcyB0aGF0IHlvdSBkb24ndCBldmVuIGtub3cgd2hldGhlciBETkwgd2lsbCBiZSB1c2VkLgotCi1UaGlzIGxlYWRzIHRvIGEgY291cGxlIG9mIHZlcnkgc2VyaW91cyBvYmplY3Rpb25zOgotMS4gVGVzdGluZyBmb3IgYSBETkwgbWFya2VyIG11c3Qgb2NjdXIgaW4gdGhlIGlubmVyIGxvb3Agb2YgdGhlIGRlY29tcHJlc3NvcidzCi0gICBIdWZmbWFuIGRlY29kZXI7IHRoaXMgaW1wbGllcyBhIHNwZWVkIHBlbmFsdHkgd2hldGhlciB0aGUgZmVhdHVyZSBpcyB1c2VkCi0gICBvciBub3QuCi0yLiBUaGVyZSBpcyBubyB3YXkgdG8gaGlkZSB0aGUgbGFzdC1taW51dGUgY2hhbmdlIGluIGltYWdlIGhlaWdodCBmcm9tIGFuCi0gICBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZGVjb2Rlci4gIFRodXMgKmV2ZXJ5KiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgSUpHCi0gICBsaWJyYXJ5IHdvdWxkIHN1ZmZlciBhIGNvbXBsZXhpdHkgcGVuYWx0eSB3aGV0aGVyIGl0IGNhcmVkIGFib3V0IEROTCBvcgotICAgbm90LgotV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IEROTCBiZWNhdXNlIG9mIHRoZXNlIHByb2JsZW1zLgotCi1BIGRpZmZlcmVudCBhcHByb2FjaCBpcyB0byBpbnNpc3QgdGhhdCBETkwtdXNpbmcgZmlsZXMgYmUgcHJlcHJvY2Vzc2VkIGJ5IGEKLXNlcGFyYXRlIHByb2dyYW0gdGhhdCByZWFkcyBhaGVhZCB0byB0aGUgRE5MLCB0aGVuIGdvZXMgYmFjayBhbmQgZml4ZXMgdGhlIFNPRgotbWFya2VyLiAgVGhpcyBpcyBhIG11Y2ggc2ltcGxlciBzb2x1dGlvbiBhbmQgaXMgcHJvYmFibHkgZmFyIG1vcmUgZWZmaWNpZW50LgotRXZlbiBpZiBvbmUgd2FudHMgcGlwZWQgaW5wdXQsIGJ1ZmZlcmluZyB0aGUgZmlyc3Qgc2NhbiBvZiB0aGUgSlBFRyBmaWxlIG5lZWRzCi1hIGxvdCBzbWFsbGVyIHRlbXAgZmlsZSB0aGFuIGlzIGltcGxpZWQgYnkgdGhlIG1heGltdW0taGVpZ2h0IG1ldGhvZC4gIEZvcgotdGhpcyBhcHByb2FjaCB3ZSdkIHNpbXBseSB0cmVhdCBETkwgYXMgYSBuby1vcCBpbiB0aGUgZGVjb21wcmVzc29yIChhdCBtb3N0LAotY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBTT0YgaW1hZ2UgaGVpZ2h0KS4KLQotV2Ugd2lsbCBub3Qgd29ycnkgYWJvdXQgbWFraW5nIHRoZSBjb21wcmVzc29yIGNhcGFibGUgb2Ygb3V0cHV0dGluZyBETkwuCi1Tb21ldGhpbmcgc2ltaWxhciB0byB0aGUgZmlyc3Qgc2NoZW1lIGFib3ZlIGNvdWxkIGJlIGFwcGxpZWQgaWYgYW55b25lIGV2ZXIKLXdhbnRzIHRvIG1ha2UgdGhhdCB3b3JrLgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvdGVzdGltZy5ibXAgYi9saWJqcGVndHdycC90ZXN0aW1nLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwM2QxNS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC90ZXN0aW1nLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3Rlc3RpbWcuanBnIGIvbGlianBlZ3R3cnAvdGVzdGltZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGNhNWQuLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvdGVzdGltZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC90ZXN0aW1nLnBwbSBiL2xpYmpwZWd0d3JwL3Rlc3RpbWcucHBtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgxY2UyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3Rlc3RpbWcucHBtCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1QNgotMjI3IDE0OQotMjU1Ci0wLy0wLy0xMC4yMS81MS41MS42Mi82Mi84My84My86My06My06My06My06My06My06Mi85MS45MS44MC04MC05MS45MS46Mi84MC04MC04MC04MC04MC04MC04MC04MC02Lis2Lis2Lis1LSo1LSo0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCkyLSkvKiQvLCUvLCUwLSYxLicyLygzMCkzMCk2Myw2Myw3NC04NS44NS45Ni86NzA6Ny5BOjBCPDBEPjJGQDRJQTRKQjVLQzZLQzZNRDVNRDVPQzNOQjJPQzNPQzNQRDRSRTVSPzFZPzJiQDRuQjV9RTaLSDiZRzmjRjevRzq4Rzm+RTrFRzvHRz7KRz/LSEDQRUDnRkztQ0zrREvrRUnuQ0nvQkTxPkL0PUH4O0H3OkD0Oj/wPD/pP0DiQD7XPzzLQTe7PS+1QC61QC60Py20Py2zQC2yPy2vQC2tQCyqQSymQS2iQiyfQCqbQSmYQCqWQSyUPi2SPy+SPy+RPi6RPiyQPSuSPCuSPCuUPyuUPyuUPSqUPSqUPSqVPiuWPyyWQC+WPzaVPjWXPTKfPzGpQjOzRDO8RDS/RDS5PzC1QTKsRjieSDuHSDlvQTJUOCpDMyY9NTI5NTQ5NTQ3MzI3MTE2MDA1MC01MC03Mi83Mi83Mi82MS42MS01MCw1MCw0MSwvLy0uMC0vLy0vLy0wLy0wLy0yLi0yLi01LC00Kyw0KiszKSo3KCs9LjFFNjlQOjxqQkN8SUiNTU2VT0+fV1uqZG6qb4OfdJCUe6OHf66Ahrp+iL1zea1gYZFUS3ZQRGhTSmdPR15NSF5UUWJmZG98fYKNkZCZnpijqZ+iqJqeoJOPkoF7fGxmZ1VYV0VRTkVVUltVUWJVUWIwLy0wLy0xMC4xMC40MC01MS42Mi82Mi84My84My86My06My06My06My06My06My05MS45MS44MC04MC04MC04MC05MS45MS44MC04MC04MC04MC04MC04MC04MC04MC02Lis2Lis1LSo1LSo1LSo0LCk0LCk0LCk1LSo1LSo1LSo1LSo1LSo1LSo1LSozLiowKyUwLSYwLSYxLicyLygzMCk0MSo0MSo2Myw2Myw3NC03NC04NS45Ni86NzA6Ny5AOS9BOy9DPTFFPzNIQDNJQTRKQjVKQjVMQzRMQzRNQTFNQTFNQTFOQjJPQzNRRDRQPjBVPzFeQTNqQzR4RDaERTSSRTWcQzOnQzSvQTS1QTS8QjfARDrERTzFRj3NQ0DhRUnnQknoQ0nqREjtREfvQkTzQEP2P0P4O0H3OkD0Oj/wPD/pP0DgQT7VQDzKQDa5Pi+1QC60Py20Py20Py2yPyywPy2vQC2tQCypQCumQS2hQSufQCqbQSmYQCqWQSyUPi2SPy+RPi6RPi6RPiyQPSuSPCuSPCuUPyuTPiqUPSqUPSqUPSqVPiuWPyyWQC+UQDWVPjWYPjOgPjGrQTO1RDS9QzS/RDW7QTK3QzasRjicSTuFRzpsQDNTOSpCNCk+NjM6NjU5NTQ4NDM4MjI3MTE2MS42MS43Mi83Mi83Mi82MS42MS01MCw1MCw0MSwvLy0uMC0vLy0vLy0wLy0wLy0yLi0yLi0zLS01LC00KiszKSo1KSs8LTBDNDdOODpkPj12RUGGSkmPTkyaVFakYWqlbH2dco6Re6KGgK5/hbl7hLtvdalbW41RSHVPQ2lPRmVPR19QSF9STl9bWWZub3SDh4iUmZWZnpeaoJSZnY+PkYN+f29qa1ldW0xWU0pYU1pWUmFYUWEvLiwvLiwwLy0xMC40MC00MC01MS41MS43Mi43Mi43Mi43Mi45Miw5Miw5Miw5Miw5MS44MC43Ly03Ly03Ly03Ly04MC45MS84MC44MC44MC44MC44MC44MC44MC44MC42Liw1LSs1LSs1LSs0LCo0LCo0LCo0LCo1LSs1LSs1LSs1LSs1LSs1LSs1LSszLioyLScxLicyLygzMCkzMCk0MSo0MSo1Mis2Myw2Myw2Myw3NC04NS45Ni85Ni86Ny4/OC5AOi5CPDBEPjJHPzRIQDVIQDNIQDNJQDFJQDFLPzFLPzFLPy9MQDBNQTFOQjJNQTFRQTFZQjJkQzJxQzN8QzKHQjKSQTCYPC2gOiunOy6vPTK1QDa6RDq/Rj3FRD7ZQ0XhQEbjQkfnQkbqREbwQ0X0QUT4P0T6O0D5Oj/1O0DwPUDoQEDcQT3RQDvGQDW3PS6zQC2zQC2yPyyyPy2wPy2vPiytQCyqPy2nQC2lQCyhQSudQSyaPyqYQCqVQCuUPi2RPi6RPi6RPi6QPSuQPSuQPSuQPSuRPiyRPiySPCuSPCuTPSyTPSyUPyuVPy6VQTaWPzWaPjOjPjKvQTS5QzW/RDXBQzXARDi4RjuuST2ZSj2BRztoQDRROixCNSw/NzQ9Nzc8NjY6NDQ5NDE4MzA3Mi83Mi82Mi82Mi82Mi81MS41Mi00MSw0MSwyMSwuMC0sMS0uMC0uMC0vLy0vLy0wLy0yLi01Ly80Li41LC00Kis0Kis5LS8+MjRJNTZbOTdsPzl8RUCGSUSQT02YW2CbZnaUbYiMd56Dfa19grl1frdmbaRUVolNRXZMQWtNQWVPRmNRSGNNSF5OS1xbW2VxdHmFiYiHjIaKj4iNkIWGinx4emxmaVhaW01WU0xaVVtaVGBbU2AuLSsvLiwvLiwwLy0zLyw0MC00MC00MC02MS02MS02MS02MS04MSs4MSs4MSs4MSs3Ly03Ly02Liw2Liw2Liw2Liw3Ly03Ly04MC44MC44MC44MC44MC44MC44MC44MC41LSs1LSs1LSs0LCo0LCo0LCozKykzKyk2Liw2Liw2Liw2Liw2Liw2Liw2Liw0LywzMCszMCkzMCk0MSo0MSo1Mis1Mis1Mis1Mis1Mis2Myw3NC04NS44NS45Ni85Ni0+Ny0/OS1AOi5CPDBFPTJFPTJGPjFGPjFHPTFHPi9IPC5JPS9JPS9KPi5MQDBKQTBLRDJORTRVRDReRDNpRDJzQjF+QS+GPy2MOSmUOSedOSqjPC2sQDOzRTi4SDzBRj7SREPaQUPeQkPiREPnQ0TsQkPzQEP3P0H6O0D5Oj/1O0DuPkDlQUDaQj3NQDnCQDO1PS2wQCywQCywQCyvPiyuPyyuPyysPyupQC2mPyyjQCugQCqcQCuYQCqWQCmUPyqRPiyRPi6RPi6QPS2QPSuQPSuPPCqPPCqQPSuQPSuPPCqPPCqSPCuRPiyUPi2SPy2VQTaWPzWcPjKmQDSyQja8QzjBQzfCQjfCRjy6Sj+sTECXSz58RjpiQDRMOi5BNy1AODU+OTY9Nzc8NzQ6NTI5NDE4MzA4MzA2Mi82Mi82Mi8zMi41Mi0yMSwyMSwxMi0tMi4tMi4vMS4vMS4wMC4wMC4xMC4xMC41MTA2MDA1Ly81LC00Kyw2LC06MDFEMjJUNzFjOzNxQTd7RTuCSESJUlWNX2yLaYKDc5h9eat4fbVvd7VgZqJRUotMRXlMQHBMQGhQRWdRRmZMQ15HQlZNTFpeXmZqbnF1eXh4fXd6gHZ3em9rb2FgYlRXWUxUVExdV1ldVl1dVl4tLS0tLS0uLSsvLiwwLy0xMC4zLyw0MC0zLywzLyw0Lys0Lys0Lys0Lys2Lyk2Lyk0Lyw0LywzLiszLiszLiszLis0Lyw0Lyw1MC01MC01MC01MC01MC01MC01MC01MC0zLiszLisyLSoyLSoyLSoxLCkxLCkxLCk0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0MSw0MSw0MSw0MSw0MSw1Mi01Mi01Mi01Mi01Mi02My42My43NC84NTA5NjE5Ni88NS09Niw/OC5AOS9COi9DOzBDOzBDOy5EOi5EOi5GOi5HOy1IPC5JPS9KPjBJQDFKRzZNSDVSRzVZRjViRTNqRDF1Qi99PiyCOymLOimTOiqaPSyjQjKsRjiySj27ST/MR0LUREPYRELdRULiQkLpQUHwPUD0PD75Oj/4Ojz0PD7tPz7hQj7TQzrFQTW5PzCyPy2uPyyuPyyuPyytPi2sPi2sPi2qPy2oPi6kPy2gPyyePyuaPyyXPyuVPiqTPiqRPiyQPy6PPi2PPi2PPi2OPSyOPSyOPSyOPSyOPSyOPSyOPSyPPCyPPi2RPi6QPy6UQjSXQTSdQDGoQDO2QTe/QznFQjjEQTe+Qzu3SD+mTEOQSkB0RTtaPjJFOS08NStAOTNAODU/NzU+NjM9NTI8NDE5NDA4My82Mi80My80My8yMy4zMi4xMi0xMi0wMi0tMi4sMi4tMi4tMi4vMS4vMS4wMC4xMC4zMjA1MTA1MTA0Li4yLCw0Kyw3Li89Ly5ONS5ZOS5lPTFuQDNzQjt5S0uAWmWDZ4B/cJd6eKp1e7drc7RfZKZUVJRPR4NMQndOQW1OQmhNQWVKQWBHQllHRlhLS1dNUFVdY2NgZmJiaWFgZlxaYFRXW01VWE1YWFBeWVZgV1hgV1osLCwsLCwuLSsuLSsvLiwwLy0zLywzLywyLisyLiszLiozLiozLiozLio1Lig1LSozLiszLisyLSoxLCkxLCkyLSozLiszLiszLiszLiszLiszLiszLiszLiszLiszLisyLSoyLSoyLSoyLSoxLCkxLCkxLCkwKygzLiszLiszLiszLiszLiszLiszLiszLis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw1Mi01Mi02My43NC84NTA4NTA4NS47NCw8NSs9Niw+Ny1ANy5BOS5BOS5BOS5DOS9DOS1FOS1GOi5HOy9IPC5KPjBIQTFKRzZJSDZORzVWRjZcRTNkQzJuQDB2Pi17PCuCOymMOyqUPSycQDGjRjWqSjq0Sj3ESEDMRUHRRkHWRUDeQ0HkQD7sPj/xOjz3Ozz0OjvwPD3pQD3cQz3NQzi+QDKxPiyuPyyrQCyqPyuqPyuqPy2pPiypPiyoPyylPi2iPyygPyybPiyXPyuVPiqTPimRPyqPPiuPPi2PPi2PPi2OPSyOPSyOPSyNPCuOPSyLPCuNPCuLPCuLPC2MPSyNPi+OPy6UQjSXQTKgQDKsQjW5QznCQzrFQjrCQTu6QTmxSUCjTkeNTkVvRz1TPzRBOy85Ni1AOTNBNzU/NzQ+NjM8NDE5NDA4My83NC80My80My8zNC8yMy4yMy4wMi0wMi0uMy0tMy8tMy8uMy8uMy8wMi8wMi8xMS8xMS8yMS8zMjAzMjA0MC8yLi0xLSw0Li44LixHNC1PNClYOCtgPDBlPzZtR0Z5WWSCa4WAdZ98fLJ3fLxudbtkaK9bW6FSTY9MQn5PQXJMQGhJPWNIPmBIQl5FQ1hAQk87QEZCR0pETUpKUUpKUUlJUUZLUUVPVUlWV09eWVNgWVNgWFUrKysrKyssLCwtLS0vLiwvLiwwLy0wLy0xLSoxLSoxLSoxLSoyLSkyLSkyLSkyLSkyLSoyLCwxKysxKysxKysxKysyLCwyLCwxKysxKysxKysxKysxKysxKysxKysxKysyLCwyLCwyLCwxKysxKysxKyswKiowKiozLS0zLS0zLS0zLS0zLS0zLS0zLS0zLis0MSw0MSw0MSwzMCszMCszMCszMCszMCs0MSw0MSw1Mi02My43NC83NC84NTA4NS46Mys7NCw8NS09Ni4/Ni8/Ni0/Ni0/NyxCOC5COC5FOC9FOS1HOy9IPDBKPjJIQDNIRTZHRjRLRTVRRDRYQzJfQjJmPy5uPSx2PSx8OiqFOSmMOyqTPS6bQjKiRjesRji7RjzCRj7JRj7QRT7ZREDiQz/qQEDwPj7yOjrxOzrsPDzkQTzWQzvGRDa1QC+qPSmqPy2pQC2pQC2oPyyoPi6oPi6nPS2lPi2jPS6gPy6ePy2aPy2WPyyTPiqRPyqPPimPPiuNPi2NPi2MPSyMPS6MPS6LPC2LPC2LPC2KPS2KOyyJPCyKPC+LPi6LPTCMPy+SQzKYQjGhQTGuQja8QzrCQzzEQz3AQz25RkGyUUqlWFKPWFFzUklXST5DQzc8PzY+OTNANzI+NzE9NjA6NS85NC44My82My40My40My4zNC8xMy4xMy4uMy0uMy0uMy0tMy8tMy8tMy8tMy8uMy8uMy8wMi8wMi8wMC4xMS8yMjAyMS8wLy0vLiwyLi00Lyw/MCtEMClLMylUOC1aPDRkRkZ1XWqDc42JgKuFhL5+g8d0esZtcL1jZa9WU5pMQ4JLP3FJPGdHO2NFPl9GQl1EQlc/QU47P0g6QkU+SEdETUhHUUlHUUhKUkdOVktVWE1eWk9hWU5hWE8rKysrKyssLCwsLCwuLC0vLiwwLy0wLy0xLSoxLSoxLSoxLSoyLSkyLSkyLSkyLSoyLCwxKysxKyswKiowKioxKysxKysyLCwwKiowKiowKiowKiowKiowKiowKiowKioyLCwyLCwyLCwxKysxKyswKiowKiowKioyLCwyLCwyLCwyLCwyLCwyLCwyLCwyLCwzLywzMCszMCszMCszMCszMCszMCszMCs0MSw0MSw1Mi02My42My43NC84NTA4NTA5Miw6Mys7NCw8NS0+NS4+NS4+NS4+NSxCOC9COC5FOC9FOC9HOjFJPTFKPjJJPzNGQzRGQzRKQjVPQTRUQTJcQDJiPjBqPC1xPC53OSp9OCmFOCiMOiyVPS+bQjSkQjWyRjq6RTvBRj7KRz/UR0DeRkHnQ0HuQkDtOzvrOzvnPjvfQjvRRDq/RDSvQC2kPiimQS2mQS2lQCylQC6lQC6kPy2kPy2kPi+iPi6fQC6cPy6YPy2VPiuRPyqPPimPPiuNPi2NPi2NPi2MPSyMPS6LPC2LPC2KPS2KPS2IPC6IPC6IPC6IPC+HPi+IPjGLPzGRRDKWQzGiQjStQza6QzvBRD7BRD67RUG5UEyyW1SlZVyRZl11X1RbVUlHTUFDST88OTI/ODI+NzE7NjA5NC43NC02My40My40My4zNC4yNC8xMy4vNC4uMy0uMy0uMy0tMy8tMy8tMy8tMy8uMy8uMy8wMi8wMi8vLy0wMC4yMjAyMjAxMC4wLy0wLy0zLyw4LCw7LClDMCpLNzBTPDZeSUh0Ym6HepSQiraMjcaEiM96gMxyeMZpa7ZXV59JRIRFPW5HPGREPGFDPl5DQVlAQ1ZARFA+RUtHUVJLV1VRXldVYFhTX1VSXlRUXlNZX1NeW0xhWkphWkosLS8sLS8sLS8sLi0tLS0tLS0uLSsuLSsvLiwvLiwxLSowLCkwLCkwLCkvKygvKygvKyovKyovKyovKyovKyovKyovKyowLCsvKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyowLCswLCsxLSwxLSwyLi0xLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwwLCkxLSoyLiszLywzLywzLywzLywzLywzLywzLywzLywzLyw0MC01MS42Mi83NC84MC05Miw6My07NC49NC8+NS4+NS4+NS4/NC4/NSxCNS1DNi5ENy9GOTBHOjFGPDJHPzRIQDVKQDZQPzVUPjNYPDFeOTBiNittOS50OC18OCuDOSyNOy+TPTCYPzGePjCnQTOtQTS1Qzi+RTrKRz3URz7eRT/lQ0DoQD/qQkHmREHaRT7IRDi3QjGqQS6iQiyiQS6hQC2iPyyiPi6hPS2hPS2iPi6gPy+cPCyaPSyYPC2VPi2TPSyQPSuOPSqMPiqLPCuLPCuKPS2JPCyJPCyJPCyIOi2HOy2JPS+GPC+GPC+HPTCIPjOIQDKJQTWLQTSRRTWXRDSjRTmxST66R0C7RD67RUG4TUe0WlKvZl+jcWaRc2h+cmRqal5WXlNJUUZMTEJKRj1CPjU8OC85NSw3NCs2MywzMys0My4zNC4xNC0xNC0wMi0vMSwsMSssMSstMi4tMi4tMi4tMi4vMS4vMS4vMS4vMS4wMi8wMi8xMS8xMS8xMS8xMS8xMS80MC80KzA7LzNBMzJDNC9KOzZdT095bXmLhZ+TkLuUls+QldmDidN0esZqbrdfYqdaW5RMSXRIQmRBPl0+Plg/QlVBSVZMVVxVYGJicW5ufXh2hnxyf3VseW9ndWhfa19XX1BdXEhiXEZjXUcsLS8sLS8sLS8sLS8tLS0tLS0uLC0uLSsvLiwuLSswLCkwLCkvKygvKygvKygvKyguKikuKikuKikuKikvKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyowLCswLCswLCsxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwwLCswLCkxLSoyLiszLywzLywyLisyLisyLisyLisyLisyLiszLyw0MC01MS42Mi84MC45MS46Mi87NC49NC8+NTA+NTA9NC0/NC4/NC5BNC5CNS1DNi5FODBHOjJIOzNIPjVIPjVMPTZPPjZRPTRWOzJaOTBfNy9oNzBwNy53Ny2BOS2JOS6QPDGWPDGbPTGiQDOnQTOsQjW0RDi+RTrJRjzURT3bRD3fREDgRUDeRkHURz7ERjiyQzKlQi2eQi2fQy6eQi2fQC6ePy2ePy2ePy2ePi6ePi6aPSyZPiyWPS2UPSyQPSuPPiuMPiqMPSyLPCuKPSuJPCyJPCyJPCyHOyuHOy2FPC2GPC+FPS+FPTGDPTGEPjKGQDaHQTeIQjaTRzmXRTejRzyvSkC4SUK4R0G3TEazVE6xZFyqcWaffm+Qf29/fG1tc2VaZlpOWE1MTkFLST1FQzdAPTQ9OjE4OC40NCwxMSkyMy0yMy0wMywvMisvMSwuMCsuMCsuMCsvMS4tMi4vMS4vMS4vMS4vMS4vMS4vMS4wMi8wMi8xMS8xMS8xMS8xMS8xMS8yMDE1KzQ5LTc8MjM/NTNIPzpeVlR4cnyKiJ6Tk7mUl8qQltSEi895gcJxebhrdK1obp5cX4BYWnFTVWpSV2pUXmhaZ21mdnZygn90iH9+koeDlYl+joF2hnlygHFmdGVaZVRbWkVgWkBiXEQsLS8sLS8sLS8sLS8sLS8sLi0tLS0tLS0uLSsuLSsuLSstLCovKyguKicuKicuKicsKyksKissKissKisrKSorKSorKSorKSotKywtKywtKywtKywtKywtKywtKywtKywsKissKistKywtKywtKywuLC0uLC0uLC0uLC0uLC0uLC0vLS4vLS4vLS4vLS4vLiwwLCswLCsxLSwyLi0yLi0yLi0yLi0xLSwxLSwxLSwxLSwxLSwyLi0zLy40MC81MS44MC45MS46Mi87MzA9MzE9NC89NC89NC8/NDA/NC5BNC5BNC5DNjBENzFGOTNHOjRIOzVKOzZLPDdOPTZQOzZTOjVWNzJbNi5jNjBrNi50NSx9Ny+HOS+NOzCUPDCWPDGdPzOgQDSiQDOoQDOxQza6RDjFRTrNRDrVRkDXSEDUSULMST++RTquQzOhQi6cQS6dQi+cQS6cPy6bPi2bPi2bPi2bPi+bPzCYPC2WPS2UPC6TPS6PPi2MPSyLPCuKPSuJPCqJPCqJPCyHOyuHOy2FPC2EOi2DOy2EPDCCPDCCPDKCPjODPzSFQTiHQzqIRDmUSj2XSDugSD6sS0SyS0azTEeyU02uYFatc2emgXGdjHqRjnuCiXdzgG9jcWJYY1VOUkRNTkBISTtERDhAQDQ5Oy40NisvMSYwMSkwMSkvMCovMCouLyouLyovLy0vLy0vLy0uMC0vLy0vLy0vLy0vLy0vLy0vLy0wMC4wMC4wMC4wMC4wMC4wMC4wMC4xLzI2Kzk3Kzk4LzQ7NjNIRT5fXll6enyLjZqQlLGSl7+PlceEjsN9ibt7ibZ8i7J9jKt9iJp3g49xfodufYJufn5vgn55joWDmY2LoZSRqJiQpZSInYqDloN8jXtqe2lcaFRYWEBdWTxfW0AtLjAtLjAtLjAtLjAtLjAtLjAuLi4uLi4uLSsuLSstLCotLCouKicuKicuKicuKiksKisrKSorKSorKSorKSoqKCkqKCkqKCksKissKissKissKissKissKissKissKissKissKissKissKissKistKywtKywtKywtKywuLC0uLC0uLC0uLC0vLS4vLS4vLS4vKyowLCsxLSwxLSwxLSwxLSwwLCswLCswLCswLCswLCswLCsxLSwyLi0zLy40MC85MS86MjA7MzE8NDE9MzE9MzE9MzE9NC8+My8+My9AMi9AMy1BNC5DNjBENzFFODJGOTNIOTRJOjVKOzZMOjZOOTRRODNUNTBeNzJlNjBvNi94OC+COTCKOi+QPDGUPjGZPzSbPzSbPzKfPzGlQTKuQjW4RDe/RTrHRz7LSEDKSkHDST62RjqqQjWeQTCZQC6ZQS2ZQS2YPy2XPiyXPiyZPiyZPS6XPi6VPCyUPSyTPS6QPS2OPSyKPSuKPS2JPCyIOymIOymHOyuHOyuEOyyEOyyDOy2AOyyBOy+APDGAPDGBPjWDQDeDQzqHRDyIRTyUTECWSDyeRz6nSkOuTEmuUUytXVaqal6ngG+hj3mamoKPm4OGlYB6i3hte2pibV1TWkpRVUZLT0BFSTpARDY7PTA1NywxMygwMSkvMCguLykuLSguLSkuLSkvLiwwLy0vLiwvLiwvLiwvLiwvLiwuLiwvLiwuLiwwLy0vLy0wLy0vLy0vLy0vLy0vLy0yLTE3LDo2KjgzLTE5NjFISj9iZlh7gHqLkJONk6OPlrCMlbaDkLKBkK+FmbKNpLaSqLOTqKuQpKOMoJ6HnpiCmY99mImBnIuIo5CUsJqYsZuUrZeLo42Fm4R/knxrfGlYZk9TVjtaVjleWj0rLzIrLzIrLzIrLzItLjAtLjAuLi4uLi4tLS0tLS0uLSstLCotLCosKyksKyksKyksKissKissKisrKSorKSoqKCkqKCkqKCksKissKissKissKissKissKissKissKissKissKissKissKissKisrKSorKSorKSosKistKywtKywuLC0uLC0vLS4vLS4vLS4vKyowLCswLCswLCswLCswLCsvKyouKikvKyovKyovKyovKyowLCsxLSwzLy40MC85MDE6MjA7MzE8NDI9MzI9MzE8MjA8MjA9MjA9Mi4/MS4/MS5AMi9BMzBCNS9DNjBENjNDODREOTVFOjZHOTZIOTRLODRONTBYNzJfNjBpNzByNy99OjGGPDGMPjKQPjKXQDaXPzWXPzWXPzOcQDOjQzWrQzazRTi6RTu9Rz2+SD65Rz2wRDimQTWbPzCXQC+XQC2XQC2WPy6VPi2UPSyVPCyWPS+WPS+VPC6TOy2SPC+OPC6LPC2JPCyJPCyIPCyHOyuGOiqGOiqGOiqDOiuDOiuCOiyAOi6AOjCAPDGAPTR/PzaCQjmDRD2HRkCISD+RS0GSSD2aRz+jTEWoUEyoWFGpZl2mdmiijHebmYCVpIeMo4eGnYN+kX10gnFqdWVcZVJWX0xOVUNFTDo/RjY8QDI3Oi82OC0wMSkwMCguLSgvLCcvKygvKyoxLSwyLi0xLSwxLSwxLSwxLSwxLSwvLiwxLSwvLiwyLi0wLy0yLi0wLy0wLy0wLy0wLy0yLTE4LDo1KTUxKys2NixHTDhgaFF6g3CIkoeNl5aPmqCNmaWGlqOHm6KQqqmbubGgwLOYt6iatqebt6iYt6WRsZyJq5KJq5CQsZSSs5aVtJWQrY+IooWEm4F7knhnemRUYklRVDlWVTlYVzssMDMsMDMsMDMsMDMuLzEuLzEvLy8vLy8uLi4uLi4vLiwuLSsuLSsuLSstLCotLCotKywtKywtKywsKisrKSoqKCkqKCkqKCkrKSorKSorKSorKSorKSorKSorKSorKSosKissKisrKSorKSorKSoqKCkqKCkqKCksKissKissKistKywuLC0uLC0vLS4vLS4vKyovKyowLCswLCsvKyovKyouKiktKSgwLCswLCsvKyowLCsxLSwyLi0zLy40MC86MTI6MTI7MzE8NDI9MzI8MjE8MjA7MS89MjA8MS8+MC0+MC0/MS5AMi9BNC4/NC5ANTFANzJAOTNBOjRCOTRDODRGNzRINS9RNTFYNS9hNi9sOC11OS6APC+GPjCLPTGTPzWVPjWTPzWTPzSVQjSaQjSgQzSlRDSsQjWwRDi0RTqxRTuqQjehPzSaPjGWPjCVPy6UPyuTPSyTPSyTPCuTPCuUPC6UPC6TOy2SPC2PPC6NOy2KOyyJPCyHOyuHOyuGOiqGOiqFOSmDOimDOiuBOSp/OS1/OS2APDF/PDN/PzaAQTiCQzyFRj+ISUKKSUOOSkGQRz6XSEOfTkqnVlKnYFqpcGWkg3KclH2WoYOPqIqIp4iDoIR+ln55iHVwe2pkcFxdaVNSXkpKU0BCSzo+RTU6QDI5PDEzNCwyMioxLikvLCcvKSkwKioxKysyLCwxKysxKysxKysxKysxKyswLCswLCswLCsxLSwxLSwxLSwxLSwvLiwvLiwvLiwyLC44Kjc1KDEzKyg1NiZFSzFcZ0d1gmSGk3mOm4qRnpSQn5qLnpiNpZeXtJ6ixaWpzq2lya2myrCny7GkyKyXvp+Ls5GIsI2NspCOso6Qso+NrIqEoYKAmXt3jnJkeF1RX0VOUjdRUTVTUjYsMDMsMDMsMDMsMDMuLzEuLzEuLzEuLzEvLy8vLy8vLy8vLy8vLiwvLiwuLSsuLSsvLS4uLC0uLC0tKywsKisrKSorKSoqKCkrKSorKSorKSorKSorKSorKSorKSorKSorKSorKSorKSoqKCkqKCkqKCkpJygpJygrKSorKSosKistKywuLC0uLC0vLS4vLS4vKyovKyovKyovKyovKyouKiktKSgsKCcwLCswLCswLCswLCsxLSwyLi00MC80MC86MTI7MjM7MjM8MzQ9MzI8MjE8MjE7MTA8MS88MS8+MC89Ly4+MC0+MC0/MS4+My89NjA7NjA7ODM8OTQ9OjU+OTNANzJDNjBHNC5PNCtZNCtkNStuOCx4Oi1/Oy6FOy6PPDSRPDWQPjOPQDOQQTKTQjGXQTKZQDCgPjGmQDSqQjeqQjmlQDafPjWXPTKVPzKSPy2SPy2RPiyQPSuROyqROyqSPC2SPC2ROy6ROy6OOy2NOy2KOy6IOi2GOiyEOyyFOSmFOSmDOimCOSiCOSqBOSp+OCx+OCyAPDGAPTSAQDeBQjmERT6FSUGIS0aMTUaMSUGOSECYSkahU0+oXVipaGKpe26kjnmZnIGSp4aJrIuCqoiAoYR/mYB+i3d4gW5qeGFkcltaaFFRXUlJVENDTDs+RDY8PzQ2Ny80NCwzMCswKycxKCkxKCkyKSo0KywyKSoyKSoyKSoyKSoyKSowKiowKiowKioxKysxKyswLCswLCswLCswLCswLCsxKy02KTI1KS00LSU0NiFBSCZXYztxgFeCkm2NnH2QoIaQooyLoYqNqImVuI6gyJSk0J2p06uo0q6n0a2hy6WTvZeFr4eCrISHsIaIroWMsYiLq4aBn3t7lHRxiGtfc1dNXUJJTzNKTTBLSy8uLzEsMDEuLzEuLzEuMC8uMC8uMC8vLy8wMC4wMC4wMC4wLy0wLy0wLysvLiwxLSwyLi0xLSwxLSwwLCsvKywsKisrKSorKSorKSorKSorKSorKSorKSorKSorKSwrKSorKSwrKSotKCwqKCksKCkpJygpJygoJicqKCkrKSosKissKyktKywuLSsvLiwvLiwtLCotLCovKyovKyouKiktKSgsKCcsKCcxLSwyLSoyLSoyLSozLis0Lyw1MC02MS47MzE7MzE8NDI8NDI9MzE8MjA7MS87MS88MS88MS89Ly49Ly49Lyw+MC0/MS49Mi49NC09Ni47ODE5OTE5OjI5OjI7ODE/Ni9DMitKMSxUMileMypnNytvOS11PS56PC+HPTKLPTOLPzKMQDKOQDOPQDGSPzGVPS+YPC+cPjKiQjahQzeeQjeZPzSWPjKUPjGUPi+TPS6QPS2PPCyOPSyMPSyMPS6NPi+OPC6OPC6LPC+KOy6IOi2IOi2GOiyEOyyCOiuCOit/Oip+Oyp+Oyt8Oip9OSx8Oi6APjKBPjWAQDaCQzqDRz2FSkKHTkWLT0eMSUOOSUSTUEqYXFSeZ2CddWmeh3WemICUoYWPqomJrIuDqIeAoYR+m396kHl0iG9pfWJieV1ccFVVZ09PXEhHUkFBSDg9QTM4OC44NS43LywzKykyKCkyKCkzKSo0KiswKiwvKyowKiwwKiowKiwwKiwyKSwyKSwzKi0xKy0xKy0xKy0wLC0wLC0wLC0xKy80KS80Kis0LSU0NiE/RiVUYDhtfFGBkGeJmXSNnnqNoX6IoXqKp3uRtoKbxIify5CfyZmex52dxpqYwZWMt4qCrYCFroKMtYmEq3+JroWJqYJ+nHh2j29sg2ZablNKWj9HTTNGSjFERi4vMCsuMCsvMCswMSwwMSwwMSwxMi0yMS0zMi40My80My82Mi81MS40MSwzLyw0Lyw1MC01MC00LywzLisyLCwxLSwwLCswLCsuLC0uLC0tLS8tLS8sLC4rKy0qKS4pKSsuKS8uKS0vKC8uKS0vKS0uKS0uKisuKisvKyovKyotLCouLSktLSstLikuLyouLyotLS0tLS0uLC0vLS4vLiwwLy0yLisyLisyLSo0LCk1LSo2Lis4Lyo6MSw6MSo7Mis9NC09NC0+NTA+NTA+NTA9NC88My47Mi09Mi48MS08MS87MC49Ly4+MC8+MC9AMS5BMClAMik7NCo3Ny0zOS0yOC41Ni46My0/LSlGKidMKSdTKiZaLyhgNSxkPDBrQDB5QTB/QC+GQTGLQjOPQDOTPTCTOy+SOC2TOy+TPS6UQTGVQjKUQzKSQTCRPi6ROyyXOzCXOjKSOzGMPTCIPzCEPy+CPy6DPi6IQDGIPzCKPjGKPDCJOy+IOi6GOi2DOy17OSt+QDN3PC5xNyl3Pi13Pi12Oy19PzJ7Oy+CQDSHRTmJST+ITEGGTUKEUEOHTkWRS0mXU1CUYlmRcGGMfWqJiXGJlnyKnoKNpIeNpomOp4qNp4yHpIh+n4J1mntvl3VpjWlihF9belhac1VablNXZU5QV0VKSz1DPzZAOTM7MC42KiozJykzJyszJysxJiosKi0pKyoqKiwqKCksJysuKCwxKC0yJy0zKC4zKC4zKDAyKDAwKTEwKTEvKjEvKjAvKS0xKyswLSgvLyM8PypWXEBwelh/i2eNnHWLnXOMoXaMpneKqHaJqnWOtHuZv4afwY+dvo+WuoqPs4OIrn2Fq3yDqnuFqn6DqH2Dpn6Annx5lHVyiW1ofGNZa1VNWkZJUTxDSDQ/Qi8vMCowMSswMSswMSsxMiwxMiwyMSwzMi00My40My43NC83NC82My41Mi01MCw1MCw3Lyw3Lyw2Liw2LiwzLisyLSowLCswLCswLC0vLS4vLTAtLS8tLDErKi8pKi4pKC0uKS8vKC8vKC8vKC8vKS0vKS0uKisuKisvKyovKyouLSkuLSkuLyouLyouLykuLyouLi4uLjAuLi4uLi4vLiwvLiwxLSozLis1LSo1Lig3Lik4Lyg6Lyk7MCo8Mik9Myo+NSw+NSw+NS4+NS4+NS49NC08My48My49Mi48MS07MC47MC49Ly49Ly4+MC9AMS5DMCpDMClBMis+NCs6Ni05NSw6My08MS0/LStEKilJKihOKydULylaNS1fOjFlPi9wQS94QS2AQTCIQDKPPzSRPTOTOjKTOzGNOS6LPC+LPi6MQDCNQTGNQTGOQS+RPzGVOzKVOzKQPDKLPTCGPjCDQC+BPy+CPy6FQDGGPi+JPTCIPC6HOy6EOyyCOiyAOyx4OCx4PDFzOS1uOStzPi5zPi5yOCp1Oix9PTGDQTWJRTqLST2JS0CGTkGEUEOHTkWRSkiXU1KSZl2Md2aEhnCAk3eBnn+EpYaIp4iNp4qQp42Qp42KpImBn4N3nH1vmHZlkmlgi2BZglpZe1hcd1hablNTYUpOVUNGSDtDQDc8NzM3Ly0zKisyKSoxKCsuKCosKisqKiwrKSwrKSwtKCwvKS0yKDAyKDAyKDAyKDAyKDEwKTEvKjEtKjMtKjMtKjEyLTEyLi0wLCktLSU4OixTWEJveF2Ai2mHlm+GmWyGnm6Io3CGpHCEpXCKrXeTtoCZuYeWtoSTs4GMrnuGq3iCqHeCqHmDqHyDpnyCpH9/nXt4knVxiG5oe2VZaldNWkhFTDxARDU7PS8xMiwxMiwxMiwxMiwyMy0yMy00My40My41NC81NC84NTA4NTA4NTA3NC83Mi42MS04MC04MC03Lyw2Lis0LywzLisyLCwxLSwxLS4vLS4wLjEvLTAtLS8sLC4rKi8rKS4vKC8xJy8vKS0vKS0vKS0vKS0uKisuKiswLCswLCsvLiovLiovLikwLyowLyowLysvLy0vLy8wLi8wLi8wLy0vLiwxLSoyLSo2Lis3MCo5MCs6MSo8MSs9Myo+NCs/NSw/Ni0/Ni1ANy5ANy4/Ni8+NS49NC09NC09Mi48MS07MC47MC47MC47MC48MS8/MS5DMitFMCtILytLLS1MLC9LKy5JKi9FKy5BLSxALipBLihFLihNLilYMSpiMy1nNSxqOixvOy13OzCBPTSHPDaMPDWNOjSNOjSKPDKHPTKGPjKFPzOGQTKJQTOMQjWPQzWOPzKPPS+MPjGKPi6HPi+FPiyGPS6IPCyJOy6JPCyIOi2GOiqDOyx/PCl+PSt7PCt9PTF6PDF2Oi91Oy94QDF4QDF2PC52Oy1/PzWCQjiJRj2LSD+JSkGHS0GHTkOKTkaRSkiYVFGWZlyQdmWHhW6CkXR/nXuBpIOFqIeIqomNqoyQqYyOpYmIn4OBmn15mHhplm1hkmVci2FchmBdgmBbfF1VclZQaFBGWUVCUD86RDkzOjIuMywqLykqLCkqKigwJygxJioxJioxJiowJyoxKCswKi4wKy8vKi4tKy4sKzArLDApLTAoLTEoLTEpLTAxLzIzLy4uKicqKiI1NypQVUFtdlt8immAkGt+k2p/mWqDn26AoG5+oG2ApXGHrHiNr3yLrXqIqniEqXaBp3Z/p3V/pnd/pnl/pHmAon19m3l3kXRwh21ofGNZa1VNWkhESDk9PzI5OS0yMy0yMy0zNC4zNC4zNC40NS81NC81NC82NTA3NjE5NjE6NzI6NzI5NjE5NDA5NDA6Mi85MS45MS44MC01MC00Lyw0Li40Li4zLzAzLzAxLzAxLzIwLjEuLjAtLS8tKy4wKTAyKS4wKi4wKi4wKi4wKiwvKywvKyoxLSwxLSwwLyswLysxMCsxMCsxMCsxMCwxMS8xMTExLzAxMC4xMC4yLiszLiszLio5Miw5Miw7Mis8Myw+NCtANi1ANi1BNy5COC9BOC9COTBBOC9BODFANzA+NS4+NS49Mi49Mi48MS87MC47MC48MS89MjA9Mi5CMy5FMi5MLi5SKzBWJy9VJi5QJy9JKS5DLy48MSs7Mik/MilHMChSLylfLipkLylpOS9rOy91PDN9PDaFOziJOzmKOzeIOjaJPjiGQDiGQjmFQjmFQzeGQjeHQTeJQTWIQDGIQS+HQC6HQC6HPi2IPCyIOyuJOiuKOCqIOSqHOiqDOil/PCl7PSh4Pih4PiqCPjF7Ny56Ny56PDF2Oy13PS98QTN7QDKAQjeDRTqGSD2ISj+GSkCHTUKIT0SKUUiMU0qOXFGOaFuLdGKFf2eAi21+lnZ/nnyDp4OEqYeHqomLqoqLpoeHoIKDmn59mHlxlW9plGlmj2dmjGVni2dkhmVffl9ad1tQaFBLXkpCUD84RDYyOi8uNCosLygrKiUyJiY1JSg0JSgyJigxJygvKSsvKywuLC0rKysqKy0qKy0oLC0oLC8nLC8nLC8qKy0uKisxKyswKycuKyI4OCxQVUFpcVl2hGN7jGh5j2h8lml/nGx9n215nmt6oG1/pXKCp3SApXF9o3B9o3B9pXN+pXZ+pXh9pHh8oXh9n3p6mXd1kHFuh2plfGJXa1JOW0dERjk/PTE6OCw0NS80NS80NS81NjA1NjA1NjA3NjE3NjE4NzI4NzI7ODM8OTQ8OTQ8OTQ8NzM8NzM8NDE8NDE7MzA7MzA4MzA3Mi82MS42MS41MTA2MjE2MjEzMTIyMDExLzAwLi8xLS4yLDA0Ky40Ky40Ky4yLC4yLCwyLCwyLCwzLy4zLywzLywzLywyMSwyMSwzMi0zMi4zMjAzMjAzMjAzMjA1MTA1MS42MS42MS07NC48NS89NC0/Ni1BNy5COC9FOC9DOS9EOjFEOjFFOzJEOjFDOTBCOC9ANS9ANS8+My8+My89Mi49Mi49MjA9MjA+MzE+MzFANTFFMzFNMDJULDRYKTNXKDJSKTFLLDFCMzA6Ni03Nys6NipCNClNMilYLyleLylmOjFqOzNzPDd6PTqCPDqGPDuHOzuGOjqCOzeBPjiBQTiBQjmDQzqDQzqFQDmEQDeCQzKCQzGDQjCEPy+GPS6IPC6JOi2LOS2JNyuHOCuFOSuCOit+PSt4Pip2Pyp4PiqBOS18LyeCOC+EPjR3NCtzNSp9QTZ9Qzd/RTqARzyCST6DSj+ES0KGTUSHUUeFV0p8YU56alGAcFmBdV2CfGKDhmmGk3WInXyDo36Bp4KCqoWCrIaBqYR/pYB7nn16mXd6knB6kGx4jWx3jGt1jW1yiWxthGdrf2RgclhbaVJSW0hITD1AQDQ7Nyw3MCY1KiQ2KCc1JyczJycxJyYuKSYrKigrKykrLSonLCgnKyopKyopKyoqKiwrKSwrKSwtKSosIyQyKic1MCo4NipCQzVVWkZmcFdufV50iGVximJ1kGV4mGl3m2tzmWh0mml3n2t6om54oGx3n214oG55o3N7pXV7pXd8o3d5nnV6nHd3lnRzjm9thmhke19Xa1BOW0dDQzc+OjE5NSw1NjA1NjA2NzE2NzE3ODI3ODI4NzI4NzI5ODM6OTQ9OjU+OzY+OzY+OzY+OTU+OTU/NzQ/NzQ+NjM9NTI7NjM6NTI5NDE5NDE4NDE4NDM5NTQ4NDM3MzI0MzE1MTI0MC82LTA2LS42LTA2LS40Li40Li40Li40Lyw0MC00MC00MC01MS4zMi0zMi00My40My40My80MzE1NDI1NDA4NDE4NTA5NDA6NS89NjA+Ny9ANy5BOC9DOTBEOjBHOjFIOzJGPDNGPDNGPDNGPDNFOzJDOTBCNzFBNjBANTFANTE/NDA+My8+MzE/NDJANTM/NTNANzJDNTJJMzVQMTZULzZTLjVQMDVKMjJDNTI9OTA8Oi09OitDNylJNihRMylXMildMitkMyxsNTB2NjR9NzeCODeDNzeCNjZ+NzV9OjR9PDZ9PjWAPzmDQDiGPzmFQTiAQjOAQzGBQjGDQDCFPS+HOy6IOi6HOS2FOSyDOSyCOix/PCx8PSx5Pix4Pyx8PSyHNSqLMiyhTEWnWFGLQTh8OTCCRjuASz15SDp6Sjx7TT58Tj99T0KBUUWHVUqCX0xya09vc1J8dViHd12PeWKYf2mfi3OglHqWlnqPnXyLo3+IqIGFp4KApH57n3l+mXaDkXCFjm+DjnCAj3B/kHB7jnB3jG1zh2tqfmJmdlxfaFNWW0dPTT5HQTNANio9MCc7LCc5Kyg2KyczKygvLCcsLScrLicpLigpLigrLSgtLCovKyozKSo0KCo3Jyo3JygzKCQ8MyxFPjRJRzhRUkBdYktncVZqeVpugl1rhFxsiV1wkWJxlWVvlWRvl2VymmZ1n21ynGpxm2l0nm54onJ6pHZ5onZ5n3Z2mnR3mXZ1lHJvjWtqhWZjfF5VbE9OXEVDQzdAOTE7NCw2NzE3ODI3ODI3ODI4OTM4OTM5ODM6OTQ6OTQ7OjU+OzY/PDc/PDc/PDdAOzdAOzdCOjdCOjdBOTZAODU9ODQ9ODQ8NzM8NzM8NzM8NzQ8NzQ8NzQ7NjM5NTI5MzM4MzA4LzA5Ly44LzA4MC44MC44MC42MS42MS02MS02MS01Mi01Mi02My42My43NC83NC81NDA1NDA4NDE5NTI6NjM8OTQ9ODRAOTNANzBBOC9DOTBEOjBHOjFIPDBJPTFJPTFKPTRKPTRKPTRJPDNGPDNEOjFCOC9BNy5BODFANzBANzI/NjE/NjFANzJANzJBODM/NzRAODVCODZEOTdHOTZIOTZIOTZIOTRFODBFOC9FOS1FOStHOSxJOSpLOStRNypaLyZkLyduMy16NjODOTiJOzmLOzqLPTuLQT6HQDqCPTZ/PDN/OjOCPDSIPTeJQDeDQTWBQjOCQDKDPzKDPTGEPDCBOy+APC9+PC58PS57PS58Pi98Pi99Pi9/PS+GOS+QMSuiPDjNbGbZfnmtWlSMQzyITEF/TkB0SjxxTT1wUT9xUkB0U0B6V0SCW0p+ZU9tc09ve1WEeVuYdV+pb2O2bWa+cWu9d2+7gnexjHqnl36en4CWoYGNoX6FnXmFmXaIkXKLkHKIkXKEk3KAlnJ8lnN4k3B0knBti2lphGVkeFxda1FWXkdNUDtFRDBCOytAMys/Miw7MCo3MCozMCkwMCguLycuLykvMCoyLyo2LCs6Kis+KCtDJitFJCtDJihGNS1MQzRWUT5bWURgYkpnbVFpd1Zqe1dsgltngldmhldsjlxvlGFulGFulmJymmZznWtvm2pvmWlynG53oHR5onh4nnd1m3Zzl3N1l3ZzknJui2xphGNie1tUbU1NXUNHSDpFPDVANzA3ODI3ODI4OTM4OTM4OTM5OjQ6OTQ6OTQ7OjU8OzY/PDdAPThAPThAPThBPDhBPDhDOzhDOzhDOzhCOjc/OjY+OTU+OTU9ODQ+OTU+OTU+OTU+OTU9ODU8NzM6NTE7MzA6MC46MC45MS45MS45MS85MS45MS43Mi42MS02MS02My42My42My43NC83NC83NC81NDA2NTE5NTI7ODM8OTQ/OjRCOzVCOzNBOC9COi9DOS9FOy9IPDBJPTFKPjJKPjJLPjVLPjVKPTRKPTRGPDNFOzJDOTBCOC9COTJCOTJBODNANzJANzJBODNCOTRBOjQ/ODJAOTNCOzVEPTdGPTZHPDZLPDVOOzRNNi5ONixRNitRNitRNypQOStQOSlWNidmNipyNix+OzOJQDmVRECbSESfSkefTEagUUqZTESORDuFOzCENy2FNy2MOTGNPTSIPjWHPjeGPTaFPDWFPDWBPTR9PTN6PjN4QDN2QTN4QDN6PjN/PDODOjOINzORMzGYKCazPTvsfHr9lZLFaGOWR0CJS0B4SDpuTTxqUT1mVD5oVj5sWEB0W0V/YEyAaFB5c1GEd1WedFy0bF7JX1/TVlzZUVvXVFzkb3XZenjMhnzAj361lYCrlX2jknifj3acinKcinSZjXWVj3WRkXWLknOGkXOCkXJ8i255hmp1e2Ftb1dnYk5fVEJVRTVSPC9PNC1NMS1JMCxELyo+Lyg5LyY3Lic2Lyc4MSk6Lyk9LitBLCtGKStIKCtLJytIKSdUQjRZUTxkXkZnZUxpbE9udVZte1hsflhrhFpnhFZnh1Ztj11wlWJxlmJymWR1nWl0m2xvmWtvlmpymW13nXZ5n3h3mnl0lnVzlHV1lHVzkHFvimtphGVhfFtUbU1NXUJNTkBLQjlGPTY5OjQ5OjQ5OjQ5OjQ5OjQ6OzU9PDc9PDc9PDc9PDdAPThAPThBPjlCPzpEPztEPztFQDxFQDxFQDpEPzlEPzlDPjhFPjhEPTdCOzVCOzVCOzVCOzVCOjdCOzVBOjRBOjRBODNBODNBODNANzJANjQ+NzE+NzE+NzE8NzE8NzE7NjA6NS84NS44NS43NC83NC85NjE5NjE5NjE6NzA8NzE9ODJBOjJCOzFDOjFEPDFGPDJKPjJLPzNMQDJOQDNOQDVOQDdOQDdMPzZLPjVJPDNIOzJFOzJFOzJCOTBBOC9AOTE/ODA/ODA/ODBAOTNAOTM8NS9NRD1NQDpLOjNUQDlSNjJPMCthPDZcMy1gNS5gNCteLydeLyVmNixtPTFxPTCJST2PRzuXST+fS0GfRj6bPjeaPTaeRDumTkSkUEWoVkqrWUulT0KZQTWXOzCbPjaTOTiROTiMNjWGNTKGODSEPzh8QDZyPjFyQjRvQTJxPTB2OjCCNzKMNDOSLTGaJyzISEnoYmHFRUTNV1XheXarVk+GRjyEVkZtUj1pW0FpYkZqZUhqYEVuXkR8ZEyNalSSYkyybV3RbmjbWF3gO0znLUXyK0j1MEz2QFnsSVzkW2XlbnLie3zbgH3bg3/YiYLDf3a9gXe6hHi2hniyiHitineoi3mljHiagG+Zfm2YeGmTb2GNYlmEVU17SUJ4QT51OjxpLjJkMDJhMTFQJidHJSNMMC1NNTFHNC5FMixEMS1GMS5GLixHKypLLS1RNi9ZSDRgVzpmX0JnZEVrb051fFp1hF1vgVlsg1dsh1pwjV1ykmFzlWJ1l2R3mWZ2m2hylmpzmG9zl3FxlW9zlXR3mXh6mHx5lnp4lXlzjXJth2prhGZpgmRhelpUbU1PX0ROTz9TS0BQRz45OjQ5OjQ5OjQ5OjQ6OzU7PDY+PTg/Pjk+PTg+PThBPjlBPjlCPzpDQDtEPztEPztGQT1FQDxFQDpFQDpEPzlEPzlFPjhFPjhFPjhFPjhFPjhEPTVDPDZDPDREOzRDOjFCOTJCOTJCOTJCOTJBODNBODNAOTNAOTM+NzE8NzE7NjA7NjA5Ni84NS43NC83NC85NjE5Ni85Ni86NzA8NzE+OjFBOjBCPDBDOzBFOy9JPTFKPjBMQDJMQDJOQDNOQDNOQDVOQDdNPzZKPTRJPDNIOzJFOzJFOzJDOjFCOTBAOTFAOTFAOTFAOTFBOjRCOTJEOTNJODFMLytWLixqNzZ1OTl7OzuFRUODRD+ESECFSUGGRz6OSUKZTkihUEyiT0eTRDeUQjSaQjafQzigPjOcNy2cNy2fPTCjQzWbPzCZQDCgRTOkRzanRjauSDq2TkW0TE2vSEylQESZOTuROTiNPjqDQDh4PjNvPjB6STuFTEGEPziELCuSKS6zOUTSTFfcS07fTU3KPj3AQD/QYFyzWVGEQDWCVER5YUllW0BeXT9paElzbE92Z0p+ZEuWY068ZFjWX1vmVVrrQU7yLEX+JUT/Jkj/J0n/Lk75M07yPFLwSVrrUF7lUV3jU13gWGLbYmnVZmzUam7SbXHPcXLNdXTJeHfHeXfKfHzJeXrIdnjHcXTGa3LFZm7FYWvDX2vFYG6zU1+lS1WaR1GNREuGRUltNjlIHBtUMS1NMCpIMStKNi9LODFLOjJPPjZVRThbTzVjWjlnYUFpZkVuck96gl16iWJ0hl5yiV9wiV9wi2BxjmB1kmR3lGR3lGR3lGZzkml4lnJ6l3h5lnh+mH2DnYSFnYeDm4WBmYN6knpyiW9thGhogWRgeVtUbU1OYUVSU0FWUEJVT0M4OTM4OTM4OTM5OjQ7PDY8PTc/PjlAPzpAPzpAPzpDQDtDQDtDQDtDQDtEPztEPztGQTtGQTtGQTtFQDpFQDpFQDpHQDhGPzdKQTpJQDlIPzhHPjVGPTZFPDNGPDNFOzFEOjFEOjFEOjFEOjFEOzREOzREOzRDPDQ/ODA/ODA8NzE7NjA6NS86NS85NC45NC45Ni85Ni86NS87Ny4+Ny9AOS9COTBDOzBFOzFGPDBJPTFLPzFNPzJNQDBOQTFNQDBQPzVNPzRMPjNLPTJJPDNIOzJFOzFEOjBDOjFDOjFBOjBBOjA/OzJAPDNAPDNEOzRVRDxSMy5qMjOOQUetTFfDVWDLXWbGX2KbQj6XST+WTEGcTkKsUkq+VVLMT1PETEulQDSdQjCgQDClPzGlOy6jNyukOCunPS+rRTahPiuYNySdOielPi2sQS+yQzK2RDqnMDKvOkK5REy9TFK6TVKtS0yWQT6CNzF7OC92Nix4MiqEMS2cMze5PUfVR1foTVviRknPNTPQOjm9MzHITkvGY12USj+MW0p9Y0xqX0NnZEV0b09/cFGBaEqNaE6waFnkYmL1UVr0RFH2N0n9MUr/Mk7/L03/Kkj/Mk/8MEv3MUr1NUzyNE3wMkvzM0zzN1DyQFjvQ1vuRl3tSWHrTmPqUWXoVWjoVmvlU2rkUmnjT2nkTmnnTmzrUG/yU3PzVnX+aIXxYXzlW3TVVWzNWWzJZHKoUl1yLTJeJidZMCxXOjRRPzVCOi06OCk+QjFMTjlWTzNhVjZlXz9oZURxdVR/hmV+jGl3iGR4jGl1i2Vyi2Ryi2N2jGV5j2h6kGl6kGqAlXaEm36KnoWNoIqSo5CXqJaYqZmWppmRopKHmIZ6jXlwg21nfmJed1lUbU1QY0dTWERYVURZVkc3ODI3ODI4OTM5OjQ7PDY9PjhAPzpBQDtCQTxCQTxEQTxEQTxEQTxEQTxFQDxFQDxHQjxHQjxHQjxGQTtGQTtGQjlIQTlIQTlMQzxLQjlKQThJQDdIPjVHPTNGPDJFOzFEOjBEOjBFOzFFOzJEOzJFPDNFPDVFPDVAOTE/ODA9ODI8NzE7NjA6NS86NS86NS85Ni85Ni07Ny47Nyw/OC5AOi5DOzBEPC9GPDBGPS5KPjBLPy9NQDBNQDBNQC9NQDBPPzJPPjRMPjNLPTJKPDNHOjFFOzFEOjBEOzJEOzJCOzFAPDFAPDNBPTRCPjVGPDNTODFbKiaJOj++VGDZVGXmVWbjVWPLSk+fMzCWOi+RPjCZQTOuRj3FSUfVQkjNPkCxQjenRjWpQjOsQDOvPzOwPjOzQjS0RDayRzWpQi+jPCmkOyipPCirOiiuNiatMyi2OTe6OT29Nz68Nzy/PELGSkzEVFO+WFOZPzeMNCqJLCWdNjHDSEvcT1fiQVHbM0DeOjnNLirTODTINzTGRUDIXVWpV0uQV0Z3V0B2ZUl+cFN/cFGEZkqQZEupb1vVdWnuU1f8RFD3O0r4OUn+PU7/QFH/Okz5NEj/P1P+OU36NEv9M0v9MUr/L0n/ME7/NlP/M1T9NFb9Nlf6N1f4OVr4PVz3Pl71QGH4Q2b2QGb1P2X1P2f4P2j8Q23/RXL/SXP/T3X/UXX+VXbyU3HnVG7lYXjWZna3V2J9MTVqMC9YMSpQOCxHPi8+QS47RC8/Ry9QSy5fVDhnYENva058fGCIjnKHkXZ9i3F6jXF8j3N8j3N6jW96im19jG+DknWIl3qVo4qcqZWjrp2msaGstKexua6wt7Crta2hq6KUoJSDkYJzhHFofGNddFhTbE5QZEhSWkNXWURZWkg2NzE2NzE3ODI4OTM6OzU8PTc/PjlAPzpCQTxCQTxEQTxEQTxEQTxFQj1GQT1GQT1GQzxGQzxHQjxIQz1IRDtIRDtKQztKQzlMQzpLQjlLQThKQDZKPTRJPTFIPDBHOy9FOy9FOy9FOy9FOzFFOzFFOzFEOzJEOzJAOS9AOS9AOTE/ODA8NzE7NjA7NjA6NS87Ny47Ny47Ny48OC0/OC5BOy9DOzBEPC9HPTFHPi9LPzFNQDBNQDBOQTBPPy9PPzBPPzJOPTNOPTNKPDFJOzBHOy9EOjBEOjBEPDFEPDFCOzFAPDFBPTJBPzNCPzZLPTRcNS53MzKtTFPbXWnmTV/lQFHXNkW3JiuoMSmdNyiSOiaXPCmsQDPDRD3UPj/NOzuxPzWoQjSqQDKtPzKyQDW4Qzm8SDu7SjysPi+qPy+oPSumOymqOSmwOiy3Oy+8PDHKRkHOREHQPj/QNznWNzzeQkXiTE7dUk/EQz7GS0PNVEzUU03ZS0rbP0LgNT7hMjfbNC7aNy7QMSvPOjS/ODSzQDm1W1CWVUN7TjmCYkmGa1CEYEaSW0atZlTLcmTnbWjqRUvyOkTqOUPnPETnQkjnRkvoR0zqRk30SlPyQk3yOUn2NUj5Mkf9L0b/Mkz/OFL/OVb/OVj/Olj9Olr+O13/PV//QGL/QWX/Q2n+RGv+RG39Qm38Q2/8Q2/8QnH9Qm//R3D/QGj/R23/TXDySWjpT2vlW3LZY3O9WWOOP0RgJiRRKyJWQDNWTz1JTDdARC1SSjNlWUN1alaAe2eOjXmZnIuVnIyIk4OCjoCJl4iPm42MmYiHkoKKk4KXno6kqJmytqe4vK6/wbbAwbnCw73FxsHDw8O+vr6wtbGiqaKNl4x5h3Zpe2Vcc1lUbU9SZkpRW0JVWkNXXEY1NjA1NjA2NzE3ODI4OTM6OzU9PDc+PThAPzpAPzpDQDtEQTxFQj1FQj1HQj5HQj5HRD1HRD1IQz1JRD5JRTxJRTxLRDpMRTtMQzpLQzhMQjhLQTVMQDRLPzNKPjJJPTFHPTFHPTFGPDBGPDBFOzFFOzFEOzJDOjFBOjBBOjBAOTFAOTE9ODI8NzE7NjA7NjA7Ny47Ny47Nyw8OC0/OS1BOy9EPC9FPTBIPzBKPjBMPy9NQDBOQTBOQTBPPy9PPy9PPzJOPTNNPDJMOzFJOzBHOy9GOTBDOS9DOzBCPDBCOzFAPDFAPjJBPzNCPzZOOzRtODSXRkXEWV/bV2LfQ1HeOEbUMzu9KyutMSehOCWYOiGXOSCkOya2Pi7DOjK+NzGnNyyiOi2lOS2nNyyvOjG4Qji6RTu3RTquPjKtPzCnPCykNieqNim2PjDDRDvKRz2+OC3OQDbhRD/sQkL0PUHzOT7rMjfeLjDbNzXiR0LoU0zlTkfcPTnZMTDjLzLqNjfZMSjePC/NLCLQNzG+MyywNy/JZ1y4bFyOV0OHWkODVj+JUj2pXEzObGHhZ2LkVFTwRUvxPUbkO0DZPT7SQT7SR0LdT03rV1ftTlLvRE3wOkf2NUb3Mkb4LkT7MUf+N07+OFP9OFT9OFb+OVf/O1z/PmH/QWX/Q2v+O2X9PGj9Pmr9P236Pm74Pm/0PW32Omr/SHL/O2H/P2T/S27/S273Tm3vVW/jWm7ocoLCYWqYSUx0OjhcNi1QOStQQzJVTTpeUUFyZVWIfG6VjYKfnZGmp5+hpp+WnJiVnpuep6Smr6ymrKiip6OmqKO1tLDCwbzMycDRzsXV0MzV0M3Uzs7Vz9HRy8/Lxsq/vcCwsq+Yn5iAjH5tfmtgdFtXblJWak5TYEZWYEVYYEg1NjA1NjA1NjA1NjA2NzE4OTM6OTQ7OjU9PDc+PThBPjlDQDtEQTxGQz5IQz9IQz9HRD1IRT5JRD5JRD5KRj1KRj1NRjxNRjxNRTpMRDlNQzlNQzdOQjZNQTNOQDNNQTNKQTJKQTJJQDFIPzBHPTFGPDBEPDFEPDFDOjFDOjFBOjJAOTE/ODI/ODI8NzE8NzE8OC88OC08OC08OC1AOi5BOy9EPC9FPTBIPzBLPzFNQDBOQTBQQDBQQDBPQC1PPy9PPTFPPTFNPTBMPC9JOzBGOi5FOC9DOS9COi9BOy9BOjA/OzA/PTFAPjJAQDRQOTFyMS+oSkvBU1a7PkS9MDbCMDPBLy+6MSmpMSGjOSOcPSGZOx+bPCChPSOlOyWkNiWeNimgOC2iNiylNCytODG3QDq4QzyyQDaxQjetQTSoPC+mOCuvOjC8QzjDRD3FQDfDPi3PPi3ZNSvhKibtIiX6JSv/KjH/LjTtKSrnLivhMyzfNCzgMyzjMizpMC3nMivaMiXWNibQMibPNyzFNi69PjfIYFXSf3GmZVOPVkKKTTqjV0nIZlvfZF/nUlToQ0n1Rk3tQETfPz/UQDzJQDjGQDfRRkHjTUzvSk70QEv5OUj9N0j8NUj4M0X3Nkf6O036OFD8N1L7NlL9NlX/Nlj/OV3/O2H/PGf/Pmv/P23/QHH/QnT/QnX+QnX8QnT5QnD/Rm36QWH+RWX/S2r+S2v/VnT/X3r1XXTyan7mcH7Tb3euXmGDQ0FnNi9oQjdzVUp5ZVyMfXajlpCto6Gyrqu2traytrmqr7Owt722vcW9wcrAw8rDwsrJxs3Vztbd19vi2tjn3dvp3d3m2tzl2N/k1+Dg1N7Zz9jKxcu6urqip6OIkod0gnFleGJcc1dbb1Nbak1caUtdZ0w1NjE1NjE1NjE1NjA1NjE2NzE4NzI5ODM8OzY9PDdAPThCPzpEQTxGQzxHRD1IRT5IRT5IRT5IRTxKRj1KRjtLRztLRztOSDpNRztNRztNRTpNRDtNRDtNRD1OQz9OQz1NQzdNRDVLQjNKQTJIPjJHPTFFPTJEOzJDOjFDOjNBOjJBOjRAOTM/NzQ8NzM8NzE+Ny8+Ny88OC89OTA+OjFBOjJDPDJEPTNIQDVJPzNMQDJNQTFOQTBQQDBPQC1PQC1MPy9MPjFNPTBMOzFKOTFJODFFODBDOTBAOS8+Oi87Oy88PDA9PjA+PzFBPzBTOC2HPDfEXFvKWlmuODarLiqyMSuuLiWtMiOsOSasQiqqRiymRCejQSajQSaiPCOfOSOgOSqjOzCmOjCmNy6tPDS2Qzy3RTuwQDWrPTCoPC+pOy6sPDC7RTnGTEHFRTy8OCy/NiTNOijdOy7mMyzxKyr5KCv9Jiv7JSf4Kir1LivvMizrNCzoMyrlMynkMijgMyXgOirRMh/cPzDONinIOC3CPzWzQTbRbGC/Z1mlUkKoT0HLY1rnaGLmUlLqQUbzQkrrPkThOz3WPDzNQDnBPjS2OCy5Ni7EOTTiSEjpQEXwO0T2Okj6Okn4OEf3O0n7P07+QVX/P1b+PFT+OVT/OFX/OVr/Ol7/O2P/Pmn/Pmz/Pm//PnD9PnH6QHL4QHT3QXH3Q2r/TW3/U3P3SmjrQGD9VHP/Z4X/ZYL3XXfvX3jnaHvccH3GcXinZ2eNXlh7WlGXfneqmZK+sK3EvLrGwsPIx8zHx8/Dw8/LytjMytjRytrXzt/f1OTm2+nq4Ovt4+vv5eby6Ob06Ojw5Obu4ejt4Onq3efk2OLRytHBv8Krq6mRlo96hnhse2hidV9gclhicFZib1NjbVQyMS8zMjA0MzE2NTE4NzU5ODQ5ODQ5ODQ7OjU8OzY9PTU/PzdBQTlDQzlFRTtFRTtISEBISD5ISDxKSDtLSjhMSzdNTDhOSzhNSjlKRjpHRDtKRkNOSU1OSVBHRE9EP0VORT5MQzRKQDRLQTVNQzlMQjhGPTRCOTBFPDVDOjVAOTM/NzRAODU/NzU8NzQ8NDJDOjVCOTRBOTY+OTU/Ojc+Ojc/OzhAPDlCPzpEQDdHQDZKQDRMQDBPQC1PQCtMPyxHQC5GPy9JOzBLODFNNTNLNjVKODhGOzlCPzo2OTA0PC85RDQ6QS82OSQ/PShiQzG8al65SkGmNyylNSmnNyulNSelNyaoPSujOCSlPCaqQCqtQCmsPSmsOSauNiWrNiWkNiehNymiOCqmPC6qQDKsQjSsQjKsQTGpPiyrPSytPCyzPS+9QzTERjjAPjG6MibHOSvMOCrQOCvWOC3bNy3iNS7pMy/uMS3xLiz0Li3zMCzxMSzqNSrjNyndOinbOijcOSbUMx/QMyDPOCfGNye+NijCQjXPU0nITkPPU0vhXFfuXVrwUFLtPkPyOT/3P0fqQUbfQ0TVQUHIPzm7PDOxOy+wPC+yPDDKTEDUS0PcR0PhPj/rPEH3P0f9P0n5O0f+RFH8Q1H+RFL/RFX9QFb8PFX/PFr/QmT/Rmv/QWr6O2f1Omf2PG35Q3P9SXn/S3r/TXn/TXT4UHPwT3DnTWnqTWr8WXj/Z4j/X4P1R2z2V3foX3nDXm69e3+HYV6PeHCnkYS7p5zRxLvd1tDd3Nrc2+De3Ofi2+vm1+zr2O7x2fH23fP34vP35/T16/T07vL59PH59PD58e/27e7z6Ozu4+np3uTm3eLW0NTNycq7urijpaCLkIl5g3hyfW9we2t9hnN4gWx2fWswLi8xLzAzMjA1NDI2NTM3NjI4NzM4NzI6OTQ7OjU9PTU/PzdBQTdDQzlERDhFRTtISD5ISD5ISDxKSDlLSjZMSzZNTTVOTThLSjhLST1LSkVQUFJXVWBZWGpWVGpST2BPSUtNRD9IPzpGPThHPjlIPzpGPThCOzVEOjhBOTY/NzQ/NzRAODVAODU9ODU7NjI9NC89NC89NTI8NzQ9OTY+Ojk9PDo+PTlCPzpEPzlHQDZKQDRNQDBPQC1QPytMQCpCPyxCPy5GPDBIOjFKNjVJNTZGMzVANjVAPDk6PTY7PjVAQDRFPC1KOSleQjSATD6uUUKrOy2gMiOhNiajOieeNySeOSWjPiqhOyWnPCiuPyuzQC22PSy3OSq4Nii1NymqOSmlOiqkOSmlOyuoPi6rQTGrQi+rQC6uPyyrOiixPCu/RTbGSDnBPzG8OCvANinLNyvPNyzQOS7ROy3UPC/YOi7gOC/nNC3uMS30Liv0LivxMCvqNCnhNyjXOifVOiTePCfZNiPVOCXUPSrMOyrBNSbEOi/PRjzRRj/aSUTpT03zUFH0R0nwO0D1OkH4Q0jlQkXaREPSQkHFPji3OzGuOi2qPC2rPS62RTXGTD/UTkXcR0PjPz7vP0L6P0b+QEr4Q0r3Q0z6RFD/RlT9QlP5PlP8Plj/QmH/Rmj/Q2n8P2n5QGr5QnD8Rnb+Snr/S3v/Snr/SHT1S3DxUXP1XHr5X3v7WHf8TnH9RWv6RGzvRWnaS2fIX3CxbnVrTEmQfnSwlonMsqXk08ns49zr5+bq6e7q5/Lt4vP24/n74fr/4v3/5///7P//8v7/9v7/+fv++vf9+vX89/T69fL47/D06+7x6O3v5uvm3eDc1tjKxsWzsq6eoZqOk4yJj4WIkIOPlYeJkICGjH4vLiwwLy0xMC4yMS80My81NDA3NjI3NjE6OTQ6OjI8PDQ+PjZAQDZCQjhDQzlERDpJRj1JRztKSDtMSThNSjdOTDdOTDdPTDlLSTpOS0JUUlNfXmZpaHhtbYVsa4praINgWWlZUVxPR1JIQEtIPkdHPUVFPEFAOjxDOjs/Ojc8NzQ8NzM9ODI+OTM+OjE9OTA4My05NC47NjA8OTI9OjM+OzQ/PDVAPDNFPjRHPzRJPzNMQDBPPzBQPy9QPy1MPyw8OyY6PSg/PCtBOy1CNzFBNjI+NDI7MzA9ODRCOzVIOTROMi5ZLClsLy6HOz2gRkWjOzCiMiSfMSCkOSelPCmeNySeOCKiPCakOyaqPSmxQS22QS+5Pi67PC2+Oi2+PC+yPC6sPC6pOSupOSurPCutPi2tPi2tPCyyPy2wOCi5Pi7LTD3LRzq8Niq6MibJOS7QNizUNivUOCzWOi7YOi/cOC7jNi/oMyzwMC30Liv0LivwMSnnMifdNibUOCLSNyHdOCTcNSPaOSfaPi/TPS7INinFOSzLQTfJPDXNPjjZRUHlS0nqSkrpQ0PsP0HrQ0PeQ0HVRD/NQj3CPTS2Oi6uOCqrOiqsOyusOCnARDjUTkXdSUXgQEDoPkH3Qkn/SFD0QUf0QEn5Q0/9R1T+RVX6QFX7P1j+QV//RGb/Q2n/Q2v/RnD/SXf/S3v/THz/Snr/Rnj/SHf/S3T6TnT/Wnz/YYD9VXbxQ2T7SWv/VHbcP1zNSWDYe4W4fHxhQzuPfG6ujoHVs6fz29H77OX68vD59/r39P307Pv66///6v//7P//7v//8///9///+////fz//vv//fn/+vj/+Pb/9fb98/T78PT58PPw5+rl3+HTz86+vbmtrqiipZ6do5mdo5ejq56eppebo5YvLiwvLiwwLy0xMCwyMS0zMi41NC82NTA4ODA5OTE7OzM9PTU/PzVBQTdCQjhDQzlIRTxKRjtLSDlNSjlQSzhPTThRTDhPTDtMSj5RUExeXWJtbHp6epKBgqGAgqiAgKZ7dZdya4plX3tZU21UTGRNRVpHQFBCPEhEP0ZAOz88ODc7NjM7NjA8OC89OS47OC86NzA5OTE7OzM+OzI/PTFAPDE/Oy9BOy1GPy9IPy5LPy9NQC9PPzBPPy9QPjBMPy9APSo/PixAPS4/Oy8/OzI+OTM9OjU6OTQ8OTREOTVNNTFWLStqKS2EMjieOEOrPkOmNy6lNyilOiiqPy2oPyygOSahOCOkOyalOiarPCmzPiy5QC+9Pi/BPTDFPTHEPjK9PzO2PTKyOS6uOCqvOSuwOiyyOiyzOSq2Oyy5Oy3EQjTLRTnIPjO+MSfAMijNOS/WNSvYNCraNi3bNy3eNy7hNizmMyzsMSrzMCz0Liv0LynvMCjkMibbNCTSNiDQNR/XMh7aMB/aNCTcPC7WPS/QOS7NPTLSRDrENS3FNjDKOzXYREDiTUnlS0neQz/WPTjTQDnOQTjHPjS+PC+1OiuwOCqvOSuxOy2sNCa9PzPRSEDZSEPdQkDlQETzRkz9TlXwP0XwP0X2Qk3+SFX+SFf8Qlf6QFj8QV7/QWP/Q2b/Rm3/SXL/TXn/T3z/THv/SXn/RHb/Tn7/Un3+S3L4TW//VnX/VXX3TWrwRmPvS2bSPlbhZHT+n6fTj45kOTJsSj6leW7QpZz11Mv/6eP/9PL//f///P/58//87///7///8P//8v//9P//9///+/3//Pv//fr//Pj/+vj/+ff/9vf/9fb/9Pj+8/f26+/s4+Ta1dLJxsG6ubSztKyxtKmwtqq2vrOwuK2stKkxMCwxMCwwLyswLysxMCwyMSw0My41NC83Ny84ODA5OTE7OzM9PTM/PzVBQTdEQThJRTpMRjpOSDpQSjpSSzlSTTpTTDpRSz1PSkRWVFVmZHF3eI2GhqiNkLmPk8OPkMaOi8CHg7Z7d6lwbZppZI1fW35VUG5OSmFLR1hFQk0/PUI7Nzg5NTI5Ni84NSw4NSw2NzE3ODM4OTE7OzE+PC8/PCtCPSpDPClHPyxKPytLQCxMQS9NQDBNPzJMQDRLPjVMPzZLPjVGPDNCOTI9ODI6OTQ2OzQ3PDU5PDU+OjFINC1ZMi13NziUP0SmPkWnOTyqOzCqPCurQC6sQS+pQC2lPCmmOyerPiqnOCStOie1PCu8PS7BPC3FOy7KPDDKPTPFPza+PjO6Oi+3Nyy3Nyy4OCu6OCu6OCu7NyvHQTXNQzjFOC7BMSbGMynLNy3PNSvbNCvfMynhNC3iNizjNSznNSvsMSrwLyr1Lyz2LyryLynsMCfiMiPZNCHQNR/PNB7WMR7ZLx7YMiLYNinXOS3UOjDWPzbYRT3WRj7NQDfJPDXLQDnWS0TZTkfSRT7FOzHFPTHCPDDAPC+6Oyy3OSq0Oiu2PC25PzC1OS2/PDLJQDrSQz/bQ0LjREjtSk/2T1bsP0XtPkPyQkz7SVX/Sln9Rlj6Q1n7Q137QF/7QmT/RWz/SnP/Tnr/T3z/THn+SXb/Snf/VIH/VH39SnH5SW3/U3T/VnT4TmnrRF7kRl3qWGv/lqL/tbzznZ6OSEZrLimma2PNlo/zyMH/497/8fD//P3//f/89/7+9v//9v//9///+P//+v///P///f3//fr//Pj/+/j/+fj/+Pf/9vj/9ff/9Pj/9Pj98fPz6erk3NrW0c3NysPJyb/KysDKzcLJ0Mi+yL+3wbg2NTE0My4zMi4xMCsxMCsyMSwzMi00My42Ni43Ny84ODA6OjI8PDI+PjRAQDZCQDRKRDhNRThPSDhSSztUSzpUTTtTTDxSS0FRTElaV15saXx/fp2Mj7iWmcyZntiant6ZmNqUkdSMismGhb+BfrV4dqdua5ZmZYddWndWVGlNS1lEQUo+PD87Ojg7NzQ3NjI1NTU0NTc2NjQ4NzI8Oi4/PCtDPipGQCpHPypIQCtJQSxJQjBJQTRIQjZIQTlHQDpLPTxJOztDOTo9Nzc4NzUzODQvODMvOTE3PDU3NCtDMSddODB+Qz2WR0OePj+eNTGnOy+qPCuqPy2qPy2pPiypPiqsPyuwPy2rOCWyOSi5Oiu/OS3DOSzIOi7NOjDPPDTLPjXGOzTCOTHBOC7BOC7COS/COC7DNizFNy3RQznQQDfDMCbDLCPQNy/WPDTTMirgMyzkMijnMivoMyrqMyvtMivwLyrzLSr2Lyr1LinxMCnsMSjhNCTaNSLRNiDQNR/YNyPZMyPWMyTVMybVNSnUOCzUPDHWPzbsWVHhUkrTSEHMQzvKRTzMST/IRTvAPjG8Oiq8Oyi8Oiq5Oim3Oii4Oiu8PjC/QTPBQTbBPDPFPDbPQT3XRUXdR0jkSU3rTFDoQkbqQEPwQ0n5S1T+Tln8Slr8Rlz8Rl/4QV/5QmH9RWn/SnD/Tnf/T3r/Tnj/THb/UXv/Unn+T3b9T3T/Vnn/XXv/U2/uRF76VGzuUWT3ZHT/kp7/i5X0g4nHYGSnTU21amfOj4rvvLj/3tn/7+7/+vn//P79+//9+v/++///+///+////P//+/3/+/v/+/j/+/j//Pn/+/r/+/r/+Pr/9vj/8/f98fP57e/y5ubn3dvf2NLb187d28/g3tLf4dbc49vP2NPFzsk8OTQ7ODE4NTA1Mis0MSo0MSo1Mis2Myw3NC04NS45Ni87ODE9OjE/PDNBPjVDPzRKQjdNQzdQRzhTSjtXSztVTD1VSz9TSkNTSktdV2NubIKCgqaRlcWaoNqfpuqiqfGhpe+eoOuZm+WVmN2UldaQkcqJib2Cg7F6eaFycZFmY35YVmtQTlxJR1JGQ0xDQko/P0s9PUc7OkA7OTo8OTQ/Oy9DPS1FQCxGQCpGQStFQi9FQzRDQzdCQztBQz5AQUNCPEZEPkxDQU5FRU9DSE5BSUw+SEk+R0RDSEFBPTJMOi5nRjeDT0GNSTyOPzKUOCmlPi+pPiyrPiqsPyutQCyvQC2wPy2xPCqxOCe2OCm9OSrDOSzIOC3MOC7SOTHUOzXPOjTNOjPLODHLODHMOTLNOjLMNzDLNi/TPDXVPjXSOTHMMijONCrYOzLaPDPXMyrkMSrpMSfsMSruMinwMSnyLyn0LSj2LCj3LSn0LynwMSnpMyjiNSfZNiXSNyHPNyDUOSXVOCXTNiXRNCXSNCjTNyvSOC7QNy/jTkfoWFDnWlPaUUnMRz7ERDm/QDe5Pi+5PCq5PCa5PCi5Oie4OSi6OyrAPjDDQTTJRDvGQDfJQDrRRkPVSUjWSEfYR0rfSUvmRkjoQkTtREn1TFP8UVr7T137TF37S2D2RF73RGH5Rmb9SWz/TnX/T3j/T3j/UHf3VnjzVXb0VHb8WXj/XXv/Wnf7UWvySWD9V2v2VWfqTV72Xm3iS1rmVGHlVGHXWGHBZWbIg37lq6f/1NH/6+j/8/L/+Pn//v/7/P/7/P/7/P/8/P78+v39+fr99/f89/T/+vf/+/j//Pv/+/r/+Pj/8/P97vH66+7w4eTp3d3k2dXi2dLm39Xr59vx7eHx8eXs8+zb5uLO2dVAPTY9OjM6NzA3NC01Mis1Mis1Mis2Myw3NC03NC05Ni87ODE9OjE/PDNAPTRCPjNKQjdNQzdSRjhWSjpXSztYTDxXSz9USUNTSk1eWGZwbYiChKuRl8ucpOOjrfWnsP2qsf+mrPqhp/OgpO6fo+qdoeGZm9aVlsySksSJiLR5eZ9qaYtgXXxYVXBSUGhPTWVOSmNLR15GQlNAPUg/Oj4/OjZAPDFBPi9DQC9DQjBCQzNCRDc/RD0+REA8RUQ7Qko+Q1ZDSWFMUmhVXG9cYnJgZG9iYmpkYGFmWFdhSkRsRz6DU0WVWEaTSjeRQCuZPiuoQS6uQC+uQS2vQC2wQS60QS+yPSuwNya1Nyi8OCvCOCvIOC3NNi3RNy/VODHYOzTSNzLQNzLQNzLRODLUOTTUOTTTODPTNi/eQTrVOC/RMyrWOC/ePTXePTXaOTHcNSznMinrMCfvMCjxMCn0Lyn3LSn3LCj3LCj3LSn0LynuMinpNCnhNSfaNybUNyTPOCPONyLPOCXONyTPNibQNynSOSvRNyvONCrLNCvjTkfzZFzrYFnVT0bEQTe6OzK1OS24Pim4Pie5PCa5OyW6OSa9OSrAPC/EPjLKRDnKQTnORT/VS0jTTEnOR0TNRUXWSEfjSUnmQ0ToRUjyTVP4U1r5Ulz3T176T2H0SF71R2D4R2T7SWn/TnL/UXj/Unn/VHrwVXXvWnf5Xn39Xnz5VXD1TWf5T2n/WW7/W23/Y3TwTV73VGX0T2D8VWf1TF/kUl/AXl+7dnHXnJj6ycX/5eP/7ev/9PT///38///7///7///7//79/f39/Pr++fb9+PX/+PX/+fb/+vn/+vn/9vb88PD46ez05ubr3d3o2tnk2dPo3tXw6N358+X/+uz+/vL0+vbh6+rT3dxCPjVBPTRAPDM+OjE8OC86Ni04NCs3Myo2Mik2Mik3Myo4NCs7NjA+OTNBPDZFPjZJQDdNQzdSRjhVSTlXSjpYSztaTEFbTkhUSU1YUmBnZIF8fqeNksqXoOOeqvalsP+qs/+rsv+stP+ssvyqsfmqr/OorOypq+ifodqZmtKNjcGBf7F0cqFoZZJdWodYUn5YUXpZUXZWT25NSF9DP00/OkA/OzpCPzg+PjRAQjVCRTo/RD08Qj46Q0I+Rkg/TFVEVm5RZoNhco5pc450do+BeI2Eb4CAXmyKW2OSV1meV1WmVk2mTT+fQC6cOSSgOiSnPCisPSquPyyxQC6zQC20Py22PSy5Oyy6Nie+NijENirLNy3RNy3WOC/aOTHaODPXODTYOTXZOjbYOTPYNjHYNjHaODPdOjPmQzzgPTbaNzDjQDf+W1L/bGP/XVTnPzblMyntMinxMir0Lyn0Kib1KCX4KCb4Kyj3LSvzMCztMivjMSfaMCPUMSLUNCTTOijMOybKPCjNPCnPPCrSOizSOSvSOCzRNy3aQDjPODHcR0H0Y17lWFHLQjzFQDu3NCq3Oia2PCS5PCa6PCa9Oii/OivEPDDGPjLHPjTMQzvZUErfWFLUT0rDPzrAPzrPSETeSEfiR0XmSkvvUFTxUlfvTlbtS1jxTFz5Umb4T2b3S2X3Smb8TWz/UXP/Unb9Unb0V3buWHX1WHX7W3f/XHj/WnP/V27/Vmv/YnX9Vmf/XG3/W2zxRlj0RFj/UWXuVmXGZmeqaWXKj4vntrL40s//6+f97+78+Pf5/fz5///5///6//78/v3//vz/+/j+9vT++fX/+/f/+fb/9vT/9vb/9fX26Ojm2Njj1dTe0M3h1tDx59789Of++Oj//On///P6//no8fDY4eBDPzZCPjNBPTQ/OzI9OTA7Ny46Ni05NSw3Myo3Myo3Myo4NCs6NS89ODJAOzVEPTVIPzZMQjZRRTdUSDhWSThXSjlZSz5aTUVVSk5XUV9lYn95e6SKj8mUneKbpvWjrv6rtP+stf+utv+vt/+wt/+vtvyvtPivsvWpquuio+OYmNiMismAf7t1ca5pZaBjXphgV45gVohdVH9WUHRNSWJGQ1RCQUlBQUM8PDpBQj1GRUFDRD9BP0BEQkVPTVJXVmRjaIZxdZp/faKHfZ+SfZyge5qlcIqkYHWsWWm2VmG6UVW4SEawQDSsOymsPCatPSeoOCSoNyWrOCauOSiwOCeyOSi1Nyi4Nii7MyXCNCjKNy3TOjLZPDPePTXfPDXfPDXhPjnfPDffPDfhPjnlQj3oQz3nQjzmQTvlQDrmQjnkQDfcOC/VMSjYNivrST7/W0/xQDbuNizqKyPuKSP4LSn/Ly3+LCv2KCj6MC71NC/vNjHnNi7eMynWMibUMiXPNibLOifIOyfKPCjNOijPOSrQNynRNSnQNCjTOS/PNS3UPTblUErlVFHbTEjNQj+3MSi8Oyi7PSa9PCe+Oye+OSjAOCjCOizEOi/IPjTLQjjVT0bcV1DSUknDRD2/QzvMSEPbTEjfSkblTUzrU1LtVFfrUFbpTlbsT1r3Vmb4VWj5U2n6Umv8Um3/U3H/U3T/UnXyTW34VXT/XHr/X3v/XHb/VW/7Umn7UmX8VWb3UmL/Wmj/WmjzTl74U2P+WWnfU162YF+XXle2gX3ZqaXuyMX94d756en9+PX6/Pn5///4///3//36/v3///3/+/v/9/X9+PT++fX++fX+9vP/9/b/9fX26urq3Nvk1tPd0Mrf1czv5dv89eX/+ef//en//+/6//jo8e7b4d9FQTZFQTVDPzRBPTI/OzA9OS48OC07Nyw4NCs4NCs3Myo4NCs6NS89ODI/OjRDPDRHPjVKQjdORDhSRjZURzZXRzdZSTxZSkNXS0tYUF1iXnlzdZyFisKQmdyYpPCgq/qqs/6ttf6vt/+xuf+zuv+0u/+1uf+1uf+vsvmsrPSjo+uZl+COjdODgMd4dbxzbbNrYKJpXZtjWpFdV4VWUndOS2hFRFZAQEw4NTxBPEBLQUJMQEJRPkJaRUpwV12CY3OYcpeleqeuf6uye6O4dpzAcJPCY4PAVG7CR1zQS1zRSFDEPDy6NS64OSq1PCewPCWwOyewOymyOim0Oyq3PCy7PC3APC3EPC7ENirLOC7TPDHZPzXfQTjhPjfgPDPfOjTcNzHZNC7YMy3eOTPmQTvsRT/pQjzkPTXjPDTbNCzYNCvbNy3UMifMLCDWNirpRzr1Sz7yQDbvNC3wLSn2LCr6LCz8LCz4KizwKinsLyvoMi7jNS7cNCvYMSjVMSfRMyfNNyjLOinNOijQOinSOyrTOirUOCvUOCzRNCvWPDTVOjXVPDflT07tWVfZRUXCMy/AOyy/PCjAOyq/OinBOSnAOCjAOCrAOCzGPTPHQTbPSkHYVUvSUkfGRz7ARDrHRz7WS0TYSUPdTEnkU1DlU1TiUFPiTVPlTlfyWGT2Wmj9W3D+WnL8Vm76Umz7UWz/UXD9R23/UHb/Wn3/W3v/VnL9VGv+V2v/XG37WWj4Wmj7YW32YGvtXWfvZm7sZm3JXF+gXVd7T0aYbWbBmJTdurbw1NH04N//9fT5+ff5//35///3//36/v3//////f//+Pn8+fT8+fL8+fT9+PT/+fb/+Pb57uzv5OLl2tbb0Mrc0sju5Nj99uT/++j//ef//+36/fTq8Oze499JRTlIRDhGQjZEQDRCPjNAPDE/OzA+Oi86Ni05NSw5NSw5NSw6NS88NzE+OTNAOzVFPjZJQDdMRDdPRjVSRTRVRTVXRzhXST5YTUtYTldeWnFwcJaAhrqMltSVoemdqfWosPmpsfmts/2wt/+xt/+yuf+0uP+0uP+vsfyrrfilp/KfnuqXluKMi9eCgc19ecV1bbZwZ6pmYJ5fWpBZWIRRUXVHR2NBPlE9NURIOEJUPUNgQEVuQ0qAT1WWXWSrZni/a4/JbprLb5jJaY/IYIPJV3jGSWfEO1XGMkjZQVDgRU3ROzzGNzHEPzC9QCyxOiStNiKtNSSuNSSzNSa2Nyi8OCvDOy3IPC/TQDbXQDfaQDbcPzbePTXeOTPdNi7bNCzTLijSLSfTLijYMy3hOjTjPDThODHcNS3cNS3QLCLNKR/ZNyziQjbcPzDQNCXLLh/pRjfzSTz9SD/8PDf0LSrxIyX1Jyn7LzLxLS7rLy7kMi7eMyzaMSrXMCrWLynTMCfTNyrSOSvWOivYPC3aPi/bPzDcQDPcQDPSNirmTELlSkXONTDfR0bzWlzfSUvVQT/IPC/EOyvDOirDOirCOirCOirBOSu+OSrCPDDCPjLIRjnPT0LOUETGSDy/QzfBQzfOSD/RRj/VSkXbUEvdUk/ZTUzaS03cS1DrWGDzW2f8YXH/YXX6WG31T2f1TWf/Tmv/T3X/Unn/VXf/VHH8VG39W3D/Y3X/anj/Z3X6Ym/1YW3tZGzjZmzZaGrOZ2i1ZmGNXlRlRzx/XlWpiIHNq6nlx8Xv2tn/8/P5+Pb5/fz4///3///7/////v///P//+fr++/b7+/P7+vX++/b//fn/+/j+9PL47enq39ne1Mvd08nt5tb/+OX//uj//+b//+v4+u/q7+jj5t9OSDpNRzlMRjhKRDZIQjZGQDREPTNDPDI/ODA+Ny89Ni49Ni49NjA+NzFAOTM/OjRDPjhFQThLQzhORTZRRDNSRTJWRjZWSDtaTUdWTVJbV2hsa4t+grGKk86Sn+Oapu6mrvepr/mtsP2vs/2ws/+wtP6ws/+vs/2rrvuoq/ikp/Sgou+anOmTleKKjNmGhdGDf8l7dbtta6xkZZ5fYZJZW4RSUXNOSGJXRllfQ1FtQkyBRU2YTVSsVV28W2LKWmjZUnDiUnXfVHXZUGzSSmLNQlfHOErFLj/UOEXjQ0vmR0vYPj7NPjbMRjrDSDa2Pyu3Pi24PS26PC29Pi/DPzDKQjTQRDfVRTrZRTnaQjfbPjXZOzLZNi3ZNSzaMyvXMyrUMSrXNC3aNy7dOTDfODDeNy/dNi7cNSzWLybZNSvXNyvPMiPNMSLSOSnVPi3UOynYPC3mRDf4SkH9RD/5NjT1Ki32Ki33LzL3NjftNTXiMzDaMSzXMCrXLyzZMC3ZMCvjODHkOTHiOjHiOzLgPDDfPTDcPzDaPjHRNyvvV0z4YVrTOzbROzrmUFHcRkjmUFHPPDTKOi/GOCzFOSzEOi3EPC7DOy3AOyy+Oi2+PC7DQTPHSDnHSTvCRDa+QDK8PjDJRjzKRTzOSULVUEnXUk3VTkvTS0vXTE/pWmDwXmj8ZnL/aHj8XXHyUGXzTWX9Tmv/Vnr/VHj/UnL4VG32XXH7aHj7anf3ZXL8ZXTzX23sYGvqa3LfcnXDamaqZFyebGF9ZlZYSDlrWEqUfHK9oJzewsHu1tb+7u/79fX7+/v7///5///9/v///v//+///+v3//vn7/vX7/Pb//vn///r//vr/+/X/9/Lx6OHk3NHh2czw6df/+uT//+b//uX//+r3+evt8Ofo6eFRSz1QSjxPSTtNRzlLRTlJQzdHQDZHQDZCOzNBOjJAOTE/ODA/ODI/ODJBOjRAOzVCPzhFQjlLRTlNRjZQRTNSRTJVRjNVSDdZTENVS0xaU2NpaYV8gauJk8iTnt6apOumrPiprPusrf2tsP+usf+usf6tsP2tsP2prPmnqvekqPKipvCfo+2anuiVmeOSlN6SktqJis18gMBzeLJvdaltcJ1pZ45qX315X3iCV2qOUF+jT1y7U1zNVF3WUFfbSFLlQFHoP1LkQ1LcRFDWQ0vPQETKOTzJNDbkSkznSUrhQUHVNzTOOTXOQTjIRDi+PjHDRTbDRTbFRjfJRTjORjjRRzrXRzzaRz3WPjPVOzHWOC/VNCzWMyrYNCvbNCzaNi3bODHdPDTgPTTfPDPdOTDcNS3cNSzbNy3SLiTdOzDaPS7NMSLGLR3ONybSPSnNOibMOSfUOCniOi/zPTn/QED/PD7+MzfzLC/qLC7hKyrYKinUKyjXLyzeNDTkODjpOTnvNzXwNzTuNzPoNzHjNy3cNirXNSjRNSbNNSjnUEX/bWPbSEHINDLXQ0PTPkLqVlbZQTzSPjTLOC7GNivGOi3GPC/DPi/BPS67OSu7PC2+PzDAQTK/QTK9QC68PS67PC3DQzbERDnISD/QUEfTUkzQT0nSTkzVT07pXmPuYWf7aXT/bnr/ZHX1Vmr1UWn/VW//V3b/VnT6WHDxXnD0bnn2d4Dta3PeWGHxYG3xYG3sYm/vc33siIrMgXyqdGiZeWpza1hPTjpfVkeDcWevlpLcwL/v1dj86ev+9PX9+/z9/v/6/v/+/f///f//+///+f7///v5//X6/fb///r///r///j//ff//vb58Oft5drp4dT079z/++X//uX//+P//+j5+ury9Ofu8OVTTT1STDxRSz1PSTtNRzlLRTdKRDhJQzdFPjREPTNCOzNBOjJAOTNBOjRBOTZAOzdBQDtDQztJRTlNRzdPRzJSRjBVRjFVSDVXSz9SSEZYUl5qZ4J9gaeJk8SSntqYouekp/amp/qrqfyrrP6srf+trv6srvusrvuorPamqvSkqPGjp/ChqO6gp+2dpOibouaZnuKSmtuLk9KGj8qDjcKEiLeDgaiIeZqPbYiaY3qpWGm7UV/PTVngSVLoQUnqPUHpPTvjPjjdQznWSDrOSTjFRjPCQzDFQDHkVEngRz/aOzfYNjTYODjYOjvROTjINzTAOi++PC6/Oy7AOi7COCvDNyrGNCfGMibONCrQMyrRMyjUMynWMyrZNSzdNi7cOC/ePTPbPTLcOzHbOC/bNy3aNizYNCrXMynVMybTMyXQNCXPNibSPSnRPirKOSTAMhzIOibKNCXVMSfnNTH6PDz/PUD/Nz33MzfqLTHhLS7ZLS3XLy7cNDPjOTrpOz3wOT32Mjb4MDP0MDHtMS/kMSreMijVMSXPMyTJMSTRPTH6al/kVEzIOTXQQD/LOj3kUlPkSkjcQz3ROjPJNi7GOC7FOzDCPDC/PS+6Oyq8Py29QC68Py26Oyq6Oyi9Oyu+PCy8PjC8PjLARDjITELMUEjKTkbMTEnQTkzoYWXsYWb4aHL/b3v/aHj3Wmv3VWr+WnL/WXP7XXTuYXLmanTrfYDxh4nod3naX2TxZ3T+bXzzZXXrbHf2kZXsop/ElIqijXxoalVIUTxXVUZ0aFykjIjbv77y1dn54+b/8/b/+vz+/v/8/f/++////P//+v//+P3///v5//X3/fP9//f///j//fb//ff///b/+e/17+Hy7Nz69eH//ef//eT//uL//+f9/uz5+uz39+tWTz9UTj5TSz5QSjxPRzpMRjhMRDdKRDhIQDVGQDRFPDNCOzFCOTJBOjJDOjNBPDZDQDlERDpKRjpNRzdPRzJRRjBUSDJVSDVVST1RR0VXUV1qaIB+gqiMlMWTndiZouefoPKjoPemo/qnp/2oqv+pq/6prP2nrfulq/WjqvKjp+6ip+ukqe2mqe6lqO2jp+6YoOiUoeWUn9+Un9eVm82alb6gjK+qg6ClZX+0XXDCUWPQSVfcQk7lPkbrPEHsPDzqPzjjQTTcRTTUSTTKSTPCRi6/QizCPy3iU0XeRDzdOTfmPj7qREblQETZOD3ONjXNQjvIRDjJQzjHQTXGPjLDOSzCNinCMifGMijLMyjONCrTNSzYNS7ZNC7bNC7bNCzkQjfdPTHZNyzaNizfOS3fOS3bNSnVMSXYOCjNMiDKMSHPOSjOOCfHNCLKNyXUQzDINybOOCrXNizeNS7mMy/uNTP2Ojn7Pz7/TEv6SEbyQkLsPj3qPD3nNzrlMjbmLDH0KzH4KS/0LC7vLy7oMSvgNCrZNSnTNyjGMCHALh/0ZFnrXVPPQDrUREPLOzvfTU3qUlHgSEXTOzbJNi/GOC7GOS/DOy2+Oiu+PCzBQC3AQS67PCm3OCW4OSa9PCm+Py61NymzNyu4PjHBRzrFS0DFSUHISULLSkXlYV/mXmDxZGr+bnf+a3XzXWnwWGX4XW36XnP1YnToZG/jbHLsfn/5jYv2hoXpcXP4cnn/eYb1YXHgWGb2iJH/tLTQrqKgm4ddalBEUjlRVD9qYlWbiIHawL/y2Nn24OP/9Pf/+v3//v/9/P/+/P///f//+//++f37//r0//Ly/vL5//T8//b7/fL//fT///T///P79ef38eH++eX//ef+/OP+/eH//+r///H9/fP8/PJYT0BXUEBXTj9VTj5USzxSSztSSTpQSDtNQzdLQzZLQTVIQDNIPjJHPzJIPjJGQDRHQzpHRTlKRzhOSTZSSjVVSjRVSjRWSzlYTkRVTE1aVGJraIN7fqeJj8ORmdeYn+ejpPalovmiovyhovygpP+iqP+jq/+krfyhqvWhqfGhqOylqO2qqe+tqfOxqfasqfigqfiXp/KSoeKWn9amo862nr65hZy4Z3q/TF3RRVLfPk3nO0fnPETmPULgQEDgQEDiPj/fPD3dRULJOjTKRDnKRjq6MSnbSkXoSknpQ0XrPkLoOz/mPD/hPT7aPD3UPDvPQjvIPzfKRDvRTUHNSz6/PTC4Nim9OSy/NyvDNizINS3LMirRLyrULyvbMi/eNS7nQTXfOSvZMSTdMyblOSvnOy3fOCbVMh/PMh/MNB/KNSHHNCLHNCLKNCXNNSfPNSnKMCbPMinRNSnSNirSNCjVMybXMyfcNCngMinmMy7rNTLrMzPpLzLnLTLoLTTtLjX2LTP2Ky/vKyzsLy3qNS7jOSzZNyjQNCXDLRzEMyLnWEjpWU7LOzPfTknFNDHaSEjhT1DcSkrUQ0DMOzbIODDGOCzHOSvIPCvFPCrCOyi+OSa8Oyi7PCm6PSm6PSu3PCy0OCy1OzC5PTG7PzO7PzO+QDTAQDXEQTfvamH1cGnqY1/0bWr7cXHsYWT0Z23/cHn/bHr7aHjwZG/pYmnrZGrubG7ucW/ucW/7eXv/fYX5Wmz8Y3ffYnD7rK+2qpp9kXVdclFKWTpMUjhzblqllYjLt7Dt1dP/7vD/9vf/9/v9+Pz8/P7+///+/////v/7//7w//Tl/unm++rv/+74//b8//T+//P//vH//fH/++7/+ur/+eb/+eP/+eH/+eH8+uX///X///v///tZUEFYT0BYT0BWTT5VTD1USzxTSjtSSTpORTZNRDVMQzRLQjNKQTJKQTJKQTJJQTRHQzhIRDlMRjhPSDZSSjVTSzRWSzdUSzpYTkVVTE1ZVWNraIN7faaGjMCNldOWmuGfnuyfnfGenvSen/mdov2fpv+gqv+hrPugrPSgq+2fp+iipeilpOqpo+2roO6kn++gp/eapvCcoeGjnNCxmMC/jarCcYTEVGLRQ0/iPEbsOEHvNz/qOj3lPD/cQEHbQUPgPEPaOT/aQUTLOzvMQj/KQD3BMzHlT1DmQ0boP0TqO0LnOD/iODvbODnVOjjPOzfURT/GPTXFPDTMRz7MTEHBQzW4Oiy3OSu5Nyq/NyvGNi3LNC3RMi7YMy/hNTPkODTkPjLhOy3eNinfNSbhNSfhNSfaNSLTNB/ROSTLOSLHOSXHOibJPCvLPCzMOCzONCrVMy7WNS3TNyvPNynJNibHNCLLNCHPNCLYMiTeMibjMCvmLizmLC3mLC/mLTLoLjPsKy7tLC3sMC7oMi7gNCrbNSfVOCfSOSfVPy67KhnWRDXQPjHZRj7rVlDaQj/YQkHnVVbiUlLcS0jUQz7NPTXJOS7IOSvHOCjIOyrEOyi/Oie9PCm9Piu6Py25QC+2Pi6yOiy0OzC3PTC4PjG6PzC9PzHBQjPFQzXraVzybWTnYlvwa2b1b2zoYmHxa2z8dHj/cX7/b3z2aXLtXWbqWWDxYmb3cXD+enj7dnf/eH75UmT+W3DkXW72pqmpppNqjGtadE9OXztTWjt1c1ypnY3WxLj24dz/9fH/+vr/+vv/+/z8/Pz6/v37//76/v/1//rt//Ph/+nh/ebp/+vz//H4//L9//L///H//e///e3/+un/9uX78+D68t389N/89+T9+vP8/Pr///1cUEJbT0FbT0FZTT9YTD5XSz1WSjxWSjxTRzlSRjhRRTdPQzVPQzVPQzVPQzVNQzdKQzlKRjtNRzlQSTdTSzZWSzVWSzdUSzpXTUNWTU5aV2JraYF5e6GFibmLkcuRltaYmN6ZmeOYmemane6boPSdo/efp/igqfSgqu+dqOicpOOcouCen+CeneGdmeObmeKWm9+amtqkldCxjMC/gqzHcpPJWXHHQlPXQUzfPkTjPT/lPT3lPD/jPT/hPkHhPkPgPEPXOD3VP0HPQUDKQz/DPDjEOTbpV1fgQkPkPkLoOz/jOTzcNjjWNjbROTbMOzbVSEHEOzG+NSvFQTXNSz7GSDq7PS+3OCm6Nim/NynHNyzPNi7XNTDeNzHmOTXpPTnXMyrXNSraNircNirdNSrdNynaOirXPizFNCG/NB+5NCG5NiK8OCm9OCm9MyjALSXjQDvlPjjePTPVPC7MOSnINyTINyLMNyPSNyXVMyTXLybZLifbLircLi3bLy/cLi/bLCnfMCvgNS3cNSzVMybQNCXQOSbRPirUQS/CMSDnU0XSOzDaQTveQz/oSknwVFXtVVTnU1HjT03dSkPWQzvPPDLKOCvFNibENybANyW8Nya5Oie5PCq3Pi21PSyyPSywOiyxOy+0PC61PS+3PS65PzC+QzTDRTfcXFHqZ13kYVnwbGf2cG3nYWDsZmfzanHgUl7vXmv1aHHyZW3xYGf0ZWn5cXH+eHf6dHX/bnXzSl34UmjkW23xnKGjnIphgGBVb0hPZD1XYEF3d12tpZLh0cL/7ub/+PH//Pj//vr+//r7//z7//37//35//vz//bo/+7c/uPa+N7h+eHo++Xv/Oj2/ev9/uz9+un/+ur/9+b68eD06Njy59X269n48eH++vH9/Pj//vtcUEJcUEJbT0FaTkBZTT9ZTT9YTD5YTD5VSTtUSDpTRzlSRjhSRjhSRjhSRjhQRjpMRTtLRzxPSTtSSzlUTDdXTDZXTDhXSztWTEJVTUtcVmBqaH55eZuChbKKjcKPlM6TldKVlNaVlduWmOOYm+iYnuyaou2bo+ucpeiYot+Wn9qVm9WUmNWTl9aSk9aRkNKFhL2Rg7alfbG3c6LIZo/SVnrVR2HUPEveQUrgQkPeQ0HgQj/hQUHkP0PnPkXnPUbjP0bWOj7RP0DRRUTGQTy6NjHFPjrqWlndQULjQEPmPUDjOj3bODnTOTfQPDjOQTjPRTvCOi67MijAPC/HRTfERTa9Pi+4OSi9OCnCOSnLOC7SOi/ZODDgOTHoOzfrPjjYMSvZMircMyzdNSzgNS3fNy7bOS7WPS/JNyjGOinBPCu+PCy/Oy7BOzDFPDbOOTXrQ0DtQDzkQDfZPTHPOSrHOSXIOibJOyXPPCjQNyfPMSXRMSXUMSjWMyzUMSzRLyrTMirTNSzTNyvQNynNNSfKNyXMOyjMPirMOyjPPCz0XlDgRjzSMy/SLizmQED7V1j/dXP/cm//amf2XlnnUEfVQTfHNSi9LiDEOCfAOCi7OCa4Oym3PCy1PS2yPSywPC2vOy6tPC6wPC+wPC2xOy22Pi68QjPARjfLTUHfYFfiYVv0cGz4dHLmYGHkXWHmXWTWSFTnWWXzZ3L0Z2/2ZWz8a3D+c3b+dnb7cHP7ZW7xRFj0S2LlWGvrkpaglYNfellRbENTaD9cZ0V5fF+wqpTn3Mr/9ej/+fD/+/H+/vT9//f7//r5//r2//jy/PPq++va+N7O89LK68zP7M7X7tLg8Nbp89vy9+H29eH79uP89eP17Nvt4dHp3c3t4dHx6Nn89e389/H++fNcUEJcUEJbT0FbT0FaTkBZTT9ZTT9ZTT9XSz1WSjxVSTtVSTtUSDpVSTtVSTtTST1PRzxPST1RSTxTTDpVTThYTTdZTDlYTDxVS0FVS0lcVV1oZXh1dJN8fqWFh7eMj8KOkMOPkMiQks+QlNSSldyTl+CUmN+Vmt6VndySm9aOlM6JkMeFi8WBh8N9g8F+f7h9dJ+OcJSoZ4/BXITWTnbiQWPoOlXqOUvmQUfgRUPcR0HbR0PfRUXmQUfuPErtPUrmQknXPkDQQD/QSUW/PjizMizIQzzgVVDcREPhQUPjP0DhPj/aPz3UQDzRRDvPRjzHPTLAOCq9NSm9OSq/PS2/PS29Oyu9PCnCOirHOyrPOy/VOy/bOC/gOC/nODPpOjXmOTXkNTLkMjDmMjHnMzLmNDDdMivUMCfLMSfLNy3IOjDENy7BNC3DNDDMOjvdP0DrODvtNzbkNzHYNSzMNCbGNSLENyPFOiXLPSnLOCbMNCbONSfUOCzUOjDTOS/QOC3QPjHKOy3FOCfENyXGOSfHPCnHPCnHOijNPi3NOirYPjLhQzrULy3kOjrgMjTfNTbXNTPWOzbeQz7lS0PqUUnqU0joVEjkVUfLPzDEPy6+PCy4PS23Pi20Py6wPy+uPjCsPC6sPC6sPC6sPSytPCyxPS63QTO6RDbGTEHeYljiY13wbmz0cnLlYGPlYGXnYGf3a3b7b3r3a3btYGjwX2b9bHH/eHv/eXz6bXP4XmrzQVf0Q13oVWjmh42jk4Nnf11ZdEledUlod1CBiGazspbo4sz/+un//e3//u/9//L7//T4//T0//Ht++rk8uHY7tfF6Me75Ly63rq/3rzH4MDN4sPY5szj69Ps7tj08d738t/z6tns4NLo2s3q3M/v4dby6N/x6OHy6eJbT0FbT0FbT0FaTkBaTkBZTT9ZTT9ZTT9YTD5YTD5XSz1WSjxWSjxXSz1XSz1YTD5RST5RST5TSz5VTDtYTTlYTTdZTDlYTTtXSz9VTEdZU1dlXm5uaoN1dJZ+faWEhbGGibSHibmKi8GLjciNjs+OjtSPj9WPkNOQlNOLkMqDiMB8gbh1fLJvdq1pb6tsapyAbIiTY3muWXbLUG/jQmTwN1b2NEz3OEjvQEXlRkLdSkPbSkXhR0foQ0ryPU7wPkzkQ0nXQ0PMQT7OSUS6OzSwNCzJSUDVTEbYQkHaPz3bOzvaPDvYQD3URT/NRzzLRzrAOCrBOCjAOCq+OSi8OSe7OCa9OijAOyjEOynKPSzSPC7XOy7cOC7hNi7kNi/oNTDpMzLoLi/pLDDuMDL1NDf1NzfuNDXmMjHaLirXNC/VNjLRMzLPLzHSLzTbNj3qOkTtMDbuMDLmMy/cMyzRNSnKNyfIOSjJPCjGOCTJNiTONijTOizaPjLdQTXdQTXYQTbTRzjJQTHCOyjAOSbDPCnGPSrFPCrFOCbMOivNNynNMCfmQzzbMi/vP0HjLzLaKizVMS/SNS7VODHWOTDSOC7MNSrGMibAMSPORTXGQTK8PS61OiqxOSmvOSurOiyqOiyrOy+rPTCsPi+sPC6rPCutPCyyPi+1QTLJU0fgZ17gY1/qamnubm/mY2jwanH1b3j6cXv9dH72bXXuYmv2ZG7/cnr/eH7/cXX6aXD4V2b5QVn0QFvqUWbhfoOsl4Z5j2ttiF1viVp5imCNl3K2t5jf3sL59N78+uX//+/7/+/1/+/v/+vn+uTc79nQ483F3sGw1q2o06aq0Kew06u21K681rHH2rrS38Hg5szo6tTy7dry6dju4tTs29Hq2c/s29Pp2tPm2dHl2NBbTj5bTj5bTj5bTj5aTT1aTT1aTT1aTT1ZTDxZTDxYSztYSztYSztZTDxZTDxZTT9TST9USj5VTD1YTDxZTjpaTTpaTTpZTjxZTT9VTEVYT1JfV2JkX3NqZoFzb5B5eZ18fqR+gKmBgrKDhLyGhsaIh8uJiMyJiMqIiMiDg798fbV2d61wcadrbKRmZ6BsYI6CYHGVVl6zTl7SSl7sQFj3Nkv+M0b+OUPzP0LpREDhSELeSUPiRknpQkryPU7vPk7dQUXURkTIQT3JSEK0Oi+xNyzOT0bJQjzOPTjQNjTPMTDQNTHTPjjPRTvIRjnDRDW+OSjDOijCOiq/Oie9OCW+OSa/OifBOibEOSbLOinTOizZOSvdNyvhNSvkMyvqMy3rKivxKi34LTP8LzT/MTf/Mzf/Mzj9NTj5ODv1ODzyOT7yOUH0OUT3N0b7Nkj+NUX0KzX0LTLtMTLjNC/ZNi3QOCrOOyvOPSzLNSbROCrZOy/fPTLiPjTkPTTlPjXfQTbZSjzPRzfJQTHEPCzCOSnCOSfGOCrIOSnJMifTOS/hQDjrRD7eMC/gLi7rNDboNjbYMy3VNy7XOTDXOjHVOzHSOzDNOjDJOy/WTD/MRjq/QDG0OSqwNimsNiirNyqpOCqsOy2tPS+uPjCtPS+rPCurPCutPC6xPTDAS0HaZFreY17oa2nwb3PqaW71cnr8dn/uZnD3b3n5cnn2anP+bHb/d3//dn35aG/5Y273UmL+Qlv3PFnqS2HddHu1momNnnp9mGt7l2aClWiRnXWsso7LzK3g4MTp7NHu9t7l89nZ7dHP5snF3sC81be0y66qyKSawZSWwo+Zw5OhyJmny52sy6G1zqfB0rDO2bvZ3cTl487s5dXv4dbr2tLn0s3j0Mrgz8jazMPVx75bTj5aTT1aTT1aTT1aTT1aTT1ZTDxZTDxaTT1ZTDxZTDxYSztYSztZTDxaTT1aTD9WSj5WSj5YTD5ZTjxaTTxaTTpaTTpaTTxbT0FXTURXTUxcUlpeWGZiXXFqZn9zcI13dpZ4eJx8e6eBfrWEf7+FgsWIgsiJhMeCfb9/ebd6da14cad2b6V0a6JwZ6B6YYuEUVqZSEWzRUjTSE/uQk74Okb+NkH+OUD1PT3uQT3mRD/jRULkQ0joQUvuPU3rP03YP0LRR0TFQTzDRz+yOS6zOi/RVUvDPjXJODPHLyzFKibILyrNOjPMQznDQza8Pi/AOyrEOynDPCnBOifCOyjDPCnCOyfDOCXENSTKNyXUOCnZNyrdNSrhMyrlMynqMir1MzP/NTj/ODz/NDr/LTL/KC3/KC3+KzH8LTP2KTDyJjH3KTb/LD//KkH8IDnzGi/2IjDzKC7tLDHmMC/aMSzUMyvRNSnQNirUNivdOTDmPTbrPjfrOjToNzHoNTDiOTLfSD3XSzzTRTfLPS/ENijCMyXINinPOC3ONCrUNi3mQzzfODLgMjHSICDsODnlNjPVMSjSNCnSNCnPNSnONivKNirINSvFNyvjWU7YUkbKSDu+QDK3Oy+1Oy61PDG1PDGvOS2xOy+xPTCxPS6vOyytOSqtOSyuOi2xPDLQWVHcYl3scHD0dnnubXL1cXz2cn3/eoP/f4n/eYD0aHH3ZXD/cXz/dX//a3T4Xmr2T2H/QV73OFfpR17bbnS6nYuZqYSCnm5+mmeBl2iNnHGhqYK0upbIza3V3L3M2bvB1LSyzKmnwp+evJiatpCWsoyQsYaJs4GGtX6NuYSVwIucwo+fxJGoxZmyyKG+zqrJ0rXa2cTm383q3tLp1s/hzMnbxsPUwbvOvbXIt7BaTT1aTT1aTT1aTT1aTT1aTT1aTT1aTT1YSztYSztYSztZTDxZTDxaTT1aTT1aTT1aTD9aTD9aTT1bTj1dTT1eTzxcTzxcTz5ZTT1XTUNXTEhYTk9aUFhdVWJgWWlhXHJqZoFva45zcJt2cad7dbODfsGKg8mKg8eIf8CKfryIebKDcqiGcqeNdKuHbKOGXISQSEykQjm2QTrNQ0DeQD/oOjv0PD7/REX3PjzzPTzsPj3qQEHrQknqQ03rQU7jQUzQPj7FQDm+Pza3PjOwPC+yPDDARDjSTUTHNjHUOzbNMi7MMy7WQzvHPzO1Nie7Piy6NyXBOifDPCnCOyjAOSXCOSbFOifHOijLOifQOSjWNijYMiTaLiLgLyXsNy71PTX1ODL3NDD3MC34Kir7Jij7JSf7JSf7JSf7Jir3ISn4Ii7/Jzf/KD7/ITv/GDb9FzH/JzjvIyzmIyvjKy3dLS3UKyjSLSncNDHiNjLoNjTuNjbyNjXyMTLvLi/uLCzlLyzcOTLROjHSOTHsU0u7IhrEKyPfRj7ILibNLijePDfoRUDiOjfYLyraLiriNTHlPDffPjTVPC7PNSnLMybMNSrNOy7LOzDFOC7sYljgWk/IQzq5Niy6Oi+4OC2xMye0NiqwMCWwMiauMiavNCWwNieyOiq0PC6zPTGwOjC6QzvWXFfscHDxc3b2eHz7eYP1cXz/fIT9d4D6dH38c3v/cn7/cn3/bXj/Z3P8YG70SVz/Plz/PlvkQVbUZWu0lYCSoXqDnW19mWZ+lGOHl2qUn3eepoGgqIOcqISSo3+Ko3yAn3Z6mnF5mm98nXKBoHaDpHWCrXeDs3mLuH+RvISTvoaXvoecvoyivZCnvJOvvZq+wqfPzLnf08fj0srcx8TUv7zMurbBsqu5qqVaTT1aTT1aTT1aTT1aTT1aTT1aTT1aTT1YSztYSztYSztZTDxZTDxaTT1aTT1aTT1aTD9aTT1cTD1dTT1dTjteTzxcTzxcTz5dUEBbT0NbTkZZTkpaUFFcU1hfVV5fV2ZkXHRpYoNuZ5Fxap14cKyAebyHgMSKgcSPgMGQfrqNdKuMbqKXcaShdaiaap6ZV3udPUGqNSuxNSvCPDPTQDjdPjjoPzrzQT31PTv1Ozz0O0DxPkLuQEnoQUniQEvaQUbHPDm9PTS2PDGxOy+rOiyuOiu9QTXQSkHaR0DcQT3UNjPQNTHVQDnNQzi7OSuyNSO9OCfCOyjEPSrEPSrEOyjGOyjHOijKOSjPOSjPNibUMiXaMiXjNSrqOC7vODDwOTHnMSbnLyXqLiXvLCb2Kyf7Kyn+LCv/LS78Ki36JSv6JC7/Jzf/JDv/HDf/FDP8EzD1HjD2Ljn1MzzlKjHbKCzcLjDeMDLbKy7xOj70Nz33NDr2Mjb2LzT4MDP5MjX0ODfbMi3aOzXXODLkRT/kRT/OLyvRMi7BIh7UNTHhPzroRUDgPTjYMy3ZMizdNjDdOjHUOi7POSrJNSfHNSjIOSvKPDDKPDLGOS/tY1nhWE7JQDi6NCvCOTHDOjC/NizCOS+/NSu+NCq9NCq7NSm4Nim1NSi0NiiwNim0OzC7QjnTWVTobGrvcXT2eHz+fIT4doD+fIT8eYH5dn7+dX//c3//cH3/a3f8ZHH9X272SV3/Plz/PlzpQ1nTZWiujneJmG96lWJ1klx4jl1/kGOKlWuNmHCLlXCFlG1wh11siV1oiVxnjV5rj19xlWV5m2l6n2uBrHSEsXaKt3yNu32QvH+TvIKWvYabu4mbtYahs4uttpe+vajPxrfYx7/WwbzPvLjGt7S6rKmypKNcTDxcTDxcTDxcTDxcTDxcTDxcTDxcTDxaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxcTD1cTD1dSz1dTT1dTjteTzxeTzxcTzxfUkFdUUFcUERbTkZaT0tbUE5dUVNdUlpfU2djWHZoXYVrYpFza6R/drWGfb6Jfb2XhcGZgLebdqmecJ6udaK6dqW1aZixUnS4PES+NS26NCvAPDDLQzfTRTnbQzjkPznxPTz3Oj75OkH2PUXvQEfmQUjZQEXPQELAOza4OTCxOSutOSqpOCitOSq7PzPPRjzZRD7XOTbZNzTaOzfcQz3dT0XOSDy1MyO+OSjBOifEOynGPSvJPSzIPCvJOinMOSnPNynPMiPTLyPfNCruPTP0PzbxOTHpNCvgNCbfNSbiMiXlLyTrLCTuKyXxKyjyKyjzKy3wKCvyJi/4KDb+JTr9HTf8FjP4GDP0JTfyMDvzNUHyOEPwO0TwPEXpNT7kLDbwMjzzLzv2Ljn2LTf1LjP1LjHzLzHtNDLcMCziPTnaNjTfOzn/bWrlQ0HRLy3OLyzZOjffQDzgQTvbPDbVNy7WNS3WNSvSNirINifDNiXCNifEOCnFOy7GPDHGPDHFOzHrYFnhVE3JPDO/MCjLOzPRPjbOOzPSPTbYPTjXPDfUPTbPPDLJOzHDOS68Niq2Nim5Oy+8QDbPVE3jZ2Xtb3L4en7/gYj7fIP7fIP7eYH7eID/d4H/c4H/bn3/Z3b7YHD8W231R17/PFr/PlzsRlrOYGGefmV2hVpphFFohU9tg1J0hVh7iF19iF54hFxxglhgek1ff1BhhVVljVlulWB1nGd9oGp+o22DrHKEsnSItniLuXmLuXmNuXqRun6UuoGTsX+VrICbqYaprZK6taLHua7LuLLItrS4rKyqoaKgl5pbSztbSztbSztbSztbSztbSztbSztbSztaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxdSz1dSz1dTDxeTT1eTTteTzxeTzxeTzxeUUBeUUBdT0JbT0NcTkVbTkZcT0ldT09eUF9iVG1kWXtpXolwZ5x8dK2Fe7eIe7OZhbqlhbSvgKq4eqHGeJ/RdZzMY4zITWzcRlLfQUDVQT3PRTvMSDvNRzvTRTneQTruQEH1PEH6PUT4P0fwQUjiQUbSQEHGPzy/Pza2PDGvOSurOiqqOSmuOCq8PjDORDrVPDfVMzHgOznlQT/hRD/oU0zfVUq/OivBOSm+NyTANyXEOynJPSzKPSzLOSrOOCnNNCbSMibZMinlOS/xPjf1PjbwNS7kLybgNineNingNCrjMSfnLinqLSnsKijsKirqKSzoJyzrJzHyKTn2Jjz3ITv7Hj37JUH7NkjkKDbnLjz/UFz/YGz/UFzyPEnzOUfoKTjtKjjxLTn0MDrxMjfqMDHhKyrXKCXYMC3aNzLUMi/lQ0D/c3D1VlPdPjvlR0TbPTraPDnVOjXSODDRNy3QNirNNCbGMyO+NSO5NiS7OCa/OyzAPC+/OS3AOi/FPDLlWFHcTUfKNzDHMCnXPDfeQTraOzXfPDXnPjnpPTnmPznhQDjZPzXQPDLIOi7BOS27OSy7PTHLTkjgY1/sbm/6fH//hIj9foX4eYD4eYD8eYH/eIL/dIL/bn39ZXT5Xm73VmjzRVz9OFb/PFruSFzHWVqKbFJjckdcdEJceUNkeklsfVB0gVZ2g1hygVhvgVdth1psjlxvlWJ1nWh7pGyBqG+EqnGFq3CFrXGFsXSItHWJt3aJt3aJt3aLuHePuXqRtHyPq3uSpHybpIWtq5a+sqTIt6/HuLW0q66hnqWXkplbSztbSztbSztbSztbSztbSztbSztbSztaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxdTDxeSzxeSzxeTT1eTTtfTjxeTzxeTzxeTzxeTj5eTj5cTz9eTkFdT0JeUEVeT0piTlliUWRjVHFkWn1sZZF4cqJ/d6iDdqSUfaeshqvCianOgp7ad5ThbInbWHfaRF/zQlT6RFDvSlDhSUjQRT7LRTzQRjzZRD7oQkLwQEP1QEf1QkjtREffQ0TPQT3CPze/QDe1PS+uOiurOiqqOSmuOCq7Oy7MPzbhRkHiPTvuQkLrQUHeOzbjSkLmWEzVSz7IQDLAOCi8MyPBOCjIPC3JOirLNynQOCvOMCXXMyngOC/pOzTtOjXtNjDrMCvlLCfjMCzjMS3nMTDsMzHzMjX2Mzf3NDj3NjvsLTXqLDbtLj3xMEPzLUb2KUf9K07/M1L0OUzlMz/wQE3/X2z/bHr/V2b1Q1P1PlDuM0TtM0HtMz7pNjzjOTnbODPONCrHLyTLMirHLijQNzLyWVT2XFryWFbbQT/iSEbcQkDUPDfONzDNNi3POC3POSvKNyfCNSO5OCOzOSS1Oii4PS25Oyy2Nim8Ny7GPTXbTkfZRUHONTDQMS3hPjnnQDrjODHnNTHrMjDuMjHrNTLnODPhOjLYOi/QOS7IOi6+Niq6OCvISULcX1nrbmz7fYD/hYn9f4P1dn32d378eYH/eIL/c4P/a339ZHb5XnD0U2X0Rl39OFb+PVrvTF3AVFJ6X0JXaDxZcT9bdkNmeUtuflF0gVZ4hVp5iF93jGF5lWV4mmh6oG18p3GBqnKEq3KFq3CGqW+HrXKIsHSJs3SItXSHtXSFt3KJuHSLuHeQtnuOrHiOo3iZpIKtrZXAuafOwLXSxMG8ucCoqracnKhaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpbSztbSztcTDxcTDxdTDxeSzxeSzxeSzxfTD1eTTtfTjxeTzxeTzxdTjtdTjteTzxfTz9fTz9gUEBhUUFiUEZiTlBjTl1fUGVgVXNnYYV0b5d7dJ19cZePdpaug5/Mi6HbgpbmcoXrZHXpUGTpO1L5M0z/PFH7RVLpREvVP0DOQD7RQz/WRULjRUboQkTuQUXtQ0bnREXaRUHLQjq/PzS7PzOxOy2pOCioOSiqOSmwOCq8Oi3KOzPoSUXpPz/rPT7lNzjaMi/eQTruWlD0aFvaUEPJQTO+NSXCNifHOSvIOSvLNyvSOCzRMCbaNi3mOzTpOzTqNDDoLyzqLSvrLS3zNDn1Mzv4Mz38Mz3/MT7+MD39MT35MT71MEHyMUL0NEv1NU71ME72LU//MVj/Pl/mM0j5T1z/YW7/X27/V2b7UGD0RFjpOErzQVHqOkfdMjrSLzLKMi3COC29Oyu8OirEOi/AMijZSkL6a2PdTEfhUEvPOznPOzngTErUQDzKNzDKNy3OPC/NPCvLOinEOyi0OyatOiWvPCmzPi2xOSmvMye6Oi/KRDvWR0HYQz3UNzLXMi7nOzfsOjboMi7tMi3yLC30LCzyLi/vMzHoNzHiOjHaPDHSPjLCNim6NCnFQjrXWFLnamj6fH3/hon+gIT1dn33eH/9eoL/eIL/cYH/aXv7YnT4XW/yUWP3SWD/Olj9P1vwT1+6UU5xWDpTZjhddUVhfElugVN2hll7iF1+i2CBkGeCl2yAnGx9n218pG99qHCAqW+Cqm6DqWyFqWyIq3GIrnGIsHKGs3KEs2+DtXCFt3KJuHSLtXaJrHSOpXeaqISwtJnIw6/YzL7a0czCwsyrscGbobFaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhbTDlbTDlcTTpcTTpdTDpeSzxgSjxeSzxfTD1eTTtfTjxeTzxeTzxeTzpfUDtgTzthUD5hUD5hUD5hUDxiT0FlTU1kTVdgT19hVW1nYoB1cZJ8dpiAc5GPdY6tgJTNhpTffofucXn5Y2z6UFv6O03/Kkb/MlH/PFPxPE3gPEXXQEXVQ0TUQkPcQ0XgQkPkQUTiQkTeRELUQz7JQDi+PjO4PjGvOSuoNyepOimtPCq0PCzBPTHPPzffPTrlOTnjMDPiLzLgNDLbOTTmTUX8bGHyaFvZUUPGPC/GOi3IOi7JNyrNNivVOC/VNCzeNy/mOTPoNjLpMS/oLyzuMS/1MTX/MkP/MEX/LUb/KkL/JUD/Iz38IDn2IDj3J0H1K0X1Lk31L1DzK1D0KVT/MmD/QWjzQ1j/YG3/aHX4VmXtS1rxTFzrQlXaMkPrQFLdN0PJLTG6KCixLiSrOCalPyaoQCe4Py68OizdWU3hXVHNRz7NRD7BNjPJOzfkVVHVRkDJOTHIOC3JOizIOSjIOSjEPSmxPyemPCaoOyasPSqrNyisMyi8PTTTTEbWR0HdRUDbOTbcMzDpNzPsNTHrMCv0MS39LC//Ky36Li/0MS/tNC/mODHfOzHYPjLJOS69MyjAOzLPTkjhYV73eXr/iIr/g4f5eoH7fIP/e4b/eIT/bn7+ZXf3XnD1WmzrTGD1SWH8OVf7PVnuTV2ySkdoUTFRZDZcdERmfk51iFt/jmOEkGiGkmqIl26JnnOIpHSEpnR/p3J9qHB/qG6BqW2DqWyFqWyFqG6Hq26FrW+Fr2+BsGyAsmuCtm6Ft3KHs3SHrXSNp3ecrIWyuZrIxq/Xzr3Z0sy7v8qkrL+Smq1bSjhaSzhbSjhaSzhbSjhaSzhbSjhaSzhbSjhaSzhbSjhbTDlcSzlcTTpdTDpdTDpeSzxeSzxeSzxeTT1eTT1eTzxeTzxcTzxgUT5hUj1hUj9iUT9iUT9hUD5hTztiTD5oT0tnTlJiUFxjV2tqZn91dpR9fJx/eJeRepargZXGhJLafYXwdXr+bG3/WVv9REz+L0n/NVL/PFXzPE7pP0zjQ0vdQkjWPUDbQUPcQEHeQEHbQT/YQz/QQTnHPjS9PTC1PzGsOyupOCitPCy0Py67QDHKQTfYQz3ZNzThODXeLi7iMzDmOjbTMCfPNSnrVUf/d2rrW1DRQzfKPDDLOzDJNyrNNivUOjDaNzDfODLlNjPnMzLqMDHtMTL0Mzb9NDz+JTb/Izn/Ijn/Ijn/ITj/Hzb9HTX4HjbvGzLuHznwJULvKEfuJkrxJ03/M1z/RWj/YnX/YGz3V2PxUV3yUF3vTVriQE3UMj3aPUbMNzu7Ly6uLyimNSeiOyibPyacPiWqOSeyOCvSVkq7OzLEPzi+NDG9Mi/OQ0DlV1PVSEHIOTHENirFNijENSXGNSTDOiixPCinOiaoNyWtOSqsNCavMSXCPzXbUkrZSUHhSELeOzbeMi7qNDHtMS/vLSv8MjL+LC/9Ky75Ky3zKyvtLSrmMSrfNCzWOCzRPTG/Mii8Ny7ISULZXFjzd3f/iYv/h4r7gIX+f4b/fYj/doT/anz+X3P3WGz2VGnqRFz1RF71NlXxOlbgTFqlSENeSy1NYzVVbz9ifUp0jFyAlmeHmGyIm26KoHKLpXaMrHqGq3eBqnJ+p218pWl9pWeBpWeCpmmCpWuCqG2Dq22CrGx/rmh+sGmBs2qEtm+JtnOJr3KOrHiZsIStu5i/xanLyrXLzcK2vcWeqrqLl6ddSzdcSzddSzdcSzddSzdcSzddSzdcSzdeTDhdTDheTDhdTDheTDhdTDheTDhdTDpdSjxdSz1eTD5cTDxcTDxbTj1dUD9eU0FgU0JfUj9gUEBiUUFjUkJkUUJkTkFkTEJqTUloS01kUFlmW2xua4Z3e56Aha2JiLKPg6mlh6m+iKDQgpLieX7wc3H6amL/YV75SlfxPlHrOkzuP07vQ1HqQEvmPEflPkbhPELfPD/aPD3WPDrPPjnKPTTBOzC4OiynNiavQTCtPCysNii/QTXMRj3MPTXQNzLaODXcNzHeNS7eNi3eOCrdPCrXOifTNiXZOzDwU0zyWk/ZRTnHOCrNPi7UQjPSOi3UMyvwR0LhLy/uNTrzNj3uLDf/Qk3xJzP6JjL/KTL/KDL5HSf9Iir/Jy/+Jy/wHSbwHin5KzfqIC7sJjfxLUHnIzv/WHLnLUT/XWz/X2n+WmP5VVz1UFfrSE3dP0DNODTLPjfEQTe3PzGmNyaZMiGZNiOaOyefPCmnOC2uNy/CRT+/Oze9MzHENjTFNTTUREPbTEjaS0XRRDvIOjDENCnHNSjLNCnFNSq8PC+zOSytLyOrKB6zLSTDOS/SQzvYSD/kUEbfRT3aNzDdMCrnMCzyMjH5MTP9MTT3LzH2MDH2MDHzMC7yMC7tMi3mNS3dOS/VPTC+MiXAPjG5PTPWX1npc3H/j4/7hIb7h4r/hIz/eIj/aH3/X3f/W3X/VW/4TGb4RWPxOln0O1vmP1nbXWmLQDtWRi1MXjZZdUJnhk13ll19nGN/nWeAoWqDpm6CqG+Ap25/pm1+pWx9pWl8pGh9o2Z/o2V/o2Z/pWx/pm2Bq2x/rGt+rWd/rmaBsWeDs2mHtW2LtHKNsHaOrnyZtImnvZmxwaSywa6msrCNmJ56hYtdSzddSzddSzddSzddSzddSzddSzddSzdeTDheTDheTDheTDheTDheTDheTDheSzpcSzteTD5fTT9eTj5bTj1bTj1cUT9eUkJfU0NdUUFdT0JfT0JgTkRiUEZjT0hlTkhpTUpnTlFlU19nX3RubpB5fqiAh7uHisGelcqji7urf6O5eJDTeYPqfHv0dmr2aWD4XWHzT1rsRlLySFP4SVb1RVDvP0rrO0XkOT/gOjzaOjrVPTjOPzfHPjTAPC+3PCyrPCuqPy2pOCiyOizBQTbFPDTHNjHUPDfSNTDWNS3XNSrYNCjZOCbbOibbOyXaOSfdNi7mQTvrTUThSTzQPi/HOCjKOCnTOy7eOzT2SkbkMDHwNjv2NkHxLjz/QE7vJzTzJCz3JSj7KSz9Kyz8Kiv4KCj2KCj3KyzvJCftJSjqJSz9O0TZGyfwNEP8QVLYJjb/anX/Ymr+WmH8V130T1PlQkPXPDjRPja+OCy/RDW5SDapPiyZLx+QKRqPKBmSKBueLSWwOjbRVFDOSEfDNTTGNDXRPT3rV1XYR0LWRz/QQTnHOS/GMynKNizQNy/ONzDHPTPCOTHCNS7DMi3JNC7RODPYPzneRT3kSkDeQTjaNi3dMCrnMCzyMjH7MDP7MDP0MDLzMTL0MDHzLzDzMC7uMS3nNC3fOS3XPTG/MyS+PC+3PTLTXlfpdnP/kJD5hYj4hYr/gor/dIX/Znz/XHb/WHT/UW/+SWj8QGHzOlrxP1/hSWDBU1x7PzdSRi5NXzladkNlh0tzlVl4nF93nWJ7oWZ9pWl9pmp8pWl8pWl8pGh7o2V7oWR7oWR9oWN+omV8o2p9pmx9qWx9qml8q2V9rWN/r2OCsWOFsGiHsmuIr3CIq3OLq3yQrISQqoeMoot4h4BkcHBSXl5dTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDheSzpfTj5hUEBgUEBdUD9cTz5bTz9bUkNbUUVbUUdcT0dcT0lfUE1jUU9mVFRnVVVnVVVnVlxoXW5saYZzdqN8g7qCisuKjdSYkdegisqqgrS5fZ/PgJPkhIbuf3bzc2r7ZWf3U1ztR1HwRk/2SFL3RVHyQUvuPUXkNz3gNzrZOTnUPDfNQDfFQTS+PzC2Pi2tPi2qPCurOiy4QjbHSD/AOzK7MCnKOjLNNi/QNi7VNyzYOCzZNyjZOCbcOSbgOirdNC3bNC7iQTnpT0PeSDrINSXIMiPZQDLiPjX1SEToMTPyNTv5N0D4NED/RVP4Mj/wKTDrIybsJCf5MTP1LS/vJyfsJiX1MTLrKSr2ODroKzHiKTHrMz3/Ul7vPUv/W2f+XmbxVlzuT1TwTVLqRUndOjvVNzTUPznANizBPzK8QjWzPTGsNy2lMymhLCOcJyCaJR6pLyrHRUPCOjq8LCzIMzXXQUL0Xl3QPzrSQzvQQTnLPTPMOS/UPTTaQDjbQDvbQDzYPTvdPjvjQT/kPj7gOjrjPz3rSUTgQjndPDTZNSzdMivnMS3wMzH1MTL4MDL0MDL0MDL0MDHzLzDzMC7uMS3nNC3fOS3YPjLANCW6OCu1OzDQW1Ttenf/k5L7h4r6g4n9fon/coL/ZHn/W3T/VHH/Tm3/Rmf7PV/0PVzuRWLfVGeiQUhwOzNTSDJRYTxdeEVmh05yk1p1mF50ml94nmN7o2d7o2d5omZ5omZ5oWN4oGJ5n2J5oGF8oGJ6oGN6omZ7pGh7p2h7qGV7qWF7qWB9q2B/rmCHsmqKtW6LsnOJrHSGpneCnnV5k25vhmxTZVlBUE0yQT5eTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTDhgTjphUDxgUT5dUD9aTj5ZT0NYUEVYT0hbUU9fVVRiWFllWF9pWWNsXGZrXmdsYWlsZHFva4JydJp5frV/hsqFjNqMjuGOh9efi9OtisSzgKm9eY7Me4HegXrygnf/c3L/Y2f5VVz0TVT1R1D0Q03yPkfvPELlNjvgODjbOTfUPDfNQDbFQTS8QTG3Py6rOiqtPi2xPTC8RjrMUkfHSD+6NS66MSnIOTHNODHTOzDZPTHbOy3ZNifcNibgOCvgNS3bMivgPTTsTkLjSz3SOizROCrgQjbfNy7wPjrpLzDwMTb3NDz8OEL/Tlr/TFX9PkXyMzjiJCbtLzHqLCzwMjLoKirrLy7yOjrRGhzmMzfdLDLoOUDwRU3/WGPzTVfYPUPaQUThQkbhPkHeOT3cODnYODjTOTfJODPCOTG9OjLAQTrNTkjWVlPQTk7DQ0CyNzK2OTXPS0nZTUzjUVLvWVrqUlHxWVbJNTHOPjbSQjnQQDfTPzXZQjngQzziQDvpP0DnOD3sOT3yP0PvOj/oNTjsPj32TUreOTPbNjDaMyveMyzlNC7sMzDyMjH0MDH0MDL2LzL2MDH1LzD1Ly7wMC3pNC3gOC3ZPzPCNie3NSizOS7LVk/vfHn/k5L8iIv9gYn+eof9b3/8Y3f/WHH/T2z/Rmj/QGP7OVz0P17pS2TYWmiFMzVnOzBXTzhXZ0Nhe0tqiVBzkll0lVx1mF53nWJ5oWV6omZ3oGR2oGF3n2F2nmB4n2B4n2B7n2F6oGN6omZ6o2d6p2Z6p2J6qGB6qF18q11+rV+GsmeLtG6Ms3SKrXOGpnWAnXF0jmlpgGRRY1VEU0w4R0BeTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTldSzVfTTVgUDlfUDtcTz5aTkBYT0ZYUUtZUFFgV1xnYGhuZnNzaHlzZ3tzZ31xaH1vbH1wcYZyd5d2fat6gsF/h9KEiuCKi+WTjeOdjNqghL+edZ+gbIKsbnG8dmzSdmnyc23/bGz/Z2n+XmD7Ulf1Rk3vPELqNz3mNTvhNzjdOTjWPTfOQTfGQjW9QjC4QC+tNym0QDOvOjCwOzHIUkjVXFHJTUO7OzC+OTDBNy3MOS/WPjPbPTHaNircNCfiNirgMyziNzDkPTXlRTniRjneQjPeQTLiPjLbMCbqNzLsMC/vLjHxLjT6Nz//UFj/XWT/Wl//T1PhLjHjMDPgLC33RUXoNjbcLCzbLS7rPkDcMjXZMzf/YmjgPULLKjLKLTTBJirVOz3hQEXbNjrZMzffOT3cNzvNLzDMNDPNOzvVR0beUlPsYGP1aWz0ZWvqXmHEQD7GRUDlXlv4aGf/b3D/amrlS0vXPTvJNDDRPjfXRDzWQzvVPjXVPDTYOjHcNDHuNTvxLTfwLDbyLjjvLDTrLDPzOTz+SkvfMy/cMy7aMyvcMyzjNS7qNDDvNC/yMjH0MDL2LzL3LzH2LjD1Ly7wMC3qMy3iNy3ZPzPGOCq0MiWyOC3DTkfvfHn/kpH/iIz/f4n/d4X6bHz4YXT7VG79SGf/PmL/Ol/6NlzzQWHgTmXCV2FwLytfPzBbVz5ebEllfU1riVN0klx1ll92mV94nmN5oWN4oGJ1n2B1n2B1nV92nl93nl94n2B7n2F6oWJ6omR7pWV8pmR8p2B5p155qFp7qlx9rF6ArGGFr2eHrm2HqnCFpXODoHJ7lW5yimpleGVba15SYlVfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjpeTDRfTjRgTjheTzpbTj5ZT0VaU01aVFRfWmFoYnBybYF6dYx7dZF7cZN6cJN2cJJxdJNyeJp0fah3gbZ6g8R+hs+EidqLjN6Wj9yZis2bhbaig6OqhJGrfnmfbFuaUT68TULUUUniV1LrV1XxU1LxS03tPkPlNDrpOTzmOTvgOznYPTjTQDjKQjbAQTC6Py+zOSy6QTarNSujLiS+ST/ZZ1zZZFrLVUm4PDK4NinAMynOOjDZOzDaNizeMynkNi3fMSrkNzHjOzLdOS/ePjDjRjXkQjPfOSvfMSjpNC3wMzHvLS7tKi70MTf/RUr/Vlv/XWL/XGHiOTzjOTzVKyz0SkviODnXLy/bNTfMKCnMJyv4WFrdPkLVOT3RNjq6HyPEKCvcPD7mQUXdNDnZLDLeMTfZMDXNKC7SMzfkS072YWX7aG75Y2z3YGn6YGz4YmvWTEzVTkrqXFrqVlTnTU3jSEbPNDLOMy/ZQTzgS0TkT0jfSkPZQDjXOjPXNi7cLi31Mjr7LTr4Kjf1JzT1KTT4MDr/PkP/SkrgMS7eMyzcMyzdNSzhNC3nNC/tNC/wMy/0MDL3LzL5LjH4LTD2Li7xLy3rMi3iNy3ZPTHJOy2zMSSxNyy6Qz3seXb/jY3/iI3/fIj/cYH2aHj2X3L5Umz7RGP/OV7/Nl36NlzwRmPRTmCiSU1lNStWRDBbWUBebEllfE5riFJ0kVt3lV94mWB7nmR6oGN2nmBzm11ynFxzm1x0nF12nV53nl97n2F6oWJ5oWJ6pGJ8p2J7pl94plt4p1l6qVl7qlp+ql+DrWWFrGuHqW2Jp3OJpXWEnXN8lHJ1iXBuf2xmd2VfUD1fUD1fUD1fUD1fUD1fUD1fUD1fUD1eTzxeTzxeTzxeTzxeTzxeTzxeTzxfTjphUDZhUDZhTzleTzxbT0FbUktcVlZfWmFrZ3Zzb4Z9epeCfqGBfKV9d6N7daV4dqdzealzfbB4gbh7hL9+hsSEicmNjs6Uk82ak8eglb2rm7W8prLJranFppSqiG2cZkqcRTKvQTS2QDTCQjnWSEToTk7uSkvsP0PrPT/pOz3kPDvfPTrZQDjQQDXIPjHBPTC9OjC+PzavNCynMSe7ST/RY1bWaFvVZVfDT0K6PjK6NCnHNyzWOTDZNSzfMivnNjDiMCzjNC/iNy/eNy7gPjHlQzTkPjDeNCXmNCrpMCvwMy/wLi7vLS7yMTTzNzj2QkX2TVL8WV7pRkv2UVfYMzfrRkrdODzmQUXaNzrOLjDRMDXkSEvSNzvQNzq5IyXVOz3bODvlOz7rPEHnNjziLTbdKTLhMTvnPETwTFP9XWX/a3P/anP6YGr2Wmf5WGj3W2b0ZGToWlboV1TYQD3PMTDUNDTTMzPhQ0DjSkXpUkvqU0zhSkHZPzfYOTPbODHjMzPzLjf/MD7/MD36Kjf8Ljr/O0X/Q0j7QULjMS/fNC3dNC3dNSziNC3mMyztNC/xNDD0MDL3LzL5LjH4LTD2Li7xLy3rMi3jNy3YOi/NPjC1MSWxNyyyOzXpc3H/ior/h43/dob+aX3zYXTzW3D3UGr6Q2L/N2D/N2H5O1/sTGa/T1t+ODZdPTBORjFWWEBaZUVjeE1qhVJyjlt2lF55mmF7nmR4nmFzm11wmFlwmVdxmlhxmlh0m1x1nF15nV94n2B4oV95ol56pV55pFx4pFl4pFd5pVZ7p1h/qV+CrGSEq2iGqGyHpW+GonGAmm14kWpxhWlqfmNidl1fUD1fUD1fUD1fUD1fUD1fUD1fUD1fUD1eTzxeTzxeTzxeTzxeTzxeTzxeTzxfTjpjUTljUTlhUDxdUEBaUEdcVFJfWmFhX210cop5eJiBgKiDgbB+frB5ea95dbB3d7V3fL54gMF9hcSCiMSFisGNj7+Xlr6gnbysp7u2rLW+s7HIuKvQvqbWwaLRu5bQrIivb1SuXEekRzWoPjDCRz/gV1HvV1bxTk/pQEPqPT/mPD3iPTvfPTrXPTXROjHJOTDBODDBPDW5OjO4PTXBT0XHWE3HXU/RZVjTY1XCTD68Oi3FOC7SOTHXNC3fMiznNjDmNDDhMi3gNS7jPDPnQzfmQzTiOi3fMyXqNSzmLibwMC3vLyzwMzHxNTTnLS7iMjTnQkb3WF32V1z/b3XlRErrSE3gPEP+W2D/b3XePUL/fYL/bXHqUVTUPkDGMDLWOj3ySEvuOT7wNz/4PUbyN0LoLTj0Pkr/XWf/bXf/anL/Y273XWf6Xmv/YW//XW75WWXyXF3jUEniSkfVNzTSLzDZNTTSMC7YOTXfRD/jSkTiSUHZQDjTNi/WNC/cNzHoNjbqJy/8MDz+Mj33Kzb5MDr/PkX9P0HsNDTiMy7gNS7eNi3fNCzhMyroMyzvNC/0NDH2MDH3LzL5LjH4LTD4Li7yLy3rMi3jNy3XOS7RPzK2MCWyNiywNjHocG//h4j/ho7/cIL8Y3jxXHD0WG73T2n7QmL/OWH/PGT2QWLkUmewUVdkLydXRDNHRy9SVDxVXj9idExpgVFxi1t2kl96mGJ8nWR4nF9ymVpul1Vul1Vul1VvmFZymVp0m1x3m113nl13nlt4oVt5o1t3o1h2old2olV3o1R5pVh6pFp+pl+BpmN/oWR+nGZ7l2ZyjF1pglhgdlJab1BSZ0hcTDxeTj5gUEBgUEBfTz9fTz9fTz9hUUFiUkJfTz9dTT1dTT1hUUFjU0NiUkJgUT5kUz9hUD5dUEBeUUlbUVBaU1plYXBzcYl5eJp6fKV+gLGAgbl9f7p4erdyc7Rsb7Z0d8h2e8yAg8qLjcaWl8OkpL6ysLu8ubTLxrPTzLDZz6zbz6fcz6Pd0KPZy5zZwpjRqIi4gGegXkbLemfWdWW9SD/XUU73Y2PpS0zlP0HiODnkOjriOjncNzXZNjHWOzbLODHANS7HQju7PDO/ST/GWEu5T0HOZFbRY1TMWEnFRznEOi/NNi3YNy/hNi/jNC/fMC3fMizgNzDkPTTgPDDdNynfNSjlNyzkLyTqLybsLynuMS3uMjDrNDDoNTHiNjTXNznmSk71WV3tTlPXOD3XNjz5WGD/foT/fob/b3X/Z2//aXD/Zmz1XGHxWFv7Wl//VVr/REv8OEL7N0H2Mj7uKznsMD7xPUj/U1//YGn/Z3L/ZXD+Ym3/Y27/YG/9XWftU1PfRkDWODXWNDHXMTHXLy7YMzHbOTThRD3cQjrZPzfWPDTXOTDbODHgOTPmNjbwNzzzNDvzNDv2NDz1NjvyNTnrMzPjMS/eMyzeNS7fNy7gNSvkMyvpMizvMiz1MjD3MTL4MDP6LzL5LjH5Ly/zMC7sMy7lNy7gPzXMOCy/NiyvLya4OzfSWFf/mJr+e4P/bYD/ZXz4XHLwUGj0R2X8Q2X/O2T5OWD1TmzTUmSJPT9QLCBDOyZDRy5LTTVZX0NaakVjeE1xiFp4kmJ4lmB0lVxylllxmFlslVNtllJul1NvmFRymVh0m1p1nF11nFt0m1h0nVd2oFh3oVd2old2olV1oVR0oFN7pVt7o116nl51l1tti1Vifk1YckNTaj5BVzA/VS88UixbSzteTj5gUEBgUEBgUEBfTz9gUEBhUUFiUkJgUEBfTz9gUEBiUkJjU0NiUkJgUEBmVkdfUUZcT0deVFNhWmFkYG9ta4N2d5Z3eaJ7fa59f7h4fLlxdbVrcLRsb7Zucb51dtB8ftWJidOYmM6op8e4tsHJxbrTzrHb16ri26Xn3qXm3aLk26Ti2KPb0aDUx5vTvJq7nICpfWTFi3fKfW20VkrSYVv2cnDsWlvnS0zjP0DnPT7rPkDnOzviNjbbNjTWPTjJODPKPzi5Ni64PjO9S0C2SDvIXU3db2DUYFHGSDq9NSnEMCbUNi3cNS3bMCniNTHlOTXkPTfgPDPcOC7bNSnfNCrjNSrsNy7tNSvtMivrMCvnMCzjMizhNC7dNTLWODfYPkDkSkzzV1v6XmL8XGT+XWX/YWn0U1vvTlbxUVn/X2f/anH/Zmz1WmDzTlTtNDrxLDX0Kjb3LTnxJzXlIS3mJzbtN0P+UFr/WmT/Ymz/ZG3/ZW7/Y239W2j1UVrlRUXePDfbNjTeNjPfNTXcMzDaMi/bNjLgPjnbPjfYOzTXOjPbODHfODLlOTXnOjbpOTvqNzrrNzruNznuNznsNjXlMzHfMizcMyzdNi3fNyziNizlMivqMSzyMSz1MjD3MTL3MDP6LzL5LjH3Ly/zMC7sMy7lNy7fPDPUPTLCOC62MSq3NzTYWlv/kJP7c33/Znr/Xnb5V2/3T2n5Rmb7P2L8PGP0QGPlT2i5S1Z4OzhMMiM8OiM8QihFRy9PUzhWZEFgckpug1h1j192k110k1hxk1ZwlFRrkk9rlFBslVFtllJwl1ZymVhzmltzmll0m1h1nVd1n1d1n1d0nlRynlFxnVJwnFFumFBslE5ojExigUZYdT9OaTZGXS9AVytAVy1AVy1BWC5ZTDxbTj5eUUFeUUFeUUFeUUFfUkJgU0NhVERgU0NfUkJgU0NhVERhVERgU0NeUENiVU1cUU1bUVJjWWJrZHRxbYR2dZV5e6R5e6x5frZ4fLtuc7VlabBgZ69qbrhydcZ9fdeHhN2XlNupp9i7uc/Lysjc2L/l4bTp5Krt6Kbw6aXt5aTn4afi26fXz6HLw5y4r5Cpm4Gbg2uog3Cnb2CcUke6XVXdbWn3dXXvX1/kSkzlQETrQUTsPkDoODriNjbfPTrUOzbUQTrCNzC3Nyy3PjOuPS+2RjjbalzfaVvZW03KQjbFMijRNCvZNi3ZMizeNTLpQT7sR0PgPTbVMinVMSfaMifeMCXmNCroMSnnLinmLynjMiziNy/hPTTgQjnGLSjKNDPcREPwVlj6XmL3WmHzU1vxUVvoRlHqSFPvT1n8XGb/bXb/bnT0WV/jPkTpLjX0LTT7Mjz8Mj71KzntJzT2NkX/S1f3SVP1UFf4V1/+Xmb/Y2v/YGn3UlnpQkneOTfeNzHjNzXpPDjrOzvmOTXhNTHdNjDdOjPZOzLXOTDXOTDcNzHhODPnOjbpPDjjOTnjOTnlOTfnOTjoODjmNzThNDDbMivaNi3bNy3eOCziNiznMinrMCnzMCz3MTD1MTL1MTP4MDL3LzH3Ly/yMC7uMy7nNi7dOTDcRDnHODC7NC61Ly7kX2L/g4j4bHf+Ynj+V3P6UG3+TGz/Q2b2Ol3zO1/sSWbUU2edREpsOzRPPiw9PCc6PyhFRC9GSDBRXDxZa0VnfFFyiVt0j1pxkFVtj1Jrj09pkE1pkUtpkkxrlFBtllRul1Vwl1hxmFd1nFl1nVd0nFVynFRwmlJtl01rlU1qlExljUdhiEVbf0FVdDtMaTNFYC1BWCo+VSdCXC9FXzJJYzZXSjpaTT1cTz9eUUFdUEBeUUFfUkJhVERgU0NgU0NgU0NhVERhVERgU0NfUkJcUERaT01aUVZiWGNqY3NxbYZ2dZV4eqN6fK13fLRzebdtcrRiaa9dZKxhZ7Fscr54e8qJid+VkeWkoeS2teHHxNnV0c7h3cTn5Lnr5q/u6q3u6Kzp4qvj26ra06nLwqG7tpmlpY2bmYSTiHaYgXGZcmObYlezaWDPcm37i4n1dXTqW13mTE7oQ0ftQETsPD/pOzzfOjjbPDjeRT/TQzvDOjC6Oi+wNimnMSO/STvbYVLqa1zbU0XJOizMNCfUNivXNC3ZNDLxTUv+WljtS0bZODDWMyrbNCveMijfLibhLCXhLCXeLSXcMSnaNizZOzDXPzTCLyfENCzOOjbZQ0LfRkjgRUnkR07qTVbxUV32VmL4WGL5XGX/Z3D/bXX0WWHeO0DqMTfxLjTyLTbwKzTrJTLsKDT7PUn/U1/tP0noQUnqR0z0UVb/WWD/WF30R03kNjjhNTPkNzPqOzjyQD70QD/vPTvmOTXgNzLdODLaOTHZODDZODDcNzHjNzPoOTbpOjfiOjfgOznjOjfmOjjnOjblODTgNS7aMyvaNizbNy3eOCziNiznMinrMCnyLyv2MC/0MjL0MjP3MTL2MDH2MC/yMC7uMy7nNi7cOC/gRjzJOTG+My62LCzuZmr/eYD4Z3T/Ynn9VHH+S2v/R2r/PmPyNlnrPV7jUWjEWGWIQkJnQzdbTjtHRjFBQy1KSDNFRS1MVTZTYz5idExsg1Vwi1hujVJrjVBpjktnj0lokEpokUtqk01rlFBtllRvlldwl1Z0m1hzm1VxmVNvl1Bqk01nkEpljkhkjUdgh0RdgUFXeT1ScThNaTZMZjZOZTdPZjhMZjdPaTlTbT5VSDhXSjpbTj5cTz9dUEBdUEBfUkJhVERfUkJgU0NhVERhVERgU0NfUkJfUkJeUUlWTVJfWGhuZnt0cIl4dJd4d6F4eqt5e7RzebdqcrNgZ61bY6tfZ7Bqcrt2fMaAhM6TleCenuStrue7vebLyd/U09jd287h38bl4b7m4rzk37ng17ba0LXOxrG+taatp5uYmoyMjoCJhXmKfHGRdmubc2mobWW6b2nmiYTugX7zc3LxZWTxV1nwTU7uREXsQEDjOjfgOzfkQj3eRT/MPDPGPTPEQjWvMSOuMCLHSTvcWEvWTkDMPS/OOCrQNirRMyrWNDL1VVX/a2j6XVjjRD7cOzPfOzLjODDiNC3jMiziMSvdMCnUMCfNLyTGLyTCMCPFOSzANCfBMynLOjXXQ0HbRUfbQkfaQEjgRE/rT1ryVmHyVmH6Xmn/Z2/zWWHhQkfqOjztNTftMzjvMjjxMz33OUP/SFP/Vl/kNj/dNDvfNjvrQUT5Sk/8SU30O0HpMTPoNTHrOTXvPDjyPDnzOznwOjfpNzPiNzDfOzLcOzHbOjDcOTDfODLkNzPoNjTpNzXmOjjkOzjmOjjoOjnoOzfmOTXhNi/cMyzbNy3cOC7fOS3hNyrlMynpMSnxMCn0MS3zMzLxMzP0MjL0MDH0MS/yMC7uMy7nNi7eNy/gQzrKNzDAMS3AMTP3anD/cXr6ZnT7XXT6UG3/Q2b/PWT/OWP1OF7mRWTZWm2rVlt3RT5kSj1hWUZUTztLSTRQSTZHRS5HUDNMXDhabEZmfE5thVNtilJsjE1ojUpmjkhnj0hnkUlpkkxqk09slVNulVZvllV0mVZzmFVulVJqkkxmj0tjjEhhikZfiEZagUJYfD9TdDtQbjhPazpSbD1XbkBacUNVbz9WcT5XcUFSRTVVSDhYSztaTT1bTj5cTz9eUUFgU0NgU0NhVERhVERhVERgU0NgU0NiVUVhVlBeVmNqZXx5dZB9eZp6eaF4eal2ebBzd7RqcrNjarBbY6tdZa5ocLl2fseBh9GIjNOZnd2jpeCvs+O7v+XGx+PPzt7U09jX1tHZ18vZ1sfX0cXSycDMw77Fubm0qKyjmp2Ki4Z4e3R5dnF1bGV/bGWNb2eOYVudYFvAc23YeXXwf3v8fHn/cnD9Y2P2U1TwSEfvQz/qPjrhPDbgQTvROjHTQzrdVErCPjK4Nim9OSzCPS7IPy/PQjHXQzXWQDHRNy3QMi/qTE36X13yV1PfRD/ZOjTbODHgNzDmOTPnOTLnOTLiOjHaOS/ROSzKOCvEOCmwKBi4MyLIQDLTST7SREDLOzrMNzvPOkDRN0HiSFLtVl/wWWL1Xmf3YGnqVVvcQUXlQD7sPzvxQUP6R0r/TFT/UVn/VF3/Vl7hNDraLzXcLzPnNzr0PUH4Oz/3NDjzMTLtNDLvOTXwODbtNDLrMjDqMjDnNDDhNC7jPDTgPTTfPDPeOzLhODPkNzPoNDPoNDPoODjnOTjoODjrOTnrOTfpNzXiNS/eMyzbNy3cOCzdOivfNyrjMijnMCjvMCjyMSzxNDLwNDPzMzLzMTHzMS/xMS7sMy7nNi7gOTHZPDPMNzHBMC3RQEP/bnX9a3X5YnHwUmn1SGb/O2H/NF7/NmL7PmTkTmnKXGmLR0ZqRjpdTDxdVkNYUT5SSjdPRzRJRC5ESi5HVTJTYz5ec0hnf01qh09qiktnjEdnjEZmjkdmkEhnkEppkk5rlFJtlFVtlFVxlVVvlFFqkU5njktjjEhgiUVfiEZehkdcgkVbfkRXeEFWcj9Vb0BZcEJdckdedUdbc0NZdEFYc0BOQjJRRTVVSTlXSztYTDxaTj5cUEBeUkJhVUViVkZiVkZhVUVfU0NhVUVmWkpoXVluZ3d1cI58eJl7eaB3eKZ2d61wda9qb69haKxeZq5fZ7BlbbZweMB9hc2JkNiPl9iZoNahqNaqsdu0ud+6v9/Awd3Dw9vHxtjGw9TFwdDBu8m8s8S7sMG1qLymmK+Wi5yIhYxxcXF0cG9wZmV3aGWGbmqEX1mVZF+bWlS5ZmDZc27wenb/e3f/d3P/aGb8Wlf+Uk71SELmPTbnRD3YOzTbRz3qXFLFOzDEPDC9Nyu+NijHPi7RRDPUQjPUQTHXQTPSODbYPj7dQ0PcQkDWPTfVODHYNy/eNy/lOjPmOTPlOjPiOzPbPjXVQTXRRTjMRzauLRi8OyXNSjjRTD3GPTW7MCvAMDDKOT7XQUrhS1TrVWDwWmXwXWXsWWHfTFLUPkDPNC/YNy/gOznqQEDyQ0j1RErxQknuP0biNTvfMjbjMzbvODz1Nzn4MTT7LzL8MTTvMjDwOTXwNzTsMC7oLCrnMCzmMy7gMyzkPTXgPTTgPTTgPDPjOjXmOTXqNjXsNjXsNTfsNTftNTfuNjjuNjbrNTTkMi7eMSveNy7dOS3dOivfNyrhNCbmMSbtMSjxMSzwNDLuNTPxNDLyMjHzMS/xMS7sMy7nNi7iOzPSNCvSOjXGMjDnVVj/cHj5Y27yWmnnSWDzRWb/OGL/L13/NWL/QmjcTGWxUFlqNS9eRzdYSzpVTjtbUD5WSThNQDBKQzBARixBTy5LWzZYakBieEdmgUpoiElmi0ZlikRji0JjjUVljkhnkExokU9pkVJrklNuklJskFBoj05ki0phikhfiEZfh0hfh0hfhUhfgkhdfkddeUZdd0hgd0tjeE9jek5ddUNbdkFadUBKQzNNRjZRSDlUSzxXSz1ZTT9cTz9eUUFkV0ZlWEdkWEhiVkZfVUlhV01nXlVsY2Z3col5dZp4dp50c59ycqR0da1scK9iZ6laYalfZa9mbLhtc792fMiBh9OPk92XnN6bodWgp9Oprdqus92xtN2ytNu0tNq2tNu1sdazrdGup8mrocSqnsKkmLyZi6+Ifpl8eIZkYmdpZWZjWVpqW1h7Y195VlCSY12KTkaiVU29YFjWa2Pxd3L/f3r/enf/bmr+YVz3VE/pR0LuT0ndQj3eR0DqV0+6LCK+MSe+NCfHPi7RRTbLPi3BMiLKNyfbRTfeRT/TOTfMMy7NNTDUOzXXPTXdPDThPTTkOzTkOTLeNS7XNCvPNSnKOCvFPCzCPy3UUz7IRzK9PCm+Oi3DPTLEOzXCNzTCNDPcS07eTVLhUFXlVFnoWV3lVljcTU/TREDJNSvRNyvYNy/dNTLiMjTlMjbmMTjmLjbsND7sMzvzNT/7OUL9ND76KzX/KDP/Lzn4LTP5NTf5NTnwLi/rKivpMC7oNTHiNS/jPDTgPTTgPTThPTTkOzbnOjbrNzbuNjbsNDbrMzXsMjXtMzTtNTXqNDHjMS3bMCjeOCzdOivdOiveOCjgNCbjMyTpMybsNCruNTDuNTLwNDLwMy/yMi/vMizsNCznNi7kPTTNLybXPjnMMzX5Ymf/b3n3W2nwTmPqQ135RWj/OmX/MF3/NmH2R2jJSl2TQ0ZSLCNWSThTTDpPSDZbTz9VSTlGPy1IRjE+QidASihJVTFTZDpfckVlfUlnhEpliEhjiENhiUJiikNjjUVljkhmj01oj1BpkFFskFBrkE1mjUpjiklhiEdgh0Zgh0hghklegUdef0ZffUdgfElhe0tke01mfE5mfk5deENdekBee0NEQjZGRDhKRjtQRz5SSD5XST5dTT5fTz9gUT5hUj9gU0JfVkdiWVJnYl9vam5zb353cZN6dKB8eah5d6lwcKZnZ6NgYaJcX6RgYq1maLVvcMB5esyEgtaNi9+Wkuecmeagnt2hodejo9mkpNqmo9ilotelodSkoNOlntGjnc2imsmimciflsOZjbuOgrCDfJ5ybn1pZ2xkXmBmWlprWVVyV1B9V06MV0+VUkmoWlC1WFDBWlPYa2TseXL5gnz/i4b5dXH/dXPtX13fUEzZRUHvWlTMNzHFMirENirDNyjANyfDNybGOSjKOyvQPC7VPzHSOC7WPDLXPzTTOzDNNSjNMyfYOi/iQDXgOTDhOTDeNy7XNyvPNynJOirGPyzEQS/CPS7GQDTLRTrNRzzMQzvFPDS7Miy2KybHPDfQRULZT0zgVlPjWVbhWFLYT0nQQzrMOyrTOijcOCziNS7oLi/sKjLwKDP0Jzb6LT76Kz/7Kj/9KT//KD//Jj//JDz/JDz/JDj/Jzn/Kzz+LDnzKzXtLjXoNDXnOzndODTdOjPeOzTgOzXjOjXmOTXpNzPrNTTrMzXsNDbrNTTpNTTnNTPiNS/dNSzbNSncOCzbOSrcOSjeOSbfOCbiNyXjNiXmNCbsNS3tNC/wNTDxNC7xNSztNSvqNSrlNyzgOTDYNy/VOjbbP0L/bXf/YnP7U2r1SWP/S2r2Nlv/Nl//PGf4PmPnTmqvSVZeJCJELCA/OidIRTRQTTxQSTlFQjE+Qy8/Ry9CSCZFSyVLUy5TXThba0Rhdktkfk5kg0pihkZgiEJhiUBji0JljUZokEpskFBtkVFskUxpjkhnjEdmi0hmikpliUljhUhhg0dkg0pkgUlif0djfkdkf0pkf0hlfkdhfUNbezxcfz1fgkI9PzQ/QTZGQzxKRT9QRT9URz5bSz5dTT1gTztgUTxeU0FeVkljW1hoY2lubHlzb4Z0cJV2cJ50cKJwbaJnZp9hYZ9dXqFcXKRlZLBrarp0csV9e8+GgtmNieCUjuaYk+WbltmcmNWdmdaemteemNadl9WcltSbldGeltGclM2ck8qbkseakMSTibuIf66CeJ10a3xtZGlmXV5mW1lpWlNvV017VUqKVkuaVkuwXFK6WVLBWFLTZmHgcWrjdm/tfnf9h4X/h4X3dXPuZ2TjVVPrWlXHMizCLyXFNynDNybANyXBOCbEOCfIOyrPOy3TPS/VOSzVOSzTOizSOizROSvROSvUOCvYOCzfOzHgOTDcOC7WOCzPOSrIOSjBOia+OSa+NirBODDGPTXJQDjKQTnIPzfFPDTCOTG/NC3HPjbRSEDYT0faUUnXTkbMQzvDNyrKNyXTOCTdNynlNCztLy/0KzP5KTf9KDr/K0D/KkH/KUH/JkH/I0D/ITz/Hj3/HTr/Hzr/IDn/JTv/KTv3LTnwMTnqNzrlOzvcOTTcOjXeOzTgOzXjOjXmOTXpNzPrNTLrMzXsNDbrNTToNjTkNzHfNi/cNSzZNSnbOSrbOSrcOSjcOSbeOSbfOCXhOCXjNiXnNSvqMyvrNCzrNSrrNSrqNijkNynhNyrfOzHVNCzTNTTzVFn/ZXP/W3D1R2L/SWj/QWT/O2D9M1v5O2HyTW3NTGKJOD9TKiRBNSc2OSg7PCxCQDFEQTBAPy09Qi4+Ryw9Qx1LUCdcYjxlb0podlJlelFkfk9kgkxhg0ZhhkFhiUBjjEBnjURpjkhrkE1skU5skUtqkEdojUhmi0ZnikpmiUlmhUpkg0hmg0tkgUlkf0hkgEZlgUdlgUdmf0VifkFdgD5fhD9ih0I2OS46PDE/PzdEQTpLQjtPRTxWSD1ZTDxeTzxcTzxcU0JeV01jXV1oZWxvbXtzcYlzb5Rxa5lqZphjYJVcW5RaWphcXaBcX6ZoarVub793eMp/gNKGhNiKiNyPi+CRjt2TkNOTkdCTkdCTkdKUj9GTjtGTjNCSi86VjM2Ti8eUi8SUi8CTi76MhLODeqWAcpV8ZXd1XmZpW1tkW1ZkW1JmWEtyVkiEVEijWlG9YFnJXFnPWVfbY2Lha2nfb2vjdnH7ioT/iob/hYH/fXn3bmjuYVjENCvAMibEOCnBOifAOSbAOSXCOSbGOyjMOivQOizWOi3TNSnONSfQOCrUPi/UPi/ONijLLyLaOi7aOC3ZNyzWOCzQOivJOinCOSa+NyS9NSnANizCOC7EOjDHPTPKQDbLQTfMQjjHOjHKQDbPRTvQRjzSSD7RRz3KQDbFNyvMNiXWNibfNyznNC/xMDP2LTX7Kzn/Kjz8Jzv8Jz37JT35Izv7ITr6Hjf8HDf+Gzb/Hjj/Hzb/JDj9Kjv3MjzxNj3rODvkOjrcOTTcOjXeOzTgOzXlOTXnODXpNzPrNTLtMzbuNDftNTXqNjXlNjHhNi/cNSzYNCjaOCnZOSnaOSfbOCXdOCXeNyTgNyThNiXhNSfiNCnjNSrjNijjNijhNyjeNinbNyvdPDLQMSvYODj/a3L/XW7+UGnxPFv/SGz/N13/PmX5NVvuPmLmVnGqP1FhIyhMLyk7NyswNyczNyY5PClAPSpBPChAPilCQiY/Rh1YYTRzflSAjGR3h2Bof1NhfUxhgEdgg0NghT9hiUBjjEBojkVqj0prkE1skU5uk01rkUhojUhnjEdoi0toi0tmiExkhkplhEtkg0pjgEZkgUdmgkhmgkdlgUZigEJjhkRlikVojUgyNSo1OC07PDRBPjdHQDpLQjtSRTxWSjxYTDxZTT1ZUUReV09jXmJpZ3JvboByb4xybZVqZ5RgXo9XV4tUVY5XWJhcX6JhY61sbrtyc8N7fM6Cg9WIhtmKiNuMiNyNitePjtKPjc6PjM+Oi9CPidGOiNCOhs+Nhc6PhcqOhcaPhcGQh7yPh7aJgqyAeJ1/b4yAX3B8WWBsWFlkW1ReX1FfXElqV0Z9U0WeVUy+XFnQWVvZWFzkY2fna2vhcGzleHPsfXbtenP+g37/hoH/gXv1a2HJPDLEOCnCOyi/Oie/Oya+OiXBOibFOifIOSnOOCrYOi7UNirONSfOOCnRPi7RPi7LOCjHLyHSNinTNSnSNCjSNinROSvNPCvIPSrEOynEOi3EOi/GOTDGOS/HOjHIOzHJPDPLPTPTRDzTRTvQQTnLPTPLPDTPQTfPQDjOOzHONSfZNSniNS7rMzHyLzX3Kzb5KTf8KTr5Jjn3Jjv3Jjv4Jzz7Jjz9JTr/JDr/Izr/Ijf+Izf6JTf5LDv3NT7yOT/oODrgODfcOTTcOjXeOzTgOzXlOTXnODXpNzPrNTTuNDfuNDfuNjbqNjXmNzLhNi/cNSzXNSrYOCrYOCjYOCjZOCbaNybcNyTdNiTdNiTbNSXcNijdNyfcOSjcOSjbOijZOSnXOivXOjHQMy7rSEv/b3n/Vmr4RF/4PF//QWf/M1z/OGL4PmPoTWzFT2WAMD1KHSBDMS0xMScuNic0PSw9Qi5CQCtCPCRFPiRIRSRVXDBwfk2Pn3KXqHyDmG1qhFdfe0pdfkVfg0NhhkBiikFmj0NrkEpskUxtkk9tkk9vlE5skklpjklojUhpjExpjExoik5niU1mhUxkg0pkgUdlgkhng0hohElmgkdkgkRnikhpjklskUwtMyczNis4OTE8OzZCPTlHQDpNRD1RRz1TST1TSz5VTkRaVVFhXmVpZ3Vta4Fsa4pqaJBiYI9YVohQUIZRUY1YWZpgY6pmarRvcsF1eMl8f9CChdaGh9mHiNiKidmLitaLjM+LisyKic2Jh9CJhdGIhNGKg9GJgtCMhM+LhMiNhcGNhrqNhrCHgaV+d5Z/bYWEWWqAU1puVlRjXFJaYU9aX0hlWkR4VUKSTES4VFLQU1fbUlnlXmToZWrja2zmdXHkdW7ib2j3fnb/gnv/h370bGDJPzLBOCjAOyi/PSe/PSfAPCfCOyfFOifHOCjNNynYOi/ZOC7SOCzPOSvMOivJOirIOSnJNyjPOSvRNyvSOCzRNyvPNyrMOCrLPCzLPi3KPDDJPTDKPDLJOy/IOjDGOCzFNy3FNSrQQDfQQDXNPTTJOS7LODDOOzHNOjLMNSzQLyXZMCnkMjDsMjX0Lzj5LTn7Kzv8LDz8LT/7Lj/8L0D8L0D+L0H/Lz//LT//LkD/KTn8KTj3Kzf1MDrxNj3tOD3jNzfcNDPcOTTcOjXeOzbiOjflOTXnODXqNjXsNDTxNDjxNDjvNTbtNzbmNzLhNi/aNizXNSrYOCrWOSjWOSjYOSbYOSbZOCbaNybZOCbVOCXVOibWOyfVPSjUPSjUPSrUPSzUPC7RNy/aOzj/XmX/YXH/UGn3PFv/QWn/NF//NGD7MVn0S2zbWXGVPk5aJS1DKSw6Mi8tMCkwOCs3QC86Qis8PCJBPB5VSChgWzV7hVOQo2yqvouovo2OpXdvi1thf0tef0ZghERjiEJljURqk0dvlE5wlVBvk1Nvk1NvlE5skklpjklnjEdpjExpjExpi09oik5mhUplhElkg0hlhElnhUlohkhnhUdlhURpjklpkUtslE4rMSUuNCo0NzA4OTM+OjdCPTpIQTtLRDxOSDxORz1PSkRXU1JfXmZmZXVnZ39nZoZiYYlbWYpRUYVOT4dSU5NbXqNlabNsb751d8p6fNF/gdaDhdiGh9mGh9eIh9WJidOHiMuGh8iGhcuFg86FgNCFgNKHf9KHgNCNhdKMhcuNhcGMhbiLhauEf517do18anqEVmOBUFZuVVFkXlBbZU1YYkliXkVzWEOPT0W0V1LQVVraU1rnXGPoYWflZ2rocG/seXLmcWj3fHTzc2r+eG3mXFHEOyu+NSPCOyfBPSjBPSjDPCjEOyjIOynLOSrPNyrWNSvYNy3UOi7OOizHOinEOCfGOinKPSzPPS7WQDLZQTTWPjHOOCrINCbKOCnLPCzJOizIOizJOy/JOy3KOi/IOSvINSvHNSjKNizPOy/SPjTTPzPWPzbVPjPONy7JLCPSKyXcLSrnMDLwMzn2MTv6MDz9MD/9MD/5MED3MUD3MUD2MD33Lzz3LTn6LDn6Kjf9Lzz5Lzv1MDrwMzrtNjvmNjnfNTXZNDLcOTTdOjXfOjbiOjflOTXnODXqNjXsNDTyNTnyNTnwNjftNzbmNzTfNi/aNi3WNirVNyvUOCnUOCnUOSfVOCfVOCXXNyfUOSXQOSTOPCXPPSbPPyfOQCjOQCrQPy7SOzDRNjHrSEn/ZnL/T2T/SGb7N1v/QW39L13/N2HyNFjjUGq8VWZtMTlFKCpFNjk3MzI1NDA2OTA2PS0zOyMzOBhDQx1qYTqFgVSfrnepwYe1zpevx5OSrn12lGJlhlFggkZghUJjiEJnj0ZtlkpymE9yl1JxlVVwlFRvlE5skUtojUhmi0Zoi0tpjExpi05pi09nhktmhUplhElmhUloiElpiUhph0dmhkNqj0prk01ullAoMCMrMScvNC0zNTA3NjQ8ODVAPThDPjhJRTxIRTxLSENSUFFbW2VhYnRiYnxgYIJfXohaWIpUVIpUVJBcXaBnabNwc8R2eM17f9h+gtuDhN6Eht2EhdiDhNaFhNSGhdGDhsuChciDg8uCgc2DgNGFgNSIgNWIgNONhdKLhMiLg76Lg7KJgqSBfJN3cIB2ZW9+VVt8UFFuVU5mX09dZU1aZElhYUdxXUWJVEatXVTIWlvUVlriW2HmXWTpYWXubGz1enPtcmr3eG/eWVDlW1DSRDjDNSfHOinFOifEPCbFPSfIPSjKOyrNOirQOCrUNirTMCfUMynSOCzNOyzHOyrCOyjAOyjDPCnIOyrVQzThSz3eSDrTPS/KNCbJNSfNOyzIOSnIOSnIOSvIOSnKOCvKOCnLNyvLNynNNivSPC7XPzTYQDPaQDbbQTXXOjHSMSncMC7lMTTuNDn1Nj75ND75MT76MED4Lz/yLjzvLzztLzntMDfvLTXvLDLyKzLxKjH1Mjr1MzvyNTvsNTnlNTfhNTXeNjXcNzXcODbdOTffOjbjOjfmODfpNzfqNjfsNDb0NTr0NTrxNzruODfmNzTgNzDaNi3UNirTNyrROCrQOCrQOSjQOSjQOSbROCjQOSbLOSLIOiLIPiTHPyXIQCjIQCrMPS3POzHXOTb8VVz/XnH/R2P/P2H/OmH/N2f+M2L7OGDtRmTFTmGJQElTMTJBNjRAOjw6NDY/NTY8NzE3OSs0PSI5Qx5TWi6CglCip3GxxYqvy46wzJKmw42Srn17mWVniFFfgUVeg0BjiUBpj0RvlUpzmVBzmFNxlVVvk1Nuk05rkEpnjEdlikVnikpoi0tpi05pi05miEtkhklkhklliEhnikpoi0lpiUhmiUVqkkxslk5vmVEmLiEoMCUtMisxMy4zMzE3NjQ6OTU8OzZHRD1ERDxHRkJPT1FaWmRfYXBeYHlcXH5gX4lcWoxZWJFcXJpnZ61xc8B6fNF/gNyBhOGCheSFhuOEheGDg9uBgtWDgtKDgs6Eh8yDhsmEhMyDgs6FgtOHgtaKgteMg9SNhdCMg8SLgreKgquFf5t/eIhzbnVxYmV2V1V0U0xqVktmX01iZk1fZUljYkZwXkZ6UT+dW023WlPFU1LXVlriV1zqWWDyY2X3cm3xbmb3cWjRRDvUQTfFMSXINCbUQzLHOSXHOibJOyfNPCnQOivTOizYOCzZNyzPLCPOMCXONinLPCzHQC3BPiq+Oye8NyTANCPRQjLjT0HkTkDYQjTLNynLNynQPi/KOyvJOirHOCjGNyfINifKNijOOCrQOCvTOy7VOy/VOS3SNirVNyzaPDHdPDLcNzHoODjxOD33OkH7OUL6NEH1LzzyLDvvLDrtLzvqMTnqMzjrNDjtNTfxNTb0MzbzNTfwMzfvNjvtOTzpNjniNDXdMzPfNzbgOzndODbeOTfhOTbjOjfmODfpNzfqNjfsNDb0NTr0NTrxNzrsODnmOTXfODLYNy/TNyvQOCvNOirNOSvMOyrNOirNOijNOirMOyjFOSLCOiLDPSTCPiXDPyjGPyvKPC7PODHfPD//XGb/UWj/SWb/OV3/PWj5Ll39PGjpO1zlXHCmTFZeLi5HODNCQz48ODk/NDhFMjZDNDE9Oik+RSZGVSpicz+Qm2GtvX+xy4yryYumw4uduoSOrHp7mWVmh1BafEBegT9hhz5ojkNvlUpymE9yl1JwlFRuklJuk05qj0lmi0ZkiURmiUloi0tpi05pi05miEtlh0pkh0dliEZnikhoi0doi0dlikRrk0xtl09wmlIoMCEnLyIoLSYpLiguMC0zMzE3ODM5OjQ9PTU/QDhERUBKTEtPUllWWGVaXHNdXn1ZWIJbWYteXZZlZaNubrZ3eMh/gdiEheKMjO6MjPCKiuyGh+SCgtyAgNaCgNODgs6Ag8iBhMeDg8uEhM6Gg9CIg9OLhNKMhM+KgMWKgLyJgK+HfZ+AeI13b3prZWdmXVhtW1FtW01pXExmXktkX0llYUhoYUdvX0ZvUDuFVUGlXU+/YVnRWVjdUVTuU1v4XGD5aGXmWVDURDzONzDRNy/XOjHWPS/UOyvPOSjNOibPOSjROinUOCnYOCrcNSzcNSzQLyXNMynMOCzKPi/FQC/BQC2+PSq8OSfCOSm+MCLpV0rfSz/DLyPRPTHOPC/HOCjKOyvJOinIOSjHOCfINybJNibLNSbMNCbQNynXOy7cPjLcPDDZNyzaOC3iPjTsQzz1QkXyOT/wMjz2ND/2MkDxLTvtLTrtMj3sNz7mNTvkNjjlNzjrOTnwOjnxNzjvNzfyOz3uPDzqOjrmODfhODXfNzTcNzXcNzXeOTfhOTjjOTnmOjrpOTvsOTztOTzvODz0NzvzNjrwODrtOTrnOzngOzXXOTDPNyzKOCvIOSnHOSvGOinHOinHOijIOyrHPCnBOSPEPSe+OiO2NB68OSXJRDPPPzbKMSz/XmX/Vmf/SWL/PFz4MVj3MFn7NmP1QmnnWW+sRlFvMzNOMyxCPzY+QzxANzhALTFMLzNLMi5BOSZESihabj1+ml+euHeoxYKsyoyfvoKYtoCUsn6CoG5mhFJYdkJZez9dgD5jh0Fpj0RulEltlUxslE5rkk9skU5pjklmikRjhkJjhkJmiUloi0tmikxkiEpni01ojE5ni0tmi0hlikVmi0Vqj0lrk0pxm1FynlN0oFUqMCIpLyMpLicpLigtLywxMzA1NjE3ODI7PDQ+PzdBRD1ISkdPUFRTVWFYWWtaXHVcWn9eXYlkYpRraqR1dLp/fs6Hh9+LjOmNje+MjPCJieuFhOKAgNiAftKAf8+CgsyFhsmGh8iHiMuJiM6LiM+Mhs6NhsyOhciKgLyJf7GGfKGCeJF7c4B0a25sYmBlXVJlYE1lXktmXktoXUtpXElqXkhrX0duXkV3X0d/W0OSWUatWkzHVlDeUlP1UVj/WF/wVVPjTEXZPjnVNjDZNi/cOTDbOSzWOSjTOCbROCbROCjUOCnXNyncNirfNCzdNSzOMCfJNSnIOSvGPS3EQS/BQC2/PCq+OSjEOCnLPC7kUkXcSDzINCjMOi3IOizCNCbKPSzLPCvKOyrKOyrLOinMOSnOOCnPNijTNyrWOCzZNyzXMynVMSfYMSjeNy7nPDX4REfxOD7tLznvLzrwMD3uLjvrMTzrNj/kNTrcMzbYMjLfOjjuRUL4SUb4REPzPz7pOjfnOTjlOTfiOTbhODXgODXhOTjhOTjgODfiODjlOTnnOTrpOTvsOTztOTzuNzvzNjryNTnuNjjqODjkOzjcOjXTOS/LNyvGOCrDOirCOirAOyrAOyrBPCnBPCvBPCm9OSTBPym7OiWzNR+5OifBOy/KOjLYPD3/Xmf/UGT/QVv5OFf2Nlv1O2D0PmTjSWWrP0yDPz5fOjJHOy86PjA4PjJGPDpSPj1OMC5TOC9WSzVjaUV4j1uNsHCdwn2hxoGauX2auYCatoONqXhyjl5ZdUVUcD1ce0Jff0BihkBpjUNtk0hslEtrk0xpkE1pkE1njEdliUNjhkJjhkRnikppjExojE5ni01pjU9pjU1pjktnjEdnjEZmjkVskkltlUxwnFFvnVJ0oFUtMSItMSMsLyYsLikvLy0xMS8zNC80NS05OzA8PjFAQjdFSEFLTUxRUldVVWFWV2lcWXReXX9mZIxwbqB6eLeFg86Ni9+QkOqQju+OjO2KieeHhN+Bf9N/fMt/fciAf8OGhceIiMaKisqMismMismMiMWMhL+LgreJgK2GfKGAdo97cIB1anBuZGJpX1ZjXU1fYUxfYUtjXkpnXEpsW0luXEhvXUdxXUV3YUl4WD+HUz2jVkTHWE/jVVP4T1T+TVPiPjzePDfdODTeNzHhNi/hNi7dNyvaNyjUNybTOCTTOCbVOCfYNindNSrgMyzdNSzLMyjENijCOSnBPCvCPy3CPy3BPCvAOCjDNSfcSj3aRjrVQTXOPC/ENijEOyu+NibGOinHOinHOinJOirKOCnLNynMNijNMyfVOS3VNyzWMyrXMyraMyvfNi/lOjPpPDjwPD3tNDnrMDfsMTjuMzztNDzrN0DqPUPdNzvhQUHsTkv4WVX9WlX6UUzvQj7lODTiNjLgNzLgNzLgNzLhODXiOTbkOzjkOzjhNzfkODjmODroODvrODzrODzrODzsODvvNTjuNDfsNTfnNzfiOjfZOjTPOC/HNyzCOCu/Oiu9Oyu7PCu7PCu7PCm7PCu7PCm4OSa9QCqzOSSxNiS2Oyu1MCfDNDDsUFT/W2n/SmD1OlXwN1bxQF3vSGbnSGTNTmGCODllPzZSQDJEQTA5PSw1Nyk+NitLOS9FLSNSPSxnXUKBiF+Sq3SXu3uWwXqWv3uUs3icuIWatIWAmm1cdUtIYjVOaDhbeEJffT9jg0BojERskkdqkklokkpnkExmj0tkiURkh0NjhkRliEZoi0trjk5rj09qjk5pkE9pkE9pkE1okEpnj0hokkhslEtvmU1zoVZzo1d2pFkyNCYwNCYwMSkwMSsxMi0yMy4zNC40Nis5Oy07Pi0/QTNERjlJSkRNT05SUVdTU11YVmRcWm9kYX5ubJR6d6yEgsOMidaRj+OUkeqTkOuOi+KJhdmCf8x/fMN/fL+Afr2EgsGGhcGJiMKNisOLiL+JhbiHf66FfaSFe52Ado55bn5yZ21tYWFrXlZpW1BjXEpdYEtdYUpjXkpoW0ptWktxWkp0Wkl2W0ZzV0F4UjuKUT2qWUbNW1DjVFDwRknxPkHbMi/cNS/hNTHjNjDjNS7hNSvgNinbOCnWNyTTOCTROCbUOSfYNincNirgMyzaNi3INim9OCe8Nya9Oii/PivCPy3DOyvEOCnGNCfpVUnTPDHMOCzRQjS+NSXAPSvAPSvAOCjEOCfFOSjHOinIOSnLNynMNijNMyfSNirUMynVMinbNCzjOjPpPjfsPznsPTroNDXsNTnvNjvuNTvqMjrmMznkNz3iPEDzVVb8YmL/bWr/aWTzVlHkQTzfNjPdNC/fNjHeNzHeNzHfODLhODXiOTblOTfmOjjlNzjmODnoODvpOTzrODzrODzrODzsNzzuNTruNjjqNjflOTffPDfWPDTMOS/FOSy+OSq6Oyq2Oym1PCm1PCu0PSmzOyqzPCizOie3QCytOCatOCezOy2rKyLDNTT9YGf/VGT6R1zwPFXrPVjnR1/hT2TST1+0U1p2R0FYSDlLRDJGRTFCRTA9Pyo6OCM7Mx4/Mx1QRypua0iKk2aVrHSRtHSOt3ORunieu4WhuIqQp31sgltLXzpBVzBMYzdXcj9fe0Bkg0BpikNrkUZpkUhnkUdkj0hljkpih0JjhkJkh0VnikhqjU1sj09tkVFuklJqkVBqkU5qkkxokkpnkUdpk0dtl0twnE92pVd2plp4qFw3OCg2OCo2Niw1Ni41NjA1NjA2Ny82OCs7Pi09QC1AQy5ERzRJSz5NTkZRUE5SUlJWVVNZWF1hX2xraYF1c5uAfbKIhseMitOVkuGUkeKQjdyLh9OEgcSBfbp/fLV/fLOBfreEgbqHhLmJhbeKhLKGf6iBepuAeJB/c4d6bnpyZmptX15qW1RpW1BqWktmWkpiX0xiX0xlXkxpXEtuW0xyW0t3XEt7Wkd+VUGGUj2bUkG2VkbOUkjaR0DiODjlMzPdMS3fMy/iNS/jNS7hMyzfMyndNSjcOSjTOCTQOSTPOibROifUOCnZNyrdNSzYNy3EOyu5Oim1NiW3OCe9OyvCPS7HOy7HNyzQOTD1XFTWPTXJNSvPQTW4MyS3Oii8Pyu/OinDOirGOivIOizKOy3MOi3POC3RNy3QMyrSMSnWMSveNzHlPDfqPjroOzfmNzTpNzXvOzzwPD/qNjnkMTXkNTroQkbtTU//eHf/cW7xYFvdSkPRODPRMi7cNzPnQDrgOTPgOTHgNzLgNzLiNjLjNzPlNzblNzbmNjjnNznqNzvrODzrOD7rOD7oNz3qNzvuNzvuNznqNzrkOjrfPTrWPTfLOzLDOy+6OCq1OiqzOyqvPCmvPCqsPCisOymsOymqOyisPSqmOCenOSqqOC2sLynLQEP/aHL0TV7zSFvtRFnlSFvZT17JVF23VFecWFVkTT9PTDlMRzRKRTFGRC0/Qic9RCM+SCNLVi5cZzx4gVSLmWaRpG2NqW6PsnKXuX2ftoiSp4B1hmRSY0M/UDBCUzFPYTlWbD1ie0JlgkJpikNqkEVpkkZlkUZikEhjjkdih0JmhkNnikhpjEprjk5tkFBuklJvk1NqkU5rkk9qk01pk0tpk0lqlklumktynk92pVd2p1h3qFk/PS49Pi49PTE9PTM9PTU7PDQ7PTI7PS8/Qi9ARC1DRy5GSjNLTDpOT0FRUUlSUkhZV0paWk5fXlxnZXJxbol7eaGDgLeHhcSPjNGPjNONis+KhceDf7p+ea96d6Z5dqV7dqx8ea6AfK6DfamDfaN/eJd8dIt6coF2a3NyZmZtX1xqXFNrW05sWkxsW0trW0tpXU1nXk1pXU1qXU1uXU1zXk16XU2BWkmTYE+bVkenTkC4Sj3FQDfPNi7YMSveMSvhNTHhNi/iNS7iNC3gMineNCfcNibaOyjROSTNOyTMOybOOyfROinVOSrZNyzTOS3BPiy0OyiwNSOyNSO7OSnEPC7JOy/LNy3ZPzf4W1TjSUHOOjDMQDO4NiasMyC1PCm8OSe/NyfANyfDNyjFNynJNyrONyzRNy3ZPDPbOjLeOTPlPDfqPjrqPTnnODXjNDHoOTbrPDnsOjroODrsPkD4UFD/YmP/cHD5aGXiVFDKPTbAMSvJNDDWOzffPTrgOzfiOzXhOjLiOTThODPjNzPkNzPlNTXmNjbpNjnpNjnqNzvrODzrOD7qNz3oNz3pNjrvODzsODnoODrjOzrdPjrTPjfJPDLAPC+2OCmyOimuOymqOyipPCioOyelOialOiilPCmgOSigOymgOSqiNiq1PjjbVFj7ZXDuS1zvSV3pSlzbTVvJUVq0VlagWlKKYFJQSTdITTlOSTVIQCs7NRs2Nxc+TyVMZjZsilR3lFyEm2WJmmSNm2aQo2uUrXSYsHyDlW1ufVxRYEM8SjA5RixBUDFPXztXaj1jekRlgkJqi0RrkUZpkkZlkUZhj0ZjjkdjiENpiUZqjUtsj01sj09sj09tkVFuklJtlFFtlU9tllBslkxrl0ptmUpyn05zolF7rF17rF16q1xEQTBEQjNEQjZDQzlDQztDQztCQjZCQzNERjBFSC1HSi1KTTJPTjlSUT9UUkVVU0RcWkNcXERcXU9hYWFpaHhycZB7eqaBfrWGgr+Ig8OIhMGEgbp/e655c6F0b5dvbZVwbJ5ybqF2cJ53cpp3cpJ0b4Vza3pyaW5tYmBsX1dqXFFrW0xtXExvXE1vXEtxW01xW05vXE5tXU5sX09tYE9zYE96X06GWk2fX1OkUEWuQji6OzLGNi3OMSjWMindNSziNzDhNi/hNC3gMyzgNCrdNSjYNyXUOSXPOiLKPSLJPSTKPifNPCnSOyrVOSzPOy2/QC2xPCisNSGuMyG6OCjEPC7KOi/ONS3YOTPwTknxVE3ZQjnMQjW+Py6mMR2zPCi+PCzBOSvBNyrCNinFNyvJOS7POzHUOzPhRD3jQTzkPzvnPjvpPTvpOzroODjnODXnODXmOTXmNzTpOzr0Skr/XFv/ZGP4Y1/MPTnBODK9NC7DODHVQT3eRUDfPTvZNDLiOzXiOzPiOTTiOTTkODTlODTnNzfpNzfqNjnrNzrrNjvrODzrOD7oNz3oNz3pNjrrNzrpNjnmODngOznbPjnRPjbGPDG+PC6zOCmuOymqOyimOyekOyijOiejOiegOSahPiuWNyWcPSuaOSmaMifDUEvta23uXGbsUF7pSlzfSFfNS1O5UlOkW1KSY1GAalVKTThETDdKQi9IOSRCNxtGSCNVcD1nk1Z+s2+Cs3GDpWh9klmDjVmOlmOJl2R8jF9YZkNHVDg5RS02Qio6RCw9SjBKWDdXaD5lfEZogkNsi0VskEZpk0djkUZhkUdhj0dmi0ZsjEltkE5ukU9sj09rjk5rj09tkVFwl1RxmVNwmVNwmlBvm05xnU50o1J3plV8rV56rV55rF1JQzNKRDZJRTlJRTpJRztJRztIRjlIRzVJSDNKSjJMTDJOTjRSUDtUUT5YUkRZVEFdWT5bWj5cWUheW1RkYWhua354c5N9eKCBe6eDfauFf62DfKZ9d511bo9vaYVrZ4JpZYhqZottaIhtaYJtaHxsZnJrYmdqYF5nXVRoXE5oW0trXEluXUtxX0txX0twXUxwXU5wXU9wXU5zXU93XU5+XU6HXEySWEyhVUikRjyrOS+6Ny3KNy/TNi3aNi3eNi3fNi/fNC3fNCzfNCzfNyzdNynYNifRNiTPOiTMPCTKPCbLPSfOOynROyrTOizOPC2+QS+vPCeoMyGsMyC2OSfBPS7JOy/MOC7MMirgQTv4W1TgSUDQRDfKRjerMh+5PizKRjfMQjXKQDPLPzLNPzPUQTfcRTzjRj/iQDviPTnjOjfiNjTjNTTkNjXlOTflPDnkPzngPTbcOjXfQDrqTUjqUUzTQDm4KSO4LSa+NS3JPjfRQDvWPjnaOzjjOzvnPT3iOTbiOTbiOTbkODblOTXnOjbpOTnqOjrqODjqODjrODvrODvpOTzoODvnNzrnNzrpNjrmNjjiODjeOjjWPTjMPTXCPDG5Oy2uOSiqOyqmOymiOyigOyeeOyafOiibOieYPy2MNSKZPS6YOCqXLybNXFj3eXzfWF/mWGTaUVvKS1K5TE+pVlCeYFWQZ1WAblZQVzg/Sio8OxxDPRtVUStsdkSDomaUwX6HvHaGuHN8nmFugk11flGCh151fVZbYkA7RCk0PCU1PSg9RDI8RTI5QytDUDJVZT5ne0hpg0Zsi0dtkUdqk0dmkkdikEdjjkdojUpsj01vklBuk1Bsj01pjktqj0pqkkxzm1RznVVznVNynlFynk9zolJ3plV6q1p2plp1pVtzo1lSSztSSztSSj1SSj1SSj1SSj1SSj1SSztVTjxWTz1XUD5YUT9ZUkBbVERcVUVcVUViW0hhWkhhWUxiWVJlXVtrYWlxZnR1ant6boR8cIh/c4t/c4l8cIR1anttYnJlXWpjYGtgX2dfXGNfWl5eWlleWVVhWlJiWk9lW09nW0tpXEtrXElrXEdtXUZtXUZqXkhpY01xZlRxWkp1T0KLV0qcXFCjWUysWkylTj2mRTSnPCyxNyjCOC3RODDcNDHdMS3fNi/eNy7eNy7eNy7eNy7bNyvYNinXNynVOCnUOCnSOSnSOSnSOSvSOSvUOCvNOyy9Oyu2Pi2uOSipMSCrMiG3OSrAPC/DOS7INSvONS3UOjDbQzjdSz7USDnCPSy3MiPdUEbYSkDURjzURDvaRz/eR0DgQz7gPDrgNzTmODfsOjrsOjrnNzfiNjTgOTPcPTfZRj7PQjnEOi+8NCi3MSa5NSm/Oy/DPzPDOjDJPDPSPzfaPzriPTvnOznsODntOTrnNzrlODrlODrlOTnlOTflOTflOTXlOTXgNDDhNTHkNjXlNzbmODnnOTrnOTrnOTvrOz7mOTvfOTncPTrWQT3NQjvBQTa3PzGpOimjPCugPSqbPCiZOiaWOiWXOCaROCaQQTCLPC2HLyORLya8TErkbW/nbG/NVlq9TE61Tk+qUU2iVU+bWE+XXVKVYVSKalNXWi86TRY3Rg9UYSl+jlCbsG+fvHmcvXiStXN+nWFogExcbUNZZEJUXUJIUDk/RDA6PSxAQzI8QDE6PjA8QzM6QzBBTjJSZD5dc0Jng0hwj0tvk0tskkdqkklpk0tnkEpskFBtkVNvk1Nsk1Btkk1rk0ptlkptmElxnExxnk1yn05yoVB0o1J2p1V5qll6ql55pmNtmVpijk9XTj9XTj9XTj9XTj9XTj9XTj9XTj9XTj9YT0BZUEFZUEFbUkNcU0RdVEVeVUZfVkdkW0pjWkljWU1jWU9mW1VqX11uYmRwZGhyZWx0Z3B2aXJ2aXJzZm1tYGdnW19iWFleW1ZaWlJZVk9XVEtYVElYVEhcVkheV0djWktjWklmW0lnXEhpXUdqXkZrX0doYEljYk1uZ1R2XE2BU0aaVk2rVk+wUkq3UUWvSDmsQzCsPSyxOSm+OCzLODDVNjLZNDDdNi7cOC7cOC7cOC7bNy3aOC3ZNyzXNyvXNyvVNyvVNyvVNyvUOCvUOCvUOCvOOiy+PC62Pi6uOSimMSCnMiCyOim5Pi6+PC7GOi3HNCrLNCnSOzDcRTrhT0LfUUPdT0PbRj/YQDvTPDXSOzTWPTfaPTjcODbdMzPnNzfrNzjuNznrNzjnNzflOTfiPTnbQjrKQTe/PzS4OiyxNievNSayOCm4PS2/QDHFQTTNQDbXQDffPTjjOjfpNzfvNTbxNzrpNjrnNjznNzrmODnmODflOTXlOTXjOjXiOTLjOjPjOjXkOzbkOzjkOzjlOTnlOTnkOjvjOzvfPD3ZPz3QQTvEPza3PTKsOy2lOyugPSqcPSuXPCmWOyiSOiaTOCWMOiWAOSeAOCmJNSqdPDW/UVDXZWXRXmG3TU2sTkykVE2dWVCYXFGXXlOXXlOYX1aMZlFgXy9TZypecjN6kE+Zr26lvnyZsnCIoGJqgkhhdUJUZTtKWDdGUDc/SDU5PzE1OC06PC9BQjQ9PzQ6PTI9QTM6QzBATTNSZD5edEVng0hxkE1wlExukkhrlEhrk0xokUttkVFuklRtlFNtlFFrk0xrlEhsl0htmEhwnUpwnUpwoExzolF1plR4qVh4qVh4qF5tl1hii1FZgkhdVEVdVEVdVEVdVEVdVEVdVEVdVEVdVEVbUkNcU0RdVEVeVUZfVkdgV0hhWElhWEdlXUplXUhkW0pkW0xlW1FmW1VoXVloXVtpXV1qXl5rX19rX19pXlxmW1liV1NfVlFaVk1XVEtVUUhSTkNRTUJTT0NXUUNYUkJeV0deV0VhWUZjW0ZnXEhpXkhrYEpoYkxiYU1uZ1V5X1CIWE6iW1WxVlGySUW4RUC5QDe4PjG3Oy+4OCu8OCvDOSzJOy/ROi/ZOC7bNy3bNy3bOS7aOC3ZNyzZNyzXNyvXNyvVNyvVNyvUOCvUOCvUOCvSOSvNOyzAPjC2Pi6tOiijMiCjMx+qOiazPiy5Pi7EPzDEOCvFMijINCrQPDDYRjncTT/iTkTZOjbYNDPUMjDWNDLbOTfhPTzmPDzpOzztOTzuNTrrMjfpMjboNTjlOTnhPDrZQDq+OC21OiuxNieuNCWtNSWwOCi1PCu7PS7IRDXPQzbWQjjcPTfiOTToNjTtNTXvNznqNjnpNjnpNjnnNzfnNzfmOTXlOTXlOjPjOjPkOzTkOzbjPDbjOzjiOjnhOTneODjdOTrcPDzaQD7TQj3IPzm5OjGtNyulNyihOyydPCuZPCuUOymTOiiQOSaQNyWKOSZ6NiN5NiWIOSygRj25U0/AV1S4UE+rSUaiTUicU0yZWVCXXlOXYVeXYVeYX1aLZVBzckZ6jVaTpm6kuYCrwIees3t8kFtbbzw/UiRBUytBUC8/TDI6QzA2PC42OTA1OC85Oy5AQTM9PzQ5PDE9QTM5Qi9ATTNRYz1gdkdphUpzkk9ylk5wlEptlkptlU5rlE5wlFRxlVVvllNullBslEtslUlsl0humUlwnUxwnUxwn051pFN4qVh5qlt1pldxoFhfiUpWf0VPeD5hWElhWElhWElhWElhWElhWElhWElhWElfVkdgV0hgV0hhWEliWUpjWktkW0xkW0plXUhmXkdmXklnX0xnXk9mXFBmXFJmXFNoXVdoXVdoXVdoXlVnXVRlW1FkWlBjW05dWU1aVkpWUkZSTkJQTEBQTT5UTkBVTz9XUUFZVEFbVkNdWERhWkdkXUpmX0xmYU1kY1FsZVV2XE+KW1GpYly4Wli2RkS5PDrDPDjGOzbEOjDCOC29OCm8Oiq+Py7HPy/TOS3ZNyzaOC3ZOS3aOC3YOCzYOCzVNyvVNyvUOCvUOCvUOCvUOCvUOCvSOSvNOyzBPzG2Pi6sOSeiMyCdMx2iOCKsPSm1QC68Py2/OivDNyrFNSrLNyvOOi7OPC/TOjLeNjXgMjTbMTLdMzTgODjlOzzqPT/sPD7uNzzsMzjpMDbmMjXlNTjhNzfaNjXONjG3NSivNyeuNiasNyasNyauOSiyOim1OirDQTHKQjTUQTfcPzjiOzXmOTXrNzbuODftNjjrNzjrNzjqODbqODboOTTnOjTmOzTiOTLhOjLfOjTgOzfeOjjcOjjbOTfZOTnWPDrVQDzSQz3KQTu7OzKvNiukNieeNyicOyqYOymUOymSOyiPOiaNOCSMNyOHOSWAPSp2NSOBNSeZRTqqUEisTUepTEemUUydUEqYVUyUWk+UXlKVYVaVYVaXYVeNZ1SJhV+ZqXitvY6muIiQoXRzhllOYDgvQRstPhwzQiU6Ri49RjM7QTM6PTI6PTQ8PTU5OS0/QDI8PjM5PDE8QDI5Qi8/TDJQYjxhd0hqhkt0k1Bzl09ylkxvmExvl1Btl09wl1RzmFVwmFJvl1BtlkptlkhumUpwm0txnk1yn050o1N5qFh7rF13p1ttnVNlkk1bhUZTfEJOdz1jWktjWktjWktjWktjWktjWktjWktjWktjWktjWktkW0xkW0xlXE1mXU5mXU5mXUxmXkdnX0hoYElpYUxpYU5pYE9oX1BnXk9qYFRpYFFpYFFoX05oX05oYE1oYE1oYU5kXk5gWkxbVUdWUEJQTT5OSzpOSzpOSzpQTTxSTz5UUUBWU0BYV0NbWkZdXEheXUtiYFFmXlFtV0qGW1KsaWO+Y2DBTU3IQkPQOz3UODnTODTMNzDBOSu6PSm1Qyu8QivOOyvXNynYOCrXOivZOSvWOSrWOSrUOCnUOCnUOCnUOCnSOSnSOSnSOSnSOSnNOyzBPzG2PjCrOiihNiKaNB6bNyCjPSavQi2zOyq6OyzCOizHOS3LOC7OOjDQPDDZOjTpOTzsNDzmMznjMjjiMzjhNDjiMzjiMjXpNjzpNDnnNDrnNzrjOTzbNzbQMjHAMCi0NiitOiitOiirOiirOiirOiisOSavNya4OivBOy/OPjPYPzfgPTjkOzjoOTbsODfuNjbuNjbuNjbtNzTqODToOjPnOjPkPDPhOjLfOzLfPDXcPTfbPTrZPjzXPTvUPj3PQDzLQjzFQjq5PTWtNy2jNSieNyiaOiqWOymTPCmROyqNOiiKOSaJOCWINySDOCWDQC11NCJ7MyWTRzqkUUmhTkaeTkehV06YVUySWEyQWk6NXE6PXVKUYFWXYVePaFeNiWaYpXqdqYGAjmpda0hEUzQyQCYkMhktOiYwOyo1PS45PzM8PzQ9PzQ6OzM6OjA5OS0+PzE7PTI4OzA7PzE4QS4+SzFQYjxieElrh0x1lFF0mFBzl01xmk5xmVJvmVFymlNymlNymlFwmU1tl0ttmElwm0xznk90oFF2olN4p1l7qV56qF9xn1ZkkkpZhkNdhkpXfkdSeUJlXE1lXE1lXE1lXE1lXE1lXE1lXE1lXE1lXE1mXU5mXU5mXU5nXk9nXk9oX1BoX05nX0poYElpYUxqYk1qYk9qYk9qYVBqYVBqYVBpYU5oYE1oYEtoYEtoYElpYUpqYktmX01iXUpeWEhYUkJTTT1NSjlLSDdJSDZLSjhMSzlMTTtOTz1QUT9RVEFTVkVTVkVbWUxeVkljUUV6WE6haGG2ZWHEVlXWUVLZQEPfOj7cODfUNzDHOy68PyuxQyq1QSjKOyrUNyjVOCnVOSrWOSrVOSrVOSrUOCnUOCnSOSnSOSnSOSnSOSnSOSnSOSnNOyzBPzG1PS+rPCmiOSSZNh+VNR2bOyKnQSqyQi65QC+/OyzDNyrFMijLNCvSOzDfPTjqNTruMzzrNj3pOD7nOj7kOz7jOj3iOTzfNTjhNzriOT7hPT7bPT7ROTbDMi+2MCevOSurPiqrPiqpPiqqPSmpPCipOierOCWvNiW5NynFOzDQPTPZPDXfPDfkOzjoOzfuODfvNzXvNzXuODXrOjTpOzTnPDTkPTTiPjXgPzfeQTraQTvZQT7VQT/RQD3NQj/DPzq7QDizPTOqOC2hNSibNSeYOCiVPCqRPCiNPCmKPCiIOiaGOSeENyWDNiR/NiV9Oil0MyF+OSqXT0GjWU6cUkeVT0WYVkqVWU6QW02OWk2MW02OXFGTX1SZYFeRZ1d+eFh5g15yfFpVYEI7RSwvOyUwOyowPC4zPTI0PDE2PDI8PzZAQTk/QTY8PDA3Nys4OSs+PzE6PDE3Oi86PjA3QC09SjBPYTtieElrh0x1lFF1mVF0mE5xmk5ymlNwmlJymlFznFBym09wmUtumUpwm0xznk92oVJ5pVh7p1p6qF14pl1xn1dnlE9dikVYgkJgh05ZgElTekNnXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9oX1BoX1BoX1BoX1BpYE9qYVBqYk9qYk9qYk9pYE9pYE9pYU5pYU5pYU5oYEtoYEtoYEloYEloYUdoYUdoYUdmX0xlXktiW0lcV0RXUj9QTTpMSThJSDZJSDZHSDZHSjlHSzpITDtJTTxITz9KTj9QUUNYUkZbT0NpUkSDWU2WVkywU0zUWlnbSUriP0LhOTnaNzLPOzHCPy20QiqzPCTJOinTNyjUOCnTOirVOSrTOirTOirTOirSOSnROinROinROinROinROinROinNOyzBPTC1PS+sPSyjPCmYOCCQNBuVOSChQSmtQy22QS+/PS/ANivCLyXHMCfQNi7eOjjoNTnuNj7sO0HqQEPmQUXgQkPcQEHZPz/NMTLQNjbTOjzRPTvJOzm+NzG1NC6tNCmqPC2lPiulPiulQCylPiukPiimOyepOieqNyWyNye8OCvFOC7MNzDUOTTcPTnmPjvpOjfsOTXsOTXrOjTpOzToOzTlPTTiPjTgQjfdQznaQzzVQjvPQT3KPzzHPTu/PjmxPDOpOi+iOCucNiiYNyeUOCmROimNOiiLPSmJPCqHPCmDOieCOSiANyZ/NiV9NiR4MyN4NSWFQjKYVUWdV0uUUEOQUESVWkyTWU2QWk6QXFGQXFGSW1SVXFWYW1aOYlVrYkVWYD1KUzQ9Ryw2PyoyPSw0PjM1PzY2PTY4Pzg9QjtDRj1FRzxDRDZAPi87OSo3OCo9PjA6PDE3Oi86PjA2Pyw9SjBOYDphd0hrh0x1lFF1mVF0mE5ym09ymlNwmlBxm09ynU5xnE1wm0xvmktynU51oVR5pVh/q2B+qWF6pV1xnFVmkUxfiUddh0VeiEliiVBZgElTekNoX1BoX1BoX1BoX1BoX1BoX1BoX1BoX1BnXk9oX1BoX1BoX1BoX1BoX1BpYFFpYFFtZFVsY1RqYVJpYFFoX1BnXk9nXk1oYE1pYU5pYUxpYUxpYUxoYEloYEloYUdoYElnYUtmX0xlXktiW0hcV0RVUj9QTTxNTDpFRjRERzRESDdESDdCSTlCSzpCSzpDSjpJSz5TUURTUEFYTDxlSzp0RTWVSD7CWVPZUk/gREXgOjrcNzXVOzPKPi+6PSm1OCLJOinPOCfQOSjSOyrSOyrSOyrSOyrSOyrROinROinROinROinROinROinROinNOyzBOzC2Oi6tPCynPiuZOSOPMxqTNx6fPyejOSOwOynAPjDGPDHMOC7QNy/ZPDXjPz3sPULuP0TpQ0XiREPYQD/KOzfANTC7MS65Lyy8NTG+Oja7PDazOjKqOC6kOCyhOiuhPS2fPiugPyyhQC2hQC2hQSujPiqmPSqpOyqtOiiyNyi5NSm/NSvJOTDUPzngQz7kPTfoOzXoOzXnPDTlPDXkPTThPjXeQDXcRDnYRDrSQzvKQTnEPzq8Oza4ODWwOTOiNy2ZOCiVNSeTNieROimPPCqLOimFOCaIPSqFPCuDPCqAPCl+Oid8OCV7NiZ7NiZ5MSOAOCqMRziWU0OSUEKLTD2QUkWZX1ORV0ySWU6UW1KWXVSWXVaXXFaWWVSMXlFhWDtFTSg2QB44QSY+RzI8RTQzPTItNy4xODE3PjZCRTxHSj9ISTtCQzE/Pio7OiY3OCg9PjA5OzA2OS46PjA2Pyw8SS9OYDphd0hqhkt1lFF0mFB0mE5ym09ymlNwmlBxnE1xnExxnExwm0twm0xznk93o1Z7p1yCrWWAq2R4o1xqlVBdh0VZg0FeiEhlj1BjilFagUpTekNpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1NqYFdqYFdqYFdqYFdqYFZqYFZqYFRqYVJqYVJqYVBqYVBqYk9qYk9qYk9qYk1qYk1nX0pnX0pmXkllX0liXUlaWENTUD1NTDpISTdFSDdBRTZARDU/RTc/Rzg/Rzg+RjdHSz1JSz1BRTRLSjZcUTthRS+DSjnAal3cZ2DjVVPkRkXlQUDgQT3VPjXJPTDGPS3GNCXLNSbMNifNNyjNNyjOOCnROyzTPS7SPC3SPC3SPC3SPC3ROyzROyzROyzOPC27Mii2Ny6xOy+oOimaNyKUNR+VNx6cOSKuQS2zOyu6NinBNCrNNi/XPDfiQz/qSEXoREXoRUjdQ0PJOja7NjG0ODCuOC6pNCurOS+pOS6kOC6gOC2bOSyWOiuTPCuSPCuWPSuYPSqZPiuaPyybQC2dQSygQS2jQC2iOyqlOiirNyiwNim2Niu+OC3EOzPMPDTaPTbgPTbiPzjiQTfiQTneQjbaQDbXQDXYSD3SRTvHQTi7OzKyNS+qMy2mMSqfMiuZOS2SOyqROSuNOiqLOimIOymHOyuFPCuAOSd9OCh8OSh8OSh8OSh7OCd5NiZ4MyR3LSCLQTSXT0OTTUGOTECRUUWTVUqOUkeYXFKYXFKRVU2QVEyXWlWVWFOUV1STZ1pdVDVJUSpBSyhCSyw+SC83QCsyPS00PzE0PDFIUENaXlBXW0pNTzpERi5BQSc9PSU6Oyk+PzE7PTI6PTI7PzE0PSo7SC5QYjxjeUpsiE11lFFzl09ylkxwmU1ymlNxm1FwnUxxnktyn05yn05zn1B2olV7p1x/qmKCrWZ4o15qk09giUdeh0VhiUpmjlBokFRkiVNbgExUeUVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1NqX1lqX1tqX1tqX1lqX1lqYFdqYFZqYFRqYFRqYVJqYVJqYVJqYVJqYVJqYVBqYVBoYE1oYEtnX0pnX0pkXUpeWUVVUj9PTjpJSjpFSDdCRDZARDU/RTc+Rjc+Rjc9RTZARjg+RTU+RjFITDVNSTBVPyd/UTq8c2LLY1jgX1rrVVTnR0fiQD7gQT3YPznOOjDNOSvOPSzPPS7PPi3POy3OOyvNOSvNOirOOizQOivQOizQOivQOizQOivQOizNOy7JPzXFQjq8QjeuPS+fNiOWMR2WMR2bMh2oNSO0NijDOy/RQTjeRT/mSUTpSkbqS0jeQ0HbRUTQQj68PDOvOS+pPTClPzGfPTCfPzGcPjKXPjCUPi+PPS+KPi6HQC6IPyyOPSqROyqSPCuTPSyUPyuVPiuXPiyZPiyfQC6hPS2kOiyoOCysOCuxOC22OjC8OS/KPDLQPDLTPzXVQTfXQznWQznURDnRRTjKQjbDQTS5PTOwOjCpNi+kNS6fNCyZNyySOi6MPSyKOyyIOyuGOiqEOyqDPCqBPCx+Oyp8Oyl7OSl5Oil4OSh3OCd1Nid3NCSANCeQRDeYTkORSz+MSj6PUUSSVEmQUkeTU0qYWE+YVU+XVlCcXViUV1KOU0+KY1RdVzVYYzlfakJaZkJJVDY2Qyk0QCo8SDRPWEdZYlFfZlRXXEZKTjdCRSo/PyM8PCI5Oig9PjA6PDE5PDE8QDI1Pis7SC5QYjxkektsiE11lFF0mFBylkxxmk5ymlNxm1FzoE9yn0xwnUxxnk10oFF4pFd8p19/qmN7pmFvmlVjjEpdhkRhiUpljU5ljU5ji09kiVNbgExUeUVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1VqX1tqXl5qXl5qX11qX1lqYFdqYFZqYFRqYFRqYFRqYFRqYFRqYFRqYFRqYFZqYFRsYU9rYExpYU5pYU5mX0xhXEhZVkNTUj5NSzxISTlERjhBRTZBRTY/RjY+RDY8RDU9RjU3QC1ASDFJSzNGPyVXPyeHWkO3c2C2VkrZYlrwZWLsVFPmRkjrR0jmQ0TYOzbLNyvJOirJOizJOirLOSzKOCnINinINifKOCvLNynLNyvLNynLNyvMOCrMOCzLOC7CMy2+NS+2Ni2tMyihMCKeLx6gMSCnMyS8QTLHQzfWRz/hTEbnTEfpSkblRkLfREDXQ0HPREHBQDqxOzGkPC+hQTGcRTSYRTOTRDORRDSPQjKKQTCFQDCCQS9+QS5/QC6GOiqLOSuLOimKOyqLPCuNPCuOPSqPPCqWPy6WPS2bOyudOSqgOCulOS2pOy6uOS+4Oi6+OTDBOzDEPjPFPzPFQTTDQTPBQTS2OyyyOiyqOC2jNyueNiubNiyYNy6UOi+NOy+IPCyHOy2EOyyCOiuAOyuAOyt/PCx9Oyt6Oyp6Oyx3OSp2OCl1Nyh0Nil2NCaIOzGURjyWTkKOSj2ISDyNT0KRU0iSUkmST0mZVE+ZU1GaVlOaXVqTWVWNW1SNbFuBfVh+iV6Ai2FseFJMWDQ2RCM9Si5MWkBlcVllb1ddZU1QVT5FSTA/Qyg9QCM6PCQ4OSc7PC44Oi85PDE9QTM2Pyw8SS9QYjxkekttiU52lVJ0mFBzl01xmk5ymlNwmlB1olFwoExunUxwn091pFZ5p1x9qGB8p2BwmVVmj01chEVchEVljE1pkFFmjU5fhUhjiFJaf0xTeEVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYFZrYFxrX19rYF5rYFxrYFprYVhrYVdrYVVrYVVrYVVrYVVrYVVrYVdrYVdrYVhrYVduYlJtYlBqYk9qYk9oYU5lXktfWkdZVkVSTz5NSzxHSDpERjhDRTdCRDZARDU8QzM8SDQ5Qi1GSjNMRjBPOiVxTDmaY0+qXk6hQTXGU0znY1/wXl7tU1XrSk/pREjhQUHMOTHHOS3FNyvFNyvIOC3KOi/LOzDNOjDRPjTRPjTSPjTSPjTTPzXTPzXTPzXTPjfTPzvRQj7LRD7GRj3CRjzDST7HTUDOUETZU0jdUEfiTUfkSUXkR0LiQz/gQT3bQj3VRkLJRD+6PzerPTCfPi6aQzCVRzOUSTaNRjSMRTOIQzOFQjGAQTB9QC56QS58Py2COiyGOCyFOSuGOiyGOiyHOy2HOyuIOyuJOiuLOimOOCmQOCqVOSyZOy+dPS+iPDCqOi+tOC6vOS+wOi6wOi6wOiyvOSuuOCqoNymlNyieNimbNiqVNyuSOC2ROS+OPDCIPC6FPC2DOyyBOSp/Oip+OSp9Oip9Oyt8Oix6Oyx5Oyx3OSpzOCpxNihyNyl1NSmMRDiSSD2RSz+KSDqHSTyLT0STVEuXVEyWUUybVFCYUU+UU0+WXFiQX1iQaF6XfmqUlHCFkmZ1gldZaD9DUis/TypQYDxjclFldFVcaUtOWD1DTDE/RSs+Qik9QSg7PSc3OCg6Oy03OS45PDE9QTM3QC08SS9PYTtieElsiE12lVJ1mVF0mE5ym09ymlNvm1BxoE9vnk1vnk1zolJ6qF18qmF6pV51oFtjjEpeh0Vbg0Rfh0hnjk9qkVBmjUxgh0hih1FZfktSd0RpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYFRrYFprYFxrYFprYVhrYVdrYVVrYlNrYlNrYlNrYlNrYlNrYVVrYVdrYVdrYVhrYVdvY1VuYlJrYlFrYlFrYlFoYU9kXU1gWkpYUkJSTz5OSzxJRzhHRTZERTVCQzM+QjE9STE/Ry9MRzFTPitnPS2VWkytX1OcPjSeMyu2PznYWFXzaWf2ZGXrUlXmSk7oTlDZSUHTRjzNQDbLPjTOQDbSRDrVRz3XRz7aSkHaSkHdSkLdSkLeS0PeS0PgS0TgS0XrU1LoVFTjU1LcUk/YU0zYU0zbVUzgVU7gTEjhSUbjRULiQ0DkQkDiQ0DkRULgRkTZSkbKRUC5PjesPTKhPzKYQjGSRTOQRzSMRTOIQzOHQjODQDCBPzF+PzB6Py98Pi+AOi6DOS6DOS6DOS6DOy2DOy2DOy2DOy2BOSqCOSqFOSuHOiqJOiuNOy2PPC6TOy+bOy+eOS2fOS2gOiyhOSyiOCuiOCqiOCqfOCmcOCmYOCiUOCmPOSqMOiyJOi2HOy2EOi2COiyBOSuAOCp9OCl9Nyt8OCt7OSt6OCx5OS14Oi12OCtxNSpvNSlxNyt0OSuMSDuNSTyJST2ESTuFSz+MUkaTV02YWE+YUU2cVVGYUlCTVlGSYFmIYleDZ1uGemRuclFaaUBKWTBBUihJWjBXaT9kdk5qfFZYaUVMWzo/TC46RCk8RCw+Qy08QS06PSw4OSs6Oy02OC04OzA+QjQ3QC07SC5MXjhfdUZphUp0k1B0mFB0mE5ym09zm1RwnFFunU1tnkxwoVB3qFl8qmF6qGBynVhpk1Fag0FchEVhiElljE1njk1njktojUpmikxjhlBZe0lSdEJpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYVVsYllsYllsYllsYlZsYlZsY1JsY1JsZFFsZFFsZFFsY1JsY1RsYlZsYlhsYlhsYlhvY1VuYlJrYlFsY1JsY1JrYlFnYFBkXU1eV0dZU0NTTT9NSjtLSDlHRTZFQjM/Qi87SC4/SC1PQy1hPS2DRTqrWFK0TkqeLCuyOjm5PTvTU1LycG7+dnbxZWjrWF7wXl/jVVHaUEbUR0DQQzrRRD3URz7WR0HWRz/ZSEPaSkLcSETdSkPeSkbeS0TgS0fgS0fiSEjhR0ncSEjZR0fWSETXSETYR0LbRkLgQkHkQULmQkHoQkLnQ0LkQkDfQT7bQT/bSkfKQz+5PDauPjOiQDOYQTCQQTCPQzOKQTKIQDGHPzGFPTGCPDCAPDF/PTF/PTGBOzGBOzGDOjOBOzGBOzGAPC+APDF/PS+APC+APS2BPC2AOyyCOiyBOSqCOCuDNymMOi6POC6ROS2UOi+XOy6aPS6ePC+fPi6ZOSmWOSiTOiqQOiuKOyyHOyuEOyyCOiuCOiyBOSt/Nyl+Nih7NSl7NSl7NSl6Nil4Nip4OCx3OSxzOCpwNClvNSlyOi12PDCLTUCJSzyESjyCTT2FUUOLVkiSWE2XV06TTkmZVE+XVlKVXFWQZVx7XlBmVkZgXkdFTy0+Tik/TyhKXDJfckVrflFleEtYakBNXzdAUS02RSY3RCo9RjE9RDQ6PjA3Oy04Oiw6Oy02OC04OzA+QjQ3QC05RixJWzVbcUJlgUZykU5zl09zl01ym09zm1RwnFFtnExvoE9zpFV4qFx6qGBzoFtpk1FgikhZgUJehkdljE1njk1mjUpljUdnjEdojExhhE5YekhRc0FpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsYlhsYlZsYlZsY1JsY1JsZE9sZE9sZE1sZE1sZE1sZE9sZFFsY1JsY1RsYlZsYlZvY1VtYVNrYlNsY1RtZFVsY1RpYFFmX09iW0teV0dYUUFSTDxPSTlKRzZJQzNBQy46RytARipVQCt4RzmjUEy0SEi2ODy6MznIQUXEP0DKSknfYmDxcXDwbnDnYmXiWlzbUU7VTETPRD/NQjvPRD/QRT7QQj7NQDnSQz/SQz3UQ0DVRD/XQ0HYREDZRUPaREPdQUTdQUTeREbdR0jfSUjgSknjSUnlR0jnQUPqQUTsQkXsQkXnQUHiQD7bPTrVPTraRkbJPTy5ODOwOzKmQDSYPzGRPjCPQDGKPC+KPDCJOzGIOjCHODGGOTOFOjSEOzSBOzOAPDOBOjSAPDN/PDN9PTF9PTN8PDB8PDB8PS58PS57PC18Oix7OSl6OCp7NyqCOi6DOS6HOS2JOS6NOS6ROy6VPC6WPS2SOSmROimNOiqKOyqHOyuDPCqAOyt+OyqAOCqAOCx+Nip9NSl8NCh6NCh6NCp5NSp1Mil2Nix2OC1yNitvMylvNSpzOi94QDOKUEKGTj+BTj2CUUCFVkaJWEmOVUqRUkmST0mXVE6TVE+RXFaKZlpuW0pQSzdFSzFBTjBLWjlXZ0NgckpneU9kekxWbD5HXS9BVi03SCQxQCE2Qio9RjU8RDk4PTY3OjM5Oy47PC42OC05PDE/QzU3QC03RCpGWDJWbD1hfUJvjktxlU1zl01ym090nFVxnVJvnlBxolF1pld2plpzoVlql1JijEpbhUVehkhgiEljiktljEtmjUpmjkhmi0ZliUlgg01XeUdQckBpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsYlZsY1RsY1RsY1JsZFFsZE9sZE9sZE1sZE1sZE9sZE9sZFFsY1JsY1RsY1RsY1RuYlRtYVNtYVNtYVNtZFVsY1RqYVJnYFBkXU1gWUlaU0NVTj5QSzhNSDVJRDFEQy5ARipERChbQiyIVEevXFirPkGsLzPOSU7GP0XAOz67OzzERkfYWlvjZWbbWVvMR0jRSkfQRULNQj/QQj7URkLURkLQQj7JPjfPRD3PRD3SREDURUHWRULZRUPaREXdREbeP0PfQETeQkXfRUXhR0fgRkbgQkPhPj/oQkTpQEPoPkHnPT7kPj7jQT/hQ0DfRUPWQkLFOTi2NTCwOzSmPzaaPjOQPS+NPzKIPC+HOjCHOjCHODGHODOHODOIOTSIOzWCOTKAOjKAOjJ/OzJ+PDB+PDB8PDB8PDB4OCx5OS16Oi56Oi57PC17PC16Oyx6Oyx9Oy9/OS+ANy6BNyyENiqFNSqGNyqGNyiKOCqIOSqIOyuFPC2EPC2APSx+PCx9Oyt9OSx9Ny18Nix5NSp6NCp4NCl4NCl4NSxyMih1NSt2OC1yNituNCluNSp0OzB4QjaKVUeEUEKAT0CEU0SIV0mMVkqMUkeNTkeVVE6UVU6LUkuEWE1/ZFNlWkRHSzI9SixJWDlaa0lneFRjeFFZbkVTaD1OYzhKXzQ6TCYwPx4sOR01Pik9QzU8Qjg6PDc5PDU7PTI7PTA3OS45PDE/QzU4Py04QilFVTFVaDthekNuik1yk05ylk5ymlFznVNxnVJyoFV1o1h2pFt0olpvmlVmkE5eiEhbg0RkjE5hiUtgh0hjiklmjUpnjktlikVhhUVgg01XeUdQckBpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlFrYlFrYlFrYlFsY1JsY1JsY1JsY1JsY1RsY1RsY1RuYlRrXVBwYFF0ZFdyZFduYlZqYFRoYFNoYlRnYVNnYVFjXU1bVkNWUT1TTjhOSDJHQSlLRyxJPyRiSTORZ1e2eG27bGW4WVe5T0+2QkW9QkXCREfIRkjNSEvQSkvSTE3TS03PRUXQREXTRUTWRkXVRkLSQz3OQzzPRjzIRDjJRTnKRTzMRT/SREDXQ0PaQUTbP0PhQkbiQkThQ0TgREXgREXhRkTjRUTkRETjQ0PkQkDkQD/jPz7jPz7iQD3iQD3eQz/TQj/FPjq2OTOqNzCfOjCXPTKOPjOGPjKDPzKBPzOBPTKBOzOEOTOGOTOIODGIOTKFOzCEPC6EPC6DOy2BOy+AOi6AOi6AOi5+Oi1+Oi1+Oi1+Oi19Oy99Oy99Oy99Oy99OTB9OTB+ODB+OC6ANy6ANy6ANy5+OCyAOCx+OCx9OSx8OC17OS16OCx4OCx4OCx4OC54OC53Ny12OC12Nix0NitzNSpxNSttMSdyNixuNCltMyhvNittNClxOC1/ST2FU0iFU0qGUkeIUkiLUEiQUUqUUUuVUkyTVE2NVEuJW06CY1FvX0hZVTpNVjdPXztqfllieFFZb0hVakNSZ0BNYjtJWTVDUjE3RCY0PiMyOiM2Oyc8PjBAQjVAQDY8PjM1OC0zOS00Oi43Oi85PS87Py49Qiw8RShTXzthckZuhlJzkVVylVFymlNznVNynVV1nlp+p2V+p2VwmFliiktehkdehkhehEdghkliiEtkik1mjU5ljE1jiktgh0hehEdfgkxUdkRLbTtpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRyYlNxYVJyYlVxY1ZyZlpvZ1ptZVhqZFZnY1draFlvaVlsZ1RoY09jXkhbVT1STDRQSjBIPiVRPylrUD1/WEeETkKIRT2TRD+xV1a4VFS7UVHAUE/ATk3BTU3CTErDS0rQVFTISEfCPT7EPTrQQkDTRUHPQjvHPjTKRDnJRTnLRj3NRz7URkLYRETcQUXdQUXhQkbhQ0ThQ0TiREXiREPhRkThRkThRkTgRUHfREDgQj/fQT7gQT3gQT3gQT3eQz/URT/IQzy6PjasOjCgOTCUOi+KPDCCPDCAQTJ+QDN+PjR/PDODOjOGOTGIODGJOTCHOy6FPC2EOyyEOyyDOy2COiyCOiyCOix/OS1/OS1/OS1/OS1+Oi9+Oi9+Oi9+Oi99OTB9OTB9OTB9OTB9OTB9OTB8OTB8OTB8OTB6OjB6OjB5OS95OS95OS93OS53OS53OC93OC90OC5zNy1yNixyNixwNitwNitrMSZxNyxtNClsMyhvNitsMyhwNyx+SD6EUkmFU0yIUUqLUEqQUUyUUE2VUU6UU0+KT0eFU0iAW0t7ZVBzaVBoa0xmcVFneFRedE1YbkdQZj9MYTpLXzpLXDpHVjdDUDQ8Ri04QCk2Oyc3Oik8PS8/QDI+PjI7PTA0OjAzOzA1OzE2PDA6PC88Py4+QSw+RCpRWzlebURrgVJwjFJwk1NxmVJznVNznlZ4n158omV4nmFrkVRghkldg0Zdg0ZcgkVghklhh0pjiUxli05kik1iiEtghklehEldf0xSdEJJazlpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRxZFRvX1BtXVBtX1JxZVlvZ1xsZFloYlZmYldwbGB7eGl+e2p/eWl6dWJwaVZlYEpUVDxGRi5DPihNQi5TQC9VOChdNypsPTNuNzB1OTF+OzWHQDqSSUKbUEqlWFCtWlK7Xlm6U063R0W8Qj/IRELRRkPTREDPQDrQQTvQQzzSRT7UR0DWR0PaRkbbRUbeREbfQ0TfQ0TfQ0TfQ0TgREXfRUXfRUPfRUPeRELeRELcRD/bQz7cQz3cQz3cQz3bQz7WRUDORT/DQjyzPjWiOjGUOC2IOSyDOy2CQDJ/QDF+PjJ/PTGDOjGGOTGHODGIOjCHOy6EOyyEOyyEOyyCOiyCOiyAOi6AOi5/OS1/OS1+Oi9+Oi9+Oi9+Oi9+Oi9+Oi99OTB9OTB9OTB9OTB8OTB7OC97OC97OC97OzF7OzF6OjB5OzB4Oi94Oi94Oi94Oi90OC50OC5zNy1zNy1yNixxNStvNSpvNSpqMSZvNittNClrMidsNippMydtNyt9Rz2HUEmHUEmLUEqOUUyRUk2SU06UVVCRVlCMV0+HW1B+Xk90Yk5vaVFvclVsd1lmd1VRZUJLXzpFWTZEVTNFVjZHVjlHVDhFUjg/STA8RC05Pio3Oyo6PC48PjA7PS85Oy42PDI1PTI2PDI2PDA6PC88PjA9QC09QylNVzVaaUBmfE1siE5ukVFxmVJ1n1V0n1d6oWB3nWBulFdjiUxcgkVcgkVcgkVagENfhUhhh0piiEtkik1jiUxhh0pfhUhdg0hbfUpQckBHaTdpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRyZFdvYVRtX1JrX1NrYVdsY1psZVtqZl1qZl14dGmIhHiRjYGVj4GSjH6JgnJ9emdgY05PVD5ERzJGRTFIQzBGPSxMPCxWQzRQOStSNipWNCpZNSlcNithOS9lPTFtPTGKS0KdU0quVU+2Tku8RkTGQULSREPYRkbUQD7VQT/WQj7WRUDZRUPaRkTbRUTdRUTeRETfQ0TfQ0TeRETeRETdRUTdRULeRkPbRkLaRUHZRD7YRT7XRDzXRDzZRD3YRT7URDzTRj/JRj66QTinOzGYOCyMOSuFPC2DQDB/QDF+PzB/PS+DOjGEOi+HOS+IOi6EOi2EOyyEOyyDOiuCOiyCOix/OS1/OS1/OS1/OS1+Oi9+Oi9+Oi9+Oi9+Oi9+Oi99OTB8OTB9OTB7OC97OC97OC97OC94OC57OzF5OzB5OzB5OzB4Oi94Oi94Oi92Oi9zNy1zNy1zNy1yNixxNStvNSpvNSptNClqMSZvNitsMyhoMiZrNSloMiZsNip8RjyKT0eMT0qNUEuPUk2QU06RVlCQV1CMWlGJXVKFYVV5X1BpWkdkX0lkaE9cZktOXUBFVThBUTQ9TTA8Sy4/TTNDUTdGUjpHUztCTDQ+RzI6QS85PSw5PS45PS44PC03Oy03PTM2PTU2OzQ2PDI6PDE7PS88Pyw8QSpKUzRWZT5ieElqhkxukVFzm1R3oVd4olp7omFymFtli05cgkVagENcgkVcgkVagENfhUhghklhh0piiEthh0pghklehEddg0hZe0hOcD5FZzVoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsY1RyZlh0aFxzZ1ttY1lqYVhsZV1zbmh6d3CBfneQjYagnZSopZyrp5yopJmjnZGZlod6e2tjZlNPUj9HSjdFSDVCRTJCRTJFSDVLTDxKSDlHRDVEPjBBOSxBNytANipGNChTNSpxQjiMUEifUEuvSUe/R0nMRUnTQkXWQELZQELaQkHbQ0LaRUHaRUHcREHcREHeRETeREbeREbeREbeRETdRUTdRUTaREPaRkLXRkHWRj7URT3URT3TRj3URT3VRj7UQTrTQzvORT3BQjmuPjOeOS2ROy6KPC+EPzCBPy+APi6APS2BOy+EOi2GOi2HOy6EOi2DOy2COiyCOiyCOiyBOSt/OS1/OS1+Oi9+Oi9+Oi9+Oi99OjF9OjF9OjF9OjF8OTF6OjF8OTF5OTB5OTB4OC94OC92Ny55OjF5OjF4OTB2OjB2OjB1OS91OS90Oi9yNy9xNi5xNi5wNS1vNCxuMytuMyttNCtqMShtNy1qNCpoMihqNCpmMidqNit9RDuNTkePTkiQUUqQVEyQVU+OV1CKWVKDW1F7WU12XE9rWkpdVUJZWERZXkhPWUE/SzM6SC83RS40Qis1QSs4RC49STNDTDdFTjlCSzY/SDU8RTI6QS84Py83Pi41PCw0Oiw1PDQ1PDU2OzU2OzQ5OzA6PC87Pi07QClHUDFSYTpgdkdphUtvklJ1nVZ5o1l5o1t4n2BukVdgg0lafUNbfkRegUdegUddgEZgg0lhhEpihUtihUthhEpgg0lfgkhegUlXfElMcEBCZjZoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsY1RrYVVuZFpwZlxsY1prZFxybWeEgXyRkIyno6C1sa7EwbzJxsHJxL7FwLrAubG5sqiknI+IgnJmY1RQUT9GSTg+RTM7RDE6RjI4RTM4RTM4QzI6QjM8QjRAQzhDRTpHRTk+NChQOi9lPzaARUGhUE+/WFvKUVbKQ0nVRkrXRUbaRkbbRUTdRULeRELdRD/eQ0HeRETeREbeREbeREbcREPcREPcREPaREPZRUHXRkHVRkDTRj3SRTzQRjzRRz3URT3UPzjVQDnQQzrGQzm2QTelPTCWPS+MPS6GPi+CPy+BPi6APS2BPC2DOy2EOi2FOy6COiyCOiyCOiyCOiyBOSt/Oit/OS1+OCx+Oi9+Oi9+Oi9+Oi99OjF9OjF9OjF9OjF6OjF6OjF5OTB5OTB4OC92Ny52Ny50OC53OC91OS91OS9zOS50OC5zOS5yOC1yOC1xNi5xNi5wNS1vNCxuMyttNCtsMypqNCpoMihsNixpMylmMidoNCllMSZpNSp7QjmOTUeSTUiRUEqPVEyNVk+HWE6BWU98XFFzXE5rW0xgV0ZWU0JQU0JKUT9ASTY0QCwzPCsyOyowOSgwOSgyOyo1Pi05QjE8RTQ/SDc/SDU+RzQ6RjI6QzI1QC8zPi0xPCwzOjMzOTU0OTU0OTI4OTE5Oy47Pi07QCpDTC9PXjddc0RphE1wk1N3n1l5o1l3oVlxmFlmiU9afUNYe0Fcf0VdgEZdgEZegUdgg0lgg0lgg0lgg0lgg0lfgkhegUddgEpWe0hKbkBBZTdoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsYlZqYFZqYVhrZFprZ151cGqIhYCfnpqwsK7DwsDT0tDi4d/n5uTn4+Dj3tre1tPZzsjOvLK4pZeXh3p5bV1fWUlLTDpARTE7RC8+SjY9SDc9RjU7QzQ7PjU6OzM5ODM4ODA9PTNDPDJONzFhODSISEivXV/FYGTKV1rNUVPTTk/XTUvbS0reSEfhRkTjREHiQkLfQ0TeREbeREbdQ0XdQ0XcQkTcQkLbQ0LaREPYREDVRD/TRj/SRTzQRjzQRz3URT3ZQDrZQDrRQjrIQzq8QzqsQDSZOy+MOSuJPS+DPi6BPi2APSyBPCyDOyyDOyyEPC2COiyCOiyCOiyBOSt/OS1/OS1+OC59OS5+Oi9+Oi99OjF9OjF9OjF9OjF9OjF9OjF6OjF5OjF4OTB4OTB3OC90OC5zNy1yOC10OC5zOS5yOC1xOC1yOC1wNyxwNyxwNyxvNi1vNi1uNSxuNSxtNCtsMyprMilpMylnMSdrNyxoNCllMSZoNCliMCVmNCl6QTiQTUeSTUiRUEqOVUyIWE6BWU94Wk9yXE5rXk5eV0dSUEFLTj1DSjo5QjEyOiswOCkxNysxNy0wNiwvNSsvNSkwOCsyOis0PC05RDQ7RjU9SDc8STc7RjU2QzEzQCwxPi0uODAwNjIxNjIyNzE3ODI5OzA6PC46Pyk/SCtLWTVbcUNog0xxk1Z3nlt3oVlznFZnjVBegUlVeEBXekJbfkZbfkZbfkZdgEhfgkpfgkpfgkpfgkpegUlegUldgEhdgEpVdklKa0BAYTZoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsYlZwZ15uZ19sZ2F0cWqHhH+hoJy8vLrO0M/Pz8/g4ODy8vL6+Pn79/b38/Dx7Onw4t/o0MbdwbXBq52ikYF9dWJeXEdLTTdDSDJBSTJBSTRARzVCRDdBQTdCPTlDOTc/OjY5PDU+PzdCNzFKLitkNjaPUVKzZ2nGbm3AXFzHWlfQVlPXUU7cTEviSEjmQ0TlQkPfQ0bdREbdREbdQ0XdQ0XcQkTcQkLcQkLcREPZQ0LXQz/TRD7SRT7QRjzQRjzURT3cQz3bQTnSQjrKRDu/RTqwQTacOi2LNSaKPC+FPS6CPS2APSyBPCyBPCyDPCqEPC2COiyCOiyCOix/Oit/OS1+OCx9OS59OS5+Oi9+Oi99OjF9OjF9OjF9OjF9OjF7OzF5OjF3OzF4OTB1OS90OC5zOS5yOC1xNyxyOC1xOC1wNyxuOCxwNyxtNytvNitvNitvNi1vNi1uNSxtNCtsMypqNCppMyloNClmMidrNyxoNCljMSZlMyhiMCVlMyh4QjiOTUeST0mOUkqKVU2DWE96Wk9xW01oXExaVERJSjo/QzQ+RDY5QTIwOCsvNyo2PDI0NzA1ODE1NzI0NzAyNS4wNiwwOC0xOSw2QTM6RTU9Sjk+Szk8STc3RjMyQSwxPi0sNi4uNDAwNTExNjA2NzE4Oi86PC46Pys8RSpJVzRZb0Fngk1wklZ2nVx1nlhwmVVghklYe0NTdj5XekJbfkZZfERZfERcf0dfgkpfgkpegUlegUlegUldgEhdgEhdf0xTdElIaEE/XTdpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NqY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVsZFdpYlpnZF12c26Tko6vr63ExsXa3Nvq7u/z9Pb29/n8/P7///////3/+/r89/T98uz34dTy2MfgyrXGtp+qoIeIhGliYkZFSC1ESC9DRzBGRTFHRDVGPDNDNjBGNDJIOjk+PTk+PzpCOjdJNzVjR0aSamrFk5LoranSi4fHdG7AXVjGU1DVT07fSkznRkvpRkvfRUffSUvaREbUOz7YPkDhR0ngREfWOj3aQEDaQEDZQUDWQj7UQz7RQjzQQTvRQTneQz7bQTnTQDnKQTm+QjiwQDWfOi6QOCqMPTCHPi+DPi6BPi2APSx/PCuBPSqBPCx/Oit/OS1/OS1+OCx+OC58OC18OC18OC18OTB8OTB8OTB8OTB6OjF6OjF6OjF6OjF5PTV3PDR3OzN1OjJ0OTFxOC9wNy5wNy5vNi1tNy1tNy1sOC1tNy1sOC1tNy1tNy1pMittNi9wOTJvODFrNC1nMipnMipoMytlMChpNy5kMildLSNgMCZfLyViMihzPjaMT0qPUEuIUUqBUkp9WU12X1FmWUlUTj5ERTU+RTU6QzI1QDA0PC8zOzA0OjA0OjA2ODM3ODM2NjQ0NjEzNTAxNi8vNi4uNisuOSsyPS02QzI6RzY6STY4RzQ0Qy4xPy4qNCssMi4tMi4uMy00NS83OS46PC86Pys2PiZEUjFXbENoglJzlF13nl9ym1drlFJbfkRYeURUdUBUdUBXeENae0ZbfEdae0Zef0pig05ig05ef0pcfUhfgEtggUxefk1Uc0pGZEA8VzRpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVsZFlnZF1vbmqGhYOkpKLBw8LW2tvq7u/3+/z3+/74/P/8/f/+/v7///3//vr//Pn/+vP/8OD769Tt38XXzbLAu52ko4SCg2NnaktMUTNHSi9FQy5HQi9IPjJJOjNMOTVLPDk/OjdCQT9NSEVdUlB5amejjovOsq7oxb//19Hss6rNgnzAY17KVlbYUlPfSE3aQUTWREXVRUXYSEjcSkvbRUbVPD7WPD7bQUPZPz/ZPz/ZQUDXQUDWQj7TQj3SQTzTQDncQTzbQDvTQDnLQjq/QzuxQTagOzGSOC2MPTCHPi+DPi6BPi2APSx/PCuBPCyBPCx/Oit/OS1/OS1+OCx9OS58OC18OC18OC18OTB8OTB8OTB8OTB6OjF7OzJ7OzJ6OzJ3PDR1PDN1OjJzOjFyOTBuOC5vNi1tNy1tNy1sOC1sOC1sOC1sOC1qOC1sOC1sOC1rNi5uNzBvODFuOTFsNy9pNCxnMiplMypjMShkNCpfLyVeLiRiMiheLiRgMCZwPjWBSkWHUkyHWFJ+WE9yVktkUkRRSjo+Py86QTE2QTA1QDAzPjA0PDE0PDE1OzE3OjM3OTQ3NzU3NzU1NzI0NjExNi8vNi4vNywuOSsxPC40QTA4RTQ5SDU4RzQ0RTI0QjEuOC8uNS4uMy0tMisyMys0Nis4Oi05PSw3PyhEUTNXbEVoglV0lWB3nWJwmFlnj1BZfERXeENUdUBUdUBWd0JZekVZekVZekVbfEdfgEtfgEtcfUhbfEdef0pef0pee01TbktGX0E5UjRpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZsZlplZF95e3iXmZiytrfN0dLk6ez0+fz6///7///8///9/v/+/v7//vz///v///r///T+/Of6+d3v8NHh5cTS2LS8xJ+gqIOHkWxgZ0VRWDdERyxEQy5KRDRMRDdLQThJPjpDOzlTSktpYV+Bd3ackpC+s6/Zzsjq3NP+6N3/8+n/5NvwqaPDZWO1QkXHREnaUlbbVVTRTUvKREHNQ0HURkXXRUbYRETZQ0TWPT/XPkDYQD/WQD/WQkDTQj/TQj3UQTrZQDrZQDrSQjrLRTzARDyyQjehPDKTOS6OPDCJPTCDPi+BPi5/PS1+PCyAPS2APS1/OS1/OS1+Oi99OS59OS58OC17OC97OC99OjF9OjF7OzJ7OzJ7OzJ7OzJ6OzR4PDR0OzJxOzFyOTBvOS9uOC5sOC1sNixrNyxsOC1qOC1qOC1qOC1qOC1pOS1qOC1qOC1uOTFtODBtODBtODBtODBpNy5mNCtjMShkMilhMSddLSNfMCZjNCpcLSNfMCZzRDx9UEqBVlB+WVFwVEleSj9PQzc/PC00NigyOyowOysxPC4yPS80PDE0PDE1OzE3OjM3OTQ3OTY2ODM1NzI1NzIyNzAwNy8wOC0uOSswOy0yPy42QzI3RTQ4RzQ4RzQ5RjU0PjMzOjIvNC0sMigvMCgxMyg1Nyo2Oik2PidEUTVZbUprhFp3l2Z3nGZsk1pfh0tXeENXdUNUckBUckBWdEJYdkRZd0VZd0VaeEZde0lffUtde0lde0lffUtefEpad0tQZ0pBV0AzSTJpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZuZVZuZVZtZ1tqa2aDh4ijp6i5vsHQ1djl7e/z+/31/f/7///7///8///8/vv9/vn+/fj//vf///P4/eb0/d7u99jm8s7d6cPO2rS2wZmhq4aAh2VmbUxNUTZGSDBISjVLSTpIRDlEQDdPR0RqYF+LgYCkmpm3r6zLxsLe29Tq5t368ej/+/H/9+3/3dX7trHlj47KY2SwQD/DUEvJVE3JUEjDRkDIR0LUTUrWS0jQQD/SPj7TPz/VPz7VQT/VQT/TQj/TQj3TQj3WPjnVQDrSQz3MRT/ART6yQTmiPTWVOzKOPDGJPTCDPi+BPi5/PS9+PCyAPS2APS1/OS1/OS1+Oi99OS59OS58OC17OC97OC9+OzJ+OzJ8PDN7OzJ7OzJ7OzJ6OzR4PDRyOTBvOS9vOS9tOS5sOC1rNyxqNitoNitpNyxpNyxpNyxoOCxoOCxoOCxoOCxoOCxtOzJsNy9qNS1pNy5qOC9qOC9mNCthMSdlNSthMihdLiRhMihiMylZKiBhMih5TkWBXFZ2V1JpTkdXQzpJPDNAOi46Oy04PC4wOCkvOiozOy40PC81PTI1OzE2OTA2OTA3OTQ2ODM2ODM0OTIzODEzOS8xOS4xOS4uOSsvOiwwPSwyPy41QjE3RTQ7SDY8STg5Qzg3PzQyOC4tMycuMCUvMSQyNCY0OCc0PCdFUjhdcFByi2R7mm53nGlmjVhVfEVTc0FUckBTcT9TcT9UckBVc0FWdEJWdEJXdUNbeUdde0lcekhefEpffUtcekhXcklKXkU8TTsuPy1nZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldvZlduZ11xcW+HjI+kqay3v8LN1djj7e/y/P70/v/4///6///7//z9//r8/fX6/PH5+e32+Or2/+jz/+Tw/eHu+dnp9NLe6MXK0q22vpmdo4F9gmJZXUJHTDVGSzdGSjlDRzlBQzhjXliFfXqroZ/Bt7XMwsHXz83m4d3x7un69/D89ev/8eb/8un/9Oz/5d/pqKS3aGOmTEG1UETBWU7HW1HGUUi/RD3CQTzLREHLQD3OQD7QQD/RQUDSQz/RQz/RQz/SQz3TPzvSQTzQRUDJRUC9Qz6vQDmgPjWVPTOOPDGJPDKDPTGBPTB/PTF+PC5/PS9/PS9+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC98PDN8PDN8PDN7OzJ6OzR5OjN5OjN3OzNuNzBtODBsNy9sNy9rNi5oNi1oNi1oNi1pNy5oOC5oOC5nOC5nOC5nOC5nOC5oOC5rOTJoNi9mNC1nNS5pNzBoNzBlNC1iMSpjMitiMytfMChdMShdMShWKiFiNi17VUx0WVJhTkhOPzhBNy49Niw7OS05Oy45PDEzOS0zOy41Oy82PDA2PDA3Oi81OC00Ny42OTA0OTIzODEzOS8zOS8yOi8xOS4xOSwuOSsuOSsvOiwwOy0zPi42QzI6RTU8Rzc9RTg6QjU1Oy8wNigwMiUvMSQxMyUxNSQyOiVHUztidVd3j2t8m3JxlWdcglFKcD1Pbz5Rbj5Rbj5Rbj5Rbj5Rbj5TcEBTcEBXdERbeEhdekpdekpffExffExad0dSbEVDVT82RDcoNilnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldwZ1hwZ1huZ11sbm16goWTmqCrtbfEztDc5ujt9/n0/v/1/v32//z6//r7//n7/vP4+u319ujx9OP0/er0/ej0/OXz+d/y9tvp7M3Y17nFxKWxsJKPjnJlZ09NUDtHSzpGTT1HT0JLUUd7e3OfmpTFvrjYzszf09Pn29vz6+n89/Tw7+r8/PT///b//fP/+e//8+r/597/18vYk4O4ZVOjSjq0VEa9V0m1Rju3QDjIS0XHQz7KQz/MQj/OQ0DOQz7OQz7NRD7NQj3RQjzSQz/OREHFRD+4QT2qPTieOzWVPDSOOzOJPDKDPTOBPTJ/PTF+PDB/PTF/PS9+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC98PDN7OzJ7OzJ6OjF5OjN4OTJ3ODF1OTFuNzBsNy9sNy9qOC9pNy5pNy5oNi1nNy1nNy1nNy1mNy1mNy1mNy1mNy1mNy1mNy1oNzBoNi9nNS5nNS5nNi9oNzBnNi9mNS5hMiplNi5eMilcMCdgNCthNSxpPTR1U0pYR0BFPjY8NS85NSw7OC84Oi81NywzNis2OS41Oy83Oi82OS42OS41OC01NywzNisyOCwxOSwyOC4xOSwxOS4xOSwxOSwxOSwuOSsuOSsuOSsvOiwwOyszPi42QTE3QjI8RDU6QzI4Py81Oy00NikyNCcxMyUwNCUwNyVIVD5leFx1jW10kmxmiV9Sd0tCaDlLazxOaztQbT1QbT1OaztOaztPbDxRbj5Wc0Nad0ddekpee0tffExffExWc0NOZ0A8SjkvOjIkLiZnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldwZ1hxaFlvaF5oaWttdHqFjJSjrLG/yM3T3uLl8PLw/Pzy/Pv1/vn4//f6//b8//L6/ez4+ef29+f29ur39+v69+j89ub99eL37Nbn2MPVxq/AsZqek311bltaV0ZQUUNTVktbYlplbGSVmI2ysqjVzsbo3dnz4+P66uv/8fT/9/n//vv+/fn5+vT4+u/8/PD///P///H/++r/5tHxqpS8b1upVkSuUkO1UES7TEG/SkHCRz/GRT/JRUDKRUDKRT7JRD3IQzzJQjzRQz/QRUDMRUHCQz2zPTmmOzWcOzWVPDaMPDOHPTSFPDWBPTR/PDN+PDB/PTF/PTF+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC97OzJ7OzJ5OjN4OTJ3ODF2NzB2NzBzNy9uNzBqOC9qOC9qOC9qOC9oOC5oOC5oOC5nNy1mNy1mNy1mNy1kOC1kOC1kOC1mNy1nNi9oNzBpODFpODFoNzBpODFqOzNsPTVnODBrPDRiNi1hNSxvQzp4TEN0SUBuTURDOTA1Ni40NS84OTE4OzI0Ny4xNCsyNSw1OC01OC01Nyw0Nis0Nis0Nis0NikzNykvNyguOSkwOCsuOSkuOSsuOSkwOCkwOCkxOSowOCkwOCsvNyowOCsxOSwzOy40PC05QjE6QzA7QjA6QTE6PC42OCoyNCYvMyQyOSdJVT9jdVtthGdmhGJXeVRJbkU/ZDhIZztMaTtOaz1Oaz1MaTtMaTtNajxPbD5VckRZdkhbeEpdekxee01ceUtRbkBHXzs2QjQrNC8jKSVnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NqY1NqYlVsYlZsYlZtY1dtZFVtZFVtZFVsZVVtZlZuZ1dvZ1puaFxvaF5tamVrb3JtdHqDipClrrPDzNHV3+Hm7vH0/P70/fr3/fn5/vf6//T8//L8//H8/+79/vD7+O/++vH/+e//+u3/+en/8t/v4MvdzrfBspuil4F8dWJiX05YWkxdY1dtd258hn2mrKK+wLXa1c/u5OL87u7/9PT/9Pf+9PX/+fn7+vj7/fj8//r4//X0/PH3/fH///H/+ej/9OP/zLu9f3CbUUSpU0a1U0iyQzrASkDESEDHRz7JRj7IRT3HRDzGQzvGQzvNRz7MRz7HRz68QzutPjWfOjKXOjORPjaKPTWGPTSDPTWBPTSAPDN/OzCBOzGBOzF+Oi9+Oi9+OjF9OTB8OTB7OC97OC97OC96OjF6OjF4OTJ3ODF2NzB1Ni91Ni9xNi5tODBrOTBqOC9qOC9pOS9pOS9pOS9oOC5nNy1mNy1nNy1mNy1mNy1mNy1mNy1mNy1mNS5qODFtOzRrOjNqOTJqOjBtPjRvQzhsQDVvRDtkPDJjPTJ6VkqGZFp5V01iTEE+OjEzODE0OTI3PDU0OjAvNSsyNSw5PDMzNisyNSoyNCkwMygxMygyNSo0Nis0NywuNiksNykvNyotOCovNyovNyovNyovNyoxOSwwOCswOC0vNywvNywvNywwOC0wOCs3PzA5QjE8RTQ9RDQ7QTM4PC4yNictNCQyOypKVkJjcltofGFddlhPbUtGZkFBYTpIZDtLaDxOaz9Oaz9LaDxKZzlMaT1Oaz1UcUVXdEhad0tbeExdek5adk1OakFDWzsyPjQqMDAhJydoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqZFhsZFlsY1ptZVptZVhtZlZnYE5qZVJua1hvbF1oZVxmZWFzcXKBgoaKj5OWnqGrs7bDyMvY3eDq7u/29/n5+/r8/v3+/vz///r9/vb6/fL5/PH6/fL7/vP5+vL6+vL5+e38+uv+/Of5997p5crV1La6uZuYmHxxdFlfZE1ia1hyfWyEkIKRm5C0ubLLzMfj4t7y7uv38/L79/b9+fj8+Pf//vz+/vz+/vz9//r9//r9//r9//r9//r6/Pf///r/+/b/6uXYp6CjYFibRD21TkW/TUPCRjzERDnKRTzOSUDOS0HLSEDHRzzGRzjDSDi9SjizSDimRTWaQjSRQjWLQzWGQjWEQjaCQDSCPjOCPDKEOjGGOTGGOTF/OTF+OjF8OTF7ODB6Ny96Ny93Ny52Ni13Ny53Ny53OC93OC92Ny51Ni1xNStuMytsNy9pODFpODFoNzBoNzBnNi9nNi9nNi9mNS5nNi9pNzBpODFoNzBnNi9lNC1lMyxoMy1qNS9tODBrOTBqOjBpOy5pPTBrQTNnQjJqSTpkSDp2X09+a1yKeGqMf29SSj03OS40OjA0OjAzOS8zOS8zOS8yOC4yOC4xNy0xNy0zNi0wNiwyNSwvNSsxNCsvNSsvNC0uNS0vNC0uNS0vNC0vNC0vNC0vNC0wNS4vNC0vNC0uMywuMywvNC0vNC0vNi4xOzIzPTI2QDU4Qjc5RDY3QjQ1QDAzPi00Py5EUT1XZU5ba1FQYkhFWDxAVDhCVzZJYz5LZT5LZj1LZj1KZTxKZTpMZz5Paj9VcEdZdEtcdk9dd1Bdd1JXcU5IYj87TzYmMSsmKy4kKSxoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZpZFFqaFNtaldqa1tnZ19sbGx+f4SQk5qor7W4wsTR1tni5+ry8/X7/P7//v///v/+/fv//vr///r+//n7/PT4+/L2/PL3/fP3+vH4+u/4+u33+un5++Xy9drf4sPM0K+0uJeRlnZrcVVZYUlfa1V0gW+MmIqdp5y/wbzT09Hn5+Xz8/H39/X7+/n8/Pr7+/n+/vz+/vz+/vz+/vz+/vz+/vz+/vz7//71///1///+////+/r/7erwv7rCfnWfS0GvTUC5Sz7CTEDFSz7DRTm8PTS+PzbDRTnERjfDSje9TDqzSjemRjaZQzKRQzaNRTeFQzeCQjiBQTeBPjWCPDSDOjOGOTGEOTN+OTJ9OjJ6OjF6OjF5OTB4OC92Ny52Ny51Ni12Ny50OC50OC50OC5yNixvNSptNCtsNy9pODFqODFoNzBpNzBoNzBnNi9nNi9lMyxlMyxnNS5oNi9qODFqODFqODFrOTJrNjBsNzFrOTBrOzFrOy9qPjFqQDBpRDJnSDZrUD1nUkF1ZlOBdWWMhXOGg3JLTDw2OS4zOS8zOS8zOS8yOC4yOC4yOC4xNy0xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsvNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4wNS8vNC4uMy0uMy0uMy0uMy0vNC4vNi8uODAvOjIxPTM0QDY2QjY2QjY2QjQ1QjE2QzFDUD5QXUlSYElJV0BBTzZCUDdFVTpKYkBKZD9LZUBLZT5JYzxIYzpJZDtKZTxTbkVYcktcdlFdd1RbdFRUbU9DXD42STUmMS0nLDAkKS1oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZtaFVraVRtaldqa1tra2N3d3eRkpenrLK/xszS3N7s8fT3/P/+///+/////v///v/+/fv//vr///r9/vj6+/P1+O/x9+vx9+v09+z1+ev2+Or1+OX19+Hu7tTb27/JyquwsZKTlnl1eWBrcFp0e2mIkIGfp5yuta3Nz8re3tzv7+34+Pb7+/n+/vz+/vz9/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//77///7////////+/n/+vT/9+390cbYnpCUTD2lUkKpTDunQDG3RzvPWU3PVUq8QDTERDfGSDrDSz25STuqQjedPzOXQDeTRTuJQDmEQTmBQTh/PzZ+PjV9PTR/PDR9PTR6OzR4PDR3OzN3OzN1OjJ0OTF0OTF0OTFyOTByOTByOTByOTBvOS9uOC5sNixrNStsNy9qODFsNzFqODFrNjBpNzBpNzBoNi9nNS5nNS5mNS5nNi9oNzBpODFrOjNrOjNsOzRqOzNpOjBoPDFrPzJqQzRpRDJmRTJmSTdsVkFqWUd1alaGf22RjnuAf21FRjY1OC0yOC4yOC4yOC4xNy0xNy0xNy0wNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsvNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4uMy0tMiwtMiwuMy0vNC4uNS4rNS0rNi4tOS8vOzEyPjI0QDQ2QjQ3RDM4RTM/TDpFUj5DUTo7STI4Ri0+TDNEVDlKX0BKYkBMZEJLYz9JYT1HYDlGXzhHYDlSa0RYcExddVNedlZacVRQZ0s9VDguQS4mMS0nLDAlKi5oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZuaVZsalVsa1dsbV1wcWmAgoGeoaa5vsTEy9Hb5ef1+v37///8/f/8/f/+/P38+/n//vz///v//vn7/PT19u7u8ebp7+Pn7d/t8eLw9OXx9OPx9N/y8dzq6tDY2LzHx6uysZWhoYmRk32Qk4CcnpGqraK2u7TAxb/c3Nrp6ef29vT7+/n9/fv///3///39/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v77+/3//v///v/38u/88+z//PP/++3/9OTsw7G5gXCVUECiTz+4WEq3TT+1RTnARzzBQTbIRTvFST+9Rz2vQDmhPDSaPTaWQTyNPzuHQDyBQDp9QDt6Pzl5QDl4Pzh4Pzh2PTR2PTR2PTR1PDNzPTNyPDJyPDJxOzFvOzBvOzBvOzBuOi9rOS5qOC1qOC1pNy5tODJuNzJtNjFsNzFsNzFrNjBpNzBpNzBsOjNqOTJoNzBmNy9mNy9mNy9oOTFmOjFqPzZmPjRlPTFmPjJoQzNpRTVmRzNjRzJjSjZoVkBpXElza1aFgm+PjnpwcV85PSw0NywyOC4xNy0xNy0xNy0wNiwwNiwwNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsuMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0tMiwtMiwtMiwtMiwuMy0tNC0qNCwpNCwqNiwrNy0uOi4xPTE0QDI1QTM2QzI6RzU8STc4RTEyPysyQCk4Ri8+TjREWDxFXT1LYEFKYkBLYD9HXztIXjpGXjpTaUVYcE5gdVZedVhablNMY0k5TTQpOiglLislKi4kKS1oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZsZ1RraVRubVlvcGB0dW2Fh4akp6y/xMrO1dvm8PL7///7///7/P79/v///v/+/fv///3///v+/fj3+PDv8Ojn6t/g5tre5dXn69rq79vt8Nvs8Nnu7tbo6NDa2L/MyrHCvae3taCxrp22tKfBvrXJyMPS087Z2dfo6Oby8vD6+vj8/Pr9/fv///3///38/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vz//P///P//+/r8+/f9//n+//j+//T//+3//uz438vFnIqdYlCWSjqlTDy0UEC8TD6/QDfGQzvFRj+/RD2xPjumOjeeOjiZPjuRPTuKPzyEQD19QD14QTx0QjtyQztyQztxPzZzPjZzPjZyPTVyPTVyPTVwPjVvPTRuPjRtPTNsPDJrOzFqOzFpOjBpOjBqOjBuNzJwNjJwNjJtNjFtNjFsNzFpNzBpNzBsOzRrOjNoOTFlOTBlOTBlOTBlOjFkPDJmQjZjQTVjQzRkRDVkRzVkSTZiSTNfSTJeTDZlVj9qYk1ybVeEg2+Eh3JbYEwzOigyOCwyOC4xNy0xNy0xNy0wNiwwNiwwNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsuMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0tMiwtMiwsMSssMSssMSssMSstMiwsMywsNi4rNS0qNCsqNCsrNSwuOC0wOy0yPS8yPS01QC82QTA1QS0xPSkxPSk1QS04Ri89TzVAVDhGWT1IXEBKXT9JXj1LXj5LYD9UZ0dbcFFjdlphdVpZa1NKXUc2RzQmNCUkLSokKSwiJypoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVpsZlZqZ1RralVsbllvcmFzdm2BhYSfpKi4v8fW3+Tt9/n7///7///7/P/+/////v/+/fv///v///r8/PTz9err7eLj59nd49Xc49Hk6dPn7NXp7dbq7NTr69Po5s/f2sTTzrjTzrrMxrbLw7jQycHX0s7g29jq5uXw7+3z8vD5+ff9/fv9/fv9/fv///3+/vz8/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//fz/+/z/+Pn//v3+//35//30//jv//X3//bw9+f//+3/7tvNp5Ska1iiW0eqV0WtTDu5RDrARDzART68RT+0QT6qPTqiOjmaOzmVPTyNPz2FPz19QDt3QjxyQztvRDtvRDtwPzhxPzZxPzZxPzZxPzZwPjVvPzVvPzVvQDZuPzVtPjRrPDJoPDFoPDFoPDFsPDJvODNxNjJwNjJwNjJtNjFsNzFqODFpODFoNzBnODBlOTBlOjFkPDJlPzRmQDVkQjZeQjRhRzhjTDpkTTtjTThgSzZdSzNdTTRdUTliWD9taFJzc1uAg252e2VGTzo0PSozOS0yOC4yOC4yOC4xNy0xNy0xNy0wNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSsrMCorMCorMCorMCosMSssMywuNS4sNi4qNCsqNCsqNCsrNSwtNywuOSstOCowOys0Py81QC80Py4zPyszPi0zQCw3Ri85SzNATzhCVDpHVzxIWz9NXUJNYERVZUpcb1NkdFpgclpYZ1JHWEU0QjEkMiUkLSokKSwiJypoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqY1lrZFpsY1xtZFtsZlpsZlZsaVZsa1ZrbVhrbl1scmh5f32VnaCut77S2+Dq8/j7///5/v/5+v7+/////v/6+ff///v+/fj5+fHx8+jp697j59jf5tbg6NPk6dLn7dPo7NPn6dHo6NDn5c7g28fX0L7a08PZ0cbe1Mvm3dju5OPz6er68fT/+fv6+ff+/vz///39/fv9/fv///3///38/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//fz/+fj/+vn//v38//33//7u//nx///y//31//rz+ev//e3/+uj0zrurd2KPUTqqXEiyTj64Sj25ST64SUC0R0CvRD6lPTqcOjeWPTmPPjqIPzmAQTp4QTp0RDpwRjpwRTxwPzhxPzhxPzhxPzhxPzhxPzhwPzhwPzhxQjpwQTluPzdsPTVpPTRqPjVqPjVuPTZvODNyNzNwNjJwNjJuNzJsNzFqODFpODFkOC9kOTBjOzFkPjNkQDRjQTVjQTVfQzVaRTRfTjxnVkJoV0NjUzxeTzhbTzVcUjddVjxdWT5ubFV0dl58gWtjbVUyPig2Qi4zOy4zOS8zOS8zOS8yOC4yOC4yOC4xNy0xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSssMSsrMCoqLykqLykrMCosMSsrMistNC0rNS0qNCwqNCwrNSwrNSwsNistNywsNisvOiwyPS82QTE3QjI3QjE1QDA0Py4yPy00Qy46RzM9TDVBTzhEVDpKWD9MXEJUYklca1RjcVpebVhVYlBEUkEyPjAjLyUmLywmLCwkKipoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqY1lrZFpsY1xtZFtsZlpsZlZvbFltbFdqbFdna1pmbGJye3iOmJqosbjK09jj7PH4/f/3/P/6+//+/////v/6+fX///r9/fX4+O7w8uXp693l6djj6tjl7dbm7NLp7dLq7dLo6M7o5s/o48/h2sjY0MPYzsTd0szq39v47ev/9Pb/9fn/9fv/+fz+/P3///3///3+/vz+/vz///3///39/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vr//fv//fv9/Pr5/fz4///1///z///t/frz//v7//r///T/9ub/89//483XrZWpb1moV0SuUUCsTz6vT0GxT0KtS0CkQzyZPDWVPjePPzaIPziBQTd7Qjd1RDZxRThxRThwPzhxPzhzPjhxPzhxPzhxPzhxPzhwPzhzQjtxQjpvQDhtPjZsPTVqPjVtPjZvPjdvODNxNzNvODNtODJtODJpODFoOTFmOjFmOzJkPjNkQDRiQjVgQzVdQTNcQDJXQjFURzRbUz5mXkdpXkhiWD9aUzlaUzdcVzpaVjtYVztrbVVzd151fWZVYUkmMhw4RDAzOy40OjA0OjAzOS8zOS8zOS8yOC4yOC4xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSsrMCorMCoqLykqLykrMCorMCosMSsrMispMysqNCwrNS0rNSwsNi0tNy4tNywsNisuOC0yPDE2QTM5RDY5RDQ3QjQ2QTEwOysyPy01QjA5RjI8STVATjdGVD1KWD9SYElbaFRhblpcaVdRXk1CTkAvOy8iLCMrMS0oLiwmLCxoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZFpsZVttZF1uZVxtZ1ttZ1dxbltrbVdrbllrcmBqcmdweXaHkZOfqrC7xMnQ2d7q7/P2+/78/f/+/////v/+/fn///r+/vb6+vD2+Ov09ujw9OPq8d/n79jw9trt8tTr7tHs7NLo5tHh3Mnd1cje1Mrh1M7o2tny5OT66+7+8vT/9/v/+f///P///f7+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+//r//vr//vr+/vz9//77///6///6///7///+//////3/+/X/+/H//Oz/++X/89v/6tG6gmmmYkuXTzmfVD+oWkajUkGdSjqgTT+OPDCLPTCGPjJ/PS94PS90Py9zQjN0RDZyPTVyPTd0PThzPjh1QDp1QDp0PzlxPzhzQTpxQDlxQDlxQDlwPzhuPzdvPjdvPjdrOTJtODJsOjNsOzRsOzRoPDNnPDNjPTJjPzNePjFkRzljRzlUPS1OOShNOCdAMR5XUTtQTjdLSTBPSzJdWT5pZUplYURWVTdYWDxdYENvc1p6gGZkbFU9STEtOSMyPio0PC81OzE0OjA0OjA0OjAzOS8zOS8zOS8zOS8zOS8zOS8yOC4xNy0xNy0xNy0wNiwxNjAxNjAwNS8wNS8vNC4vNC4vNC4vNC4sMSssMSssMSssMSssMSssMSsrMCorMCouNS4tNC0tNC0sMywtNC0tNCwuNS0uNS0rMiotNCwwNy81PTI5QTY9RTg/Rzw/Sjw3QjI1QC8zPi0xPSkyPio5RS9CTjhJVT9PW0dWYk5daFdZZFRMV0k8RjsvOS4pMyopLysoLionLStoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZFpsZVttZF1uZVxtZ1traFdvblpqbFZrbllrcmBqdGlxfHiJlJajrrS+x8zS2+Dr8PT3/P/9/v/+/////vz+/fn///r+/vT7++/3+ev09+bw9eHq8t3o7dbq79Hm68vk58rm5szj4czf2cne1Mrf1M7n2djt39/25+r77/P/9Pj/9/v/+v7//P///vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z7//r7//r9//z9/v/+/f///P///P//+////P///P//+/n//PX//vH//+3/++X/8tn/69HgsZendVyRW0OWWkKaWUOaVkOZUkCORzWLRjaIRTSDRDN8QzJ3QjBzQC9vPi91QDhzPjh1Pjl1QDp0PzlvPTZwPjdzQTpxPzhwPzhwPzhuPzdvPjdtPjZuPTZtPjZrPDRsPTVtPjZrPzZqPzZnQTZlQTViQjVkRzlbQTJeRzdeSThOPStGNyRHOCU+NiFMTDRHSzJERyxERCpNTTFcWz9iYUNgYUJZWT1kZ0pzd15zeV9YYEk6RCwvOyU3Qy82PjE2PDI2PDI2PDI1OzE1OzE1OzE1OzE1OzE1OzE1OzE0OjA0OjAzOS8zOS8zOS8yNzEyNzEyNzExNjAxNjAxNjAwNS8wNS8uMy0uMy0tMiwtMiwsMSssMSsrMCorMCoqMSoqMSopMCkpMCkpMCkqMSorMiosMysuNS0tNCwuNS0wNy80OzM5QTY/Rj5CSj87Rjg6RTU3QjE0Py4zPys2Qi48SDJATDZMWERTX0tZZFRXYlJMVks9RzwxOzIrNSwrMisqMCwpLytoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdsY1ptZFttZF1uZVxtZ1traFdtbFhpbVZqb1lrdGFpdWlxfXmKmJmlsri/ytDU3eLt8vb3/P/8/f/9//7//vz+/fj///f9/fP6++33+un09+Tv9N7n79jl69Hi58ne4cLd3cHe3sbe28jd18vg1c/k2dfu4uLz5+v67vL/9Pj/9/v/+fz/+v3//f3//vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z4//z4//z7//7+/v7//P//+v//+f//+P//+f//+v//+vr//fj///b///P9/+//+ub/9Nz/+OD/7NPjv6esgmqHWUKFUTuSW0aXXUmNUz9/RjJ1PilyPilzQCt0RDB2RTRxPzRuPDNxPDR0QjlzQThvPzVxQTd4SD5uPjRtPjRtPjRrPzRsPTNqPjNsPTNqPjNnPzVnQTZnQTZnQzdlQzdjQzZgQzVeRDViSztVQjFaSTdgU0BSRzNDOyZFPShGQStBRSxCSC5BRSo8QCU/QiVOTjJfYEFpakthYUVucVR2emFnbVNKTzk0PCU0PSg9RjM4PjI4PjQ4PjQ4PjQ3PTM3PTM3PTM2PDI4PjQ4PjQ3PTM3PTM3PTM2PDI2PDI2PDI1OjQ0OTM0OTM0OTMzODIzODIzODIyNzEwNS8wNS8vNC4uMy0tMiwsMSsrMCorMCopLigpLigpLigpLigpLigqLykrMCosMSsxNjAvNC4sMSssMSsvNC42OzQ9QjxBSEBASz0+Szo8STc4RTM0QS0yPyszQSo1QyxEUT1LWERRXk1RXk1IVEg8SDwyPjQuOC8tNC0tNC0sMyxnZFVnZFVoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbVZqb1lqc2BodGhtfHeImJims7m/ytDT3OPr8Pb2+//8/f/9//7///3//vn+/vb9/fH6++33+uf09+Lu89zl7dXi6M7b4MDX2rvW1rzZ18Ld18fe183l29ns4OD47PD78Pb/9fv/+f7/+v3/+/v/+/v//fz//vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z4//74//77//7+/v7//P7/+v//+f//+P7/+v3/+fz/+fn//fr///j///j7//X8/vD//+3//On/8d//8N3/79rx0r20kHp7Uj50SjR1SDN2STR6TTh9UDt5TDduQS5lNyd7TUBzRDpxQjhzRDpvQzhnOzBkOC1nPTFpPzNpPzNpPzNnPzNmPjJmPjJmPjJlPzJiQDRiQjVgQzVfQzVfQzVbRDRaRTRXRDNYSTZPQi9cVD9vaVNjXkhNSzRJRzBJSzM+RCo/SC1ARio8QiY8QSNGSSxYWTpkZUZtbVF4eFx0dl5bX0ZAQy42OyU4QCs8QzE5PzM5PzU5PzU4PjQ4PjQ3PTM3PTM3PTM5PzU4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ3PDY3PDY3PDY2OzU2OzU2OzU1OjQ1OjQzODIzODIxNjAwNS8vNC4tMiwsMSssMSsrMCorMCoqLykqLykrMCosMSstMiwtMiwwNS8uMy0rMCorMCotMi4yNzE4PTk7QjpASz1ATTtATTs9SjY4RTEzQCwxPygwPic8STVCTztIVUNJVkVEUEI7RzsyPjQuOjAsNi4uNS4tNC1nZFVnZFVnZFVoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldrZVdsZFdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbldpcVpnc19kcmVqeXSFlZWjsre9yM7S2+Lq7/X0+f37/P/9//7///3///r///j///P+//H7/uv3+uXw9d7m7tbi6MzZ3L/V1bnS0LnU0b7a1Mjg2dHq4N/06e3+8/n/9/z/+////f///v///vz//vr//vr+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//76///6///7///+/v7//f7//Pz/+/z/+/r/+vj/+ff/+vf//fj///v///v9//r9/vn59O7//vb//fT//PP/++7/9+f75tXp0sDPtKG2moWUdWF3VkNqSTZsSTZyTTt1UD5tRjdpQjNnQjJqRTVuSTluSjpvSztvSztlQTFjQjFjQjFjQjFjQjFjQjFiQzFgQzNdRjZcRzZcRzZaRzZaRzZXSDVURzRSRzNQSDNOSDJmZE1+fmZyclpWWEBKTDRHTTM8RSo8Ris/SCtBRytBRihERypNTi9UVTZ4d1t7el5ublZVVT1DQi4/QSw+QS46Pi07PjM5PzU5PzU4PjQ4PjQ3PTM3PTM3PTM4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ5Pjg5Pjg5Pjg4PTc4PTc4PTc3PDY3PDY2OzU1OjQ0OTMzODIyNzEwNS8vNC4vNC4tMi4tMi4sMS0rMCwrMCwsMS0tMi4tMi4sMS0sMS0sMS0sMS0uMjEwNTEzNzY0OzQ7Rzk9TDlATzxATzo8SzY3Ri80QywyQSo2RS46STRATzxCUD8/TT44RjcxPzItOS0sNi0tNCwsMytmY1RmY1RnZFVoZVZoZVZpZldqZ1hqZ1hpZldpZldpZldpZldpZldpZldpZldpZldsZFdsZFdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbldpcVpnc19icGNneHKClJSjsrfAy9HU3eTr8Pb1+v77/P/9//7///3///r///j///T///P//+/6/ejy9+Dn8NXi6MzX2r3R0bXNy7TOy7rWz8Xe19Hs4uP37vP/9v7/+v///f///v////3+//r+//n+//r+//r+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v79/v/9/v/9/v/9//79//z+//r+//n///f9/fP9/fX+/fj+/fn//vz+/v7//f///v/++f///P//+/z79vP/+PL//fT//vH//e3/+un/8uD35NPn0r/Su6m5n46fhHOPcmJ8XUt9Xkx0VUNhRDJXOihZPCpbPixYPSpgRTJgRTJgRTJfRjJgRzNgRzNgRzNdSDNcSzdcTTpcTTpZTDlYTTlVTThSTDZRTDZOTDVRUTlpa1N8gGdtcVhTWT9GTDI+Ryw8Ris8Ris/SCtESi5FSixERypISSpMTS55eFx0c1dmZE1UUjtMSTZLSjZGRTM8PS08PzQ5PzU5PzU5PzU4PjQ4PjQ4PjQ4PjQ3PTM3PTM4PjQ4PjQ4PjQ4PjQ5PzU5PzU6Pzk6Pzk6Pzk6Pzk5Pjg5Pjg5Pjg4PTc4PTc4PTc3PDY2OzU1OjQ0OTMzODIzODIvNDAuMy8tMi4sMS0rMCwrMCwrMCwrMCwrMCwsMS0tMTAuMjEvMzIvMzIvMzItNC0zPzE3RjM9TDdATzo/Tjc8SzQ5SDE4RzA1RC04RzA8SzY+TTo8Sjk3RTYxPzItOS0rNSwtNCwsMytmY1RmY1RnZFVoZVZoZVZpZldqZ1hqZ1hpZldpZldpZldpZldpZldpZldpZldpZldsZFdsZFdsY1ptZFttZF1tZlxtZ1tqaVdqbFdobVZoclpmc19jcWRoeXOFl5elt7vH0tja4+rw9fv4/f/8/f/9//7///3//vn///X///L///D8/+z4++bv9N3i69Dd48fV1bnOzLPJxLDKxLTQyb/a0s/p4OP27fL/9///+v///f///v////39//r8//j8//j9//r+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v7//P///P/+/f/9//76//r4//n4//X4//P4//P4//X8//j9//r//f7//P///P//+//99///+v///P///f///v/+/fv7+/P6+Oz///H//+///+3//u3//e3/9uf/7uD96tv649H/5tDjyrSlj3h0XkdlTzhiTDVcSDBeSjJcSjJcSjJdSzNdSzNeTDReTDRcTTZZTjhXTzpXTzpWUDpVTzlTTjhQTjdOTjZNTzdQVDtgZkxmb1RVXkNFTzRBSzA8Ris/SS4/SS5DTC9ITjJITS9GSSxPUDFZWDpxbVJqZkthXEZbVkBZVEFUUT5NSjlCQzM9QDU7QTc7QTc7QTc6QDY6QDY6QDY5PzU4PjQ4PjQ4PjQ5PzU5PzU6QDY6QDY6QDY7QDo7QDo7QDo6Pzk6Pzk5Pjg5Pjg5Pjg6Pzk6Pzk5Pjg5Pjg4PTc4PTc3PDY3PDY0OTUyNzMxNjIvNDAtMi4sMS0rLy4rLy4sMC8sMC8tMTAuMjEuMjMuMjMtMTIrMS0rOSovQC02SDI7TTc9Tzc8TjQ6TDI6TDI1Ry83STE6TDY8TTo6Szk2RzcwQDMtOy4sNi0tNCwsMytjZFJjZFJkZVNlZlRnZVZoZldpZ1hpZ1hoZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZVdsZFlsZVttZF1tZlxrZ1tqaVdpa1ZobVdoclpndGBkcWdqe3WJm52qvMDN2N7g5+30+f/6///7///9//z+//r+/vb6+u76++36++n4+uXz9uHq7tff48rZ3MHT0bjMx7HFvqzGvrHMw7zWzsvm3eD06vL+9///+v///v/////+/v79//r8//r8//r9//z+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vz//vz//vz//f7//P///P///f/9//77//z4//n3//f3//X4//b5//b8//j///v//v3//P//+///+v//+v//+////P///v/+/f/7/fz8/vv+//r5+vL6/PH9++/++u7/+ez/++z//e///ez/8Nv/++Ls3MOejnVgUDdSQilYSC9YSC5bTTNbTTNaTjRaTjRbTzVbTzVcUDZbUThVTzdUTzlUTzlRTzhQTjdOTjZLTTVJTTRKTjVMUjhTXEFQWTxASSw7RihBTC4/SixETTBFTjFKUTJNUjRKTTBMTDBZWT1rak5oZEliXkVeWkFfWkRgW0daVUFRTzpLSjhBQjRAQjVAQjU+QTY+QTY+QTY9QDc9QDc5PzU5PzU5PzU6QDY6QDY6Qjc6Qjc6Qjc7QDk7QDk7QDo6Pzg6Pzk5Pjc5Pjg5Pjc7QDo7QDk7QDo7QDk6Pzk6Pzg6Pzk6Pzk4Pzg3PTk0OzQzODIxNjAvNC4uMy8uMy8uMjEuMjEsMi4sMi4rMisrMiosNCkpNiUkNh4pPSEyRis4TDE7TzY7TTU7TTU7TTU4SjI5SzM7TTU8TjY8Tjg3SDUxQjAuPC0tNywuNS0tNCxdZU5eZk9fZ1BgaFFkaVVmaVZnaldpalhmZ1VoZ1VoZVZoZVZqZFZrZVdrZVlsZlhsZlhraFltZ1trZ1xtZl5qZltpZVlnZVZnaFZma1Vlbllib11kcWhzg4CWqKy5yM/S2+Li6e/y9/v3/P/5/fz8/vn8//b8/vH3+Or5+ur49+Xy8d3u7dnr6tbg38rX0r7Xz7zLwK69tKW9s6nCt7HMwsHb0tfq4Oj68/v89v/++////v/+/f/8/f/8/v38/v3+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz+/fn+/fn//Pn//fr//vv//vv//v///f7//P3//f7////+//39//z7/fj///v8/ff//fj//vr//fj/+vb/9/T/+fn/+v///P///f/////////9//z9//78/v3+/////////vz//vn//vP//u7//er//eb69Nz/+uDn4MaPiGxVTjJXTjFUSy5TSitXTjFXTjFVTjFVTjFUTzJUTzJUTjRTTzRRTTJSTjVRTzZQUDZNTzdLTzZITTZHTDVKUDZGTzRBSi09Ric+SCZESypGTStFTCpQVjRQVDNLTi9ISyxUVDhiYkZjY0laWkBbWUBcWkFdW0JdW0JbWUBYVj1VUzpTUThIRjFHRDFEQTBBPzBAPjE+PjI/PzU+QDU7PjU5PzU5PzU5QTY5QTQ4QzU4QzU4QzU6Qjc5QTY5QDg4QDU4Pzc5QTY5QDg6Qjc6QTk6Qjc5QDg6Qjc7Qjo8RDk9RDw+RT04Qjo4Qjo3QTg4QDU2PjE0PC8zOS8yNzEuNDAvNTEtNy8tOS0uOykwQCY2Ryc3TSc7Vis6Vys7VTA7VDQ7Ujg9UDo+Tzw+UDo6TDZAUjhFVz1GWT1EWD1AVDs1SDIrPCksNissMysrMipaZ01baE5caFBdaVFialNja1RnbFhoa1hnaFZnaFZpZldpZldrZVdsZlhtZVptZ1ltZ1lraFlrZ1trZ1xqZl1qZltoZlplZlZoaVdnbFZmb1xlcmFqd256iomcq7K6yNHQ2eDh6ezy9/v4/v75/vr6//j7/vP5/e/4+ev3+Ob19OLt7Njp5tPl4s/c18TSy7nKv63BtKS5raG8r6bBtrLLwcDb0Nbm3+b78/799//++////v/+/f/8/f/8/f/8/f/+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz//fr//Pn//Pn//fr//fn//vr//v3//fz//P3//f7//v///v///f79+/z//v3//vv//Pr/+PP47efy5d326N/78Or/+v3//P///f7///3///v9//z9//78/f/9/v/9/v///f///vz//vX//+7//uj//+T69t39++Lk4MeLh2xSTTBTTjBRSytRSytVTy9VTy9UTzFUTzFTTzJTTzJRUDRRUDRRTTJQTzNQTjVOUTZNTzdKUDZITTZFTTVIUTZFTjFCSy4/SSdCSShGTStKUCxLUS1OUi9QVDFWWjdeYkFfYkNZXD9UVzxVVT1WVj5XVT5YVj1ZVz5YVj1YVztXVjpYVDlRSzNPSTNMRzRJRDFEQTJCQDNBPzM+QDU8PTU5PzU5PzU5QTY3QjQ4QzU3RDM3RDM6Qjc5QTY5QTY4QDU4QDU5QTY5QTY6Qjc6Qjc6Qjc6Qjc6Qjc7Qzg8RDk9RTo8Rjs9Rz88SD48Rjs7RjY8RDU6QjM5PzM4PTY3Pjc0PjYzPTQwPi0zQyk5TSpCWS9HYTFPcDtMbjtMaT1GYT5CWT88Uj07TDo6Szg9TzlEVjxLXkJNYEJMYERIXEA6UTcxRC4rNSorMiopMChaZ01baE5caFBealJialNkbFVnbFhpbFlpalhpalhraFlraFlsZlhtZ1luZltuaFptZ1lraFlrZ1tqZltqZl1pZVpoZlpmZ1doaVdlalRkbVpndGNvfHN/j46drLO2xM3N1t3e5unx9vr4/v76/v35/vj4+/L0+Orz9Obw8d/q6dfh4Mzc2cbX1MHQy7jHwK6/s6O9sKC8sKTDtq7LwLzVy8rj2N7r5Ov89P/99//++////v/+/f/8/f/8/f/9//7+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz//fr//fr//Pn//Pn//Pj//Pj//fz//Pv/+/z//P3//v///v///f7+/P3//v3//vv//fv88+7q39ni1c3r3dT37Ob/+v3//P///f7///3///v9//z9//78/f/9/v/9/v///v////3//vX//u3//ef//uP7997+/OPj38aJhWpQSy5RTC5RSytRSytUTi5VTy9UTzFVUDJUUDNTTzJRUDRQTzNRTTJPTjJQTjVNUDVNTzdKUDZJTjdGTjZIUTZGTzJDTC9DTStGTSxKUS9PVTFTWTVRWTJXXzhqcEp5f1txdlZZXkBLTzRNUDVRUTlRUTlSUDlTUThUUjlVVDhZVTpaVjtYUjpWUDpSTTpOSTZIRTZEQjVDQTU/QTY8PTU5PzU6QDY5QTY3QjQ3QjQ3RDM3RDM6Qjc6Qjc5QTY5QTY5QTY5QTY6Qjc6Qjc6Qjc6Qjc6Qjc6Qjc7Qzg8RDk+Rjs8Rjs/SUE+SkA/ST4+STk/Rzg+Rjc+RDg9Qjs+RT45Qzs2QDc0QjE5SS9CVjNQZz1YckJef0pbfUpYdUlNaEVDWkA5Tzo2RzU0RTI8TjhFVz1OYUVTZkhTZ0tOYkZAVz02STMvOS4vNi4tNCxaZ01baE5caFBealJibFRlbVZobVlpblprbFprbFpsaltsaVpuaFpuaFpvZ1xvaVtsaVpraFlqZlpqZltpZVxpZVpoZlpmZ1dmZ1ViZ1FhaldlcmFvfHN+jo2WpayrucLH0Nfa4efu8/f2/Pz4/Pv1+vTz9u3u8uTp6tzj5NLc28nT0r7Oy7jJxrPDvqu9tqTDt6fHuazNwbXWycHf1NDp397z6O748fj99f/++P///P/+/f/9/P/8/f/8/v39//7+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz+/fv//vz//fr//fr//fr//Pn/+/f/+/f//fz//Pv++vv/+/z//f7//v///f7+/P3//Pv//vv//fv99O/t4tzm2dHw4tn88ev/+v3//P///f7///3///v9//r9//78/f/9/v/9/v///v////3//vX//u3//Ob//OH++eP//ufk38mKhm1QSjBSTTBTTC9TTS1UTi5VTy9VUDJVUDJUUDNTTzJQTzNPTjJQTDFOTTFPTTRMTzRMTjZKUDZKTzhIUDhKUzhHUDNHUDNJUzFNVDNPVjRWXDhcZD1nckh0gVWIk2mQm3OFj2xudVRaYUJSVjtMTjZOTjZNTTVOTDVPTTZSUDdXUzpZVTxaVD5YUjxUTzxRTDlLSDlHRThFQzdAQjc9PjY6QDY6QDY5QTY3QjQ3QjQ2QzI2QzI7Qzg6Qjc5QTY5QTY5QTY5QTY6Qjc7Qzg7Qzg6Qjc6Qjc7Qzg7Qzg9RTo+Rjs9Rzw9Rz88SD4+SD0+STk/Rzg+Rjc+RDg9Qjs9RD05Qzs2QDc0QjE5SS9EWDVSaT9bdUVae0ZXeUZUcUVJZEE9VDoySDMvQC4tPis2SDJAUjhMX0NSZUdTZ0tPY0dAVz02STMwOi8wNy8tNCxZZ01aaE5caFBealJibFRlbVZpblpqb1ttblxsbVtta1xtaltuaFpuaFpvaV1vaVtsaVpraFlqZlppZVppZVxpZVppZ1tnaFhnaFZjaFJhaldlcmFvfHN7i4qQn6aisLnBy9TU3eTp8fTy+vz0+vjx9vDt8Ofo7N7i49Xa28nS0b/MybbJxLHDvqu/uKa8s6LKvq7Txbjc0MTm2dHt4uD27O3/9Pr/+f//9///+v///P/+/f/9/P/7/P78/v3+///+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz+/fv+/fv//fr//fr//fr/+/j/+vb++fX//fz/+/r9+fr++vv+/P3//f7//v///f7//Pv//fr//Pr/+PP37Oby5d346uH/9O7/+v3//P///f7///3///v9//r9//78/f/8/f/9/v///v////3//vX//ez/++P++t///Ob//+nn4syMiG9STDJUTzJUTTBVTjFUTi5VTy9WUTNWUTNVUTRTTzJPTjJOTTFQTDFOTTFOTDNLTjNMTjZLUTdLUDlKUjpMVTpJUjVKUzZPWTdTWjlUWzldYz9mbkeCkmOSpnOfsYGbqn+SoXqIlHBye1xcYkZMUDdLTTVMSzZLSTRMSjVQSzVUTjhWUDpXUTtWUDpTTjtRTDlMSTpJRzpHRTlDRTo9PjY6QDY6QDY5QTY3QjQ3QjQ2QzI2QzI7Qzg7Qzg6Qjc5QTY5QTY6Qjc7Qzg7Qzg7Qzg7Qzg7Qzg7Qzg8RDk9RTo+Rjs9Rzw9Rz88SD49Rzw9SDg+Rjc9RTY9Qzc9Qjs6QTo3QTk1PzY0QjE5SS9CVjNOZTtVbz9UdUBSdEFQbUFFYD05UDYtQy4rPCorPCkxQy08TjRIWz9QY0VSZkpOYkZAVz01SDIsNisrMionLiYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC90ZXN0aW1ncC5qcGcgYi9saWJqcGVndHdycC90ZXN0aW1ncC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmI2NTguLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvdGVzdGltZ3AuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvdGVzdG9yaWcuanBnIGIvbGlianBlZ3R3cnAvdGVzdG9yaWcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE2YTBjLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3Rlc3RvcmlnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3Rlc3Rwcm9nLmpwZyBiL2xpYmpwZWd0d3JwL3Rlc3Rwcm9nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwZmVlMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC90ZXN0cHJvZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC90cmFuc3VwcC5jIGIvbGlianBlZ3R3cnAvdHJhbnN1cHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlYzU2NC4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC90cmFuc3VwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLS8qCi0gKiB0cmFuc3VwcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGFuZCBvdGhlciB1dGlsaXR5IGNvZGUKLSAqIHVzZWQgYnkgdGhlIGpwZWd0cmFuIHNhbXBsZSBhcHBsaWNhdGlvbi4gIFRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgY29yZQotICogSlBFRyBsaWJyYXJ5LiAgQnV0IHdlIGtlZXAgdGhlc2Ugcm91dGluZXMgc2VwYXJhdGUgZnJvbSBqcGVndHJhbi5jIHRvCi0gKiBlYXNlIHRoZSB0YXNrIG9mIG1haW50YWluaW5nIGpwZWd0cmFuLWxpa2UgcHJvZ3JhbXMgdGhhdCBoYXZlIG90aGVyIHVzZXIKLSAqIGludGVyZmFjZXMuCi0gKi8KLQotLyogQWx0aG91Z2ggdGhpcyBmaWxlIHJlYWxseSBzaG91bGRuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxpYnJhcnkgaW50ZXJuYWxzLAotICogaXQncyBoZWxwZnVsIHRvIGxldCBpdCBjYWxsIGpyb3VuZF91cCgpIGFuZCBqY29weV9ibG9ja19yb3coKS4KLSAqLwotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAidHJhbnN1cHAuaCIJCS8qIE15IG93biBleHRlcm5hbCBpbnRlcmZhY2UgKi8KLQotCi0jaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLQotLyoKLSAqIExvc3NsZXNzIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzLiAgVGhlc2Ugcm91dGluZXMgd29yayBvbiBEQ1QKLSAqIGNvZWZmaWNpZW50IGFycmF5cyBhbmQgdGh1cyBkbyBub3QgcmVxdWlyZSBhbnkgbG9zc3kgZGVjb21wcmVzc2lvbgotICogb3IgcmVjb21wcmVzc2lvbiBvZiB0aGUgaW1hZ2UuCi0gKiBUaGFua3MgdG8gR3VpZG8gVm9sbGJlZGluZyBmb3IgdGhlIGluaXRpYWwgZGVzaWduIGFuZCBjb2RlIG9mIHRoaXMgZmVhdHVyZS4KLSAqCi0gKiBIb3Jpem9udGFsIGZsaXBwaW5nIGlzIGRvbmUgaW4tcGxhY2UsIHVzaW5nIGEgc2luZ2xlIHRvcC10by1ib3R0b20KLSAqIHBhc3MgdGhyb3VnaCB0aGUgdmlydHVhbCBzb3VyY2UgYXJyYXkuICBJdCB3aWxsIHRodXMgYmUgbXVjaCB0aGUKLSAqIGZhc3Rlc3Qgb3B0aW9uIGZvciBpbWFnZXMgbGFyZ2VyIHRoYW4gbWFpbiBtZW1vcnkuCi0gKgotICogVGhlIG90aGVyIHJvdXRpbmVzIHJlcXVpcmUgYSBzZXQgb2YgZGVzdGluYXRpb24gdmlydHVhbCBhcnJheXMsIHNvIHRoZXkKLSAqIG5lZWQgdHdpY2UgYXMgbXVjaCBtZW1vcnkgYXMganBlZ3RyYW4gbm9ybWFsbHkgZG9lcy4gIFRoZSBkZXN0aW5hdGlvbgotICogYXJyYXlzIGFyZSBhbHdheXMgd3JpdHRlbiBpbiBub3JtYWwgc2NhbiBvcmRlciAodG9wIHRvIGJvdHRvbSkgYmVjYXVzZQotICogdGhlIHZpcnR1YWwgYXJyYXkgbWFuYWdlciBleHBlY3RzIHRoaXMuICBUaGUgc291cmNlIGFycmF5cyB3aWxsIGJlIHNjYW5uZWQKLSAqIGluIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLCB3aGljaCBtZWFucyBtdWx0aXBsZSBwYXNzZXMgdGhyb3VnaCB0aGUgc291cmNlCi0gKiBhcnJheXMgZm9yIG1vc3Qgb2YgdGhlIHRyYW5zZm9ybXMuICBUaGF0IGNvdWxkIHJlc3VsdCBpbiBtdWNoIHRocmFzaGluZwotICogaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIG1haW4gbWVtb3J5LgotICoKLSAqIFNvbWUgbm90ZXMgYWJvdXQgdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBvZiB0aGUgaW5kaXZpZHVhbCB0cmFuc2Zvcm0KLSAqIHJvdXRpbmVzOgotICogMS4gQm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB2aXJ0dWFsIGFycmF5cyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlCi0gKiAgICBzb3VyY2UgSlBFRyBvYmplY3QsIGFuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIG1hbmlwdWxhdGVkIGJ5IGNhbGxpbmcgdGhlCi0gKiAgICBzb3VyY2UncyBtZW1vcnkgbWFuYWdlci4KLSAqIDIuIFRoZSBkZXN0aW5hdGlvbidzIGNvbXBvbmVudCBjb3VudCBzaG91bGQgYmUgdXNlZC4gIEl0IG1heSBiZSBzbWFsbGVyCi0gKiAgICB0aGFuIHRoZSBzb3VyY2UncyB3aGVuIGZvcmNpbmcgdG8gZ3JheXNjYWxlLgotICogMy4gTGlrZXdpc2UgdGhlIGRlc3RpbmF0aW9uJ3Mgc2FtcGxpbmcgZmFjdG9ycyBzaG91bGQgYmUgdXNlZC4gIFdoZW4KLSAqICAgIGZvcmNpbmcgdG8gZ3JheXNjYWxlIHRoZSBkZXN0aW5hdGlvbidzIHNhbXBsaW5nIGZhY3RvcnMgd2lsbCBiZSBhbGwgMSwKLSAqICAgIGFuZCB3ZSBtYXkgYXMgd2VsbCB0YWtlIHRoYXQgYXMgdGhlIGVmZmVjdGl2ZSBpTUNVIHNpemUuCi0gKiA0LiBXaGVuICJ0cmltIiBpcyBpbiBlZmZlY3QsIHRoZSBkZXN0aW5hdGlvbidzIGRpbWVuc2lvbnMgd2lsbCBiZSB0aGUKLSAqICAgIHRyaW1tZWQgdmFsdWVzIGJ1dCB0aGUgc291cmNlJ3Mgd2lsbCBiZSB1bnRyaW1tZWQuCi0gKiA1LiBBbGwgdGhlIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgYXJlCi0gKiAgICBwYWRkZWQgb3V0IHRvIGEgZnVsbCBpTUNVIGJvdW5kYXJ5LiAgVGhpcyBpcyB0cnVlLCBhbHRob3VnaCBmb3IgdGhlCi0gKiAgICBzb3VyY2UgYnVmZmVyIGl0IGlzIGFuIHVuZG9jdW1lbnRlZCBwcm9wZXJ0eSBvZiBqZGNvZWZjdC5jLgotICogTm90ZXMgMiwzLDQgYm9pbCBkb3duIHRvIHRoaXM6IGdlbmVyYWxseSB3ZSBzaG91bGQgdXNlIHRoZSBkZXN0aW5hdGlvbidzCi0gKiBkaW1lbnNpb25zIGFuZCBpZ25vcmUgdGhlIHNvdXJjZSdzLgotICovCi0KLQotTE9DQUwodm9pZCkKLWRvX2ZsaXBfaCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cykKLS8qIEhvcml6b250YWwgZmxpcDsgZG9uZSBpbi1wbGFjZSwgc28gbm8gc2VwYXJhdGUgZGVzdCBhcnJheSBpcyByZXF1aXJlZCAqLwotewotICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBibGtfeCwgYmxrX3k7Ci0gIGludCBjaSwgaywgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkNPRUZQVFIgcHRyMSwgcHRyMjsKLSAgSkNPRUYgdGVtcDEsIHRlbXAyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIEhvcml6b250YWwgbWlycm9yaW5nIG9mIERDVCBibG9ja3MgaXMgYWNjb21wbGlzaGVkIGJ5IHN3YXBwaW5nCi0gICAqIHBhaXJzIG9mIGJsb2NrcyBpbi1wbGFjZS4gIFdpdGhpbiBhIERDVCBibG9jaywgd2UgcGVyZm9ybSBob3Jpem9udGFsCi0gICAqIG1pcnJvcmluZyBieSBjaGFuZ2luZyB0aGUgc2lnbnMgb2Ygb2RkLW51bWJlcmVkIGNvbHVtbnMuCi0gICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIHJpZ2h0IGVkZ2UgYXJlIGxlZnQgdW50b3VjaGVkLgotICAgKi8KLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgZm9yIChibGtfeSA9IDA7IGJsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlmb3IgKGJsa194ID0gMDsgYmxrX3ggKiAyIDwgY29tcF93aWR0aDsgYmxrX3grKykgewotCSAgcHRyMSA9IGJ1ZmZlcltvZmZzZXRfeV1bYmxrX3hdOwotCSAgcHRyMiA9IGJ1ZmZlcltvZmZzZXRfeV1bY29tcF93aWR0aCAtIGJsa194IC0gMV07Ci0JICAvKiB0aGlzIHVucm9sbGVkIGxvb3AgZG9lc24ndCBuZWVkIHRvIGtub3cgd2hpY2ggcm93IGl0J3Mgb24uLi4gKi8KLQkgIGZvciAoayA9IDA7IGsgPCBEQ1RTSVpFMjsgayArPSAyKSB7Ci0JICAgIHRlbXAxID0gKnB0cjE7CS8qIHN3YXAgZXZlbiBjb2x1bW4gKi8KLQkgICAgdGVtcDIgPSAqcHRyMjsKLQkgICAgKnB0cjErKyA9IHRlbXAyOwotCSAgICAqcHRyMisrID0gdGVtcDE7Ci0JICAgIHRlbXAxID0gKnB0cjE7CS8qIHN3YXAgb2RkIGNvbHVtbiB3aXRoIHNpZ24gY2hhbmdlICovCi0JICAgIHRlbXAyID0gKnB0cjI7Ci0JICAgICpwdHIxKysgPSAtdGVtcDI7Ci0JICAgICpwdHIyKysgPSAtdGVtcDE7Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19mbGlwX3YgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogVmVydGljYWwgZmxpcCAqLwotewotICBKRElNRU5TSU9OIE1DVV9yb3dzLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7Ci0gIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7Ci0gIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogV2Ugb3V0cHV0IGludG8gYSBzZXBhcmF0ZSBhcnJheSBiZWNhdXNlIHdlIGNhbid0IHRvdWNoIGRpZmZlcmVudAotICAgKiByb3dzIG9mIHRoZSBzb3VyY2UgdmlydHVhbCBhcnJheSBzaW11bHRhbmVvdXNseS4gIE90aGVyd2lzZSwgdGhpcwotICAgKiBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgYW5hbG9nIG9mIGhvcml6b250YWwgZmxpcC4KLSAgICogV2l0aGluIGEgRENUIGJsb2NrLCB2ZXJ0aWNhbCBtaXJyb3JpbmcgaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgc2lnbnMKLSAgICogb2Ygb2RkLW51bWJlcmVkIHJvd3MuCi0gICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIGJvdHRvbSBlZGdlIGFyZSBjb3BpZWQgdmVyYmF0aW0uCi0gICAqLwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKLSAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCS8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KLQlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAotCSAgIGNvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLSAgICAgIH0gZWxzZSB7Ci0JLyogQm90dG9tLWVkZ2UgYmxvY2tzIHdpbGwgYmUgY29waWVkIHZlcmJhdGltLiAqLwotCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICAgICAgfQotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKLQkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT52X3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3kgLSAxXTsKLQkgIGZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotCSAgICAgICBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKLQkgICAgICAvKiBjb3B5IGV2ZW4gcm93ICovCi0JICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICAgICAgLyogY29weSBvZGQgcm93IHdpdGggc2lnbiBjaGFuZ2UgKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9Ci0JfSBlbHNlIHsKLQkgIC8qIEp1c3QgY29weSByb3cgdmVyYmF0aW0uICovCi0JICBqY29weV9ibG9ja19yb3coc3JjX2J1ZmZlcltvZmZzZXRfeV0sIGRzdF9idWZmZXJbb2Zmc2V0X3ldLAotCQkJICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MpOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fdHJhbnNwb3NlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIFRyYW5zcG9zZSBzb3VyY2UgaW50byBkZXN0aW5hdGlvbiAqLwotewotICBKRElNRU5TSU9OIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBUcmFuc3Bvc2luZyBwaXhlbHMgd2l0aGluIGEgYmxvY2sganVzdCByZXF1aXJlcyB0cmFuc3Bvc2luZyB0aGUKLSAgICogRENUIGNvZWZmaWNpZW50cy4KLSAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgZWRnZXMgcmVxdWlyZSBubyBzcGVjaWFsIHRyZWF0bWVudDsgd2Ugc2ltcGx5Ci0gICAqIHByb2Nlc3MgYWxsIHRoZSBhdmFpbGFibGUgRENUIGJsb2NrcyBmb3IgZXZlcnkgY29tcG9uZW50LgotICAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKLQkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAotCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLQkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKLQkgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQlkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fcm90XzkwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIDkwIGRlZ3JlZSByb3RhdGlvbiBpcyBlcXVpdmFsZW50IHRvCi0gKiAgIDEuIFRyYW5zcG9zaW5nIHRoZSBpbWFnZTsKLSAqICAgMi4gSG9yaXpvbnRhbCBtaXJyb3JpbmcuCi0gKiBUaGVzZSB0d28gc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KLSAqLwotewotICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKLSAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7Ci0gIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogQmVjYXVzZSBvZiB0aGUgaG9yaXpvbnRhbCBtaXJyb3Igc3RlcCwgd2UgY2FuJ3QgcHJvY2VzcyBwYXJ0aWFsIGlNQ1VzCi0gICAqIGF0IHRoZSAob3V0cHV0KSByaWdodCBlZGdlIHByb3Blcmx5LiAgVGhleSBqdXN0IGdldCB0cmFuc3Bvc2VkIGFuZAotICAgKiBub3QgbWlycm9yZWQuCi0gICAqLwotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0JIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0JICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgewotCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCi0JICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwotCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewotCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwotCSAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgewotCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQotCQlbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCWkrKzsKLQkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKLQkgICAgICB9Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgLyogRWRnZSBibG9ja3MgYXJlIHRyYW5zcG9zZWQgYnV0IG5vdCBtaXJyb3JlZC4gKi8KLQkgICAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCi0JCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkgICAgfQotCSAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fcm90XzI3MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKLS8qIDI3MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bwotICogICAxLiBIb3Jpem9udGFsIG1pcnJvcmluZzsKLSAqICAgMi4gVHJhbnNwb3NpbmcgdGhlIGltYWdlLgotICogVGhlc2UgdHdvIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCi0gKi8KLXsKLSAgSkRJTUVOU0lPTiBNQ1Vfcm93cywgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBCZWNhdXNlIG9mIHRoZSBob3Jpem9udGFsIG1pcnJvciBzdGVwLCB3ZSBjYW4ndCBwcm9jZXNzIHBhcnRpYWwgaU1DVXMKLSAgICogYXQgdGhlIChvdXRwdXQpIGJvdHRvbSBlZGdlIHByb3Blcmx5LiAgVGhleSBqdXN0IGdldCB0cmFuc3Bvc2VkIGFuZAotICAgKiBub3QgbWlycm9yZWQuCi0gICAqLwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLQkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKLSAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLQkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7Ci0JICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKLQkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0JICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07Ci0JICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQotCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgaisrOwotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQl9Ci0JICAgICAgfQotCSAgICB9IGVsc2UgewotCSAgICAgIC8qIEVkZ2UgYmxvY2tzIGFyZSB0cmFuc3Bvc2VkIGJ1dCBub3QgbWlycm9yZWQuICovCi0JICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JICAgIH0KLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWRvX3JvdF8xODAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCi0vKiAxODAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgMS4gVmVydGljYWwgbWlycm9yaW5nOwotICogICAyLiBIb3Jpem9udGFsIG1pcnJvcmluZy4KLSAqIFRoZXNlIHR3byBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgotICovCi17Ci0gIEpESU1FTlNJT04gTUNVX2NvbHMsIE1DVV9yb3dzLCBjb21wX3dpZHRoLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7Ci0gIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7Ci0gIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7Ci0gIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7Ci0gIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwotICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewotICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7Ci0JLyogUm93IGlzIHdpdGhpbiB0aGUgdmVydGljYWxseSBtaXJyb3JhYmxlIGFyZWEuICovCi0Jc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKLQkgICBjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gICAgICB9IGVsc2UgewotCS8qIEJvdHRvbS1lZGdlIHJvd3MgYXJlIG9ubHkgbWlycm9yZWQgaG9yaXpvbnRhbGx5LiAqLwotCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKLQkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICAgICAgfQotICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwotCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKLQkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT52X3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3kgLSAxXTsKLQkgIC8qIFByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGNhbiBiZSBtaXJyb3JlZCBib3RoIHdheXMuICovCi0JICBmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBfd2lkdGg7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIDFdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSArPSAyKSB7Ci0JICAgICAgLyogRm9yIGV2ZW4gcm93LCBuZWdhdGUgZXZlcnkgb2RkIGNvbHVtbi4gKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaiArPSAyKSB7Ci0JCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOwotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICAgIH0KLQkgICAgICAvKiBGb3Igb2RkIHJvdywgbmVnYXRlIGV2ZXJ5IGV2ZW4gY29sdW1uLiAqLwotCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqICs9IDIpIHsKLQkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKLQkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IG1pcnJvcmVkIHZlcnRpY2FsbHkuICovCi0JICBmb3IgKDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9Ci0JfSBlbHNlIHsKLQkgIC8qIFJlbWFpbmluZyByb3dzIGFyZSBqdXN0IG1pcnJvcmVkIGhvcml6b250YWxseS4gKi8KLQkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07Ci0JICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3ldOwotCSAgLyogUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgY2FuIGJlIG1pcnJvcmVkLiAqLwotCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoOyBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSAxXTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDIpIHsKLQkgICAgICAqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICAqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9Ci0JICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IGNvcGllZC4gKi8KLQkgIGZvciAoOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCi0JICAgICAgKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb190cmFuc3ZlcnNlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkgICAgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQotLyogVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgaXMgZXF1aXZhbGVudCB0bwotICogICAxLiAxODAgZGVncmVlIHJvdGF0aW9uOwotICogICAyLiBUcmFuc3Bvc2l0aW9uOwotICogb3IKLSAqICAgMS4gSG9yaXpvbnRhbCBtaXJyb3Jpbmc7Ci0gKiAgIDIuIFRyYW5zcG9zaXRpb247Ci0gKiAgIDMuIEhvcml6b250YWwgbWlycm9yaW5nLgotICogVGhlc2Ugc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KLSAqLwotewotICBKRElNRU5TSU9OIE1DVV9jb2xzLCBNQ1Vfcm93cywgY29tcF93aWR0aCwgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OwotICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKLSAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0JIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7Ci0JZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0JICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgewotCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCi0JICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwotCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewotCSAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKLQkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF0KLQkJW2NvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gb2Zmc2V0X3kgLSAxXTsKLQkgICAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgewotCQkvKiBCbG9jayBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCi0JCSAgW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSBvZmZzZXRfeCAtIDFdOwotCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICAgIGorKzsKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgIH0KLQkJICBpKys7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgewotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgICBqKys7Ci0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQkgIH0KLQkJfQotCSAgICAgIH0gZWxzZSB7Ci0JCS8qIFJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBtaXJyb3JlZCBpbiB5IG9ubHkgKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKLQkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewotCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JCSAgICBqKys7Ci0JCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICB9Ci0JCX0KLQkgICAgICB9Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgewotCQkvKiBCb3R0b20tZWRnZSBibG9ja3MgYXJlIG1pcnJvcmVkIGluIHggb25seSAqLwotCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV0KLQkJICBbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07Ci0JCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKLQkJICBpKys7Ci0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOwotCQl9Ci0JICAgICAgfSBlbHNlIHsKLQkJLyogQXQgbG93ZXIgcmlnaHQgY29ybmVyLCBqdXN0IHRyYW5zcG9zZSwgbm8gbWlycm9yaW5nICovCi0JCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07Ci0JCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCi0JCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKLQkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLS8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZS4KLSAqCi0gKiBXZSBhbGxvY2F0ZSB0aGUgd29ya3NwYWNlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIHNvdXJjZSBkZWNvbXByZXNzaW9uCi0gKiBvYmplY3QsIHNvIHRoYXQgYWxsIHRoZSBhcnJheXMgKGJvdGggdGhlIG9yaWdpbmFsIGRhdGEgYW5kIHRoZSB3b3Jrc3BhY2UpCi0gKiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZSBtYWtpbmcgbWVtb3J5IG1hbmFnZW1lbnQgZGVjaXNpb25zLgotICogSGVuY2UsIHRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX3JlYWRfaGVhZGVyICh3aGljaCByZWFkcwotICogdGhlIGltYWdlIGRpbWVuc2lvbnMpIGFuZCBiZWZvcmUganBlZ19yZWFkX2NvZWZmaWNpZW50cyAod2hpY2ggcmVhbGl6ZXMKLSAqIHRoZSBzb3VyY2UncyB2aXJ0dWFsIGFycmF5cykuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQotewotICBqdmlydF9iYXJyYXlfcHRyICpjb2VmX2FycmF5cyA9IE5VTEw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludCBjaTsKLQotICBpZiAoaW5mby0+Zm9yY2VfZ3JheXNjYWxlICYmCi0gICAgICBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDciAmJgotICAgICAgc3JjaW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMykgewotICAgIC8qIFdlJ2xsIG9ubHkgcHJvY2VzcyB0aGUgZmlyc3QgY29tcG9uZW50ICovCi0gICAgaW5mby0+bnVtX2NvbXBvbmVudHMgPSAxOwotICB9IGVsc2UgewotICAgIC8qIFByb2Nlc3MgYWxsIHRoZSBjb21wb25lbnRzICovCi0gICAgaW5mby0+bnVtX2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgfQotCi0gIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7Ci0gIGNhc2UgSlhGT1JNX05PTkU6Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfSDoKLSAgICAvKiBEb24ndCBuZWVkIGEgd29ya3NwYWNlIGFycmF5ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfVjoKLSAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKLSAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHNhbWUgZGltZW5zaW9ucyBhcyBzb3VyY2UgaW1hZ2UuCi0gICAgICogTm90ZSB0aGF0IHdlIGFsbG9jYXRlIGFycmF5cyBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnksCi0gICAgICogc28gdGhhdCB0cmFuc2Zvcm0gcm91dGluZXMgbmVlZCBub3Qgd29ycnkgYWJvdXQgbWlzc2luZyBlZGdlIGJsb2Nrcy4KLSAgICAgKi8KLSAgICBjb2VmX2FycmF5cyA9IChqdmlydF9iYXJyYXlfcHRyICopCi0gICAgICAoKnNyY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwKLQlTSVpFT0YoanZpcnRfYmFycmF5X3B0cikgKiBpbmZvLT5udW1fY29tcG9uZW50cyk7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBzcmNpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICAgIGNvZWZfYXJyYXlzW2NpXSA9ICgqc3JjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6Ci0gIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6Ci0gIGNhc2UgSlhGT1JNX1JPVF85MDoKLSAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKLSAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHRyYW5zcG9zZWQgZGltZW5zaW9ucy4KLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgYXJyYXlzIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSwKLSAgICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgotICAgICAqLwotICAgIGNvZWZfYXJyYXlzID0gKGp2aXJ0X2JhcnJheV9wdHIgKikKLSAgICAgICgqc3JjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLAotCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgY29tcHB0ciA9IHNyY2luZm8tPmNvbXBfaW5mbyArIGNpOwotICAgICAgY29lZl9hcnJheXNbY2ldID0gKCpzcmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzID0gY29lZl9hcnJheXM7Ci19Ci0KLQotLyogVHJhbnNwb3NlIGRlc3RpbmF0aW9uIGltYWdlIHBhcmFtZXRlcnMgKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQotewotICBpbnQgdGJsbm8sIGksIGosIGNpLCBpdGVtcDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlFVQU5UX1RCTCAqcXRibHB0cjsKLSAgSkRJTUVOU0lPTiBkdGVtcDsKLSAgVUlOVDE2IHF0ZW1wOwotCi0gIC8qIFRyYW5zcG9zZSBiYXNpYyBpbWFnZSBkaW1lbnNpb25zICovCi0gIGR0ZW1wID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGg7Ci0gIGRzdGluZm8tPmltYWdlX3dpZHRoID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0OwotICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBkdGVtcDsKLQotICAvKiBUcmFuc3Bvc2Ugc2FtcGxpbmcgZmFjdG9ycyAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKLSAgICBpdGVtcCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9IGl0ZW1wOwotICB9Ci0KLSAgLyogVHJhbnNwb3NlIHF1YW50aXphdGlvbiB0YWJsZXMgKi8KLSAgZm9yICh0YmxubyA9IDA7IHRibG5vIDwgTlVNX1FVQU5UX1RCTFM7IHRibG5vKyspIHsKLSAgICBxdGJscHRyID0gZHN0aW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOwotICAgIGlmIChxdGJscHRyICE9IE5VTEwpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JICBxdGVtcCA9IHF0YmxwdHItPnF1YW50dmFsW2kqRENUU0laRStqXTsKLQkgIHF0YmxwdHItPnF1YW50dmFsW2kqRENUU0laRStqXSA9IHF0YmxwdHItPnF1YW50dmFsW2oqRENUU0laRStpXTsKLQkgIHF0YmxwdHItPnF1YW50dmFsW2oqRENUU0laRStpXSA9IHF0ZW1wOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0vKiBUcmltIG9mZiBhbnkgcGFydGlhbCBpTUNVcyBvbiB0aGUgaW5kaWNhdGVkIGRlc3RpbmF0aW9uIGVkZ2UgKi8KLQotTE9DQUwodm9pZCkKLXRyaW1fcmlnaHRfZWRnZSAoal9jb21wcmVzc19wdHIgZHN0aW5mbykKLXsKLSAgaW50IGNpLCBtYXhfaF9zYW1wX2ZhY3RvcjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sczsKLQotICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgbWF4X2hfc2FtcF9mYWN0b3Igb3Vyc2VsdmVzLAotICAgKiBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNldCB5ZXQgaW4gdGhlIGRlc3RpbmF0aW9uCi0gICAqIChhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHNvdXJjZSdzIHZhbHVlKS4KLSAgICovCi0gIG1heF9oX3NhbXBfZmFjdG9yID0gMTsKLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBpbnQgaF9zYW1wX2ZhY3RvciA9IGRzdGluZm8tPmNvbXBfaW5mb1tjaV0uaF9zYW1wX2ZhY3RvcjsKLSAgICBtYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChtYXhfaF9zYW1wX2ZhY3RvciwgaF9zYW1wX2ZhY3Rvcik7Ci0gIH0KLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChtYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotICBpZiAoTUNVX2NvbHMgPiAwKQkJLyogY2FuJ3QgdHJpbSB0byAwIHBpeGVscyAqLwotICAgIGRzdGluZm8tPmltYWdlX3dpZHRoID0gTUNVX2NvbHMgKiAobWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLX0KLQotTE9DQUwodm9pZCkKLXRyaW1fYm90dG9tX2VkZ2UgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCi17Ci0gIGludCBjaSwgbWF4X3Zfc2FtcF9mYWN0b3I7Ci0gIEpESU1FTlNJT04gTUNVX3Jvd3M7Ci0KLSAgLyogV2UgaGF2ZSB0byBjb21wdXRlIG1heF92X3NhbXBfZmFjdG9yIG91cnNlbHZlcywKLSAgICogYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBzZXQgeWV0IGluIHRoZSBkZXN0aW5hdGlvbgotICAgKiAoYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzb3VyY2UncyB2YWx1ZSkuCi0gICAqLwotICBtYXhfdl9zYW1wX2ZhY3RvciA9IDE7Ci0gIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgaW50IHZfc2FtcF9mYWN0b3IgPSBkc3RpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3I7Ci0gICAgbWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgobWF4X3Zfc2FtcF9mYWN0b3IsIHZfc2FtcF9mYWN0b3IpOwotICB9Ci0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKG1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIGlmIChNQ1Vfcm93cyA+IDApCQkvKiBjYW4ndCB0cmltIHRvIDAgcGl4ZWxzICovCi0gICAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gTUNVX3Jvd3MgKiAobWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLX0KLQotCi0vKiBBZGp1c3Qgb3V0cHV0IGltYWdlIHBhcmFtZXRlcnMgYXMgbmVlZGVkLgotICoKLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKQotICogYW5kIGJlZm9yZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50IGFycmF5cyB0byBiZSB3cml0dGVuCi0gKiAoZWl0aGVyIHRoZSBvbmVzIGFsbG9jYXRlZCBieSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlLCBvciB0aGUKLSAqIG9yaWdpbmFsIHNvdXJjZSBkYXRhIGFycmF5cykuICBUaGUgY2FsbGVyIHdpbGwgbmVlZCB0byBwYXNzIHRoaXMgdmFsdWUKLSAqIHRvIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCi0gKi8KLQotR0xPQkFMKGp2aXJ0X2JhcnJheV9wdHIgKikKLWp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCSAgICAgIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JCQkgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQotewotICAvKiBJZiBmb3JjZS10by1ncmF5c2NhbGUgaXMgcmVxdWVzdGVkLCBhZGp1c3QgZGVzdGluYXRpb24gcGFyYW1ldGVycyAqLwotICBpZiAoaW5mby0+Zm9yY2VfZ3JheXNjYWxlKSB7Ci0gICAgLyogV2UgdXNlIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gbWFrZSBzdXJlIHN1YnNpZGlhcnkgc2V0dGluZ3MgZ2V0IGZpeGVkCi0gICAgICogcHJvcGVybHkuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSB0YXJnZXQgaF9zYW1wX2ZhY3RvciAmIHZfc2FtcF9mYWN0b3IKLSAgICAgKiB3aWxsIGdldCBzZXQgdG8gMSwgd2hpY2ggdHlwaWNhbGx5IHdvbid0IG1hdGNoIHRoZSBzb3VyY2UuCi0gICAgICogSW4gZmFjdCB3ZSBkbyB0aGlzIGV2ZW4gaWYgdGhlIHNvdXJjZSBpcyBhbHJlYWR5IGdyYXlzY2FsZTsgdGhhdAotICAgICAqIHByb3ZpZGVzIGFuIGVhc3kgd2F5IG9mIGNvZXJjaW5nIGEgZ3JheXNjYWxlIEpQRUcgd2l0aCBmdW5ueSBzYW1wbGluZwotICAgICAqIGZhY3RvcnMgdG8gdGhlIGN1c3RvbWFyeSAxLDEuICAoU29tZSBkZWNvZGVycyBmYWlsIG9uIG90aGVyIGZhY3RvcnMuKQotICAgICAqLwotICAgIGlmICgoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgJiYKLQkgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMykgfHwKLQkoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFICYmCi0JIGRzdGluZm8tPm51bV9jb21wb25lbnRzID09IDEpKSB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBzb3VyY2UncyBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyLiAqLwotICAgICAgaW50IHN2X3F1YW50X3RibF9ubyA9IGRzdGluZm8tPmNvbXBfaW5mb1swXS5xdWFudF90Ymxfbm87Ci0gICAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGRzdGluZm8sIEpDU19HUkFZU0NBTEUpOwotICAgICAgZHN0aW5mby0+Y29tcF9pbmZvWzBdLnF1YW50X3RibF9ubyA9IHN2X3F1YW50X3RibF9ubzsKLSAgICB9IGVsc2UgewotICAgICAgLyogU29ycnksIGNhbid0IGRvIGl0ICovCi0gICAgICBFUlJFWElUKGRzdGluZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICB9Ci0gIH0KLQotICAvKiBDb3JyZWN0IHRoZSBkZXN0aW5hdGlvbidzIGltYWdlIGRpbWVuc2lvbnMgZXRjIGlmIG5lY2Vzc2FyeSAqLwotICBzd2l0Y2ggKGluZm8tPnRyYW5zZm9ybSkgewotICBjYXNlIEpYRk9STV9OT05FOgotICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9IOgotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9GTElQX1Y6Ci0gICAgaWYgKGluZm8tPnRyaW0pCi0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6Ci0gICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7Ci0gICAgLyogdHJhbnNwb3NlIGRvZXMgTk9UIGhhdmUgdG8gdHJpbSBhbnl0aGluZyAqLwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKSB7Ci0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzkwOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIGlmIChpbmZvLT50cmltKSB7Ci0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKLSAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKLSAgICBpZiAoaW5mby0+dHJpbSkKLSAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBkYXRhIHNldCAqLwotICBpZiAoaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzICE9IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5czsKLSAgcmV0dXJuIHNyY19jb2VmX2FycmF5czsKLX0KLQotCi0vKiBFeGVjdXRlIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24sIGlmIGFueS4KLSAqCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlcioganBlZ193cml0ZV9jb2VmZmljaWVudHMsIGJlY2F1c2UgaXQgZGVwZW5kcwotICogb24ganBlZ193cml0ZV9jb2VmZmljaWVudHMgdG8gaGF2ZSBjb21wdXRlZCBzdWJzaWRpYXJ5IHZhbHVlcyBzdWNoIGFzCi0gKiB0aGUgcGVyLWNvbXBvbmVudCB3aWR0aCBhbmQgaGVpZ2h0IGZpZWxkcyBpbiB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgotICoKLSAqIE5vdGUgdGhhdCBzb21lIHRyYW5zZm9ybWF0aW9ucyB3aWxsIG1vZGlmeSB0aGUgc291cmNlIGRhdGEgYXJyYXlzIQotICovCi0KLUdMT0JBTCh2b2lkKQotanRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkJICAgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkJCQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JCQkJICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykKLXsKLSAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzID0gaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzOwotCi0gIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7Ci0gIGNhc2UgSlhGT1JNX05PTkU6Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX0ZMSVBfSDoKLSAgICBkb19mbGlwX2goc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9WOgotICAgIGRvX2ZsaXBfdihzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKLSAgICBkb190cmFuc3Bvc2Uoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgotICAgIGRvX3RyYW5zdmVyc2Uoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfOTA6Ci0gICAgZG9fcm90XzkwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKLSAgICBkb19yb3RfMTgwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKLSAgICBkb19yb3RfMjcwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0jZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KLQotCi0vKiBTZXR1cCBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBzYXZlIGRlc2lyZWQgbWFya2VycyBpbiBtZW1vcnkuCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qY29weV9tYXJrZXJzX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIEpDT1BZX09QVElPTiBvcHRpb24pCi17Ci0jaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAotICBpbnQgbTsKLQotICAvKiBTYXZlIGNvbW1lbnRzIGV4Y2VwdCB1bmRlciBOT05FIG9wdGlvbiAqLwotICBpZiAob3B0aW9uICE9IEpDT1BZT1BUX05PTkUpIHsKLSAgICBqcGVnX3NhdmVfbWFya2VycyhzcmNpbmZvLCBKUEVHX0NPTSwgMHhGRkZGKTsKLSAgfQotICAvKiBTYXZlIGFsbCB0eXBlcyBvZiBBUFBuIG1hcmtlcnMgaWZmIEFMTCBvcHRpb24gKi8KLSAgaWYgKG9wdGlvbiA9PSBKQ09QWU9QVF9BTEwpIHsKLSAgICBmb3IgKG0gPSAwOyBtIDwgMTY7IG0rKykKLSAgICAgIGpwZWdfc2F2ZV9tYXJrZXJzKHNyY2luZm8sIEpQRUdfQVBQMCArIG0sIDB4RkZGRik7Ci0gIH0KLSNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCi19Ci0KLS8qIENvcHkgbWFya2VycyBzYXZlZCBpbiB0aGUgZ2l2ZW4gc291cmNlIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIG9yCi0gKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotICogTm90ZSB0aGF0IHRob3NlIHJvdXRpbmVzIHdpbGwgaGF2ZSB3cml0dGVuIHRoZSBTT0ksIGFuZCBhbHNvIHRoZQotICogSkZJRiBBUFAwIG9yIEFkb2JlIEFQUDE0IG1hcmtlcnMgaWYgc2VsZWN0ZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qY29weV9tYXJrZXJzX2V4ZWN1dGUgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkJICAgICAgIEpDT1BZX09QVElPTiBvcHRpb24pCi17Ci0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXI7Ci0KLSAgLyogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gZXhhbWluZSB0aGUKLSAgICogb3B0aW9uIGZsYWcgaGVyZTsgd2UganVzdCBjb3B5IGV2ZXJ5dGhpbmcgdGhhdCBnb3Qgc2F2ZWQuCi0gICAqIEJ1dCB0byBhdm9pZCBjb25mdXNpb24sIHdlIGRvIG5vdCBvdXRwdXQgSkZJRiBhbmQgQWRvYmUgQVBQMTQgbWFya2VycwotICAgKiBpZiB0aGUgZW5jb2RlciBsaWJyYXJ5IGFscmVhZHkgd3JvdGUgb25lLgotICAgKi8KLSAgZm9yIChtYXJrZXIgPSBzcmNpbmZvLT5tYXJrZXJfbGlzdDsgbWFya2VyICE9IE5VTEw7IG1hcmtlciA9IG1hcmtlci0+bmV4dCkgewotICAgIGlmIChkc3RpbmZvLT53cml0ZV9KRklGX2hlYWRlciAmJgotCW1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMCAmJgotCW1hcmtlci0+ZGF0YV9sZW5ndGggPj0gNSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMF0pID09IDB4NEEgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzFdKSA9PSAweDQ2ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsyXSkgPT0gMHg0OSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbM10pID09IDB4NDYgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzRdKSA9PSAwKQotICAgICAgY29udGludWU7CQkJLyogcmVqZWN0IGR1cGxpY2F0ZSBKRklGICovCi0gICAgaWYgKGRzdGluZm8tPndyaXRlX0Fkb2JlX21hcmtlciAmJgotCW1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMCsxNCAmJgotCW1hcmtlci0+ZGF0YV9sZW5ndGggPj0gNSAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMF0pID09IDB4NDEgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzFdKSA9PSAweDY0ICYmCi0JR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsyXSkgPT0gMHg2RiAmJgotCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbM10pID09IDB4NjIgJiYKLQlHRVRKT0NURVQobWFya2VyLT5kYXRhWzRdKSA9PSAweDY1KQotICAgICAgY29udGludWU7CQkJLyogcmVqZWN0IGR1cGxpY2F0ZSBBZG9iZSAqLwotI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCi0gICAgLyogV2UgY291bGQgdXNlIGpwZWdfd3JpdGVfbWFya2VyIGlmIHRoZSBkYXRhIHdlcmVuJ3QgRkFSLi4uICovCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBqcGVnX3dyaXRlX21faGVhZGVyKGRzdGluZm8sIG1hcmtlci0+bWFya2VyLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXJrZXItPmRhdGFfbGVuZ3RoOyBpKyspCi0JanBlZ193cml0ZV9tX2J5dGUoZHN0aW5mbywgbWFya2VyLT5kYXRhW2ldKTsKLSAgICB9Ci0jZWxzZQotICAgIGpwZWdfd3JpdGVfbWFya2VyKGRzdGluZm8sIG1hcmtlci0+bWFya2VyLAotCQkgICAgICBtYXJrZXItPmRhdGEsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOwotI2VuZGlmCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3RyYW5zdXBwLmggYi9saWJqcGVndHdycC90cmFuc3VwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJkMzJhLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3RyYW5zdXBwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIHRyYW5zdXBwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBpbWFnZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBhbmQKLSAqIG90aGVyIHV0aWxpdHkgY29kZSB1c2VkIGJ5IHRoZSBqcGVndHJhbiBzYW1wbGUgYXBwbGljYXRpb24uICBUaGVzZSBhcmUKLSAqIE5PVCBwYXJ0IG9mIHRoZSBjb3JlIEpQRUcgbGlicmFyeS4gIEJ1dCB3ZSBrZWVwIHRoZXNlIHJvdXRpbmVzIHNlcGFyYXRlCi0gKiBmcm9tIGpwZWd0cmFuLmMgdG8gZWFzZSB0aGUgdGFzayBvZiBtYWludGFpbmluZyBqcGVndHJhbi1saWtlIHByb2dyYW1zCi0gKiB0aGF0IGhhdmUgb3RoZXIgdXNlciBpbnRlcmZhY2VzLgotICoKLSAqIE5PVEU6IGFsbCB0aGUgcm91dGluZXMgZGVjbGFyZWQgaGVyZSBoYXZlIHZlcnkgc3BlY2lmaWMgcmVxdWlyZW1lbnRzCi0gKiBhYm91dCB3aGVuIHRoZXkgYXJlIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiB0aGUKLSAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZmlsZXMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRyYW5zdXBwLmMsIG9yIHNlZQotICoganBlZ3RyYW4uYyBmb3IgYW4gZXhhbXBsZSBvZiBjb3JyZWN0IHVzYWdlLgotICovCi0KLS8qIElmIHlvdSBoYXBwZW4gbm90IHRvIHdhbnQgdGhlIGltYWdlIHRyYW5zZm9ybSBzdXBwb3J0LCBkaXNhYmxlIGl0IGhlcmUgKi8KLSNpZm5kZWYgVFJBTlNGT1JNU19TVVBQT1JURUQKLSNkZWZpbmUgVFJBTlNGT1JNU19TVVBQT1JURUQgMQkJLyogMCBkaXNhYmxlcyB0cmFuc2Zvcm0gY29kZSAqLwotI2VuZGlmCi0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCQlqVHJSZXF1ZXN0Ci0jZGVmaW5lIGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMJCWpUckFkanVzdAotI2RlZmluZSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24JalRyRXhlYwotI2RlZmluZSBqY29weV9tYXJrZXJzX3NldHVwCQkJakNNcmtTZXR1cAotI2RlZmluZSBqY29weV9tYXJrZXJzX2V4ZWN1dGUJCQlqQ01ya0V4ZWMKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyoKLSAqIENvZGVzIGZvciBzdXBwb3J0ZWQgdHlwZXMgb2YgaW1hZ2UgdHJhbnNmb3JtYXRpb25zLgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSlhGT1JNX05PTkUsCQkvKiBubyB0cmFuc2Zvcm1hdGlvbiAqLwotCUpYRk9STV9GTElQX0gsCQkvKiBob3Jpem9udGFsIGZsaXAgKi8KLQlKWEZPUk1fRkxJUF9WLAkJLyogdmVydGljYWwgZmxpcCAqLwotCUpYRk9STV9UUkFOU1BPU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVUwtdG8tTFIgYXhpcyAqLwotCUpYRk9STV9UUkFOU1ZFUlNFLAkvKiB0cmFuc3Bvc2UgYWNyb3NzIFVSLXRvLUxMIGF4aXMgKi8KLQlKWEZPUk1fUk9UXzkwLAkJLyogOTAtZGVncmVlIGNsb2Nrd2lzZSByb3RhdGlvbiAqLwotCUpYRk9STV9ST1RfMTgwLAkJLyogMTgwLWRlZ3JlZSByb3RhdGlvbiAqLwotCUpYRk9STV9ST1RfMjcwCQkvKiAyNzAtZGVncmVlIGNsb2Nrd2lzZSAob3IgOTAgY2N3KSAqLwotfSBKWEZPUk1fQ09ERTsKLQotLyoKLSAqIEFsdGhvdWdoIHJvdGF0aW5nIGFuZCBmbGlwcGluZyBkYXRhIGV4cHJlc3NlZCBhcyBEQ1QgY29lZmZpY2llbnRzIGlzIG5vdAotICogaGFyZCwgdGhlcmUgaXMgYW4gYXN5bW1ldHJ5IGluIHRoZSBKUEVHIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciBpbWFnZXMKLSAqIHdob3NlIGRpbWVuc2lvbnMgYXJlbid0IG11bHRpcGxlcyBvZiB0aGUgaU1DVSBzaXplLiAgVGhlIHJpZ2h0IGFuZCBib3R0b20KLSAqIGltYWdlIGVkZ2VzIGFyZSBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnkgd2l0aCBqdW5rIGRhdGE7IGJ1dAotICogbm8gcGFkZGluZyBpcyBwb3NzaWJsZSBhdCB0aGUgdG9wIGFuZCBsZWZ0IGVkZ2VzLiAgSWYgd2Ugd2VyZSB0byBmbGlwCi0gKiB0aGUgd2hvbGUgaW1hZ2UgaW5jbHVkaW5nIHRoZSBwYWQgZGF0YSwgdGhlbiBwYWQgZ2FyYmFnZSB3b3VsZCBiZWNvbWUKLSAqIHZpc2libGUgYXQgdGhlIHRvcCBhbmQvb3IgbGVmdCwgYW5kIHJlYWwgcGl4ZWxzIHdvdWxkIGRpc2FwcGVhciBpbnRvIHRoZQotICogcGFkIG1hcmdpbnMgLS0tIHBlcmhhcHMgcGVybWFuZW50bHksIHNpbmNlIGVuY29kZXJzICYgZGVjb2RlcnMgbWF5IG5vdAotICogYm90aGVyIHRvIHByZXNlcnZlIERDVCBibG9ja3MgdGhhdCBhcHBlYXIgdG8gYmUgY29tcGxldGVseSBvdXRzaWRlIHRoZQotICogbm9taW5hbCBpbWFnZSBhcmVhLiAgU28sIHdlIGhhdmUgdG8gZXhjbHVkZSBhbnkgcGFydGlhbCBpTUNVcyBmcm9tIHRoZQotICogYmFzaWMgdHJhbnNmb3JtYXRpb24uCi0gKgotICogVHJhbnNwb3NlIGlzIHRoZSBvbmx5IHRyYW5zZm9ybWF0aW9uIHRoYXQgY2FuIGhhbmRsZSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZQotICogcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyBjb21wbGV0ZWx5IGNsZWFubHkuICBmbGlwX2ggY2FuIGZsaXAgcGFydGlhbCBpTUNVcwotICogYXQgdGhlIGJvdHRvbSwgYnV0IGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVcyBhdCB0aGUgcmlnaHQgZWRnZSB1bnRvdWNoZWQuCi0gKiBTaW1pbGFybHkgZmxpcF92IGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVcyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLgotICogVGhlIG90aGVyIHRyYW5zZm9ybXMgYXJlIGRlZmluZWQgYXMgY29tYmluYXRpb25zIG9mIHRoZXNlIGJhc2ljIHRyYW5zZm9ybXMKLSAqIGFuZCBwcm9jZXNzIGVkZ2UgYmxvY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIHRoZSBlcXVpdmFsZW5jZS4KLSAqCi0gKiBUaGUgInRyaW0iIG9wdGlvbiBjYXVzZXMgdW50cmFuc2Zvcm1hYmxlIHBhcnRpYWwgaU1DVXMgdG8gYmUgZHJvcHBlZDsKLSAqIHRoaXMgaXMgbm90IHN0cmljdGx5IGxvc3NsZXNzLCBidXQgaXQgdXN1YWxseSBnaXZlcyB0aGUgYmVzdC1sb29raW5nCi0gKiByZXN1bHQgZm9yIG9kZC1zaXplIGltYWdlcy4gIE5vdGUgdGhhdCB3aGVuIHRoaXMgb3B0aW9uIGlzIGFjdGl2ZSwKLSAqIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwgZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybXMgbWF5IG5vdCBob2xkLgotICogKEZvciBleGFtcGxlLCAtcm90IDI3MCAtdHJpbSB0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0IC1yb3QgOTAgLXRyaW0KLSAqIGZvbGxvd2VkIGJ5IC1yb3QgMTgwIC10cmltIHRyaW1zIGJvdGggZWRnZXMuKQotICoKLSAqIFdlIGFsc28gb2ZmZXIgYSAiZm9yY2UgdG8gZ3JheXNjYWxlIiBvcHRpb24sIHdoaWNoIHNpbXBseSBkaXNjYXJkcyB0aGUKLSAqIGNocm9taW5hbmNlIGNoYW5uZWxzIG9mIGEgWUNiQ3IgaW1hZ2UuICBUaGlzIGlzIGxvc3NsZXNzIGluIHRoZSBzZW5zZSB0aGF0Ci0gKiB0aGUgbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHkuICBJdCdzIG5vdCB0aGUgc2FtZSBraW5kIG9mCi0gKiB0aGluZyBhcyB0aGUgcm90YXRlL2ZsaXAgdHJhbnNmb3JtYXRpb25zLCBidXQgaXQncyBjb252ZW5pZW50IHRvIGhhbmRsZSBpdAotICogYXMgcGFydCBvZiB0aGlzIHBhY2thZ2UsIG1haW5seSBiZWNhdXNlIHRoZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBoYXZlIHRvCi0gKiBiZSBhd2FyZSBvZiB0aGUgb3B0aW9uIHRvIGtub3cgaG93IG1hbnkgY29tcG9uZW50cyB0byB3b3JrIG9uLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogT3B0aW9uczogc2V0IGJ5IGNhbGxlciAqLwotICBKWEZPUk1fQ09ERSB0cmFuc2Zvcm07CS8qIGltYWdlIHRyYW5zZm9ybSBvcGVyYXRvciAqLwotICBib29sZWFuIHRyaW07CQkJLyogaWYgVFJVRSwgdHJpbSBwYXJ0aWFsIE1DVXMgYXMgbmVlZGVkICovCi0gIGJvb2xlYW4gZm9yY2VfZ3JheXNjYWxlOwkvKiBpZiBUUlVFLCBjb252ZXJ0IGNvbG9yIGltYWdlIHRvIGdyYXlzY2FsZSAqLwotCi0gIC8qIEludGVybmFsIHdvcmtzcGFjZTogY2FsbGVyIHNob3VsZCBub3QgdG91Y2ggdGhlc2UgKi8KLSAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb21wb25lbnRzIGluIHdvcmtzcGFjZSAqLwotICBqdmlydF9iYXJyYXlfcHRyICogd29ya3NwYWNlX2NvZWZfYXJyYXlzOyAvKiB3b3Jrc3BhY2UgZm9yIHRyYW5zZm9ybWF0aW9ucyAqLwotfSBqcGVnX3RyYW5zZm9ybV9pbmZvOwotCi0KLSNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotCi0vKiBSZXF1ZXN0IGFueSByZXF1aXJlZCB3b3Jrc3BhY2UgKi8KLUVYVEVSTih2b2lkKSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKLS8qIEFkanVzdCBvdXRwdXQgaW1hZ2UgcGFyYW1ldGVycyAqLwotRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwotLyogRXhlY3V0ZSB0aGUgYWN0dWFsIHRyYW5zZm9ybWF0aW9uLCBpZiBhbnkgKi8KLUVYVEVSTih2b2lkKSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24KLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKLQkgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKLQotI2VuZGlmIC8qIFRSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIFN1cHBvcnQgZm9yIGNvcHlpbmcgb3B0aW9uYWwgbWFya2VycyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBmaWxlLgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkNPUFlPUFRfTk9ORSwJCS8qIGNvcHkgbm8gb3B0aW9uYWwgbWFya2VycyAqLwotCUpDT1BZT1BUX0NPTU1FTlRTLAkvKiBjb3B5IG9ubHkgY29tbWVudCAoQ09NKSBtYXJrZXJzICovCi0JSkNPUFlPUFRfQUxMCQkvKiBjb3B5IGFsbCBvcHRpb25hbCBtYXJrZXJzICovCi19IEpDT1BZX09QVElPTjsKLQotI2RlZmluZSBKQ09QWU9QVF9ERUZBVUxUICBKQ09QWU9QVF9DT01NRU5UUwkvKiByZWNvbW1lbmRlZCBkZWZhdWx0ICovCi0KLS8qIFNldHVwIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHNhdmUgZGVzaXJlZCBtYXJrZXJzIGluIG1lbW9yeSAqLwotRVhURVJOKHZvaWQpIGpjb3B5X21hcmtlcnNfc2V0dXAKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgSkNPUFlfT1BUSU9OIG9wdGlvbikpOwotLyogQ29weSBtYXJrZXJzIHNhdmVkIGluIHRoZSBnaXZlbiBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLUVYVEVSTih2b2lkKSBqY29weV9tYXJrZXJzX2V4ZWN1dGUKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICAgIEpDT1BZX09QVElPTiBvcHRpb24pKTsKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3VzYWdlLmRvYyBiL2xpYmpwZWd0d3JwL3VzYWdlLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0OTcwYS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC91c2FnZS5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotVVNBR0UgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZmlsZSBkZXNjcmliZXMgdXNhZ2Ugb2YgdGhlIEpQRUcgY29udmVyc2lvbiBwcm9ncmFtcyBjanBlZyBhbmQgZGpwZWcsCi1hcyB3ZWxsIGFzIHRoZSB1dGlsaXR5IHByb2dyYW1zIGpwZWd0cmFuLCByZGpwZ2NvbSBhbmQgd3JqcGdjb20uICAoU2VlCi10aGUgb3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSB3aXRoaW4KLXlvdXIgb3duIHByb2dyYW1zLikKLQotSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSB5b3UgbWF5IHByZWZlciB0byByZWFkIHRoZSBVbml4LXN0eWxlIG1hbnVhbAotcGFnZXMgaW4gZmlsZXMgY2pwZWcuMSwgZGpwZWcuMSwganBlZ3RyYW4uMSwgcmRqcGdjb20uMSwgd3JqcGdjb20uMS4KLQotCi1JTlRST0RVQ1RJT04KLQotVGhlc2UgcHJvZ3JhbXMgaW1wbGVtZW50IEpQRUcgaW1hZ2UgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICBKUEVHCi0ocHJvbm91bmNlZCAiamF5LXBlZyIpIGlzIGEgc3RhbmRhcmRpemVkIGNvbXByZXNzaW9uIG1ldGhvZCBmb3IgZnVsbC1jb2xvcgotYW5kIGdyYXktc2NhbGUgaW1hZ2VzLiAgSlBFRyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgInJlYWwtd29ybGQiIHNjZW5lcywKLWZvciBleGFtcGxlIHNjYW5uZWQgcGhvdG9ncmFwaHMuICBDYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyCi1ub24tcmVhbGlzdGljIGltYWdlcyBhcmUgbm90IEpQRUcncyBzdHJvbmcgc3VpdDsgb24gdGhhdCBzb3J0IG9mIG1hdGVyaWFsCi15b3UgbWF5IGdldCBwb29yIGltYWdlIHF1YWxpdHkgYW5kL29yIGxpdHRsZSBjb21wcmVzc2lvbi4KLQotSlBFRyBpcyBsb3NzeSwgbWVhbmluZyB0aGF0IHRoZSBvdXRwdXQgaW1hZ2UgaXMgbm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCB0bwotdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IHNob3VsZCBub3QgdXNlIEpQRUcgaWYgeW91IGhhdmUgdG8gaGF2ZSBpZGVudGljYWwKLW91dHB1dCBiaXRzLiAgSG93ZXZlciwgb24gdHlwaWNhbCByZWFsLXdvcmxkIGltYWdlcywgdmVyeSBnb29kIGNvbXByZXNzaW9uCi1sZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZCBhbWF6aW5nbHkgaGlnaCBjb21wcmVzc2lvbgotaXMgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhIGxvdy1xdWFsaXR5IGltYWdlLiAgWW91IGNhbiB0cmFkZSBvZmYgaW1hZ2UKLXF1YWxpdHkgYWdhaW5zdCBmaWxlIHNpemUgYnkgYWRqdXN0aW5nIHRoZSBjb21wcmVzc29yJ3MgInF1YWxpdHkiIHNldHRpbmcuCi0KLQotR0VORVJBTCBVU0FHRQotCi1XZSBwcm92aWRlIHR3byBwcm9ncmFtcywgY2pwZWcgdG8gY29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpbnRvIEpQRUcgZm9ybWF0LAotYW5kIGRqcGVnIHRvIGRlY29tcHJlc3MgYSBKUEVHIGZpbGUgYmFjayBpbnRvIGEgY29udmVudGlvbmFsIGltYWdlIGZvcm1hdC4KLQotT24gVW5peC1saWtlIHN5c3RlbXMsIHlvdSBzYXk6Ci0JY2pwZWcgW3N3aXRjaGVzXSBbaW1hZ2VmaWxlXSA+anBlZ2ZpbGUKLW9yCi0JZGpwZWcgW3N3aXRjaGVzXSBbanBlZ2ZpbGVdICA+aW1hZ2VmaWxlCi1UaGUgcHJvZ3JhbXMgcmVhZCB0aGUgc3BlY2lmaWVkIGlucHV0IGZpbGUsIG9yIHN0YW5kYXJkIGlucHV0IGlmIG5vbmUgaXMKLW5hbWVkLiAgVGhleSBhbHdheXMgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0ICh3aXRoIHRyYWNlL2Vycm9yIG1lc3NhZ2VzIHRvCi1zdGFuZGFyZCBlcnJvcikuICBUaGVzZSBjb252ZW50aW9ucyBhcmUgaGFuZHkgZm9yIHBpcGluZyBpbWFnZXMgYmV0d2VlbgotcHJvZ3JhbXMuCi0KLU9uIG1vc3Qgbm9uLVVuaXggc3lzdGVtcywgeW91IHNheToKLQljanBlZyBbc3dpdGNoZXNdIGltYWdlZmlsZSBqcGVnZmlsZQotb3IKLQlkanBlZyBbc3dpdGNoZXNdIGpwZWdmaWxlICBpbWFnZWZpbGUKLWkuZS4sIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGlzCi1zdHlsZSBpcyBhIGxpdHRsZSBtb3JlIGZvb2xwcm9vZiwgYW5kIGl0IGxvc2VzIG5vIGZ1bmN0aW9uYWxpdHkgaWYgeW91IGRvbid0Ci1oYXZlIHBpcGVzLiAgKFlvdSBjYW4gZ2V0IHRoaXMgc3R5bGUgb24gVW5peCB0b28sIGlmIHlvdSBwcmVmZXIsIGJ5IGRlZmluaW5nCi1UV09fRklMRV9DT01NQU5ETElORSB3aGVuIHlvdSBjb21waWxlIHRoZSBwcm9ncmFtczsgc2VlIGluc3RhbGwuZG9jLikKLQotWW91IGNhbiBhbHNvIHNheToKLQljanBlZyBbc3dpdGNoZXNdIC1vdXRmaWxlIGpwZWdmaWxlICBpbWFnZWZpbGUKLW9yCi0JZGpwZWcgW3N3aXRjaGVzXSAtb3V0ZmlsZSBpbWFnZWZpbGUgIGpwZWdmaWxlCi1UaGlzIHN5bnRheCB3b3JrcyBvbiBhbGwgc3lzdGVtcywgc28gaXQgaXMgdXNlZnVsIGZvciBzY3JpcHRzLgotCi1UaGUgY3VycmVudGx5IHN1cHBvcnRlZCBpbWFnZSBmaWxlIGZvcm1hdHMgYXJlOiBQUE0gKFBCTVBMVVMgY29sb3IgZm9ybWF0KSwKLVBHTSAoUEJNUExVUyBncmF5LXNjYWxlIGZvcm1hdCksIEJNUCwgVGFyZ2EsIGFuZCBSTEUgKFV0YWggUmFzdGVyIFRvb2xraXQKLWZvcm1hdCkuICAoUkxFIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBVUlQgbGlicmFyeSBpcyBhdmFpbGFibGUuKQotY2pwZWcgcmVjb2duaXplcyB0aGUgaW5wdXQgaW1hZ2UgZm9ybWF0IGF1dG9tYXRpY2FsbHksIHdpdGggdGhlIGV4Y2VwdGlvbgotb2Ygc29tZSBUYXJnYS1mb3JtYXQgZmlsZXMuICBZb3UgaGF2ZSB0byB0ZWxsIGRqcGVnIHdoaWNoIGZvcm1hdCB0byBnZW5lcmF0ZS4KLQotSlBFRyBmaWxlcyBhcmUgaW4gdGhlIGRlZmFjdG8gc3RhbmRhcmQgSkZJRiBmaWxlIGZvcm1hdC4gIFRoZXJlIGFyZSBvdGhlciwKLWxlc3Mgd2lkZWx5IHVzZWQgSlBFRy1iYXNlZCBmaWxlIGZvcm1hdHMsIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uCi0KLUFsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwgLWdyYXlzY2FsZSBtYXkgYmUgd3JpdHRlbgotLWdyYXkgb3IgLWdyLiAgTW9zdCBvZiB0aGUgImJhc2ljIiBzd2l0Y2hlcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gYXMgbGl0dGxlIGFzCi1vbmUgbGV0dGVyLiAgVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQgKC1CTVAgaXMgdGhlIHNhbWUgYXMgLWJtcCkuCi1Ccml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwgLWdyZXlzY2FsZSksIHRob3VnaCBmb3IgYnJldml0eQotdGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCi0KLQotQ0pQRUcgREVUQUlMUwotCi1UaGUgYmFzaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIGZvciBjanBlZyBhcmU6Ci0KLQktcXVhbGl0eSBOCVNjYWxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYWRqdXN0IGltYWdlIHF1YWxpdHkuCi0JCQlRdWFsaXR5IGlzIDAgKHdvcnN0KSB0byAxMDAgKGJlc3QpOyBkZWZhdWx0IGlzIDc1LgotCQkJKFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKLQotCS1ncmF5c2NhbGUJQ3JlYXRlIG1vbm9jaHJvbWUgSlBFRyBmaWxlIGZyb20gY29sb3IgaW5wdXQuCi0JCQlCZSBzdXJlIHRvIHVzZSB0aGlzIHN3aXRjaCB3aGVuIGNvbXByZXNzaW5nIGEgZ3JheXNjYWxlCi0JCQlCTVAgZmlsZSwgYmVjYXVzZSBjanBlZyBpc24ndCBicmlnaHQgZW5vdWdoIHRvIG5vdGljZQotCQkJd2hldGhlciBhIEJNUCBmaWxlIHVzZXMgb25seSBzaGFkZXMgb2YgZ3JheS4gIEJ5Ci0JCQlzYXlpbmcgLWdyYXlzY2FsZSwgeW91J2xsIGdldCBhIHNtYWxsZXIgSlBFRyBmaWxlIHRoYXQKLQkJCXRha2VzIGxlc3MgdGltZSB0byBwcm9jZXNzLgotCi0JLW9wdGltaXplCVBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4KLQkJCVdpdGhvdXQgdGhpcywgZGVmYXVsdCBlbmNvZGluZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgotCQkJLW9wdGltaXplIHVzdWFsbHkgbWFrZXMgdGhlIEpQRUcgZmlsZSBhIGxpdHRsZSBzbWFsbGVyLAotCQkJYnV0IGNqcGVnIHJ1bnMgc29tZXdoYXQgc2xvd2VyIGFuZCBuZWVkcyBtdWNoIG1vcmUKLQkJCW1lbW9yeS4gIEltYWdlIHF1YWxpdHkgYW5kIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gYXJlCi0JCQl1bmFmZmVjdGVkIGJ5IC1vcHRpbWl6ZS4KLQotCS1wcm9ncmVzc2l2ZQlDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIChzZWUgYmVsb3cpLgotCi0JLXRhcmdhCQlJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdC4gIFRhcmdhIGZpbGVzIHRoYXQgY29udGFpbgotCQkJYW4gImlkZW50aWZpY2F0aW9uIiBmaWVsZCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5Ci0JCQlyZWNvZ25pemVkIGJ5IGNqcGVnOyBmb3Igc3VjaCBmaWxlcyB5b3UgbXVzdCBzcGVjaWZ5Ci0JCQktdGFyZ2EgdG8gbWFrZSBjanBlZyB0cmVhdCB0aGUgaW5wdXQgYXMgVGFyZ2EgZm9ybWF0LgotCQkJRm9yIG1vc3QgVGFyZ2EgZmlsZXMsIHlvdSB3b24ndCBuZWVkIHRoaXMgc3dpdGNoLgotCi1UaGUgLXF1YWxpdHkgc3dpdGNoIGxldHMgeW91IHRyYWRlIG9mZiBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhZ2FpbnN0IHF1YWxpdHkgb2YKLXRoZSByZWNvbnN0cnVjdGVkIGltYWdlOiB0aGUgaGlnaGVyIHRoZSBxdWFsaXR5IHNldHRpbmcsIHRoZSBsYXJnZXIgdGhlIEpQRUcKLWZpbGUsIGFuZCB0aGUgY2xvc2VyIHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB0byB0aGUgb3JpZ2luYWwgaW5wdXQuICBOb3JtYWxseQoteW91IHdhbnQgdG8gdXNlIHRoZSBsb3dlc3QgcXVhbGl0eSBzZXR0aW5nIChzbWFsbGVzdCBmaWxlKSB0aGF0IGRlY29tcHJlc3NlcwotaW50byBzb21ldGhpbmcgdmlzdWFsbHkgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2UuICBGb3IgdGhpcwotcHVycG9zZSB0aGUgcXVhbGl0eSBzZXR0aW5nIHNob3VsZCBiZSBiZXR3ZWVuIDUwIGFuZCA5NTsgdGhlIGRlZmF1bHQgb2YgNzUgaXMKLW9mdGVuIGFib3V0IHJpZ2h0LiAgSWYgeW91IHNlZSBkZWZlY3RzIGF0IC1xdWFsaXR5IDc1LCB0aGVuIGdvIHVwIDUgb3IgMTAKLWNvdW50cyBhdCBhIHRpbWUgdW50aWwgeW91IGFyZSBoYXBweSB3aXRoIHRoZSBvdXRwdXQgaW1hZ2UuICAoVGhlIG9wdGltYWwKLXNldHRpbmcgd2lsbCB2YXJ5IGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuKQotCi0tcXVhbGl0eSAxMDAgd2lsbCBnZW5lcmF0ZSBhIHF1YW50aXphdGlvbiB0YWJsZSBvZiBhbGwgMSdzLCBtaW5pbWl6aW5nIGxvc3MKLWluIHRoZSBxdWFudGl6YXRpb24gc3RlcCAoYnV0IHRoZXJlIGlzIHN0aWxsIGluZm9ybWF0aW9uIGxvc3MgaW4gc3Vic2FtcGxpbmcsCi1hcyB3ZWxsIGFzIHJvdW5kb2ZmIGVycm9yKS4gIFRoaXMgc2V0dGluZyBpcyBtYWlubHkgb2YgaW50ZXJlc3QgZm9yCi1leHBlcmltZW50YWwgcHVycG9zZXMuICBRdWFsaXR5IHZhbHVlcyBhYm92ZSBhYm91dCA5NSBhcmUgTk9UIHJlY29tbWVuZGVkIGZvcgotbm9ybWFsIHVzZTsgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGdvZXMgdXAgZHJhbWF0aWNhbGx5IGZvciBoYXJkbHkgYW55IGdhaW4KLWluIG91dHB1dCBpbWFnZSBxdWFsaXR5LgotCi1JbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBxdWFsaXR5IHZhbHVlcyBiZWxvdyA1MCB3aWxsIHByb2R1Y2UgdmVyeSBzbWFsbCBmaWxlcwotb2YgbG93IGltYWdlIHF1YWxpdHkuICBTZXR0aW5ncyBhcm91bmQgNSB0byAxMCBtaWdodCBiZSB1c2VmdWwgaW4gcHJlcGFyaW5nIGFuCi1pbmRleCBvZiBhIGxhcmdlIGltYWdlIGxpYnJhcnksIGZvciBleGFtcGxlLiAgVHJ5IC1xdWFsaXR5IDIgKG9yIHNvKSBmb3Igc29tZQotYW11c2luZyBDdWJpc3QgZWZmZWN0cy4gIChOb3RlOiBxdWFsaXR5IHZhbHVlcyBiZWxvdyBhYm91dCAyNSBnZW5lcmF0ZSAyLWJ5dGUKLXF1YW50aXphdGlvbiB0YWJsZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG9wdGlvbmFsIGluIHRoZSBKUEVHIHN0YW5kYXJkLgotY2pwZWcgZW1pdHMgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB5b3UgZ2l2ZSBzdWNoIGEgcXVhbGl0eSB2YWx1ZSwgYmVjYXVzZSBzb21lCi1vdGhlciBKUEVHIHByb2dyYW1zIG1heSBiZSB1bmFibGUgdG8gZGVjb2RlIHRoZSByZXN1bHRpbmcgZmlsZS4gIFVzZSAtYmFzZWxpbmUKLWlmIHlvdSBuZWVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGF0IGxvdyBxdWFsaXR5IHZhbHVlcy4pCi0KLVRoZSAtcHJvZ3Jlc3NpdmUgc3dpdGNoIGNyZWF0ZXMgYSAicHJvZ3Jlc3NpdmUgSlBFRyIgZmlsZS4gIEluIHRoaXMgdHlwZSBvZgotSlBFRyBmaWxlLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gbXVsdGlwbGUgc2NhbnMgb2YgaW5jcmVhc2luZyBxdWFsaXR5LiAgSWYgdGhlCi1maWxlIGlzIGJlaW5nIHRyYW5zbWl0dGVkIG92ZXIgYSBzbG93IGNvbW11bmljYXRpb25zIGxpbmssIHRoZSBkZWNvZGVyIGNhbiB1c2UKLXRoZSBmaXJzdCBzY2FuIHRvIGRpc3BsYXkgYSBsb3ctcXVhbGl0eSBpbWFnZSB2ZXJ5IHF1aWNrbHksIGFuZCBjYW4gdGhlbgotaW1wcm92ZSB0aGUgZGlzcGxheSB3aXRoIGVhY2ggc3Vic2VxdWVudCBzY2FuLiAgVGhlIGZpbmFsIGltYWdlIGlzIGV4YWN0bHkKLWVxdWl2YWxlbnQgdG8gYSBzdGFuZGFyZCBKUEVHIGZpbGUgb2YgdGhlIHNhbWUgcXVhbGl0eSBzZXR0aW5nLCBhbmQgdGhlIHRvdGFsCi1maWxlIHNpemUgaXMgYWJvdXQgdGhlIHNhbWUgLS0tIG9mdGVuIGEgbGl0dGxlIHNtYWxsZXIuICBDQVVUSU9OOiBwcm9ncmVzc2l2ZQotSlBFRyBpcyBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZCwgc28gbWFueSBkZWNvZGVycyB3aWxsIGJlIHVuYWJsZSB0byB2aWV3IGEKLXByb2dyZXNzaXZlIEpQRUcgZmlsZSBhdCBhbGwuCi0KLVN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKLQotCS1kY3QgaW50CVVzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgotCS1kY3QgZmFzdAlVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCi0JLWRjdCBmbG9hdAlVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KLQkJCVRoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4KLQkJCXRoZSBpbnQgbWV0aG9kLCBidXQgaXMgbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZQotCQkJaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28gbm90ZSB0aGF0Ci0JCQlyZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkKLQkJCWFjcm9zcyBtYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZQotCQkJdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLiAgVGhlIGZhc3QgaW50ZWdlciBtZXRob2QKLQkJCWlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCi0KLQktcmVzdGFydCBOCUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5Ci0JCQlOIE1DVSBibG9ja3MgaWYgIkIiIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0JCQktcmVzdGFydCAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gcmVzdGFydCBtYXJrZXJzLgotCi0JLXNtb290aCBOCVNtb290aCB0aGUgaW5wdXQgaW1hZ2UgdG8gZWxpbWluYXRlIGRpdGhlcmluZyBub2lzZS4KLQkJCU4sIHJhbmdpbmcgZnJvbSAxIHRvIDEwMCwgaW5kaWNhdGVzIHRoZSBzdHJlbmd0aCBvZgotCQkJc21vb3RoaW5nLiAgMCAodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHNtb290aGluZy4KLQotCS1tYXhtZW1vcnkgTglTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcKLQkJCWxhcmdlIGltYWdlcy4gIFZhbHVlIGlzIGluIHRob3VzYW5kcyBvZiBieXRlcywgb3IKLQkJCW1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgotCQkJRm9yIGV4YW1wbGUsIC1tYXggNG0gc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZQotCQkJc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgotCi0JLXZlcmJvc2UJRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZSAtdidzIGdpdmUgbW9yZSBwcmludG91dC4KLQlvciAgLWRlYnVnCUFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotCi1UaGUgLXJlc3RhcnQgb3B0aW9uIGluc2VydHMgZXh0cmEgbWFya2VycyB0aGF0IGFsbG93IGEgSlBFRyBkZWNvZGVyIHRvCi1yZXN5bmNocm9uaXplIGFmdGVyIGEgdHJhbnNtaXNzaW9uIGVycm9yLiAgV2l0aG91dCByZXN0YXJ0IG1hcmtlcnMsIGFueSBkYW1hZ2UKLXRvIGEgY29tcHJlc3NlZCBmaWxlIHdpbGwgdXN1YWxseSBydWluIHRoZSBpbWFnZSBmcm9tIHRoZSBwb2ludCBvZiB0aGUgZXJyb3IKLXRvIHRoZSBlbmQgb2YgdGhlIGltYWdlOyB3aXRoIHJlc3RhcnQgbWFya2VycywgdGhlIGRhbWFnZSBpcyB1c3VhbGx5IGNvbmZpbmVkCi10byB0aGUgcG9ydGlvbiBvZiB0aGUgaW1hZ2UgdXAgdG8gdGhlIG5leHQgcmVzdGFydCBtYXJrZXIuICBPZiBjb3Vyc2UsIHRoZQotcmVzdGFydCBtYXJrZXJzIG9jY3VweSBleHRyYSBzcGFjZS4gIFdlIHJlY29tbWVuZCAtcmVzdGFydCAxIGZvciBpbWFnZXMgdGhhdAotd2lsbCBiZSB0cmFuc21pdHRlZCBhY3Jvc3MgdW5yZWxpYWJsZSBuZXR3b3JrcyBzdWNoIGFzIFVzZW5ldC4KLQotVGhlIC1zbW9vdGggb3B0aW9uIGZpbHRlcnMgdGhlIGlucHV0IHRvIGVsaW1pbmF0ZSBmaW5lLXNjYWxlIG5vaXNlLiAgVGhpcyBpcwotb2Z0ZW4gdXNlZnVsIHdoZW4gY29udmVydGluZyBkaXRoZXJlZCBpbWFnZXMgdG8gSlBFRzogYSBtb2RlcmF0ZSBzbW9vdGhpbmcKLWZhY3RvciBvZiAxMCB0byA1MCBnZXRzIHJpZCBvZiBkaXRoZXJpbmcgcGF0dGVybnMgaW4gdGhlIGlucHV0IGZpbGUsIHJlc3VsdGluZwotaW4gYSBzbWFsbGVyIEpQRUcgZmlsZSBhbmQgYSBiZXR0ZXItbG9va2luZyBpbWFnZS4gIFRvbyBsYXJnZSBhIHNtb290aGluZwotZmFjdG9yIHdpbGwgdmlzaWJseSBibHVyIHRoZSBpbWFnZSwgaG93ZXZlci4KLQotU3dpdGNoZXMgZm9yIHdpemFyZHM6Ci0KLQktYmFzZWxpbmUJRm9yY2UgYmFzZWxpbmUtY29tcGF0aWJsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGJlCi0JCQlnZW5lcmF0ZWQuICBUaGlzIGNsYW1wcyBxdWFudGl6YXRpb24gdmFsdWVzIHRvIDggYml0cwotCQkJZXZlbiBhdCBsb3cgcXVhbGl0eSBzZXR0aW5ncy4gIChUaGlzIHN3aXRjaCBpcyBwb29ybHkKLQkJCW5hbWVkLCBzaW5jZSBpdCBkb2VzIG5vdCBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGlzCi0JCQlhY3R1YWxseSBiYXNlbGluZSBKUEVHLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlCi0JCQktYmFzZWxpbmUgYW5kIC1wcm9ncmVzc2l2ZSB0b2dldGhlci4pCi0KLQktcXRhYmxlcyBmaWxlCVVzZSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkCi0JCQl0ZXh0IGZpbGUuCi0KLQktcXNsb3RzIE5bLC4uLl0gU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yIGVhY2ggY29sb3IKLQkJCWNvbXBvbmVudC4KLQotCS1zYW1wbGUgSHhWWywuLi5dICBTZXQgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudC4KLQotCS1zY2FucyBmaWxlCVVzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCi0KLVRoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcuICBJZiB5b3UKLWRvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBET04nVCBVU0UgVEhFTS4gIFRoZXNlIHN3aXRjaGVzIGFyZSBkb2N1bWVudGVkCi1mdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC5kb2MuCi0KLQotREpQRUcgREVUQUlMUwotCi1UaGUgYmFzaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIGZvciBkanBlZyBhcmU6Ci0KLQktY29sb3JzIE4JUmVkdWNlIGltYWdlIHRvIGF0IG1vc3QgTiBjb2xvcnMuICBUaGlzIHJlZHVjZXMgdGhlCi0Jb3IgLXF1YW50aXplIE4JbnVtYmVyIG9mIGNvbG9ycyB1c2VkIGluIHRoZSBvdXRwdXQgaW1hZ2UsIHNvIHRoYXQgaXQKLQkJCWNhbiBiZSBkaXNwbGF5ZWQgb24gYSBjb2xvcm1hcHBlZCBkaXNwbGF5IG9yIHN0b3JlZCBpbgotCQkJYSBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQotCQkJYW4gOC1iaXQgZGlzcGxheSwgeW91J2QgbmVlZCB0byByZWR1Y2UgdG8gMjU2IG9yIGZld2VyCi0JCQljb2xvcnMuICAoLWNvbG9ycyBpcyB0aGUgcmVjb21tZW5kZWQgbmFtZSwgLXF1YW50aXplCi0JCQlpcyBwcm92aWRlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4pCi0KLQktZmFzdAkJU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgZmFzdCwgbG93Ci0JCQlxdWFsaXR5IG91dHB1dC4gIChUaGUgZGVmYXVsdCBvcHRpb25zIGFyZSBjaG9zZW4gZm9yCi0JCQloaWdoZXN0IHF1YWxpdHkgb3V0cHV0LikgIEN1cnJlbnRseSwgdGhpcyBpcyBlcXVpdmFsZW50Ci0JCQl0byAiLWRjdCBmYXN0IC1ub3Ntb290aCAtb25lcGFzcyAtZGl0aGVyIG9yZGVyZWQiLgotCi0JLWdyYXlzY2FsZQlGb3JjZSBncmF5LXNjYWxlIG91dHB1dCBldmVuIGlmIEpQRUcgZmlsZSBpcyBjb2xvci4KLQkJCVVzZWZ1bCBmb3Igdmlld2luZyBvbiBtb25vY2hyb21lIGRpc3BsYXlzOyBhbHNvLAotCQkJZGpwZWcgcnVucyBub3RpY2VhYmx5IGZhc3RlciBpbiB0aGlzIG1vZGUuCi0KLQktc2NhbGUgTS9OCVNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5Ci0JCQl0aGUgc2NhbGUgZmFjdG9yIG11c3QgYmUgMS8xLCAxLzIsIDEvNCwgb3IgMS84LgotCQkJU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgotCQkJc2NyZWVuOyBhbHNvLCBkanBlZyBydW5zIG11Y2ggZmFzdGVyIHdoZW4gc2NhbGluZwotCQkJZG93biB0aGUgb3V0cHV0LgotCi0JLWJtcAkJU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIGZsYXZvcikuICA4LWJpdAotCQkJY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYgLWNvbG9ycyBvciAtZ3JheXNjYWxlCi0JCQlpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsKLQkJCW90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCi0KLQktZ2lmCQlTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQuICBTaW5jZSBHSUYgZG9lcyBub3Qgc3VwcG9ydAotCQkJbW9yZSB0aGFuIDI1NiBjb2xvcnMsIC1jb2xvcnMgMjU2IGlzIGFzc3VtZWQgKHVubGVzcwotCQkJeW91IHNwZWNpZnkgYSBzbWFsbGVyIG51bWJlciBvZiBjb2xvcnMpLiAgSWYgeW91Ci0JCQlzcGVjaWZ5IC1mYXN0LCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgY29sb3JzIGlzIDIxNi4KLQotCS1vczIJCVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiAxLnggZmxhdm9yKS4gIDgtYml0Ci0JCQljb2xvcm1hcHBlZCBmb3JtYXQgaXMgZW1pdHRlZCBpZiAtY29sb3JzIG9yIC1ncmF5c2NhbGUKLQkJCWlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlOwotCQkJb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KLQotCS1wbm0JCVNlbGVjdCBQQk1QTFVTIChQUE0vUEdNKSBvdXRwdXQgZm9ybWF0ICh0aGlzIGlzIHRoZQotCQkJZGVmYXVsdCBmb3JtYXQpLiAgUEdNIGlzIGVtaXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSBpcwotCQkJZ3JheS1zY2FsZSBvciBpZiAtZ3JheXNjYWxlIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlCi0JCQlQUE0gaXMgZW1pdHRlZC4KLQotCS1ybGUJCVNlbGVjdCBSTEUgb3V0cHV0IGZvcm1hdC4gIChSZXF1aXJlcyBVUlQgbGlicmFyeS4pCi0KLQktdGFyZ2EJCVNlbGVjdCBUYXJnYSBvdXRwdXQgZm9ybWF0LiAgR3JheS1zY2FsZSBmb3JtYXQgaXMKLQkJCWVtaXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlIG9yIGlmCi0JCQktZ3JheXNjYWxlIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlLCBjb2xvcm1hcHBlZCBmb3JtYXQKLQkJCWlzIGVtaXR0ZWQgaWYgLWNvbG9ycyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgMjQtYml0Ci0JCQlmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgotCi1Td2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6Ci0KLQktZGN0IGludAlVc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KLQktZGN0IGZhc3QJVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgotCS1kY3QgZmxvYXQJVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCi0JCQlUaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuCi0JCQl0aGUgaW50IG1ldGhvZCwgYnV0IGlzIG11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUKLQkJCWhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvIG5vdGUgdGhhdAotCQkJcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5Ci0JCQlhY3Jvc3MgbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUKLQkJCXRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4gIFRoZSBmYXN0IGludGVnZXIgbWV0aG9kCi0JCQlpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgotCi0JLWRpdGhlciBmcwlVc2UgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi0JLWRpdGhlciBvcmRlcmVkCVVzZSBvcmRlcmVkIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCi0JLWRpdGhlciBub25lCURvIG5vdCB1c2UgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KLQkJCUJ5IGRlZmF1bHQsIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaXMgYXBwbGllZCB3aGVuCi0JCQlxdWFudGl6aW5nIGNvbG9yczsgdGhpcyBpcyBzbG93IGJ1dCB1c3VhbGx5IHByb2R1Y2VzCi0JCQl0aGUgYmVzdCByZXN1bHRzLiAgT3JkZXJlZCBkaXRoZXIgaXMgYSBjb21wcm9taXNlCi0JCQliZXR3ZWVuIHNwZWVkIGFuZCBxdWFsaXR5OyBubyBkaXRoZXJpbmcgaXMgZmFzdCBidXQKLQkJCXVzdWFsbHkgbG9va3MgYXdmdWwuICBOb3RlIHRoYXQgdGhlc2Ugc3dpdGNoZXMgaGF2ZQotCQkJbm8gZWZmZWN0IHVubGVzcyBjb2xvciBxdWFudGl6YXRpb24gaXMgYmVpbmcgZG9uZS4KLQkJCU9yZGVyZWQgZGl0aGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIC1vbmVwYXNzIG1vZGUuCi0KLQktbWFwIEZJTEUJUXVhbnRpemUgdG8gdGhlIGNvbG9ycyB1c2VkIGluIHRoZSBzcGVjaWZpZWQgaW1hZ2UKLQkJCWZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJvZHVjaW5nIG11bHRpcGxlIGZpbGVzCi0JCQl3aXRoIGlkZW50aWNhbCBjb2xvciBtYXBzLCBvciBmb3IgZm9yY2luZyBhIHByZWRlZmluZWQKLQkJCXNldCBvZiBjb2xvcnMgdG8gYmUgdXNlZC4gIFRoZSBGSUxFIG11c3QgYmUgYSBHSUYKLQkJCW9yIFBQTSBmaWxlLiAgVGhpcyBvcHRpb24gb3ZlcnJpZGVzIC1jb2xvcnMgYW5kCi0JCQktb25lcGFzcy4KLQotCS1ub3Ntb290aAlVc2UgYSBmYXN0ZXIsIGxvd2VyLXF1YWxpdHkgdXBzYW1wbGluZyByb3V0aW5lLgotCi0JLW9uZXBhc3MJVXNlIG9uZS1wYXNzIGluc3RlYWQgb2YgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLgotCQkJVGhlIG9uZS1wYXNzIG1ldGhvZCBpcyBmYXN0ZXIgYW5kIG5lZWRzIGxlc3MgbWVtb3J5LAotCQkJYnV0IGl0IHByb2R1Y2VzIGEgbG93ZXItcXVhbGl0eSBpbWFnZS4gIC1vbmVwYXNzIGlzCi0JCQlpZ25vcmVkIHVubGVzcyB5b3UgYWxzbyBzYXkgLWNvbG9ycyBOLiAgQWxzbywKLQkJCXRoZSBvbmUtcGFzcyBtZXRob2QgaXMgYWx3YXlzIHVzZWQgZm9yIGdyYXktc2NhbGUKLQkJCW91dHB1dCAodGhlIHR3by1wYXNzIG1ldGhvZCBpcyBubyBpbXByb3ZlbWVudCB0aGVuKS4KLQotCS1tYXhtZW1vcnkgTglTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcKLQkJCWxhcmdlIGltYWdlcy4gIFZhbHVlIGlzIGluIHRob3VzYW5kcyBvZiBieXRlcywgb3IKLQkJCW1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgotCQkJRm9yIGV4YW1wbGUsIC1tYXggNG0gc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZQotCQkJc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgotCi0JLXZlcmJvc2UJRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZSAtdidzIGdpdmUgbW9yZSBwcmludG91dC4KLQlvciAgLWRlYnVnCUFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotCi0KLUhJTlRTIEZPUiBDSlBFRwotCi1Db2xvciBHSUYgZmlsZXMgYXJlIG5vdCB0aGUgaWRlYWwgaW5wdXQgZm9yIEpQRUc7IEpQRUcgaXMgcmVhbGx5IGludGVuZGVkIGZvcgotY29tcHJlc3NpbmcgZnVsbC1jb2xvciAoMjQtYml0KSBpbWFnZXMuICBJbiBwYXJ0aWN1bGFyLCBkb24ndCB0cnkgdG8gY29udmVydAotY2FydG9vbnMsIGxpbmUgZHJhd2luZ3MsIGFuZCBvdGhlciBpbWFnZXMgdGhhdCBoYXZlIG9ubHkgYSBmZXcgZGlzdGluY3QKLWNvbG9ycy4gIEdJRiB3b3JrcyBncmVhdCBvbiB0aGVzZSwgSlBFRyBkb2VzIG5vdC4gIElmIHlvdSB3YW50IHRvIGNvbnZlcnQgYQotR0lGIHRvIEpQRUcsIHlvdSBzaG91bGQgZXhwZXJpbWVudCB3aXRoIGNqcGVnJ3MgLXF1YWxpdHkgYW5kIC1zbW9vdGggb3B0aW9ucwotdG8gZ2V0IGEgc2F0aXNmYWN0b3J5IGNvbnZlcnNpb24uICAtc21vb3RoIDEwIG9yIHNvIGlzIG9mdGVuIGhlbHBmdWwuCi0KLUF2b2lkIHJ1bm5pbmcgYW4gaW1hZ2UgdGhyb3VnaCBhIHNlcmllcyBvZiBKUEVHIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24KLWN5Y2xlcy4gIEltYWdlIHF1YWxpdHkgbG9zcyB3aWxsIGFjY3VtdWxhdGU7IGFmdGVyIHRlbiBvciBzbyBjeWNsZXMgdGhlIGltYWdlCi1tYXkgYmUgbm90aWNlYWJseSB3b3JzZSB0aGFuIGl0IHdhcyBhZnRlciBvbmUgY3ljbGUuICBJdCdzIGJlc3QgdG8gdXNlIGEKLWxvc3NsZXNzIGZvcm1hdCB3aGlsZSBtYW5pcHVsYXRpbmcgYW4gaW1hZ2UsIHRoZW4gY29udmVydCB0byBKUEVHIGZvcm1hdCB3aGVuCi15b3UgYXJlIHJlYWR5IHRvIGZpbGUgdGhlIGltYWdlIGF3YXkuCi0KLVRoZSAtb3B0aW1pemUgb3B0aW9uIHRvIGNqcGVnIGlzIHdvcnRoIHVzaW5nIHdoZW4geW91IGFyZSBtYWtpbmcgYSAiZmluYWwiCi12ZXJzaW9uIGZvciBwb3N0aW5nIG9yIGFyY2hpdmluZy4gIEl0J3MgYWxzbyBhIHdpbiB3aGVuIHlvdSBhcmUgdXNpbmcgbG93Ci1xdWFsaXR5IHNldHRpbmdzIHRvIG1ha2UgdmVyeSBzbWFsbCBKUEVHIGZpbGVzOyB0aGUgcGVyY2VudGFnZSBpbXByb3ZlbWVudAotaXMgb2Z0ZW4gYSBsb3QgbW9yZSB0aGFuIGl0IGlzIG9uIGxhcmdlciBmaWxlcy4gIChBdCBwcmVzZW50LCAtb3B0aW1pemUKLW1vZGUgaXMgYWx3YXlzIHNlbGVjdGVkIHdoZW4gZ2VuZXJhdGluZyBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLikKLQotR0lGIGlucHV0IGZpbGVzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLCB0byBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQuCi1Vc2UgYSBVbmlzeXMtbGljZW5zZWQgcHJvZ3JhbSBpZiB5b3UgbmVlZCB0byByZWFkIGEgR0lGIGZpbGUuICAoQ29udmVyc2lvbgotb2YgR0lGIGZpbGVzIHRvIEpQRUcgaXMgdXN1YWxseSBhIGJhZCBpZGVhIGFueXdheS4pCi0KLQotSElOVFMgRk9SIERKUEVHCi0KLVRvIGdldCBhIHF1aWNrIHByZXZpZXcgb2YgYW4gaW1hZ2UsIHVzZSB0aGUgLWdyYXlzY2FsZSBhbmQvb3IgLXNjYWxlIHN3aXRjaGVzLgotIi1ncmF5c2NhbGUgLXNjYWxlIDEvOCIgaXMgdGhlIGZhc3Rlc3QgY2FzZS4KLQotU2V2ZXJhbCBvcHRpb25zIGFyZSBhdmFpbGFibGUgdGhhdCB0cmFkZSBvZmYgaW1hZ2UgcXVhbGl0eSB0byBnYWluIHNwZWVkLgotIi1mYXN0IiB0dXJucyBvbiB0aGUgcmVjb21tZW5kZWQgc2V0dGluZ3MuCi0KLSItZGN0IGZhc3QiIGFuZC9vciAiLW5vc21vb3RoIiBnYWluIHNwZWVkIGF0IGEgc21hbGwgc2FjcmlmaWNlIGluIHF1YWxpdHkuCi1XaGVuIHByb2R1Y2luZyBhIGNvbG9yLXF1YW50aXplZCBpbWFnZSwgIi1vbmVwYXNzIC1kaXRoZXIgb3JkZXJlZCIgaXMgZmFzdCBidXQKLW11Y2ggbG93ZXIgcXVhbGl0eSB0aGFuIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAgIi1kaXRoZXIgbm9uZSIgbWF5IGdpdmUKLWFjY2VwdGFibGUgcmVzdWx0cyBpbiB0d28tcGFzcyBtb2RlLCBidXQgaXMgc2VsZG9tIHRvbGVyYWJsZSBpbiBvbmUtcGFzcyBtb2RlLgotCi1JZiB5b3UgYXJlIGZvcnR1bmF0ZSBlbm91Z2ggdG8gaGF2ZSB2ZXJ5IGZhc3QgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUsCi0iLWRjdCBmbG9hdCIgbWF5IGJlIGV2ZW4gZmFzdGVyIHRoYW4gIi1kY3QgZmFzdCIuICBCdXQgb24gbW9zdCBtYWNoaW5lcwotIi1kY3QgZmxvYXQiIGlzIHNsb3dlciB0aGFuICItZGN0IGludCI7IGluIHRoaXMgY2FzZSBpdCBpcyBub3Qgd29ydGggdXNpbmcsCi1iZWNhdXNlIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBhZHZhbnRhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlIHNpZ25pZmljYW50Ci1pbiBwcmFjdGljZS4KLQotVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHJlcXVpcmVzIGEgZ29vZCBkZWFsIG9mIG1lbW9yeTsgb24gTVMtRE9TIG1hY2hpbmVzCi1pdCBtYXkgcnVuIG91dCBvZiBtZW1vcnkgZXZlbiB3aXRoIC1tYXhtZW1vcnkgMC4gIEluIHRoYXQgY2FzZSB5b3UgY2FuIHN0aWxsCi1kZWNvbXByZXNzLCB3aXRoIHNvbWUgbG9zcyBvZiBpbWFnZSBxdWFsaXR5LCBieSBzcGVjaWZ5aW5nIC1vbmVwYXNzIGZvcgotb25lLXBhc3MgcXVhbnRpemF0aW9uLgotCi1UbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIGRqcGVnIHByb2R1Y2VzIHVuY29tcHJlc3NlZCBHSUYgZmlsZXMuICBUaGVzZQotYXJlIGxhcmdlciB0aGFuIHRoZXkgc2hvdWxkIGJlLCBidXQgYXJlIHJlYWRhYmxlIGJ5IHN0YW5kYXJkIEdJRiBkZWNvZGVycy4KLQotCi1ISU5UUyBGT1IgQk9USCBQUk9HUkFNUwotCi1JZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCB0aGFuIHdpbGwgZml0IGluIHRoZSBhdmFpbGFibGUgbWFpbiBtZW1vcnkgKGFzCi1kZXRlcm1pbmVkIGJ5IC1tYXhtZW1vcnkpLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLiAgKE1TLURPUyB2ZXJzaW9ucwotd2lsbCB0cnkgdG8gZ2V0IGV4dGVuZGVkIG9yIGV4cGFuZGVkIG1lbW9yeSBmaXJzdC4pICBUaGUgdGVtcG9yYXJ5IGZpbGVzIGFyZQotb2Z0ZW4gcmF0aGVyIGxhcmdlOiBpbiB0eXBpY2FsIGNhc2VzIHRoZXkgb2NjdXB5IHRocmVlIGJ5dGVzIHBlciBwaXhlbCwgZm9yCi1leGFtcGxlIDMqODAwKjYwMCA9IDEuNDRNYiBmb3IgYW4gODAweDYwMCBpbWFnZS4gIElmIHlvdSBkb24ndCBoYXZlIGVub3VnaAotZnJlZSBkaXNrIHNwYWNlLCBsZWF2ZSBvdXQgLXByb2dyZXNzaXZlIGFuZCAtb3B0aW1pemUgKGZvciBjanBlZykgb3Igc3BlY2lmeQotLW9uZXBhc3MgKGZvciBkanBlZykuCi0KLU9uIE1TLURPUywgdGhlIHRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBUTVAKLW9yIFRFTVAgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBuZWl0aGVyIG9mIHRob3NlCi1leGlzdC4gIEFtaWdhIGltcGxlbWVudGF0aW9ucyBwdXQgdGhlIHRlbXAgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBuYW1lZCBieQotSlBFR1RNUDosIHNvIGJlIHN1cmUgdG8gYXNzaWduIEpQRUdUTVA6IHRvIGEgZGlzayBwYXJ0aXRpb24gd2l0aCBhZGVxdWF0ZSBmcmVlCi1zcGFjZS4KLQotVGhlIGRlZmF1bHQgbWVtb3J5IHVzYWdlIGxpbWl0ICgtbWF4bWVtb3J5KSBpcyBzZXQgd2hlbiB0aGUgc29mdHdhcmUgaXMKLWNvbXBpbGVkLiAgSWYgeW91IGdldCBhbiAiaW5zdWZmaWNpZW50IG1lbW9yeSIgZXJyb3IsIHRyeSBzcGVjaWZ5aW5nIGEgc21hbGxlcgotLW1heG1lbW9yeSB2YWx1ZSwgZXZlbiAtbWF4bWVtb3J5IDAgdG8gdXNlIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIHNwYWNlLiAgWW91Ci1tYXkgd2FudCB0byByZWNvbXBpbGUgd2l0aCBhIHNtYWxsZXIgZGVmYXVsdCB2YWx1ZSBpZiB0aGlzIGhhcHBlbnMgb2Z0ZW4uCi0KLU9uIG1hY2hpbmVzIHRoYXQgaGF2ZSAiZW52aXJvbm1lbnQiIHZhcmlhYmxlcywgeW91IGNhbiBkZWZpbmUgdGhlIGVudmlyb25tZW50Ci12YXJpYWJsZSBKUEVHTUVNIHRvIHNldCB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuICBUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzCi1kZXNjcmliZWQgZm9yIHRoZSAtbWF4bWVtb3J5IHN3aXRjaC4gIEpQRUdNRU0gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlCi1zcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZCBpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbgotZXhwbGljaXQgLW1heG1lbW9yeSBzd2l0Y2guCi0KLU9uIE1TLURPUyBtYWNoaW5lcywgLW1heG1lbW9yeSBpcyB0aGUgYW1vdW50IG9mIG1haW4gKGNvbnZlbnRpb25hbCkgbWVtb3J5IHRvCi11c2UuICAoRXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGlzIGFsc28gdXNlZCBpZiBhdmFpbGFibGUuKSAgTW9zdAotRE9TLXNwZWNpZmljIHZlcnNpb25zIG9mIHRoaXMgc29mdHdhcmUgZG8gdGhlaXIgb3duIG1lbW9yeSBzcGFjZSBlc3RpbWF0aW9uCi1hbmQgZG8gbm90IG5lZWQgeW91IHRvIHNwZWNpZnkgLW1heG1lbW9yeS4KLQotCi1KUEVHVFJBTgotCi1qcGVndHJhbiBwZXJmb3JtcyB2YXJpb3VzIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb2YgSlBFRyBmaWxlcy4KLUl0IGNhbiB0cmFuc2xhdGUgdGhlIGNvZGVkIHJlcHJlc2VudGF0aW9uIGZyb20gb25lIHZhcmlhbnQgb2YgSlBFRyB0byBhbm90aGVyLAotZm9yIGV4YW1wbGUgZnJvbSBiYXNlbGluZSBKUEVHIHRvIHByb2dyZXNzaXZlIEpQRUcgb3IgdmljZSB2ZXJzYS4gIEl0IGNhbiBhbHNvCi1wZXJmb3JtIHNvbWUgcmVhcnJhbmdlbWVudHMgb2YgdGhlIGltYWdlIGRhdGEsIGZvciBleGFtcGxlIHR1cm5pbmcgYW4gaW1hZ2UKLWZyb20gbGFuZHNjYXBlIHRvIHBvcnRyYWl0IGZvcm1hdCBieSByb3RhdGlvbi4KLQotanBlZ3RyYW4gd29ya3MgYnkgcmVhcnJhbmdpbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoRENUIGNvZWZmaWNpZW50cyksIHdpdGhvdXQKLWV2ZXIgZnVsbHkgZGVjb2RpbmcgdGhlIGltYWdlLiAgVGhlcmVmb3JlLCBpdHMgdHJhbnNmb3JtYXRpb25zIGFyZSBsb3NzbGVzczoKLXRoZXJlIGlzIG5vIGltYWdlIGRlZ3JhZGF0aW9uIGF0IGFsbCwgd2hpY2ggd291bGQgbm90IGJlIHRydWUgaWYgeW91IHVzZWQKLWRqcGVnIGZvbGxvd2VkIGJ5IGNqcGVnIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgY29udmVyc2lvbi4gIEJ1dCBieSB0aGUgc2FtZQotdG9rZW4sIGpwZWd0cmFuIGNhbm5vdCBwZXJmb3JtIGxvc3N5IG9wZXJhdGlvbnMgc3VjaCBhcyBjaGFuZ2luZyB0aGUgaW1hZ2UKLXF1YWxpdHkuCi0KLWpwZWd0cmFuIHVzZXMgYSBjb21tYW5kIGxpbmUgc3ludGF4IHNpbWlsYXIgdG8gY2pwZWcgb3IgZGpwZWcuCi1PbiBVbml4LWxpa2Ugc3lzdGVtcywgeW91IHNheToKLQlqcGVndHJhbiBbc3dpdGNoZXNdIFtpbnB1dGZpbGVdID5vdXRwdXRmaWxlCi1PbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMsIHlvdSBzYXk6Ci0JanBlZ3RyYW4gW3N3aXRjaGVzXSBpbnB1dGZpbGUgb3V0cHV0ZmlsZQotd2hlcmUgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBhcmUgSlBFRyBmaWxlcy4KLQotVG8gc3BlY2lmeSB0aGUgY29kZWQgSlBFRyByZXByZXNlbnRhdGlvbiB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSwKLWpwZWd0cmFuIGFjY2VwdHMgYSBzdWJzZXQgb2YgdGhlIHN3aXRjaGVzIHJlY29nbml6ZWQgYnkgY2pwZWc6Ci0JLW9wdGltaXplCVBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4KLQktcHJvZ3Jlc3NpdmUJQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZS4KLQktcmVzdGFydCBOCUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5Ci0JCQlOIE1DVSBibG9ja3MgaWYgIkIiIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCi0JLXNjYW5zIGZpbGUJVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KLVNlZSB0aGUgcHJldmlvdXMgZGlzY3Vzc2lvbiBvZiBjanBlZyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZXNlIHN3aXRjaGVzLgotSWYgeW91IHNwZWNpZnkgbm9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgeW91IGdldCBhIHBsYWluIGJhc2VsaW5lLUpQRUcgb3V0cHV0Ci1maWxlLiAgVGhlIHF1YWxpdHkgc2V0dGluZyBhbmQgc28gZm9ydGggYXJlIGRldGVybWluZWQgYnkgdGhlIGlucHV0IGZpbGUuCi0KLVRoZSBpbWFnZSBjYW4gYmUgbG9zc2xlc3NseSB0cmFuc2Zvcm1lZCBieSBnaXZpbmcgb25lIG9mIHRoZXNlIHN3aXRjaGVzOgotCS1mbGlwIGhvcml6b250YWwJTWlycm9yIGltYWdlIGhvcml6b250YWxseSAobGVmdC1yaWdodCkuCi0JLWZsaXAgdmVydGljYWwJCU1pcnJvciBpbWFnZSB2ZXJ0aWNhbGx5ICh0b3AtYm90dG9tKS4KLQktcm90YXRlIDkwCQlSb3RhdGUgaW1hZ2UgOTAgZGVncmVlcyBjbG9ja3dpc2UuCi0JLXJvdGF0ZSAxODAJCVJvdGF0ZSBpbWFnZSAxODAgZGVncmVlcy4KLQktcm90YXRlIDI3MAkJUm90YXRlIGltYWdlIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZSAob3IgOTAgY2N3KS4KLQktdHJhbnNwb3NlCQlUcmFuc3Bvc2UgaW1hZ2UgKGFjcm9zcyBVTC10by1MUiBheGlzKS4KLQktdHJhbnN2ZXJzZQkJVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgKGFjcm9zcyBVUi10by1MTCBheGlzKS4KLQotVGhlIHRyYW5zcG9zZSB0cmFuc2Zvcm1hdGlvbiBoYXMgbm8gcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyBpbWFnZSBkaW1lbnNpb25zLgotVGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBvcGVyYXRlIHJhdGhlciBvZGRseSBpZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90Ci1hIG11bHRpcGxlIG9mIHRoZSBpTUNVIHNpemUgKHVzdWFsbHkgOCBvciAxNiBwaXhlbHMpLCBiZWNhdXNlIHRoZXkgY2FuIG9ubHkKLXRyYW5zZm9ybSBjb21wbGV0ZSBibG9ja3Mgb2YgRENUIGNvZWZmaWNpZW50IGRhdGEgaW4gdGhlIGRlc2lyZWQgd2F5LgotCi1qcGVndHJhbidzIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiB0cmFuc2Zvcm1pbmcgYW4gb2RkLXNpemUgaW1hZ2UgaXMgZGVzaWduZWQKLXRvIHByZXNlcnZlIGV4YWN0IHJldmVyc2liaWxpdHkgYW5kIG1hdGhlbWF0aWNhbCBjb25zaXN0ZW5jeSBvZiB0aGUKLXRyYW5zZm9ybWF0aW9uIHNldC4gIEFzIHN0YXRlZCwgdHJhbnNwb3NlIGlzIGFibGUgdG8gZmxpcCB0aGUgZW50aXJlIGltYWdlCi1hcmVhLiAgSG9yaXpvbnRhbCBtaXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1UgY29sdW1uIGF0IHRoZSByaWdodCBlZGdlCi11bnRvdWNoZWQsIGJ1dCBpcyBhYmxlIHRvIGZsaXAgYWxsIHJvd3Mgb2YgdGhlIGltYWdlLiAgU2ltaWxhcmx5LCB2ZXJ0aWNhbAotbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIHJvdyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLCBidXQgaXMKLWFibGUgdG8gZmxpcCBhbGwgY29sdW1ucy4gIFRoZSBvdGhlciB0cmFuc2Zvcm1zIGNhbiBiZSBidWlsdCB1cCBhcyBzZXF1ZW5jZXMKLW9mIHRyYW5zcG9zZSBhbmQgZmxpcCBvcGVyYXRpb25zOyBmb3IgY29uc2lzdGVuY3ksIHRoZWlyIGFjdGlvbnMgb24gZWRnZQotcGl4ZWxzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nCi10cmFuc3Bvc2UtYW5kLWZsaXAgc2VxdWVuY2UuCi0KLUZvciBwcmFjdGljYWwgdXNlLCB5b3UgbWF5IHByZWZlciB0byBkaXNjYXJkIGFueSB1bnRyYW5zZm9ybWFibGUgZWRnZSBwaXhlbHMKLXJhdGhlciB0aGFuIGhhdmluZyBhIHN0cmFuZ2UtbG9va2luZyBzdHJpcCBhbG9uZyB0aGUgcmlnaHQgYW5kL29yIGJvdHRvbSBlZGdlcwotb2YgYSB0cmFuc2Zvcm1lZCBpbWFnZS4gIFRvIGRvIHRoaXMsIGFkZCB0aGUgLXRyaW0gc3dpdGNoOgotCS10cmltCQlEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzLgotT2J2aW91c2x5LCBhIHRyYW5zZm9ybWF0aW9uIHdpdGggLXRyaW0gaXMgbm90IHJldmVyc2libGUsIHNvIHN0cmljdGx5IHNwZWFraW5nCi1qcGVndHJhbiB3aXRoIHRoaXMgc3dpdGNoIGlzIG5vdCBsb3NzbGVzcy4gIEFsc28sIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwKLWVxdWl2YWxlbmNlcyBiZXR3ZWVuIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbm8gbG9uZ2VyIGhvbGQuICBGb3IgZXhhbXBsZSwKLSItcm90IDI3MCAtdHJpbSIgdHJpbXMgb25seSB0aGUgYm90dG9tIGVkZ2UsIGJ1dCAiLXJvdCA5MCAtdHJpbSIgZm9sbG93ZWQgYnkKLSItcm90IDE4MCAtdHJpbSIgdHJpbXMgYm90aCBlZGdlcy4KLQotQW5vdGhlciBub3Qtc3RyaWN0bHktbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gc3dpdGNoIGlzOgotCS1ncmF5c2NhbGUJRm9yY2UgZ3JheXNjYWxlIG91dHB1dC4KLVRoaXMgb3B0aW9uIGRpc2NhcmRzIHRoZSBjaHJvbWluYW5jZSBjaGFubmVscyBpZiB0aGUgaW5wdXQgaW1hZ2UgaXMgWUNiQ3IKLShpZSwgYSBzdGFuZGFyZCBjb2xvciBKUEVHKSwgcmVzdWx0aW5nIGluIGEgZ3JheXNjYWxlIEpQRUcgZmlsZS4gIFRoZQotbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHksIHNvIHRoaXMgaXMgYSBiZXR0ZXIgbWV0aG9kIG9mIHJlZHVjaW5nCi10byBncmF5c2NhbGUgdGhhbiBkZWNvbXByZXNzaW9uLCBjb252ZXJzaW9uLCBhbmQgcmVjb21wcmVzc2lvbi4gIFRoaXMgc3dpdGNoCi1pcyBwYXJ0aWN1bGFybHkgaGFuZHkgZm9yIGZpeGluZyBhIG1vbm9jaHJvbWUgcGljdHVyZSB0aGF0IHdhcyBtaXN0YWtlbmx5Ci1lbmNvZGVkIGFzIGEgY29sb3IgSlBFRy4gIChJbiBzdWNoIGEgY2FzZSwgdGhlIHNwYWNlIHNhdmluZ3MgZnJvbSBnZXR0aW5nIHJpZAotb2YgdGhlIG5lYXItZW1wdHkgY2hyb21hIGNoYW5uZWxzIHdvbid0IGJlIGxhcmdlOyBidXQgdGhlIGRlY29kaW5nIHRpbWUgZm9yCi1hIGdyYXlzY2FsZSBKUEVHIGlzIHN1YnN0YW50aWFsbHkgbGVzcyB0aGFuIHRoYXQgZm9yIGEgY29sb3IgSlBFRy4pCi0KLWpwZWd0cmFuIGFsc28gcmVjb2duaXplcyB0aGVzZSBzd2l0Y2hlcyB0aGF0IGNvbnRyb2wgd2hhdCB0byBkbyB3aXRoICJleHRyYSIKLW1hcmtlcnMsIHN1Y2ggYXMgY29tbWVudCBibG9ja3M6Ci0JLWNvcHkgbm9uZQlDb3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZS4gIFRoaXMgc2V0dGluZwotCQkJc3VwcHJlc3NlcyBhbGwgY29tbWVudHMgYW5kIG90aGVyIGV4Y2VzcyBiYWdnYWdlCi0JCQlwcmVzZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KLQktY29weSBjb21tZW50cwlDb3B5IG9ubHkgY29tbWVudCBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIGNvcGllcwotCQkJY29tbWVudHMgZnJvbSB0aGUgc291cmNlIGZpbGUsIGJ1dCBkaXNjYXJkcwotCQkJYW55IG90aGVyIGluZXNzZW50aWFsIGRhdGEuIAotCS1jb3B5IGFsbAlDb3B5IGFsbCBleHRyYSBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIHByZXNlcnZlcwotCQkJbWlzY2VsbGFuZW91cyBtYXJrZXJzIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSwgc3VjaAotCQkJYXMgSkZJRiB0aHVtYm5haWxzIGFuZCBQaG90b3Nob3Agc2V0dGluZ3MuICBJbiBzb21lCi0JCQlmaWxlcyB0aGVzZSBleHRyYSBtYXJrZXJzIGNhbiBiZSBzaXphYmxlLgotVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgLWNvcHkgY29tbWVudHMuICAoTm90ZTogaW4gSUpHIHJlbGVhc2VzIHY2IGFuZCB2NmEsCi1qcGVndHJhbiBhbHdheXMgZGlkIHRoZSBlcXVpdmFsZW50IG9mIC1jb3B5IG5vbmUuKQotCi1BZGRpdGlvbmFsIHN3aXRjaGVzIHJlY29nbml6ZWQgYnkganBlZ3RyYW4gYXJlOgotCS1vdXRmaWxlIGZpbGVuYW1lCi0JLW1heG1lbW9yeSBOCi0JLXZlcmJvc2UKLQktZGVidWcKLVRoZXNlIHdvcmsgdGhlIHNhbWUgYXMgaW4gY2pwZWcgb3IgZGpwZWcuCi0KLQotVEhFIENPTU1FTlQgVVRJTElUSUVTCi0KLVRoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyAiY29tbWVudCIgKENPTSkgYmxvY2tzIHRvIG9jY3VyIHdpdGhpbiBhIEpQRUcgZmlsZS4KLUFsdGhvdWdoIHRoZSBzdGFuZGFyZCBkb2Vzbid0IGFjdHVhbGx5IGRlZmluZSB3aGF0IENPTSBibG9ja3MgYXJlIGZvciwgdGhleQotYXJlIHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0IHN0cmluZ3MuICBUaGlzIGxldHMgeW91IGFkZAotYW5ub3RhdGlvbnMsIHRpdGxlcywgaW5kZXggdGVybXMsIGV0YyB0byB5b3VyIEpQRUcgZmlsZXMsIGFuZCBsYXRlciByZXRyaWV2ZQotdGhlbSBhcyB0ZXh0LiAgQ09NIGJsb2NrcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGltYWdlIHN0b3JlZCBpbiB0aGUgSlBFRwotZmlsZS4gIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBDT00gYmxvY2sgaXMgNjRLLCBidXQgeW91IGNhbiBoYXZlIGFzIG1hbnkgb2YKLXRoZW0gYXMgeW91IGxpa2UgaW4gb25lIEpQRUcgZmlsZS4KLQotV2UgcHJvdmlkZSB0d28gdXRpbGl0eSBwcm9ncmFtcyB0byBkaXNwbGF5IENPTSBibG9jayBjb250ZW50cyBhbmQgYWRkIENPTQotYmxvY2tzIHRvIGEgSlBFRyBmaWxlLgotCi1yZGpwZ2NvbSBzZWFyY2hlcyBhIEpQRUcgZmlsZSBhbmQgcHJpbnRzIHRoZSBjb250ZW50cyBvZiBhbnkgQ09NIGJsb2NrcyBvbgotc3RhbmRhcmQgb3V0cHV0LiAgVGhlIGNvbW1hbmQgbGluZSBzeW50YXggaXMKLQlyZGpwZ2NvbSBbLXZlcmJvc2VdIFtpbnB1dGZpbGVuYW1lXQotVGhlIHN3aXRjaCAiLXZlcmJvc2UiIChvciBqdXN0ICItdiIpIGNhdXNlcyByZGpwZ2NvbSB0byBhbHNvIGRpc3BsYXkgdGhlIEpQRUcKLWltYWdlIGRpbWVuc2lvbnMuICBJZiB5b3Ugb21pdCB0aGUgaW5wdXQgZmlsZSBuYW1lIGZyb20gdGhlIGNvbW1hbmQgbGluZSwKLXRoZSBKUEVHIGZpbGUgaXMgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgbWF5IG5vdCB3b3JrIG9uIHNvbWUKLW9wZXJhdGluZyBzeXN0ZW1zLCBpZiBiaW5hcnkgZGF0YSBjYW4ndCBiZSByZWFkIGZyb20gc3RkaW4uKQotCi13cmpwZ2NvbSBhZGRzIGEgQ09NIGJsb2NrLCBjb250YWluaW5nIHRleHQgeW91IHByb3ZpZGUsIHRvIGEgSlBFRyBmaWxlLgotT3JkaW5hcmlseSwgdGhlIENPTSBibG9jayBpcyBhZGRlZCBhZnRlciBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrcywgYnV0IHlvdQotY2FuIGRlbGV0ZSB0aGUgb2xkIENPTSBibG9ja3MgaWYgeW91IHdpc2guICB3cmpwZ2NvbSBwcm9kdWNlcyBhIG5ldyBKUEVHCi1maWxlOyBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGlucHV0IGZpbGUuICBETyBOT1QgdHJ5IHRvIG92ZXJ3cml0ZSB0aGUgaW5wdXQKLWZpbGUgYnkgZGlyZWN0aW5nIHdyanBnY29tJ3Mgb3V0cHV0IGJhY2sgaW50byBpdDsgb24gbW9zdCBzeXN0ZW1zIHRoaXMgd2lsbAotanVzdCBkZXN0cm95IHlvdXIgZmlsZS4KLQotVGhlIGNvbW1hbmQgbGluZSBzeW50YXggZm9yIHdyanBnY29tIGlzIHNpbWlsYXIgdG8gY2pwZWcncy4gIE9uIFVuaXgtbGlrZQotc3lzdGVtcywgaXQgaXMKLQl3cmpwZ2NvbSBbc3dpdGNoZXNdIFtpbnB1dGZpbGVuYW1lXQotVGhlIG91dHB1dCBmaWxlIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQgb3V0cHV0LiAgVGhlIGlucHV0IGZpbGUgY29tZXMgZnJvbQotdGhlIG5hbWVkIGZpbGUsIG9yIGZyb20gc3RhbmRhcmQgaW5wdXQgaWYgbm8gaW5wdXQgZmlsZSBpcyBuYW1lZC4KLQotT24gbW9zdCBub24tVW5peCBzeXN0ZW1zLCB0aGUgc3ludGF4IGlzCi0Jd3JqcGdjb20gW3N3aXRjaGVzXSBpbnB1dGZpbGVuYW1lIG91dHB1dGZpbGVuYW1lCi13aGVyZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBuYW1lcyBtdXN0IGJlIGdpdmVuIGV4cGxpY2l0bHkuCi0KLXdyanBnY29tIHVuZGVyc3RhbmRzIHRocmVlIHN3aXRjaGVzOgotCS1yZXBsYWNlCQkgRGVsZXRlIGFueSBleGlzdGluZyBDT00gYmxvY2tzIGZyb20gdGhlIGZpbGUuCi0JLWNvbW1lbnQgIkNvbW1lbnQgdGV4dCIJIFN1cHBseSBuZXcgQ09NIHRleHQgb24gY29tbWFuZCBsaW5lLgotCS1jZmlsZSBuYW1lCQkgUmVhZCB0ZXh0IGZvciBuZXcgQ09NIGJsb2NrIGZyb20gbmFtZWQgZmlsZS4KLShTd2l0Y2ggbmFtZXMgY2FuIGJlIGFiYnJldmlhdGVkLikgIElmIHlvdSBoYXZlIG9ubHkgb25lIGxpbmUgb2YgY29tbWVudCB0ZXh0Ci10byBhZGQsIHlvdSBjYW4gcHJvdmlkZSBpdCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggLWNvbW1lbnQuICBUaGUgY29tbWVudAotdGV4dCBtdXN0IGJlIHN1cnJvdW5kZWQgd2l0aCBxdW90ZXMgc28gdGhhdCBpdCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlCi1hcmd1bWVudC4gIExvbmdlciBjb21tZW50cyBjYW4gYmUgcmVhZCBmcm9tIGEgdGV4dCBmaWxlLgotCi1JZiB5b3UgZ2l2ZSBuZWl0aGVyIC1jb21tZW50IG5vciAtY2ZpbGUsIHRoZW4gd3JqcGdjb20gd2lsbCByZWFkIHRoZSBjb21tZW50Ci10ZXh0IGZyb20gc3RhbmRhcmQgaW5wdXQuICAoSW4gdGhpcyBjYXNlIGFuIGlucHV0IGltYWdlIGZpbGUgbmFtZSBNVVNUIGJlCi1zdXBwbGllZCwgc28gdGhhdCB0aGUgc291cmNlIEpQRUcgZmlsZSBjb21lcyBmcm9tIHNvbWV3aGVyZSBlbHNlLikgIFlvdSBjYW4KLWVudGVyIG11bHRpcGxlIGxpbmVzLCB1cCB0byA2NEtCIHdvcnRoLiAgVHlwZSBhbiBlbmQtb2YtZmlsZSBpbmRpY2F0b3IKLSh1c3VhbGx5IGNvbnRyb2wtRCBvciBjb250cm9sLVopIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWVudCB0ZXh0IGVudHJ5LgotCi13cmpwZ2NvbSB3aWxsIG5vdCBhZGQgYSBDT00gYmxvY2sgaWYgdGhlIHByb3ZpZGVkIGNvbW1lbnQgc3RyaW5nIGlzIGVtcHR5LgotVGhlcmVmb3JlIC1yZXBsYWNlIC1jb21tZW50ICIiIGNhbiBiZSB1c2VkIHRvIGRlbGV0ZSBhbGwgQ09NIGJsb2NrcyBmcm9tIGEKLWZpbGUuCi0KLVRoZXNlIHV0aWxpdHkgcHJvZ3JhbXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgSUpHIEpQRUcgbGlicmFyeS4gIEluCi1wYXJ0aWN1bGFyLCB0aGUgc291cmNlIGNvZGUgZm9yIHJkanBnY29tIGlzIGludGVuZGVkIGFzIGFuIGlsbHVzdHJhdGlvbiBvZgotdGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgcmVxdWlyZWQgdG8gcGFyc2UgYSBKUEVHIGZpbGUgaGVhZGVyIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dpemFyZC5kb2MgYi9saWJqcGVndHdycC93aXphcmQuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE3MGIyLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dpemFyZC5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZmlsZSBkZXNjcmliZXMgY2pwZWcncyAic3dpdGNoZXMgZm9yIHdpemFyZHMiLgotCi1UaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHIGJ5IHBlcnNvbnMKLXdobyBhcmUgcmVhc29uYWJseSBrbm93bGVkZ2VhYmxlIGFib3V0IHRoZSBKUEVHIHN0YW5kYXJkLiAgSWYgeW91IGRvbid0IGtub3cKLXdoYXQgeW91IGFyZSBkb2luZywgRE9OJ1QgVVNFIFRIRVNFIFNXSVRDSEVTLiAgWW91J2xsIGxpa2VseSBwcm9kdWNlIGZpbGVzCi13aXRoIHdvcnNlIGltYWdlIHF1YWxpdHkgYW5kL29yIHBvb3JlciBjb21wcmVzc2lvbiB0aGFuIHlvdSdkIGdldCBmcm9tIHRoZQotZGVmYXVsdCBzZXR0aW5ncy4gIEZ1cnRoZXJtb3JlLCB0aGVzZSBzd2l0Y2hlcyBtdXN0IGJlIHVzZWQgd2l0aCBjYXV0aW9uCi13aGVuIG1ha2luZyBmaWxlcyBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UsIGJlY2F1c2Ugbm90IGFsbCBKUEVHIGRlY29kZXJzCi13aWxsIHN1cHBvcnQgdW51c3VhbCBKUEVHIHBhcmFtZXRlciBzZXR0aW5ncy4KLQotCi1RdWFudGl6YXRpb24gVGFibGUgQWRqdXN0bWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT3JkaW5hcmlseSwgY2pwZWcgc3RhcnRzIHdpdGggYSBkZWZhdWx0IHNldCBvZiB0YWJsZXMgKHRoZSBzYW1lIG9uZXMgZ2l2ZW4KLWFzIGV4YW1wbGVzIGluIHRoZSBKUEVHIHN0YW5kYXJkKSBhbmQgc2NhbGVzIHRoZW0gdXAgb3IgZG93biBhY2NvcmRpbmcgdG8KLXRoZSAtcXVhbGl0eSBzZXR0aW5nLiAgVGhlIGRldGFpbHMgb2YgdGhlIHNjYWxpbmcgYWxnb3JpdGhtIGNhbiBiZSBmb3VuZCBpbgotamNwYXJhbS5jLiAgQXQgdmVyeSBsb3cgcXVhbGl0eSBzZXR0aW5ncywgc29tZSBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcwotY2FuIGdldCBzY2FsZWQgdXAgdG8gdmFsdWVzIGV4Y2VlZGluZyAyNTUuICBBbHRob3VnaCAyLWJ5dGUgcXVhbnRpemF0aW9uCi12YWx1ZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgSUpHIHNvZnR3YXJlLCB0aGlzIGZlYXR1cmUgaXMgbm90IGluIGJhc2VsaW5lCi1KUEVHIGFuZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuICBJZiB5b3UgbmVlZCB0byBlbnN1cmUKLXdpZGUgY29tcGF0aWJpbGl0eSBvZiBsb3ctcXVhbGl0eSBmaWxlcywgeW91IGNhbiBjb25zdHJhaW4gdGhlIHNjYWxlZAotcXVhbnRpemF0aW9uIHZhbHVlcyB0byBubyBtb3JlIHRoYW4gMjU1IGJ5IGdpdmluZyB0aGUgLWJhc2VsaW5lIHN3aXRjaC4KLU5vdGUgdGhhdCB1c2Ugb2YgLWJhc2VsaW5lIHdpbGwgcmVzdWx0IGluIHBvb3JlciBxdWFsaXR5IGZvciB0aGUgc2FtZSBmaWxlCi1zaXplLCBzaW5jZSBtb3JlIGJpdHMgdGhhbiBuZWNlc3NhcnkgYXJlIGV4cGVuZGVkIG9uIGhpZ2hlciBBQyBjb2VmZmljaWVudHMuCi0KLVlvdSBjYW4gc3Vic3RpdHV0ZSBhIGRpZmZlcmVudCBzZXQgb2YgcXVhbnRpemF0aW9uIHZhbHVlcyBieSB1c2luZyB0aGUKLS1xdGFibGVzIHN3aXRjaDoKLQotCS1xdGFibGVzIGZpbGUJVXNlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIHRoZSBuYW1lZCBmaWxlLgotCi1UaGUgc3BlY2lmaWVkIGZpbGUgc2hvdWxkIGJlIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgZGVjaW1hbCBxdWFudGl6YXRpb24KLXZhbHVlcy4gIFRoZSBmaWxlIHNob3VsZCBjb250YWluIG9uZSB0byBmb3VyIHRhYmxlcywgZWFjaCBvZiA2NCBlbGVtZW50cy4KLVRoZSB0YWJsZXMgYXJlIGltcGxpY2l0bHkgbnVtYmVyZWQgMCwxLGV0Yy4gaW4gb3JkZXIgb2YgYXBwZWFyYW5jZS4gIFRhYmxlCi1lbnRyaWVzIGFwcGVhciBpbiBub3JtYWwgYXJyYXkgb3JkZXIgKE5PVCBpbiB0aGUgemlnemFnIG9yZGVyIGluIHdoaWNoIHRoZXkKLXdpbGwgYmUgc3RvcmVkIGluIHRoZSBKUEVHIGZpbGUpLgotCi1RdWFudGl6YXRpb24gdGFibGUgZmlsZXMgYXJlIGZyZWUgZm9ybWF0LCBpbiB0aGF0IGFyYml0cmFyeSB3aGl0ZXNwYWNlIGNhbgotYXBwZWFyIGJldHdlZW4gbnVtYmVycy4gIEFsc28sIGNvbW1lbnRzIGNhbiBiZSBpbmNsdWRlZDogYSBjb21tZW50IHN0YXJ0cwotd2l0aCAnIycgYW5kIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gIEhlcmUgaXMgYW4gZXhhbXBsZSBmaWxlIHRoYXQKLWR1cGxpY2F0ZXMgdGhlIGRlZmF1bHQgcXVhbnRpemF0aW9uIHRhYmxlczoKLQotCSMgUXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBKUEVHIHNwZWMsIHNlY3Rpb24gSy4xCi0KLQkjIFRoaXMgaXMgdGFibGUgMCAodGhlIGx1bWluYW5jZSB0YWJsZSk6Ci0JICAxNiAgMTEgIDEwICAxNiAgMjQgIDQwICA1MSAgNjEKLQkgIDEyICAxMiAgMTQgIDE5ICAyNiAgNTggIDYwICA1NQotCSAgMTQgIDEzICAxNiAgMjQgIDQwICA1NyAgNjkgIDU2Ci0JICAxNCAgMTcgIDIyICAyOSAgNTEgIDg3ICA4MCAgNjIKLQkgIDE4ICAyMiAgMzcgIDU2ICA2OCAxMDkgMTAzICA3NwotCSAgMjQgIDM1ICA1NSAgNjQgIDgxIDEwNCAxMTMgIDkyCi0JICA0OSAgNjQgIDc4ICA4NyAxMDMgMTIxIDEyMCAxMDEKLQkgIDcyICA5MiAgOTUgIDk4IDExMiAxMDAgMTAzICA5OQotCi0JIyBUaGlzIGlzIHRhYmxlIDEgKHRoZSBjaHJvbWluYW5jZSB0YWJsZSk6Ci0JICAxNyAgMTggIDI0ICA0NyAgOTkgIDk5ICA5OSAgOTkKLQkgIDE4ICAyMSAgMjYgIDY2ICA5OSAgOTkgIDk5ICA5OQotCSAgMjQgIDI2ICA1NiAgOTkgIDk5ICA5OSAgOTkgIDk5Ci0JICA0NyAgNjYgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKLQkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQotCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5Ci0JICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKLQkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQotCi1JZiB0aGUgLXF0YWJsZXMgc3dpdGNoIGlzIHVzZWQgd2l0aG91dCAtcXVhbGl0eSwgdGhlbiB0aGUgc3BlY2lmaWVkIHRhYmxlcwotYXJlIHVzZWQgZXhhY3RseSBhcy1pcy4gIElmIGJvdGggLXF0YWJsZXMgYW5kIC1xdWFsaXR5IGFyZSB1c2VkLCB0aGVuIHRoZQotdGFibGVzIHRha2VuIGZyb20gdGhlIGZpbGUgYXJlIHNjYWxlZCBpbiB0aGUgc2FtZSBmYXNoaW9uIHRoYXQgdGhlIGRlZmF1bHQKLXRhYmxlcyB3b3VsZCBiZSBzY2FsZWQgZm9yIHRoYXQgcXVhbGl0eSBzZXR0aW5nLiAgSWYgLWJhc2VsaW5lIGFwcGVhcnMsIHRoZW4KLXRoZSBxdWFudGl6YXRpb24gdmFsdWVzIGFyZSBjb25zdHJhaW5lZCB0byB0aGUgcmFuZ2UgMS0yNTUuCi0KLUJ5IGRlZmF1bHQsIGNqcGVnIHdpbGwgdXNlIHF1YW50aXphdGlvbiB0YWJsZSAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQKLXRhYmxlIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuICBUbyBvdmVycmlkZSB0aGlzIGNob2ljZSwgdXNlIHRoZSAtcXNsb3RzCi1zd2l0Y2g6Ci0KLQktcXNsb3RzIE5bLC4uLl0JCVNlbGVjdCB3aGljaCBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlIGZvcgotCQkJCWVhY2ggY29sb3IgY29tcG9uZW50LgotCi1UaGUgLXFzbG90cyBzd2l0Y2ggc3BlY2lmaWVzIGEgcXVhbnRpemF0aW9uIHRhYmxlIG51bWJlciBmb3IgZWFjaCBjb2xvcgotY29tcG9uZW50LCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbXBvbmVudHMgYXBwZWFyIGluIHRoZSBKUEVHIFNPRiBtYXJrZXIuCi1Gb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgc2VwYXJhdGUgdGFibGUgZm9yIGVhY2ggb2YgWSxDYixDciwgeW91IGNvdWxkCi1wcm92aWRlIGEgLXF0YWJsZXMgZmlsZSB0aGF0IGRlZmluZXMgdGhyZWUgcXVhbnRpemF0aW9uIHRhYmxlcyBhbmQgc2F5Ci0iLXFzbG90cyAwLDEsMiIuICBJZiAtcXNsb3RzIGdpdmVzIGZld2VyIHRhYmxlIG51bWJlcnMgdGhhbiB0aGVyZSBhcmUgY29sb3IKLWNvbXBvbmVudHMsIHRoZW4gdGhlIGxhc3QgdGFibGUgbnVtYmVyIGlzIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KLQotCi1TYW1wbGluZyBGYWN0b3IgQWRqdXN0bWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQnkgZGVmYXVsdCwgY2pwZWcgdXNlcyAyOjEgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZG93bnNhbXBsaW5nIHdoZW4KLWNvbXByZXNzaW5nIFlDYkNyIGRhdGEsIGFuZCBubyBkb3duc2FtcGxpbmcgZm9yIGFsbCBvdGhlciBjb2xvciBzcGFjZXMuCi1Zb3UgY2FuIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCB3aXRoIHRoZSAtc2FtcGxlIHN3aXRjaDoKLQotCS1zYW1wbGUgSHhWWywuLi5dCVNldCBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IKLQkJCQljb21wb25lbnQuCi0KLVRoZSAtc2FtcGxlIHN3aXRjaCBzcGVjaWZpZXMgdGhlIEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvcgotY29tcG9uZW50LCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIEpQRUcgU09GIG1hcmtlci4KLUlmIHlvdSBzcGVjaWZ5IGZld2VyIEh4ViBwYWlycyB0aGFuIHRoZXJlIGFyZSBjb21wb25lbnRzLCB0aGUgcmVtYWluaW5nCi1jb21wb25lbnRzIGFyZSBzZXQgdG8gMXgxIHNhbXBsaW5nLiAgRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IFlDYkNyIHNldHRpbmcKLWlzIGVxdWl2YWxlbnQgdG8gIi1zYW1wbGUgMngyLDF4MSwxeDEiLCB3aGljaCBjYW4gYmUgYWJicmV2aWF0ZWQgdG8KLSItc2FtcGxlIDJ4MiIuCi0KLVRoZXJlIGFyZSBzdGlsbCBzb21lIEpQRUcgZGVjb2RlcnMgaW4gZXhpc3RlbmNlIHRoYXQgc3VwcG9ydCBvbmx5IDJ4MQotc2FtcGxpbmcgKGFsc28gY2FsbGVkIDQ6MjoyIHNhbXBsaW5nKS4gIENvbXBhdGliaWxpdHkgd2l0aCBzdWNoIGRlY29kZXJzIGNhbgotYmUgYWNoaWV2ZWQgYnkgc3BlY2lmeWluZyAiLXNhbXBsZSAyeDEiLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzCi1yZWFsbHkgbmVjZXNzYXJ5LCBzaW5jZSBpdCBpbmNyZWFzZXMgZmlsZSBzaXplIGFuZCBlbmNvZGluZy9kZWNvZGluZyB0aW1lCi13aXRoIHZlcnkgbGl0dGxlIHF1YWxpdHkgZ2Fpbi4KLQotCi1NdWx0aXBsZSBTY2FuIC8gUHJvZ3Jlc3Npb24gQ29udHJvbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQnkgZGVmYXVsdCwgY2pwZWcgZW1pdHMgYSBzaW5nbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIFRoZQotLXByb2dyZXNzaXZlIHN3aXRjaCBnZW5lcmF0ZXMgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgdXNpbmcgYSBkZWZhdWx0IHNlcmllcwotb2YgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycy4gIFlvdSBjYW4gY3JlYXRlIG11bHRpcGxlLXNjYW4gc2VxdWVudGlhbCBKUEVHCi1maWxlcyBvciBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIHdpdGggY3VzdG9tIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgYnkgdXNpbmcKLXRoZSAtc2NhbnMgc3dpdGNoOgotCi0JLXNjYW5zIGZpbGUJVXNlIHRoZSBzY2FuIHNlcXVlbmNlIGdpdmVuIGluIHRoZSBuYW1lZCBmaWxlLgotCi1UaGUgc3BlY2lmaWVkIGZpbGUgc2hvdWxkIGJlIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYSAic2NhbiBzY3JpcHQiLgotVGhlIHNjcmlwdCBzcGVjaWZpZXMgdGhlIGNvbnRlbnRzIGFuZCBvcmRlcmluZyBvZiB0aGUgc2NhbnMgdG8gYmUgZW1pdHRlZC4KLUVhY2ggZW50cnkgaW4gdGhlIHNjcmlwdCBkZWZpbmVzIG9uZSBzY2FuLiAgQSBzY2FuIGRlZmluaXRpb24gc3BlY2lmaWVzCi10aGUgY29tcG9uZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2NhbiwgYW5kIGZvciBwcm9ncmVzc2l2ZSBKUEVHIGl0IGFsc28KLXNwZWNpZmllcyB0aGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBTcyxTZSxBaCxBbCBmb3IgdGhlIHNjYW4uICBTY2FuCi1kZWZpbml0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgKCc7JykuICBBIHNlbWljb2xvbiBhZnRlciB0aGUgbGFzdAotc2NhbiBkZWZpbml0aW9uIGlzIG9wdGlvbmFsLgotCi1FYWNoIHNjYW4gZGVmaW5pdGlvbiBjb250YWlucyBvbmUgdG8gZm91ciBjb21wb25lbnQgaW5kZXhlcywgb3B0aW9uYWxseQotZm9sbG93ZWQgYnkgYSBjb2xvbiAoJzonKSBhbmQgdGhlIGZvdXIgcHJvZ3Jlc3NpdmUtSlBFRyBwYXJhbWV0ZXJzLiAgVGhlCi1jb21wb25lbnQgaW5kZXhlcyBkZW5vdGUgd2hpY2ggY29sb3IgY29tcG9uZW50KHMpIGFyZSB0byBiZSB0cmFuc21pdHRlZCBpbgotdGhlIHNjYW4uICBDb21wb25lbnRzIGFyZSBudW1iZXJlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlCi1KUEVHIFNPRiBtYXJrZXIsIHdpdGggdGhlIGZpcnN0IGNvbXBvbmVudCBiZWluZyBudW1iZXJlZCAwLiAgKE5vdGUgdGhhdCB0aGVzZQotaW5kZXhlcyBhcmUgbm90IHRoZSAiY29tcG9uZW50IElEIiBjb2RlcyBhc3NpZ25lZCB0byB0aGUgY29tcG9uZW50cywganVzdAotcG9zaXRpb25hbCBpbmRleGVzLikKLQotVGhlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgZm9yIGVhY2ggc2NhbiBhcmU6Ci0JU3MJWmlnemFnIGluZGV4IG9mIGZpcnN0IGNvZWZmaWNpZW50IGluY2x1ZGVkIGluIHNjYW4KLQlTZQlaaWd6YWcgaW5kZXggb2YgbGFzdCBjb2VmZmljaWVudCBpbmNsdWRlZCBpbiBzY2FuCi0JQWgJWmVybyBmb3IgZmlyc3Qgc2NhbiBvZiBhIGNvZWZmaWNpZW50LCBlbHNlIEFsIG9mIHByaW9yIHNjYW4KLQlBbAlTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gbG93IGJpdCBwb3NpdGlvbiBmb3Igc2NhbgotSWYgdGhlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgYXJlIG9taXR0ZWQsIHRoZSB2YWx1ZXMgMCw2MywwLDAgYXJlIHVzZWQsCi1wcm9kdWNpbmcgYSBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIGNqcGVnIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lcyB3aGV0aGVyCi10aGUgc2NyaXB0IHJlcHJlc2VudHMgYSBwcm9ncmVzc2l2ZSBvciBzZXF1ZW50aWFsIGZpbGUsIGJ5IG9ic2VydmluZyB3aGV0aGVyCi1TcyBhbmQgU2UgdmFsdWVzIG90aGVyIHRoYW4gMCBhbmQgNjMgYXBwZWFyLiAgKFRoZSAtcHJvZ3Jlc3NpdmUgc3dpdGNoIGlzCi1ub3QgbmVlZGVkIHRvIHNwZWNpZnkgdGhpczsgaW4gZmFjdCwgaXQgaXMgaWdub3JlZCB3aGVuIC1zY2FucyBhcHBlYXJzLikKLVRoZSBzY2FuIHNjcmlwdCBtdXN0IG1lZXQgdGhlIEpQRUcgcmVzdHJpY3Rpb25zIG9uIHByb2dyZXNzaW9uIHNlcXVlbmNlcy4KLShjanBlZyBjaGVja3MgdGhhdCB0aGUgc3BlYydzIHJlcXVpcmVtZW50cyBhcmUgb2JleWVkLikKLQotU2NhbiBzY3JpcHQgZmlsZXMgYXJlIGZyZWUgZm9ybWF0LCBpbiB0aGF0IGFyYml0cmFyeSB3aGl0ZXNwYWNlIGNhbiBhcHBlYXIKLWJldHdlZW4gbnVtYmVycyBhbmQgYXJvdW5kIHB1bmN0dWF0aW9uLiAgQWxzbywgY29tbWVudHMgY2FuIGJlIGluY2x1ZGVkOiBhCi1jb21tZW50IHN0YXJ0cyB3aXRoICcjJyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgRm9yIGFkZGl0aW9uYWwKLWxlZ2liaWxpdHksIGNvbW1hcyBvciBkYXNoZXMgY2FuIGJlIHBsYWNlZCBiZXR3ZWVuIHZhbHVlcy4gIChBY3R1YWxseSwgYW55Ci1zaW5nbGUgcHVuY3R1YXRpb24gY2hhcmFjdGVyIG90aGVyIHRoYW4gJzonIG9yICc7JyBjYW4gYmUgaW5zZXJ0ZWQuKSAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIHR3byBzY2FuIGRlZmluaXRpb25zIGFyZSBlcXVpdmFsZW50OgotCTAgMSAyOiAwIDYzIDAgMDsKLQkwLDEsMiA6IDAtNjMsIDAsMCA7Ci0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHNjYW4gc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIGEgcGFydGlhbGx5IGludGVybGVhdmVkCi1zZXF1ZW50aWFsIEpQRUcgZmlsZToKLQotCTA7CQkJIyBZIG9ubHkgaW4gZmlyc3Qgc2NhbgotCTEgMjsJCQkjIENiIGFuZCBDciBpbiBzZWNvbmQgc2NhbgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBwcm9ncmVzc2l2ZSBzY2FuIHNjcmlwdCB1c2luZyBvbmx5IHNwZWN0cmFsIHNlbGVjdGlvbgotKG5vIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbik6Ci0KLQkjIEludGVybGVhdmVkIERDIHNjYW4gZm9yIFksQ2IsQ3I6Ci0JMCwxLDI6IDAtMCwgICAwLCAwIDsKLQkjIEFDIHNjYW5zOgotCTA6ICAgICAxLTIsICAgMCwgMCA7CSMgRmlyc3QgdHdvIFkgQUMgY29lZmZpY2llbnRzCi0JMDogICAgIDMtNSwgICAwLCAwIDsJIyBUaHJlZSBtb3JlCi0JMTogICAgIDEtNjMsICAwLCAwIDsJIyBBbGwgQUMgY29lZmZpY2llbnRzIGZvciBDYgotCTI6ICAgICAxLTYzLCAgMCwgMCA7CSMgQWxsIEFDIGNvZWZmaWNpZW50cyBmb3IgQ3IKLQkwOiAgICAgNi05LCAgIDAsIDAgOwkjIE1vcmUgWSBjb2VmZmljaWVudHMKLQkwOiAgICAgMTAtNjMsIDAsIDAgOwkjIFJlbWFpbmluZyBZIGNvZWZmaWNpZW50cwotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBzdWNjZXNzaXZlLWFwcHJveGltYXRpb24gc2NyaXB0LiAgVGhpcyBpcyBlcXVpdmFsZW50Ci10byB0aGUgZGVmYXVsdCBzY3JpcHQgdXNlZCBieSAiY2pwZWcgLXByb2dyZXNzaXZlIiBmb3IgWUNiQ3IgaW1hZ2VzOgotCi0JIyBJbml0aWFsIERDIHNjYW4gZm9yIFksQ2IsQ3IgKGxvd2VzdCBiaXQgbm90IHNlbnQpCi0JMCwxLDI6IDAtMCwgICAwLCAxIDsKLQkjIEZpcnN0IEFDIHNjYW46IHNlbmQgZmlyc3QgNSBZIEFDIGNvZWZmaWNpZW50cywgbWludXMgMiBsb3dlc3QgYml0czoKLQkwOiAgICAgMS01LCAgIDAsIDIgOwotCSMgU2VuZCBhbGwgQ3IsQ2IgQUMgY29lZmZpY2llbnRzLCBtaW51cyBsb3dlc3QgYml0OgotCSMgKGNocm9tYSBkYXRhIGlzIHVzdWFsbHkgdG9vIHNtYWxsIHRvIGJlIHdvcnRoIHN1YmRpdmlkaW5nIGZ1cnRoZXI7Ci0JIyAgYnV0IG5vdGUgd2Ugc2VuZCBDciBmaXJzdCBzaW5jZSBleWUgaXMgbGVhc3Qgc2Vuc2l0aXZlIHRvIENiKQotCTI6ICAgICAxLTYzLCAgMCwgMSA7Ci0JMTogICAgIDEtNjMsICAwLCAxIDsKLQkjIFNlbmQgcmVtYWluaW5nIFkgQUMgY29lZmZpY2llbnRzLCBtaW51cyAyIGxvd2VzdCBiaXRzOgotCTA6ICAgICA2LTYzLCAgMCwgMiA7Ci0JIyBTZW5kIG5leHQtdG8tbG93ZXN0IGJpdCBvZiBhbGwgWSBBQyBjb2VmZmljaWVudHM6Ci0JMDogICAgIDEtNjMsICAyLCAxIDsKLQkjIEF0IHRoaXMgcG9pbnQgd2UndmUgc2VudCBhbGwgYnV0IHRoZSBsb3dlc3QgYml0IG9mIGFsbCBjb2VmZmljaWVudHMuCi0JIyBTZW5kIGxvd2VzdCBiaXQgb2YgREMgY29lZmZpY2llbnRzCi0JMCwxLDI6IDAtMCwgICAxLCAwIDsKLQkjIFNlbmQgbG93ZXN0IGJpdCBvZiBBQyBjb2VmZmljaWVudHMKLQkyOiAgICAgMS02MywgIDEsIDAgOwotCTE6ICAgICAxLTYzLCAgMSwgMCA7Ci0JIyBZIEFDIGxvd2VzdCBiaXQgc2NhbiBpcyBsYXN0OyBpdCdzIHVzdWFsbHkgdGhlIGxhcmdlc3Qgc2NhbgotCTA6ICAgICAxLTYzLCAgMSwgMCA7Ci0KLUl0IG1heSBiZSB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCB0aGlzIHNjcmlwdCBpcyB0dW5lZCBmb3IgcXVhbGl0eSBzZXR0aW5ncwotb2YgYXJvdW5kIDUwIHRvIDc1LiAgRm9yIGxvd2VyIHF1YWxpdHkgc2V0dGluZ3MsIHlvdSdkIHByb2JhYmx5IHdhbnQgdG8gdXNlCi1hIHNjcmlwdCB3aXRoIGZld2VyIHN0YWdlcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKG90aGVyd2lzZSB0aGUKLWluaXRpYWwgc2NhbnMgd2lsbCBiZSByZWFsbHkgYmFkKS4gIEZvciBoaWdoZXIgcXVhbGl0eSBzZXR0aW5ncywgeW91IG1pZ2h0Ci13YW50IHRvIHVzZSBtb3JlIHN0YWdlcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKHNvIHRoYXQgdGhlIGluaXRpYWwKLXNjYW5zIGFyZSBub3QgdG9vIGxhcmdlKS4KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dyYm1wLmMgYi9saWJqcGVndHdycC93cmJtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgzYjBmLi4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dyYm1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoKLSAqIHdyYm1wLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIE1pY3Jvc29mdCAiQk1QIgotICogZm9ybWF0IChNUyBXaW5kb3dzIDMueCBhbmQgT1MvMiAxLnggZmxhdm9ycykuCi0gKiBFaXRoZXIgOC1iaXQgY29sb3JtYXBwZWQgb3IgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGNhbiBiZSB3cml0dGVuLgotICogTm8gY29tcHJlc3Npb24gaXMgc3VwcG9ydGVkLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KLSAqCi0gKiBUaGlzIGNvZGUgY29udHJpYnV0ZWQgYnkgSmFtZXMgQXJ0aHVyIEJvdWNoZXIuCi0gKi8KLQotI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KLQotI2lmZGVmIEJNUF9TVVBQT1JURUQKLQotCi0vKgotICogVG8gc3VwcG9ydCAxMi1iaXQgSlBFRyBkYXRhLCB3ZSdkIGhhdmUgdG8gc2NhbGUgb3V0cHV0IGRvd24gdG8gOCBiaXRzLgotICogVGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotLyoKLSAqIFNpbmNlIEJNUCBzdG9yZXMgc2NhbmxpbmVzIGJvdHRvbS10by10b3AsIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSBpbWFnZQotICogZnJvbSBKUEVHJ3MgdG9wLXRvLWJvdHRvbSBvcmRlci4gIFRvIGRvIHRoaXMsIHdlIHNhdmUgdGhlIG91dGdvaW5nIGRhdGEKLSAqIGluIGEgdmlydHVhbCBhcnJheSBkdXJpbmcgcHV0X3BpeGVsX3JvdyBjYWxscywgdGhlbiBhY3R1YWxseSBlbWl0IHRoZQotICogQk1QIGZpbGUgZHVyaW5nIGZpbmlzaF9vdXRwdXQuICBUaGUgdmlydHVhbCBhcnJheSBjb250YWlucyBvbmUgSlNBTVBMRSBwZXIKLSAqIHBpeGVsIGlmIHRoZSBvdXRwdXQgaXMgZ3JheXNjYWxlIG9yIGNvbG9ybWFwcGVkLCB0aHJlZSBpZiBpdCBpcyBmdWxsIGNvbG9yLgotICovCi0KLS8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBib29sZWFuIGlzX29zMjsJCS8qIHNhdmVzIHRoZSBPUzIgZm9ybWF0IHJlcXVlc3QgZmxhZyAqLwotCi0gIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIG5lZWRlZCB0byByZXZlcnNlIHJvdyBvcmRlciAqLwotICBKRElNRU5TSU9OIGRhdGFfd2lkdGg7CS8qIEpTQU1QTEVzIHBlciByb3cgKi8KLSAgSkRJTUVOU0lPTiByb3dfd2lkdGg7CQkvKiBwaHlzaWNhbCB3aWR0aCBvZiBvbmUgcm93IGluIHRoZSBCTVAgZmlsZSAqLwotICBpbnQgcGFkX2J5dGVzOwkJLyogbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgbmVlZGVkIHBlciByb3cgKi8KLSAgSkRJTUVOU0lPTiBjdXJfb3V0cHV0X3JvdzsJLyogbmV4dCByb3cjIHRvIHdyaXRlIHRvIHZpcnR1YWwgYXJyYXkgKi8KLX0gYm1wX2Rlc3Rfc3RydWN0OwotCi10eXBlZGVmIGJtcF9kZXN0X3N0cnVjdCAqIGJtcF9kZXN0X3B0cjsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTE9DQUwodm9pZCkgd3JpdGVfY29sb3JtYXAKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0LAotCSAgICAgaW50IG1hcF9jb2xvcnMsIGludCBtYXBfZW50cnlfc2l6ZSkpOwotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLS8qIFRoaXMgdmVyc2lvbiBpcyBmb3Igd3JpdGluZyAyNC1iaXQgcGl4ZWxzICovCi17Ci0gIGJtcF9kZXN0X3B0ciBkZXN0ID0gKGJtcF9kZXN0X3B0cikgZGluZm87Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgaW50IHBhZDsKLQotICAvKiBBY2Nlc3MgbmV4dCByb3cgaW4gdmlydHVhbCBhcnJheSAqLwotICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPndob2xlX2ltYWdlLAotICAgICBkZXN0LT5jdXJfb3V0cHV0X3JvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOwotICBkZXN0LT5jdXJfb3V0cHV0X3JvdysrOwotCi0gIC8qIFRyYW5zZmVyIGRhdGEuICBOb3RlIGRlc3RpbmF0aW9uIHZhbHVlcyBtdXN0IGJlIGluIEJHUiBvcmRlcgotICAgKiAoZXZlbiB0aG91Z2ggTWljcm9zb2Z0J3Mgb3duIGRvY3VtZW50cyBzYXkgdGhlIG9wcG9zaXRlKS4KLSAgICovCi0gIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgb3V0cHRyID0gaW1hZ2VfcHRyWzBdOwotICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgb3V0cHRyWzJdID0gKmlucHRyKys7CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KLSAgICBvdXRwdHJbMV0gPSAqaW5wdHIrKzsKLSAgICBvdXRwdHJbMF0gPSAqaW5wdHIrKzsKLSAgICBvdXRwdHIgKz0gMzsKLSAgfQotCi0gIC8qIFplcm8gb3V0IHRoZSBwYWQgYnl0ZXMuICovCi0gIHBhZCA9IGRlc3QtPnBhZF9ieXRlczsKLSAgd2hpbGUgKC0tcGFkID49IDApCi0gICAgKm91dHB0cisrID0gMDsKLX0KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfZ3JheV9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkgICAgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotLyogVGhpcyB2ZXJzaW9uIGlzIGZvciBncmF5c2NhbGUgT1IgcXVhbnRpemVkIGNvbG9yIG91dHB1dCAqLwotewotICBibXBfZGVzdF9wdHIgZGVzdCA9IChibXBfZGVzdF9wdHIpIGRpbmZvOwotICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIGludCBwYWQ7Ci0KLSAgLyogQWNjZXNzIG5leHQgcm93IGluIHZpcnR1YWwgYXJyYXkgKi8KLSAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT53aG9sZV9pbWFnZSwKLSAgICAgZGVzdC0+Y3VyX291dHB1dF9yb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKLSAgZGVzdC0+Y3VyX291dHB1dF9yb3crKzsKLQotICAvKiBUcmFuc2ZlciBkYXRhLiAqLwotICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07Ci0gIG91dHB0ciA9IGltYWdlX3B0clswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgICpvdXRwdHIrKyA9ICppbnB0cisrOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCi0gIH0KLQotICAvKiBaZXJvIG91dCB0aGUgcGFkIGJ5dGVzLiAqLwotICBwYWQgPSBkZXN0LT5wYWRfYnl0ZXM7Ci0gIHdoaWxlICgtLXBhZCA+PSAwKQotICAgICpvdXRwdHIrKyA9IDA7Ci19Ci0KLQotLyoKLSAqIFN0YXJ0dXA6IG5vcm1hbGx5IHdyaXRlcyB0aGUgZmlsZSBoZWFkZXIuCi0gKiBJbiB0aGlzIG1vZHVsZSB3ZSBtYXkgYXMgd2VsbCBwb3N0cG9uZSBldmVyeXRoaW5nIHVudGlsIGZpbmlzaF9vdXRwdXQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgLyogbm8gd29yayBoZXJlICovCi19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICoKLSAqIEhlcmUgaXMgd2hlcmUgd2UgcmVhbGx5IG91dHB1dCB0aGUgQk1QIGZpbGUuCi0gKgotICogRmlyc3QsIHJvdXRpbmVzIHRvIHdyaXRlIHRoZSBXaW5kb3dzIGFuZCBPUy8yIHZhcmlhbnRzIG9mIHRoZSBmaWxlIGhlYWRlci4KLSAqLwotCi1MT0NBTCh2b2lkKQotd3JpdGVfYm1wX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QpCi0vKiBXcml0ZSBhIFdpbmRvd3Mtc3R5bGUgQk1QIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3JtYXAgaWYgbmVlZGVkICovCi17Ci0gIGNoYXIgYm1wZmlsZWhlYWRlclsxNF07Ci0gIGNoYXIgYm1waW5mb2hlYWRlcls0MF07Ci0jZGVmaW5lIFBVVF8yQihhcnJheSxvZmZzZXQsdmFsdWUpICBcCi0JKGFycmF5W29mZnNldF0gPSAoY2hhcikgKCh2YWx1ZSkgJiAweEZGKSwgXAotCSBhcnJheVtvZmZzZXQrMV0gPSAoY2hhcikgKCgodmFsdWUpID4+IDgpICYgMHhGRikpCi0jZGVmaW5lIFBVVF80QihhcnJheSxvZmZzZXQsdmFsdWUpICBcCi0JKGFycmF5W29mZnNldF0gPSAoY2hhcikgKCh2YWx1ZSkgJiAweEZGKSwgXAotCSBhcnJheVtvZmZzZXQrMV0gPSAoY2hhcikgKCgodmFsdWUpID4+IDgpICYgMHhGRiksIFwKLQkgYXJyYXlbb2Zmc2V0KzJdID0gKGNoYXIpICgoKHZhbHVlKSA+PiAxNikgJiAweEZGKSwgXAotCSBhcnJheVtvZmZzZXQrM10gPSAoY2hhcikgKCgodmFsdWUpID4+IDI0KSAmIDB4RkYpKQotICBJTlQzMiBoZWFkZXJzaXplLCBiZlNpemU7Ci0gIGludCBiaXRzX3Blcl9waXhlbCwgY21hcF9lbnRyaWVzOwotCi0gIC8qIENvbXB1dGUgY29sb3JtYXAgc2l6ZSBhbmQgdG90YWwgZmlsZSBzaXplICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgICAgLyogQ29sb3JtYXBwZWQgUkdCICovCi0gICAgICBiaXRzX3Blcl9waXhlbCA9IDg7Ci0gICAgICBjbWFwX2VudHJpZXMgPSAyNTY7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFVucXVhbnRpemVkLCBmdWxsIGNvbG9yIFJHQiAqLwotICAgICAgYml0c19wZXJfcGl4ZWwgPSAyNDsKLSAgICAgIGNtYXBfZW50cmllcyA9IDA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIEdyYXlzY2FsZSBvdXRwdXQuICBXZSBuZWVkIHRvIGZha2UgYSAyNTYtZW50cnkgY29sb3JtYXAuICovCi0gICAgYml0c19wZXJfcGl4ZWwgPSA4OwotICAgIGNtYXBfZW50cmllcyA9IDI1NjsKLSAgfQotICAvKiBGaWxlIHNpemUgKi8KLSAgaGVhZGVyc2l6ZSA9IDE0ICsgNDAgKyBjbWFwX2VudHJpZXMgKiA0OyAvKiBIZWFkZXIgYW5kIGNvbG9ybWFwICovCi0gIGJmU2l6ZSA9IGhlYWRlcnNpemUgKyAoSU5UMzIpIGRlc3QtPnJvd193aWR0aCAqIChJTlQzMikgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0gIAotICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLwotICBNRU1aRVJPKGJtcGZpbGVoZWFkZXIsIFNJWkVPRihibXBmaWxlaGVhZGVyKSk7Ci0gIE1FTVpFUk8oYm1waW5mb2hlYWRlciwgU0laRU9GKGJtcGluZm9oZWFkZXIpKTsKLQotICAvKiBGaWxsIHRoZSBmaWxlIGhlYWRlciAqLwotICBibXBmaWxlaGVhZGVyWzBdID0gMHg0MjsJLyogZmlyc3QgMiBieXRlcyBhcmUgQVNDSUkgJ0InLCAnTScgKi8KLSAgYm1wZmlsZWhlYWRlclsxXSA9IDB4NEQ7Ci0gIFBVVF80QihibXBmaWxlaGVhZGVyLCAyLCBiZlNpemUpOyAvKiBiZlNpemUgKi8KLSAgLyogd2UgbGVhdmUgYmZSZXNlcnZlZDEgJiBiZlJlc2VydmVkMiA9IDAgKi8KLSAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDEwLCBoZWFkZXJzaXplKTsgLyogYmZPZmZCaXRzICovCi0KLSAgLyogRmlsbCB0aGUgaW5mbyBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQSU5GT0hFQURFUikgKi8KLSAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDAsIDQwKTsJLyogYmlTaXplICovCi0gIFBVVF80QihibXBpbmZvaGVhZGVyLCA0LCBjaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogYmlXaWR0aCAqLwotICBQVVRfNEIoYm1waW5mb2hlYWRlciwgOCwgY2luZm8tPm91dHB1dF9oZWlnaHQpOyAvKiBiaUhlaWdodCAqLwotICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMTIsIDEpOwkvKiBiaVBsYW5lcyAtIG11c3QgYmUgMSAqLwotICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMTQsIGJpdHNfcGVyX3BpeGVsKTsgLyogYmlCaXRDb3VudCAqLwotICAvKiB3ZSBsZWF2ZSBiaUNvbXByZXNzaW9uID0gMCwgZm9yIG5vbmUgKi8KLSAgLyogd2UgbGVhdmUgYmlTaXplSW1hZ2UgPSAwOyB0aGlzIGlzIGNvcnJlY3QgZm9yIHVuY29tcHJlc3NlZCBkYXRhICovCi0gIGlmIChjaW5mby0+ZGVuc2l0eV91bml0ID09IDIpIHsgLyogaWYgaGF2ZSBkZW5zaXR5IGluIGRvdHMvY20sIHRoZW4gKi8KLSAgICBQVVRfNEIoYm1waW5mb2hlYWRlciwgMjQsIChJTlQzMikgKGNpbmZvLT5YX2RlbnNpdHkqMTAwKSk7IC8qIFhQZWxzL00gKi8KLSAgICBQVVRfNEIoYm1waW5mb2hlYWRlciwgMjgsIChJTlQzMikgKGNpbmZvLT5ZX2RlbnNpdHkqMTAwKSk7IC8qIFhQZWxzL00gKi8KLSAgfQotICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMzIsIGNtYXBfZW50cmllcyk7IC8qIGJpQ2xyVXNlZCAqLwotICAvKiB3ZSBsZWF2ZSBiaUNsckltcG9ydGFudCA9IDAgKi8KLQotICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSAhPSAoc2l6ZV90KSAxNCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGluZm9oZWFkZXIsIDQwKSAhPSAoc2l6ZV90KSA0MCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotCi0gIGlmIChjbWFwX2VudHJpZXMgPiAwKQotICAgIHdyaXRlX2NvbG9ybWFwKGNpbmZvLCBkZXN0LCBjbWFwX2VudHJpZXMsIDQpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi13cml0ZV9vczJfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCkKLS8qIFdyaXRlIGFuIE9TMi1zdHlsZSBCTVAgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvcm1hcCBpZiBuZWVkZWQgKi8KLXsKLSAgY2hhciBibXBmaWxlaGVhZGVyWzE0XTsKLSAgY2hhciBibXBjb3JlaGVhZGVyWzEyXTsKLSAgSU5UMzIgaGVhZGVyc2l6ZSwgYmZTaXplOwotICBpbnQgYml0c19wZXJfcGl4ZWwsIGNtYXBfZW50cmllczsKLQotICAvKiBDb21wdXRlIGNvbG9ybWFwIHNpemUgYW5kIHRvdGFsIGZpbGUgc2l6ZSAqLwotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAgIC8qIENvbG9ybWFwcGVkIFJHQiAqLwotICAgICAgYml0c19wZXJfcGl4ZWwgPSA4OwotICAgICAgY21hcF9lbnRyaWVzID0gMjU2OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBVbnF1YW50aXplZCwgZnVsbCBjb2xvciBSR0IgKi8KLSAgICAgIGJpdHNfcGVyX3BpeGVsID0gMjQ7Ci0gICAgICBjbWFwX2VudHJpZXMgPSAwOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBHcmF5c2NhbGUgb3V0cHV0LiAgV2UgbmVlZCB0byBmYWtlIGEgMjU2LWVudHJ5IGNvbG9ybWFwLiAqLwotICAgIGJpdHNfcGVyX3BpeGVsID0gODsKLSAgICBjbWFwX2VudHJpZXMgPSAyNTY7Ci0gIH0KLSAgLyogRmlsZSBzaXplICovCi0gIGhlYWRlcnNpemUgPSAxNCArIDEyICsgY21hcF9lbnRyaWVzICogMzsgLyogSGVhZGVyIGFuZCBjb2xvcm1hcCAqLwotICBiZlNpemUgPSBoZWFkZXJzaXplICsgKElOVDMyKSBkZXN0LT5yb3dfd2lkdGggKiAoSU5UMzIpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAKLSAgLyogU2V0IHVudXNlZCBmaWVsZHMgb2YgaGVhZGVyIHRvIDAgKi8KLSAgTUVNWkVSTyhibXBmaWxlaGVhZGVyLCBTSVpFT0YoYm1wZmlsZWhlYWRlcikpOwotICBNRU1aRVJPKGJtcGNvcmVoZWFkZXIsIFNJWkVPRihibXBjb3JlaGVhZGVyKSk7Ci0KLSAgLyogRmlsbCB0aGUgZmlsZSBoZWFkZXIgKi8KLSAgYm1wZmlsZWhlYWRlclswXSA9IDB4NDI7CS8qIGZpcnN0IDIgYnl0ZXMgYXJlIEFTQ0lJICdCJywgJ00nICovCi0gIGJtcGZpbGVoZWFkZXJbMV0gPSAweDREOwotICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMiwgYmZTaXplKTsgLyogYmZTaXplICovCi0gIC8qIHdlIGxlYXZlIGJmUmVzZXJ2ZWQxICYgYmZSZXNlcnZlZDIgPSAwICovCi0gIFBVVF80QihibXBmaWxlaGVhZGVyLCAxMCwgaGVhZGVyc2l6ZSk7IC8qIGJmT2ZmQml0cyAqLwotCi0gIC8qIEZpbGwgdGhlIGluZm8gaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUENPUkVIRUFERVIpICovCi0gIFBVVF8yQihibXBjb3JlaGVhZGVyLCAwLCAxMik7CS8qIGJjU2l6ZSAqLwotICBQVVRfMkIoYm1wY29yZWhlYWRlciwgNCwgY2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGJjV2lkdGggKi8KLSAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDYsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsgLyogYmNIZWlnaHQgKi8KLSAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDgsIDEpOwkvKiBiY1BsYW5lcyAtIG11c3QgYmUgMSAqLwotICBQVVRfMkIoYm1wY29yZWhlYWRlciwgMTAsIGJpdHNfcGVyX3BpeGVsKTsgLyogYmNCaXRDb3VudCAqLwotCi0gIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1wZmlsZWhlYWRlciwgMTQpICE9IChzaXplX3QpIDE0KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci0gIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1wY29yZWhlYWRlciwgMTIpICE9IChzaXplX3QpIDEyKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci0KLSAgaWYgKGNtYXBfZW50cmllcyA+IDApCi0gICAgd3JpdGVfY29sb3JtYXAoY2luZm8sIGRlc3QsIGNtYXBfZW50cmllcywgMyk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHRoZSBjb2xvcm1hcC4KLSAqIFdpbmRvd3MgdXNlcyBCR1IwIG1hcCBlbnRyaWVzOyBPUy8yIHVzZXMgQkdSIGVudHJpZXMuCi0gKi8KLQotTE9DQUwodm9pZCkKLXdyaXRlX2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCwKLQkJaW50IG1hcF9jb2xvcnMsIGludCBtYXBfZW50cnlfc2l6ZSkKLXsKLSAgSlNBTVBBUlJBWSBjb2xvcm1hcCA9IGNpbmZvLT5jb2xvcm1hcDsKLSAgaW50IG51bV9jb2xvcnMgPSBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7Ci0gIEZJTEUgKiBvdXRmaWxlID0gZGVzdC0+cHViLm91dHB1dF9maWxlOwotICBpbnQgaTsKLQotICBpZiAoY29sb3JtYXAgIT0gTlVMTCkgewotICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykgewotICAgICAgLyogTm9ybWFsIGNhc2Ugd2l0aCBSR0IgY29sb3JtYXAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKLQlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMl1baV0pLCBvdXRmaWxlKTsKLQlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMV1baV0pLCBvdXRmaWxlKTsKLQlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKLQlpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKLQkgIHB1dGMoMCwgb3V0ZmlsZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEdyYXlzY2FsZSBjb2xvcm1hcCAob25seSBoYXBwZW5zIHdpdGggZ3JheXNjYWxlIHF1YW50aXphdGlvbikgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKLQlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKLQlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKLQlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKLQlpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKLQkgIHB1dGMoMCwgb3V0ZmlsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIElmIG5vIGNvbG9ybWFwLCBtdXN0IGJlIGdyYXlzY2FsZSBkYXRhLiAgR2VuZXJhdGUgYSBsaW5lYXIgIm1hcCIuICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICBwdXRjKGksIG91dGZpbGUpOwotICAgICAgcHV0YyhpLCBvdXRmaWxlKTsKLSAgICAgIHB1dGMoaSwgb3V0ZmlsZSk7Ci0gICAgICBpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKLQlwdXRjKDAsIG91dGZpbGUpOwotICAgIH0KLSAgfQotICAvKiBQYWQgY29sb3JtYXAgd2l0aCB6ZXJvcyB0byBlbnN1cmUgc3BlY2lmaWVkIG51bWJlciBvZiBjb2xvcm1hcCBlbnRyaWVzICovIAotICBpZiAoaSA+IG1hcF9jb2xvcnMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVE9PX01BTllfQ09MT1JTLCBpKTsKLSAgZm9yICg7IGkgPCBtYXBfY29sb3JzOyBpKyspIHsKLSAgICBwdXRjKDAsIG91dGZpbGUpOwotICAgIHB1dGMoMCwgb3V0ZmlsZSk7Ci0gICAgcHV0YygwLCBvdXRmaWxlKTsKLSAgICBpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKLSAgICAgIHB1dGMoMCwgb3V0ZmlsZSk7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgYm1wX2Rlc3RfcHRyIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgRklMRSAqIG91dGZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7Ci0gIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBkYXRhX3B0cjsKLSAgSkRJTUVOU0lPTiByb3c7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0KLSAgLyogV3JpdGUgdGhlIGhlYWRlciBhbmQgY29sb3JtYXAgKi8KLSAgaWYgKGRlc3QtPmlzX29zMikKLSAgICB3cml0ZV9vczJfaGVhZGVyKGNpbmZvLCBkZXN0KTsKLSAgZWxzZQotICAgIHdyaXRlX2JtcF9oZWFkZXIoY2luZm8sIGRlc3QpOwotCi0gIC8qIFdyaXRlIHRoZSBmaWxlIGJvZHkgZnJvbSBvdXIgdmlydHVhbCBhcnJheSAqLwotICBmb3IgKHJvdyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OyByb3cgPiAwOyByb3ctLSkgewotICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IChsb25nKSAoY2luZm8tPm91dHB1dF9oZWlnaHQgLSByb3cpOwotICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgfQotICAgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT53aG9sZV9pbWFnZSwgcm93LTEsIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0gICAgZGF0YV9wdHIgPSBpbWFnZV9wdHJbMF07Ci0gICAgZm9yIChjb2wgPSBkZXN0LT5yb3dfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICBwdXRjKEdFVEpTQU1QTEUoKmRhdGFfcHRyKSwgb3V0ZmlsZSk7Ci0gICAgICBkYXRhX3B0cisrOwotICAgIH0KLSAgfQotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KLSAgZmZsdXNoKG91dGZpbGUpOwotICBpZiAoZmVycm9yKG91dGZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEJNUCBmb3JtYXQgb3V0cHV0LgotICovCi0KLUdMT0JBTChkanBlZ19kZXN0X3B0cikKLWppbml0X3dyaXRlX2JtcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19vczIpCi17Ci0gIGJtcF9kZXN0X3B0ciBkZXN0OwotICBKRElNRU5TSU9OIHJvd193aWR0aDsKLQotICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCi0gIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihibXBfZGVzdF9zdHJ1Y3QpKTsKLSAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9ibXA7Ci0gIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9ibXA7Ci0gIGRlc3QtPmlzX29zMiA9IGlzX29zMjsKLQotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7Ci0gICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKLSAgfSBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7Ci0gICAgZWxzZQotICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7Ci0gIH0gZWxzZSB7Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQ09MT1JTUEFDRSk7Ci0gIH0KLQotICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCi0gIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdpZHRoIG9mIHJvd3MgaW4gdGhlIEJNUCBmaWxlIChwYWRkZWQgdG8gNC1ieXRlIGJvdW5kYXJ5KS4gKi8KLSAgcm93X3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgZGVzdC0+ZGF0YV93aWR0aCA9IHJvd193aWR0aDsKLSAgd2hpbGUgKChyb3dfd2lkdGggJiAzKSAhPSAwKSByb3dfd2lkdGgrKzsKLSAgZGVzdC0+cm93X3dpZHRoID0gcm93X3dpZHRoOwotICBkZXN0LT5wYWRfYnl0ZXMgPSAoaW50KSAocm93X3dpZHRoIC0gZGVzdC0+ZGF0YV93aWR0aCk7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGludmVyc2lvbiBhcnJheSwgcHJlcGFyZSBmb3Igd3JpdGUgcGFzcyAqLwotICBkZXN0LT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLSAgICAgcm93X3dpZHRoLCBjaW5mby0+b3V0cHV0X2hlaWdodCwgKEpESU1FTlNJT04pIDEpOwotICBkZXN0LT5jdXJfb3V0cHV0X3JvdyA9IDA7Ci0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKLSAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7IC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLwotICB9Ci0KLSAgLyogQ3JlYXRlIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLwotICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgcm93X3dpZHRoLCAoSkRJTUVOU0lPTikgMSk7Ci0gIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLQotICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OwotfQotCi0jZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlianBlZ3R3cnAvd3JnaWYuYyBiL2xpYmpwZWd0d3JwL3dyZ2lmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTgzMjguLjAwMDAwMDAKLS0tIGEvbGlianBlZ3R3cnAvd3JnaWYuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKgotICogd3JnaWYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gR0lGIGZvcm1hdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5PVEU6IHRvIGF2b2lkIGVudGFuZ2xlbWVudHMgd2l0aCBVbmlzeXMnIHBhdGVudCBvbiBMWlcgY29tcHJlc3Npb24sICAgKgotICogdGhpcyBjb2RlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIG91dHB1dCAidW5jb21wcmVzc2VkIEdJRiIgZmlsZXMuICAgICAgICAqCi0gKiBUaGVyZSBpcyBubyB0cmFjZSBvZiB0aGUgTFpXIGFsZ29yaXRobSBpbiB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KLSAqLwotCi0vKgotICogVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gcHBtdG9naWYgZnJvbSB0aGUgUEJNUExVUyBkaXN0cmlidXRpb24KLSAqIG9mIEZlYi4gMTk5MS4gIFRoYXQgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2U6Ci0gKiAgICBCYXNlZCBvbiBHSUZFTkNPREUgYnkgRGF2aWQgUm93bGV5IDxtZ2FyZGlAd2F0ZHNjdS53YXRlcmxvby5lZHU+LgotICogICAgTGVtcGVsLVppdiBjb21wcmVzc2lvbiBiYXNlZCBvbiAiY29tcHJlc3MiIGJ5IFNwZW5jZXIgVy4gVGhvbWFzIGV0IGFsLgotICogICAgQ29weXJpZ2h0IChDKSAxOTg5IGJ5IEplZiBQb3NrYW56ZXIuCi0gKiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSAqICAgIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiAgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiAgICBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgotICogICAgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBXZSBhcmUgYWxzbyByZXF1aXJlZCB0byBzdGF0ZSB0aGF0Ci0gKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCi0gKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgotICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBHSUZfU1VQUE9SVEVECi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KLQotICAvKiBTdGF0ZSBmb3IgcGFja2luZyB2YXJpYWJsZS13aWR0aCBjb2RlcyBpbnRvIGEgYml0c3RyZWFtICovCi0gIGludCBuX2JpdHM7CQkJLyogY3VycmVudCBudW1iZXIgb2YgYml0cy9jb2RlICovCi0gIGludCBtYXhjb2RlOwkJCS8qIG1heGltdW0gY29kZSwgZ2l2ZW4gbl9iaXRzICovCi0gIElOVDMyIGN1cl9hY2N1bTsJCS8qIGhvbGRzIGJpdHMgbm90IHlldCBvdXRwdXQgKi8KLSAgaW50IGN1cl9iaXRzOwkJCS8qICMgb2YgYml0cyBpbiBjdXJfYWNjdW0gKi8KLQotICAvKiBTdGF0ZSBmb3IgR0lGIGNvZGUgYXNzaWdubWVudCAqLwotICBpbnQgQ2xlYXJDb2RlOwkJLyogY2xlYXIgY29kZSAoZG9lc24ndCBjaGFuZ2UpICovCi0gIGludCBFT0ZDb2RlOwkJCS8qIEVPRiBjb2RlIChkaXR0bykgKi8KLSAgaW50IGNvZGVfY291bnRlcjsJCS8qIGNvdW50cyBvdXRwdXQgc3ltYm9scyAqLwotCi0gIC8qIEdJRiBkYXRhIHBhY2tldCBjb25zdHJ1Y3Rpb24gYnVmZmVyICovCi0gIGludCBieXRlc2lucGt0OwkJLyogIyBvZiBieXRlcyBpbiBjdXJyZW50IHBhY2tldCAqLwotICBjaGFyIHBhY2tldGJ1ZlsyNTZdOwkJLyogd29ya3NwYWNlIGZvciBhY2N1bXVsYXRpbmcgcGFja2V0ICovCi0KLX0gZ2lmX2Rlc3Rfc3RydWN0OwotCi10eXBlZGVmIGdpZl9kZXN0X3N0cnVjdCAqIGdpZl9kZXN0X3B0cjsKLQotLyogTGFyZ2VzdCB2YWx1ZSB0aGF0IHdpbGwgZml0IGluIE4gYml0cyAqLwotI2RlZmluZSBNQVhDT0RFKG5fYml0cykJKCgxIDw8IChuX2JpdHMpKSAtIDEpCi0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIHBhY2thZ2UgZmluaXNoZWQgZGF0YSBieXRlcyBpbnRvIEdJRiBkYXRhIGJsb2Nrcy4KLSAqIEEgZGF0YSBibG9jayBjb25zaXN0cyBvZiBhIGNvdW50IGJ5dGUgKDEuLjI1NSkgYW5kIHRoYXQgbWFueSBkYXRhIGJ5dGVzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1mbHVzaF9wYWNrZXQgKGdpZl9kZXN0X3B0ciBkaW5mbykKLS8qIGZsdXNoIGFueSBhY2N1bXVsYXRlZCBkYXRhICovCi17Ci0gIGlmIChkaW5mby0+Ynl0ZXNpbnBrdCA+IDApIHsJLyogbmV2ZXIgd3JpdGUgemVyby1sZW5ndGggcGFja2V0ICovCi0gICAgZGluZm8tPnBhY2tldGJ1ZlswXSA9IChjaGFyKSBkaW5mby0+Ynl0ZXNpbnBrdCsrOwotICAgIGlmIChKRldSSVRFKGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUsIGRpbmZvLT5wYWNrZXRidWYsIGRpbmZvLT5ieXRlc2lucGt0KQotCSE9IChzaXplX3QpIGRpbmZvLT5ieXRlc2lucGt0KQotICAgICAgRVJSRVhJVChkaW5mby0+Y2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci0gICAgZGluZm8tPmJ5dGVzaW5wa3QgPSAwOwotICB9Ci19Ci0KLQotLyogQWRkIGEgY2hhcmFjdGVyIHRvIGN1cnJlbnQgcGFja2V0OyBmbHVzaCB0byBkaXNrIGlmIG5lY2Vzc2FyeSAqLwotI2RlZmluZSBDSEFSX09VVChkaW5mbyxjKSAgXAotCXsgKGRpbmZvKS0+cGFja2V0YnVmWysrKGRpbmZvKS0+Ynl0ZXNpbnBrdF0gPSAoY2hhcikgKGMpOyAgXAotCSAgICBpZiAoKGRpbmZvKS0+Ynl0ZXNpbnBrdCA+PSAyNTUpICBcCi0JICAgICAgZmx1c2hfcGFja2V0KGRpbmZvKTsgIFwKLQl9Ci0KLQotLyogUm91dGluZSB0byBjb252ZXJ0IHZhcmlhYmxlLXdpZHRoIGNvZGVzIGludG8gYSBieXRlIHN0cmVhbSAqLwotCi1MT0NBTCh2b2lkKQotb3V0cHV0IChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBjb2RlKQotLyogRW1pdCBhIGNvZGUgb2Ygbl9iaXRzIGJpdHMgKi8KLS8qIFVzZXMgY3VyX2FjY3VtIGFuZCBjdXJfYml0cyB0byByZWJsb2NrIGludG8gOC1iaXQgYnl0ZXMgKi8KLXsKLSAgZGluZm8tPmN1cl9hY2N1bSB8PSAoKElOVDMyKSBjb2RlKSA8PCBkaW5mby0+Y3VyX2JpdHM7Ci0gIGRpbmZvLT5jdXJfYml0cyArPSBkaW5mby0+bl9iaXRzOwotCi0gIHdoaWxlIChkaW5mby0+Y3VyX2JpdHMgPj0gOCkgewotICAgIENIQVJfT1VUKGRpbmZvLCBkaW5mby0+Y3VyX2FjY3VtICYgMHhGRik7Ci0gICAgZGluZm8tPmN1cl9hY2N1bSA+Pj0gODsKLSAgICBkaW5mby0+Y3VyX2JpdHMgLT0gODsKLSAgfQotfQotCi0KLS8qIFRoZSBwc2V1ZG8tY29tcHJlc3Npb24gYWxnb3JpdGhtLgotICoKLSAqIEluIHRoaXMgbW9kdWxlIHdlIHNpbXBseSBvdXRwdXQgZWFjaCBwaXhlbCB2YWx1ZSBhcyBhIHNlcGFyYXRlIHN5bWJvbDsKLSAqIHRodXMsIG5vIGNvbXByZXNzaW9uIG9jY3Vycy4gIEluIGZhY3QsIHRoZXJlIGlzIGV4cGFuc2lvbiBvZiBvbmUgYml0IHBlcgotICogcGl4ZWwsIGJlY2F1c2Ugd2UgdXNlIGEgc3ltYm9sIHdpZHRoIG9uZSBiaXQgd2lkZXIgdGhhbiB0aGUgcGl4ZWwgd2lkdGguCi0gKgotICogR0lGIG9yZGluYXJpbHkgdXNlcyB2YXJpYWJsZS13aWR0aCBzeW1ib2xzLCBhbmQgdGhlIGRlY29kZXIgd2lsbCBleHBlY3QKLSAqIHRvIHJhdGNoZXQgdXAgdGhlIHN5bWJvbCB3aWR0aCBhZnRlciBhIGZpeGVkIG51bWJlciBvZiBzeW1ib2xzLgotICogVG8gc2ltcGxpZnkgdGhlIGxvZ2ljIGFuZCBrZWVwIHRoZSBleHBhbnNpb24gcGVuYWx0eSBkb3duLCB3ZSBlbWl0IGEKLSAqIEdJRiBDbGVhciBjb2RlIHRvIHJlc2V0IHRoZSBkZWNvZGVyIGp1c3QgYmVmb3JlIHRoZSB3aWR0aCB3b3VsZCByYXRjaGV0IHVwLgotICogVGh1cywgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGhhdmUgdGhlIHNhbWUgYml0IHdpZHRoLgotICogTm90ZSB0aGF0IGVtaXR0aW5nIHRoZSBDbGVhciBjb2RlcyBhdCB0aGUgcmlnaHQgdGltZXMgaXMgYSBtZXJlIG1hdHRlciBvZgotICogY291bnRpbmcgb3V0cHV0IHN5bWJvbHMgYW5kIGlzIGluIG5vIHdheSBkZXBlbmRlbnQgb24gdGhlIExaVyBwYXRlbnQuCi0gKgotICogV2l0aCBhIHNtYWxsIGJhc2ljIHBpeGVsIHdpZHRoIChsb3cgY29sb3IgY291bnQpLCBDbGVhciBjb2RlcyB3aWxsIGJlCi0gKiBuZWVkZWQgdmVyeSBmcmVxdWVudGx5LCBjYXVzaW5nIHRoZSBmaWxlIHRvIGV4cGFuZCBldmVuIG1vcmUuICBTbyB0aGlzCi0gKiBzaW1wbGlzdGljIGFwcHJvYWNoIHdvdWxkbid0IHdvcmsgdG9vIHdlbGwgb24gYmlsZXZlbCBpbWFnZXMsIGZvciBleGFtcGxlLgotICogQnV0IGZvciBvdXRwdXQgb2YgSlBFRyBjb252ZXJzaW9ucyB0aGUgcGl4ZWwgd2lkdGggd2lsbCB1c3VhbGx5IGJlIDggYml0cwotICogKDEyOSB0byAyNTYgY29sb3JzKSwgc28gdGhlIG92ZXJoZWFkIGFkZGVkIGJ5IENsZWFyIHN5bWJvbHMgaXMgb25seSBhYm91dAotICogb25lIHN5bWJvbCBpbiBldmVyeSAyNTYuCi0gKi8KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX2luaXQgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGlfYml0cykKLS8qIEluaXRpYWxpemUgcHNldWRvLWNvbXByZXNzb3IgKi8KLXsKLSAgLyogaW5pdCBhbGwgdGhlIHN0YXRlIHZhcmlhYmxlcyAqLwotICBkaW5mby0+bl9iaXRzID0gaV9iaXRzOwotICBkaW5mby0+bWF4Y29kZSA9IE1BWENPREUoZGluZm8tPm5fYml0cyk7Ci0gIGRpbmZvLT5DbGVhckNvZGUgPSAoMSA8PCAoaV9iaXRzIC0gMSkpOwotICBkaW5mby0+RU9GQ29kZSA9IGRpbmZvLT5DbGVhckNvZGUgKyAxOwotICBkaW5mby0+Y29kZV9jb3VudGVyID0gZGluZm8tPkNsZWFyQ29kZSArIDI7Ci0gIC8qIGluaXQgb3V0cHV0IGJ1ZmZlcmluZyB2YXJzICovCi0gIGRpbmZvLT5ieXRlc2lucGt0ID0gMDsKLSAgZGluZm8tPmN1cl9hY2N1bSA9IDA7Ci0gIGRpbmZvLT5jdXJfYml0cyA9IDA7Ci0gIC8qIEdJRiBzcGVjaWZpZXMgYW4gaW5pdGlhbCBDbGVhciBjb2RlICovCi0gIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX3BpeGVsIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBjKQotLyogQWNjZXB0IGFuZCAiY29tcHJlc3MiIG9uZSBwaXhlbCB2YWx1ZS4KLSAqIFRoZSBnaXZlbiB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBuX2JpdHMgd2lkZS4KLSAqLwotewotICAvKiBPdXRwdXQgdGhlIGdpdmVuIHBpeGVsIHZhbHVlIGFzIGEgc3ltYm9sLiAqLwotICBvdXRwdXQoZGluZm8sIGMpOwotICAvKiBJc3N1ZSBDbGVhciBjb2RlcyBvZnRlbiBlbm91Z2ggdG8ga2VlcCB0aGUgcmVhZGVyIGZyb20gcmF0Y2hldGluZyB1cAotICAgKiBpdHMgc3ltYm9sIHNpemUuCi0gICAqLwotICBpZiAoZGluZm8tPmNvZGVfY291bnRlciA8IGRpbmZvLT5tYXhjb2RlKSB7Ci0gICAgZGluZm8tPmNvZGVfY291bnRlcisrOwotICB9IGVsc2UgewotICAgIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7Ci0gICAgZGluZm8tPmNvZGVfY291bnRlciA9IGRpbmZvLT5DbGVhckNvZGUgKyAyOwkvKiByZXNldCB0aGUgY291bnRlciAqLwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWNvbXByZXNzX3Rlcm0gKGdpZl9kZXN0X3B0ciBkaW5mbykKLS8qIENsZWFuIHVwIGF0IGVuZCAqLwotewotICAvKiBTZW5kIGFuIEVPRiBjb2RlICovCi0gIG91dHB1dChkaW5mbywgZGluZm8tPkVPRkNvZGUpOwotICAvKiBGbHVzaCB0aGUgYml0LXBhY2tpbmcgYnVmZmVyICovCi0gIGlmIChkaW5mby0+Y3VyX2JpdHMgPiAwKSB7Ci0gICAgQ0hBUl9PVVQoZGluZm8sIGRpbmZvLT5jdXJfYWNjdW0gJiAweEZGKTsKLSAgfQotICAvKiBGbHVzaCB0aGUgcGFja2V0IGJ1ZmZlciAqLwotICBmbHVzaF9wYWNrZXQoZGluZm8pOwotfQotCi0KLS8qIEdJRiBoZWFkZXIgY29uc3RydWN0aW9uICovCi0KLQotTE9DQUwodm9pZCkKLXB1dF93b3JkIChnaWZfZGVzdF9wdHIgZGluZm8sIHVuc2lnbmVkIGludCB3KQotLyogRW1pdCBhIDE2LWJpdCB3b3JkLCBMU0IgZmlyc3QgKi8KLXsKLSAgcHV0Yyh3ICYgMHhGRiwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoKHcgPj4gOCkgJiAweEZGLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotcHV0XzNieXRlcyAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgdmFsKQotLyogRW1pdCAzIGNvcGllcyBvZiBzYW1lIGJ5dGUgdmFsdWUgLS0tIGhhbmR5IHN1YnIgZm9yIGNvbG9ybWFwIGNvbnN0cnVjdGlvbiAqLwotewotICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2hlYWRlciAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgbnVtX2NvbG9ycywgSlNBTVBBUlJBWSBjb2xvcm1hcCkKLS8qIE91dHB1dCB0aGUgR0lGIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3IgbWFwICovCi0vKiBJZiBjb2xvcm1hcD09TlVMTCwgc3ludGhlc2l6ZSBhIGdyYXktc2NhbGUgY29sb3JtYXAgKi8KLXsKLSAgaW50IEJpdHNQZXJQaXhlbCwgQ29sb3JNYXBTaXplLCBJbml0Q29kZVNpemUsIEZsYWdCeXRlOwotICBpbnQgY3NoaWZ0ID0gZGluZm8tPmNpbmZvLT5kYXRhX3ByZWNpc2lvbiAtIDg7Ci0gIGludCBpOwotCi0gIGlmIChudW1fY29sb3JzID4gMjU2KQotICAgIEVSUkVYSVQxKGRpbmZvLT5jaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIG51bV9jb2xvcnMpOwotICAvKiBDb21wdXRlIGJpdHMvcGl4ZWwgYW5kIHJlbGF0ZWQgdmFsdWVzICovCi0gIEJpdHNQZXJQaXhlbCA9IDE7Ci0gIHdoaWxlIChudW1fY29sb3JzID4gKDEgPDwgQml0c1BlclBpeGVsKSkKLSAgICBCaXRzUGVyUGl4ZWwrKzsKLSAgQ29sb3JNYXBTaXplID0gMSA8PCBCaXRzUGVyUGl4ZWw7Ci0gIGlmIChCaXRzUGVyUGl4ZWwgPD0gMSkKLSAgICBJbml0Q29kZVNpemUgPSAyOwotICBlbHNlCi0gICAgSW5pdENvZGVTaXplID0gQml0c1BlclBpeGVsOwotICAvKgotICAgKiBXcml0ZSB0aGUgR0lGIGhlYWRlci4KLSAgICogTm90ZSB0aGF0IHdlIGdlbmVyYXRlIGEgcGxhaW4gR0lGODcgaGVhZGVyIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkuCi0gICAqLwotICBwdXRjKCdHJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoJ0knLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnRicsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICBwdXRjKCc4JywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoJzcnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLSAgcHV0YygnYScsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICAvKiBXcml0ZSB0aGUgTG9naWNhbCBTY3JlZW4gRGVzY3JpcHRvciAqLwotICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfd2lkdGgpOwotICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKLSAgRmxhZ0J5dGUgPSAweDgwOwkJLyogWWVzLCB0aGVyZSBpcyBhIGdsb2JhbCBjb2xvciB0YWJsZSAqLwotICBGbGFnQnl0ZSB8PSAoQml0c1BlclBpeGVsLTEpIDw8IDQ7IC8qIGNvbG9yIHJlc29sdXRpb24gKi8KLSAgRmxhZ0J5dGUgfD0gKEJpdHNQZXJQaXhlbC0xKTsJLyogc2l6ZSBvZiBnbG9iYWwgY29sb3IgdGFibGUgKi8KLSAgcHV0YyhGbGFnQnl0ZSwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIHB1dGMoMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7IC8qIEJhY2tncm91bmQgY29sb3IgaW5kZXggKi8KLSAgcHV0YygwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogUmVzZXJ2ZWQgKGFzcGVjdCByYXRpbyBpbiBHSUY4OSkgKi8KLSAgLyogV3JpdGUgdGhlIEdsb2JhbCBDb2xvciBNYXAgKi8KLSAgLyogSWYgdGhlIGNvbG9yIG1hcCBpcyBtb3JlIHRoYW4gOCBiaXRzIHByZWNpc2lvbiwgKi8KLSAgLyogd2UgcmVkdWNlIGl0IHRvIDggYml0cyBieSBzaGlmdGluZyAqLwotICBmb3IgKGk9MDsgaSA8IENvbG9yTWFwU2l6ZTsgaSsrKSB7Ci0gICAgaWYgKGkgPCBudW1fY29sb3JzKSB7Ci0gICAgICBpZiAoY29sb3JtYXAgIT0gTlVMTCkgewotCWlmIChkaW5mby0+Y2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0JICAvKiBOb3JtYWwgY2FzZTogUkdCIGNvbG9yIG1hcCAqLwotCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzFdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzJdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotCX0gZWxzZSB7Ci0JICAvKiBHcmF5c2NhbGUgImNvbG9yIG1hcCI6IHBvc3NpYmxlIGlmIHF1YW50aXppbmcgZ3JheXNjYWxlIGltYWdlICovCi0JICBwdXRfM2J5dGVzKGRpbmZvLCBHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSA+PiBjc2hpZnQpOwotCX0KLSAgICAgIH0gZWxzZSB7Ci0JLyogQ3JlYXRlIGEgZ3JheS1zY2FsZSBtYXAgb2YgbnVtX2NvbG9ycyB2YWx1ZXMsIHJhbmdlIDAuLjI1NSAqLwotCXB1dF8zYnl0ZXMoZGluZm8sIChpICogMjU1ICsgKG51bV9jb2xvcnMtMSkvMikgLyAobnVtX2NvbG9ycy0xKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGZpbGwgb3V0IHRoZSBtYXAgdG8gYSBwb3dlciBvZiAyICovCi0gICAgICBwdXRfM2J5dGVzKGRpbmZvLCAwKTsKLSAgICB9Ci0gIH0KLSAgLyogV3JpdGUgaW1hZ2Ugc2VwYXJhdG9yIGFuZCBJbWFnZSBEZXNjcmlwdG9yICovCi0gIHB1dGMoJywnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogc2VwYXJhdG9yICovCi0gIHB1dF93b3JkKGRpbmZvLCAwKTsJCS8qIGxlZnQvdG9wIG9mZnNldCAqLwotICBwdXRfd29yZChkaW5mbywgMCk7Ci0gIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGltYWdlIHNpemUgKi8KLSAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X2hlaWdodCk7Ci0gIC8qIGZsYWcgYnl0ZTogbm90IGludGVybGFjZWQsIG5vIGxvY2FsIGNvbG9yIG1hcCAqLwotICBwdXRjKDB4MDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOwotICAvKiBXcml0ZSBJbml0aWFsIENvZGUgU2l6ZSBieXRlICovCi0gIHB1dGMoSW5pdENvZGVTaXplLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKLQotICAvKiBJbml0aWFsaXplIGZvciAiY29tcHJlc3Npb24iIG9mIGltYWdlIGRhdGEgKi8KLSAgY29tcHJlc3NfaW5pdChkaW5mbywgSW5pdENvZGVTaXplKzEpOwotfQotCi0KLS8qCi0gKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfZ2lmIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICBlbWl0X2hlYWRlcihkZXN0LCBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMsIGNpbmZvLT5jb2xvcm1hcCk7Ci0gIGVsc2UKLSAgICBlbWl0X2hlYWRlcihkZXN0LCAyNTYsIChKU0FNUEFSUkFZKSBOVUxMKTsKLX0KLQotCi0vKgotICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgotICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIGNvbXByZXNzX3BpeGVsKGRlc3QsIEdFVEpTQU1QTEUoKnB0cisrKSk7Ci0gIH0KLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfb3V0cHV0X2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87Ci0KLSAgLyogRmx1c2ggImNvbXByZXNzaW9uIiBtZWNoYW5pc20gKi8KLSAgY29tcHJlc3NfdGVybShkZXN0KTsKLSAgLyogV3JpdGUgYSB6ZXJvLWxlbmd0aCBkYXRhIGJsb2NrIHRvIGVuZCB0aGUgc2VyaWVzICovCi0gIHB1dGMoMCwgZGVzdC0+cHViLm91dHB1dF9maWxlKTsKLSAgLyogV3JpdGUgdGhlIEdJRiB0ZXJtaW5hdG9yIG1hcmsgKi8KLSAgcHV0YygnOycsIGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KLSAgZmZsdXNoKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIGlmIChmZXJyb3IoZGVzdC0+cHViLm91dHB1dF9maWxlKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotfQotCi0KLS8qCi0gKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBHSUYgZm9ybWF0IG91dHB1dC4KLSAqLwotCi1HTE9CQUwoZGpwZWdfZGVzdF9wdHIpCi1qaW5pdF93cml0ZV9naWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGdpZl9kZXN0X3B0ciBkZXN0OwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZGVzdCA9IChnaWZfZGVzdF9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGdpZl9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5jaW5mbyA9IGNpbmZvOwkJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCi0gIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfZ2lmOwotICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X2dpZjsKLQotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfR1JBWVNDQUxFICYmCi0gICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9HSUZfQ09MT1JTUEFDRSk7Ci0KLSAgLyogRm9yY2UgcXVhbnRpemF0aW9uIGlmIGNvbG9yIG9yIGlmID4gOCBiaXRzIGlucHV0ICovCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgfHwgY2luZm8tPmRhdGFfcHJlY2lzaW9uID4gOCkgewotICAgIC8qIEZvcmNlIHF1YW50aXphdGlvbiB0byBhdCBtb3N0IDI1NiBjb2xvcnMgKi8KLSAgICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKLSAgICBpZiAoY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA+IDI1NikKLSAgICAgIGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyNTY7Ci0gIH0KLQotICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCi0gIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7Ci0KLSAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyAhPSAxKSAvKiBzYWZldHkgY2hlY2s6IGp1c3Qgb25lIGNvbXBvbmVudD8gKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9CVUcpOwotCi0gIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KLSAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Ci19Ci0KLSNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJqcGVndHdycC93cmpwZ2NvbS4xIGIvbGlianBlZ3R3cnAvd3JqcGdjb20uMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxOWE5OS4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC93cmpwZ2NvbS4xCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS5USCBXUkpQR0NPTSAxICIxNSBKdW5lIDE5OTUiCi0uU0ggTkFNRQotd3JqcGdjb20gXC0gaW5zZXJ0IHRleHQgY29tbWVudHMgaW50byBhIEpQRUcgZmlsZQotLlNIIFNZTk9QU0lTCi0uQiB3cmpwZ2NvbQotWwotLkIgXC1yZXBsYWNlCi1dCi1bCi0uQkkgXC1jb21tZW50ICIgdGV4dCIKLV0KLVsKLS5CSSBcLWNmaWxlICIgbmFtZSIKLV0KLVsKLS5JIGZpbGVuYW1lCi1dCi0uTFAKLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiB3cmpwZ2NvbQotcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKLWFuZCBnZW5lcmF0ZXMgYSBuZXcgSlBFRy9KRklGIGZpbGUgb24gc3RhbmRhcmQgb3V0cHV0LiAgQSBjb21tZW50IGJsb2NrIGlzCi1hZGRlZCB0byB0aGUgZmlsZS4KLS5QUAotVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzICJjb21tZW50IiAoQ09NKSBibG9ja3MgdG8gb2NjdXIgd2l0aGluIGEgSlBFRyBmaWxlLgotQWx0aG91Z2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHdoYXQgQ09NIGJsb2NrcyBhcmUgZm9yLCB0aGV5Ci1hcmUgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQgc3RyaW5ncy4gIFRoaXMgbGV0cyB5b3UgYWRkCi1hbm5vdGF0aW9ucywgdGl0bGVzLCBpbmRleCB0ZXJtcywgZXRjIHRvIHlvdXIgSlBFRyBmaWxlcywgYW5kIGxhdGVyIHJldHJpZXZlCi10aGVtIGFzIHRleHQuICBDT00gYmxvY2tzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgaW1hZ2Ugc3RvcmVkIGluIHRoZSBKUEVHCi1maWxlLiAgVGhlIG1heGltdW0gc2l6ZSBvZiBhIENPTSBibG9jayBpcyA2NEssIGJ1dCB5b3UgY2FuIGhhdmUgYXMgbWFueSBvZgotdGhlbSBhcyB5b3UgbGlrZSBpbiBvbmUgSlBFRyBmaWxlLgotLlBQCi0uQiB3cmpwZ2NvbQotYWRkcyBhIENPTSBibG9jaywgY29udGFpbmluZyB0ZXh0IHlvdSBwcm92aWRlLCB0byBhIEpQRUcgZmlsZS4KLU9yZGluYXJpbHksIHRoZSBDT00gYmxvY2sgaXMgYWRkZWQgYWZ0ZXIgYW55IGV4aXN0aW5nIENPTSBibG9ja3M7IGJ1dCB5b3UKLWNhbiBkZWxldGUgdGhlIG9sZCBDT00gYmxvY2tzIGlmIHlvdSB3aXNoLgotLlNIIE9QVElPTlMKLVN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQsIGFuZCBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLgotLlRQCi0uQiBcLXJlcGxhY2UKLURlbGV0ZSBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrcyBmcm9tIHRoZSBmaWxlLgotLlRQCi0uQkkgXC1jb21tZW50ICIgdGV4dCIKLVN1cHBseSB0ZXh0IGZvciBuZXcgQ09NIGJsb2NrIG9uIGNvbW1hbmQgbGluZS4KLS5UUAotLkJJIFwtY2ZpbGUgIiBuYW1lIgotUmVhZCB0ZXh0IGZvciBuZXcgQ09NIGJsb2NrIGZyb20gbmFtZWQgZmlsZS4KLS5QUAotSWYgeW91IGhhdmUgb25seSBvbmUgbGluZSBvZiBjb21tZW50IHRleHQgdG8gYWRkLCB5b3UgY2FuIHByb3ZpZGUgaXQgb24gdGhlCi1jb21tYW5kIGxpbmUgd2l0aAotLkJSIFwtY29tbWVudCAuCi1UaGUgY29tbWVudCB0ZXh0IG11c3QgYmUgc3Vycm91bmRlZCB3aXRoIHF1b3RlcyBzbyB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgYQotc2luZ2xlIGFyZ3VtZW50LiAgTG9uZ2VyIGNvbW1lbnRzIGNhbiBiZSByZWFkIGZyb20gYSB0ZXh0IGZpbGUuCi0uUFAKLUlmIHlvdSBnaXZlIG5laXRoZXIKLS5CIFwtY29tbWVudAotbm9yCi0uQlIgXC1jZmlsZSAsCi10aGVuCi0uQiB3cmpwZ2NvbQotd2lsbCByZWFkIHRoZSBjb21tZW50IHRleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChJbiB0aGlzIGNhc2UgYW4gaW5wdXQgaW1hZ2UKLWZpbGUgbmFtZSBNVVNUIGJlIHN1cHBsaWVkLCBzbyB0aGF0IHRoZSBzb3VyY2UgSlBFRyBmaWxlIGNvbWVzIGZyb20gc29tZXdoZXJlCi1lbHNlLikgIFlvdSBjYW4gZW50ZXIgbXVsdGlwbGUgbGluZXMsIHVwIHRvIDY0S0Igd29ydGguICBUeXBlIGFuIGVuZC1vZi1maWxlCi1pbmRpY2F0b3IgKHVzdWFsbHkgY29udHJvbC1EKSB0byB0ZXJtaW5hdGUgdGhlIGNvbW1lbnQgdGV4dCBlbnRyeS4KLS5QUAotLkIgd3JqcGdjb20KLXdpbGwgbm90IGFkZCBhIENPTSBibG9jayBpZiB0aGUgcHJvdmlkZWQgY29tbWVudCBzdHJpbmcgaXMgZW1wdHkuICBUaGVyZWZvcmUKLVxmQlwtcmVwbGFjZSBcLWNvbW1lbnQgIiJcZlIgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIGFsbCBDT00gYmxvY2tzIGZyb20gYSBmaWxlLgotLlNIIEVYQU1QTEVTCi0uTFAKLUFkZCBhIHNob3J0IGNvbW1lbnQgdG8gaW4uanBnLCBwcm9kdWNpbmcgb3V0LmpwZzoKLS5JUAotLkIgd3JqcGdjb20gXC1jCi1cZkkiVmlldyBvZiBteSBiYWNrIHlhcmQiIGluLmpwZwotLkIgPgotLkkgb3V0LmpwZwotLlBQCi1BdHRhY2ggYSBsb25nIGNvbW1lbnQgcHJldmlvdXNseSBzdG9yZWQgaW4gY29tbWVudC50eHQ6Ci0uSVAKLS5CIHdyanBnY29tCi0uSSBpbi5qcGcKLS5CIDwKLS5JIGNvbW1lbnQudHh0Ci0uQiA+Ci0uSSBvdXQuanBnCi0uUFAKLW9yIGVxdWl2YWxlbnRseQotLklQCi0uQiB3cmpwZ2NvbQotLkIgLWNmaWxlCi0uSSBjb21tZW50LnR4dAotLkIgPAotLkkgaW4uanBnCi0uQiA+Ci0uSSBvdXQuanBnCi0uU0ggU0VFIEFMU08KLS5CUiBjanBlZyAoMSksCi0uQlIgZGpwZWcgKDEpLAotLkJSIGpwZWd0cmFuICgxKSwKLS5CUiByZGpwZ2NvbSAoMSkKLS5TSCBBVVRIT1IKLUluZGVwZW5kZW50IEpQRUcgR3JvdXAKZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dyanBnY29tLmMgYi9saWJqcGVndHdycC93cmpwZ2NvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA0YjA1Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dyanBnY29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODMgKzAsMCBAQAotLyoKLSAqIHdyanBnY29tLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIHZlcnkgc2ltcGxlIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uIHRoYXQgaW5zZXJ0cwotICogdXNlci1zdXBwbGllZCB0ZXh0IGFzIGEgQ09NIChjb21tZW50KSBtYXJrZXIgaW4gYSBKRklGIGZpbGUuCi0gKiBUaGlzIG1heSBiZSB1c2VmdWwgYXMgYW4gZXhhbXBsZSBvZiB0aGUgbWluaW11bSBsb2dpYyBuZWVkZWQgdG8gcGFyc2UKLSAqIEpQRUcgbWFya2Vycy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogdG8gZ2V0IHRoZSBjb21tYW5kLWxpbmUgY29uZmlnIHN5bWJvbHMgKi8KLSNpbmNsdWRlICJqaW5jbHVkZS5oIgkJLyogZ2V0IGF1dG8tY29uZmlnIHN5bWJvbHMsIDxzdGRpby5oPiAqLwotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCkgKi8KLWV4dGVybiB2b2lkICogbWFsbG9jICgpOwotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KLSNpZmRlZiBVU0VfU0VUTU9ERQotI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KLS8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLwotI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KLSNpZmRlZiBfX01XRVJLU19fCi0jaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLwotI2VuZGlmCi0jaWZkZWYgVEhJTktfQwotI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCi0jZGVmaW5lIFdSSVRFX0JJTkFSWQkidyIKLSNlbHNlCi0jaWZkZWYgVk1TCQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIiwgImN0eD1zdG0iCi0jZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiLCAiY3R4PXN0bSIKLSNlbHNlCQkJCS8qIHN0YW5kYXJkIEFOU0ktY29tcGxpYW50IGNhc2UgKi8KLSNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIgotI2RlZmluZSBXUklURV9CSU5BUlkJIndiIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQotI2VuZGlmCi0jaWZuZGVmIEVYSVRfU1VDQ0VTUwotI2lmZGVmIFZNUwotI2RlZmluZSBFWElUX1NVQ0NFU1MgIDEJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZWxzZQotI2RlZmluZSBFWElUX1NVQ0NFU1MgIDAKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFJlZHVjZSB0aGlzIHZhbHVlIGlmIHlvdXIgbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgYmxvY2tzIHVwIHRvIDY0Sy4KLSAqIE9uIERPUywgY29tcGlsaW5nIGluIGxhcmdlIG1vZGVsIGlzIHVzdWFsbHkgYSBiZXR0ZXIgc29sdXRpb24uCi0gKi8KLQotI2lmbmRlZiBNQVhfQ09NX0xFTkdUSAotI2RlZmluZSBNQVhfQ09NX0xFTkdUSCA2NTAwMEwJLyogbXVzdCBiZSA8PSA2NTUzMyBpbiBhbnkgY2FzZSAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byByZWFkIHRoZSBpbnB1dCBmaWxlIGFuZCB3cml0ZSB0aGUgb3V0cHV0IGZpbGUuCi0gKiBUbyByZXVzZSB0aGlzIGNvZGUgaW4gYW5vdGhlciBhcHBsaWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gY2hhbmdlIHRoZXNlLgotICovCi0KLXN0YXRpYyBGSUxFICogaW5maWxlOwkJLyogaW5wdXQgSlBFRyBmaWxlICovCi0KLS8qIFJldHVybiBuZXh0IGlucHV0IGJ5dGUsIG9yIEVPRiBpZiBubyBtb3JlICovCi0jZGVmaW5lIE5FWFRCWVRFKCkgIGdldGMoaW5maWxlKQotCi1zdGF0aWMgRklMRSAqIG91dGZpbGU7CQkvKiBvdXRwdXQgSlBFRyBmaWxlICovCi0KLS8qIEVtaXQgYW4gb3V0cHV0IGJ5dGUgKi8KLSNkZWZpbmUgUFVUQllURSh4KSAgcHV0YygoeCksIG91dGZpbGUpCi0KLQotLyogRXJyb3IgZXhpdCBoYW5kbGVyICovCi0jZGVmaW5lIEVSUkVYSVQobXNnKSAgKGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyksIGV4aXQoRVhJVF9GQUlMVVJFKSkKLQotCi0vKiBSZWFkIG9uZSBieXRlLCB0ZXN0aW5nIGZvciBFT0YgKi8KLXN0YXRpYyBpbnQKLXJlYWRfMV9ieXRlICh2b2lkKQotewotICBpbnQgYzsKLQotICBjID0gTkVYVEJZVEUoKTsKLSAgaWYgKGMgPT0gRU9GKQotICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7Ci0gIHJldHVybiBjOwotfQotCi0vKiBSZWFkIDIgYnl0ZXMsIGNvbnZlcnQgdG8gdW5zaWduZWQgaW50ICovCi0vKiBBbGwgMi1ieXRlIHF1YW50aXRpZXMgaW4gSlBFRyBtYXJrZXJzIGFyZSBNU0IgZmlyc3QgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMl9ieXRlcyAodm9pZCkKLXsKLSAgaW50IGMxLCBjMjsKLQotICBjMSA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjMSA9PSBFT0YpCi0gICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKLSAgYzIgPSBORVhUQllURSgpOwotICBpZiAoYzIgPT0gRU9GKQotICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpIGMxKSA8PCA4KSArICgodW5zaWduZWQgaW50KSBjMik7Ci19Ci0KLQotLyogUm91dGluZXMgdG8gd3JpdGUgZGF0YSB0byBvdXRwdXQgZmlsZSAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfMV9ieXRlIChpbnQgYykKLXsKLSAgUFVUQllURShjKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlXzJfYnl0ZXMgKHVuc2lnbmVkIGludCB2YWwpCi17Ci0gIFBVVEJZVEUoKHZhbCA+PiA4KSAmIDB4RkYpOwotICBQVVRCWVRFKHZhbCAmIDB4RkYpOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfbWFya2VyIChpbnQgbWFya2VyKQotewotICBQVVRCWVRFKDB4RkYpOwotICBQVVRCWVRFKG1hcmtlcik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X3Jlc3Rfb2ZfZmlsZSAodm9pZCkKLXsKLSAgaW50IGM7Ci0KLSAgd2hpbGUgKChjID0gTkVYVEJZVEUoKSkgIT0gRU9GKQotICAgIFBVVEJZVEUoYyk7Ci19Ci0KLQotLyoKLSAqIEpQRUcgbWFya2VycyBjb25zaXN0IG9mIG9uZSBvciBtb3JlIDB4RkYgYnl0ZXMsIGZvbGxvd2VkIGJ5IGEgbWFya2VyCi0gKiBjb2RlIGJ5dGUgKHdoaWNoIGlzIG5vdCBhbiBGRikuICBIZXJlIGFyZSB0aGUgbWFya2VyIGNvZGVzIG9mIGludGVyZXN0Ci0gKiBpbiB0aGlzIHByb2dyYW0uICAoU2VlIGpkbWFya2VyLmMgZm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0LikKLSAqLwotCi0jZGVmaW5lIE1fU09GMCAgMHhDMAkJLyogU3RhcnQgT2YgRnJhbWUgTiAqLwotI2RlZmluZSBNX1NPRjEgIDB4QzEJCS8qIE4gaW5kaWNhdGVzIHdoaWNoIGNvbXByZXNzaW9uIHByb2Nlc3MgKi8KLSNkZWZpbmUgTV9TT0YyICAweEMyCQkvKiBPbmx5IFNPRjAtU09GMiBhcmUgbm93IGluIGNvbW1vbiB1c2UgKi8KLSNkZWZpbmUgTV9TT0YzICAweEMzCi0jZGVmaW5lIE1fU09GNSAgMHhDNQkJLyogTkI6IGNvZGVzIEM0IGFuZCBDQyBhcmUgTk9UIFNPRiBtYXJrZXJzICovCi0jZGVmaW5lIE1fU09GNiAgMHhDNgotI2RlZmluZSBNX1NPRjcgIDB4QzcKLSNkZWZpbmUgTV9TT0Y5ICAweEM5Ci0jZGVmaW5lIE1fU09GMTAgMHhDQQotI2RlZmluZSBNX1NPRjExIDB4Q0IKLSNkZWZpbmUgTV9TT0YxMyAweENECi0jZGVmaW5lIE1fU09GMTQgMHhDRQotI2RlZmluZSBNX1NPRjE1IDB4Q0YKLSNkZWZpbmUgTV9TT0kgICAweEQ4CQkvKiBTdGFydCBPZiBJbWFnZSAoYmVnaW5uaW5nIG9mIGRhdGFzdHJlYW0pICovCi0jZGVmaW5lIE1fRU9JICAgMHhEOQkJLyogRW5kIE9mIEltYWdlIChlbmQgb2YgZGF0YXN0cmVhbSkgKi8KLSNkZWZpbmUgTV9TT1MgICAweERBCQkvKiBTdGFydCBPZiBTY2FuIChiZWdpbnMgY29tcHJlc3NlZCBkYXRhKSAqLwotI2RlZmluZSBNX0NPTSAgIDB4RkUJCS8qIENPTW1lbnQgKi8KLQotCi0vKgotICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciBhbmQgcmV0dXJuIGl0cyBtYXJrZXIgY29kZS4KLSAqIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgRkYgYnl0ZSwgcG9zc2libHkgbW9yZSBpZiB0aGUgY29tcHJlc3NvciB1c2VkIEZGcwotICogdG8gcGFkIHRoZSBmaWxlLiAgKFBhZGRpbmcgRkZzIHdpbGwgTk9UIGJlIHJlcGxpY2F0ZWQgaW4gdGhlIG91dHB1dCBmaWxlLikKLSAqIFRoZXJlIGNvdWxkIGFsc28gYmUgbm9uLUZGIGdhcmJhZ2UgYmV0d2VlbiBtYXJrZXJzLiAgVGhlIHRyZWF0bWVudCBvZiBzdWNoCi0gKiBnYXJiYWdlIGlzIHVuc3BlY2lmaWVkOyB3ZSBjaG9vc2UgdG8gc2tpcCBvdmVyIGl0IGJ1dCBlbWl0IGEgd2FybmluZyBtc2cuCi0gKiBOQjogdGhpcyByb3V0aW5lIG11c3Qgbm90IGJlIHVzZWQgYWZ0ZXIgc2VlaW5nIFNPUyBtYXJrZXIsIHNpbmNlIGl0IHdpbGwKLSAqIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoIEZGLzAwIHNlcXVlbmNlcyBpbiB0aGUgY29tcHJlc3NlZCBpbWFnZSBkYXRhLi4uCi0gKi8KLQotc3RhdGljIGludAotbmV4dF9tYXJrZXIgKHZvaWQpCi17Ci0gIGludCBjOwotICBpbnQgZGlzY2FyZGVkX2J5dGVzID0gMDsKLQotICAvKiBGaW5kIDB4RkYgYnl0ZTsgY291bnQgYW5kIHNraXAgYW55IG5vbi1GRnMuICovCi0gIGMgPSByZWFkXzFfYnl0ZSgpOwotICB3aGlsZSAoYyAhPSAweEZGKSB7Ci0gICAgZGlzY2FyZGVkX2J5dGVzKys7Ci0gICAgYyA9IHJlYWRfMV9ieXRlKCk7Ci0gIH0KLSAgLyogR2V0IG1hcmtlciBjb2RlIGJ5dGUsIHN3YWxsb3dpbmcgYW55IGR1cGxpY2F0ZSBGRiBieXRlcy4gIEV4dHJhIEZGcwotICAgKiBhcmUgbGVnYWwgYXMgcGFkIGJ5dGVzLCBzbyBkb24ndCBjb3VudCB0aGVtIGluIGRpc2NhcmRlZF9ieXRlcy4KLSAgICovCi0gIGRvIHsKLSAgICBjID0gcmVhZF8xX2J5dGUoKTsKLSAgfSB3aGlsZSAoYyA9PSAweEZGKTsKLQotICBpZiAoZGlzY2FyZGVkX2J5dGVzICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGdhcmJhZ2UgZGF0YSBmb3VuZCBpbiBKUEVHIGZpbGVcbiIpOwotICB9Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGluaXRpYWwgbWFya2VyLCB3aGljaCBzaG91bGQgYmUgU09JLgotICogRm9yIGEgSkZJRiBmaWxlLCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBmaWxlIHNob3VsZCBiZSBsaXRlcmFsbHkKLSAqIDB4RkYgTV9TT0kuICBUbyBiZSBtb3JlIGdlbmVyYWwsIHdlIGNvdWxkIHVzZSBuZXh0X21hcmtlciwgYnV0IGlmIHRoZQotICogaW5wdXQgZmlsZSB3ZXJlbid0IGFjdHVhbGx5IEpQRUcgYXQgYWxsLCBuZXh0X21hcmtlciBtaWdodCByZWFkIHRoZSB3aG9sZQotICogZmlsZSBhbmQgdGhlbiByZXR1cm4gYSBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2UuLi4KLSAqLwotCi1zdGF0aWMgaW50Ci1maXJzdF9tYXJrZXIgKHZvaWQpCi17Ci0gIGludCBjMSwgYzI7Ci0KLSAgYzEgPSBORVhUQllURSgpOwotICBjMiA9IE5FWFRCWVRFKCk7Ci0gIGlmIChjMSAhPSAweEZGIHx8IGMyICE9IE1fU09JKQotICAgIEVSUkVYSVQoIk5vdCBhIEpQRUcgZmlsZSIpOwotICByZXR1cm4gYzI7Ci19Ci0KLQotLyoKLSAqIE1vc3QgdHlwZXMgb2YgbWFya2VyIGFyZSBmb2xsb3dlZCBieSBhIHZhcmlhYmxlLWxlbmd0aCBwYXJhbWV0ZXIgc2VnbWVudC4KLSAqIFRoaXMgcm91dGluZSBza2lwcyBvdmVyIHRoZSBwYXJhbWV0ZXJzIGZvciBhbnkgbWFya2VyIHdlIGRvbid0IG90aGVyd2lzZQotICogd2FudCB0byBwcm9jZXNzLgotICogTm90ZSB0aGF0IHdlIE1VU1Qgc2tpcCB0aGUgcGFyYW1ldGVyIHNlZ21lbnQgZXhwbGljaXRseSBpbiBvcmRlciBub3QgdG8KLSAqIGJlIGZvb2xlZCBieSAweEZGIGJ5dGVzIHRoYXQgbWlnaHQgYXBwZWFyIHdpdGhpbiB0aGUgcGFyYW1ldGVyIHNlZ21lbnQ7Ci0gKiBzdWNoIGJ5dGVzIGRvIE5PVCBpbnRyb2R1Y2UgbmV3IG1hcmtlcnMuCi0gKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfdmFyaWFibGUgKHZvaWQpCi0vKiBDb3B5IGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCi17Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLwotICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKLSAgd3JpdGVfMl9ieXRlcyhsZW5ndGgpOwotICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOwotICBsZW5ndGggLT0gMjsKLSAgLyogU2tpcCBvdmVyIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KLSAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICB3cml0ZV8xX2J5dGUocmVhZF8xX2J5dGUoKSk7Ci0gICAgbGVuZ3RoLS07Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLXNraXBfdmFyaWFibGUgKHZvaWQpCi0vKiBTa2lwIG92ZXIgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLQotICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCi0gIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwotICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOwotICBsZW5ndGggLT0gMjsKLSAgLyogU2tpcCBvdmVyIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KLSAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsKLSAgICBsZW5ndGgtLTsKLSAgfQotfQotCi0KLS8qCi0gKiBQYXJzZSB0aGUgbWFya2VyIHN0cmVhbSB1bnRpbCBTT0ZuIG9yIEVPSSBpcyBzZWVuOwotICogY29weSBkYXRhIHRvIG91dHB1dCwgYnV0IGRpc2NhcmQgQ09NIG1hcmtlcnMgdW5sZXNzIGtlZXBfQ09NIGlzIHRydWUuCi0gKi8KLQotc3RhdGljIGludAotc2Nhbl9KUEVHX2hlYWRlciAoaW50IGtlZXBfQ09NKQotewotICBpbnQgbWFya2VyOwotCi0gIC8qIEV4cGVjdCBTT0kgYXQgc3RhcnQgb2YgZmlsZSAqLwotICBpZiAoZmlyc3RfbWFya2VyKCkgIT0gTV9TT0kpCi0gICAgRVJSRVhJVCgiRXhwZWN0ZWQgU09JIG1hcmtlciBmaXJzdCIpOwotICB3cml0ZV9tYXJrZXIoTV9TT0kpOwotCi0gIC8qIFNjYW4gbWlzY2VsbGFuZW91cyBtYXJrZXJzIHVudGlsIHdlIHJlYWNoIFNPRm4uICovCi0gIGZvciAoOzspIHsKLSAgICBtYXJrZXIgPSBuZXh0X21hcmtlcigpOwotICAgIHN3aXRjaCAobWFya2VyKSB7Ci0gICAgICAvKiBOb3RlIHRoYXQgbWFya2VyIGNvZGVzIDB4QzQsIDB4QzgsIDB4Q0MgYXJlIG5vdCwgYW5kIG11c3Qgbm90IGJlLAotICAgICAgICogdHJlYXRlZCBhcyBTT0ZuLiAgQzQgaW4gcGFydGljdWxhciBpcyBhY3R1YWxseSBESFQuCi0gICAgICAgKi8KLSAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCi0gICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgICAgcmV0dXJuIG1hcmtlcjsKLQotICAgIGNhc2UgTV9TT1M6CQkJLyogc2hvdWxkIG5vdCBzZWUgY29tcHJlc3NlZCBkYXRhIGJlZm9yZSBTT0YgKi8KLSAgICAgIEVSUkVYSVQoIlNPUyB3aXRob3V0IHByaW9yIFNPRm4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0VPSToJCQkvKiBpbiBjYXNlIGl0J3MgYSB0YWJsZXMtb25seSBKUEVHIHN0cmVhbSAqLwotICAgICAgcmV0dXJuIG1hcmtlcjsKLQotICAgIGNhc2UgTV9DT006CQkJLyogRXhpc3RpbmcgQ09NOiBjb25kaXRpb25hbGx5IGRpc2NhcmQgKi8KLSAgICAgIGlmIChrZWVwX0NPTSkgewotCXdyaXRlX21hcmtlcihtYXJrZXIpOwotCWNvcHlfdmFyaWFibGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0Jc2tpcF92YXJpYWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgkJCS8qIEFueXRoaW5nIGVsc2UganVzdCBnZXRzIGNvcGllZCAqLwotICAgICAgd3JpdGVfbWFya2VyKG1hcmtlcik7Ci0gICAgICBjb3B5X3ZhcmlhYmxlKCk7CQkvKiB3ZSBhc3N1bWUgaXQgaGFzIGEgcGFyYW1ldGVyIGNvdW50Li4uICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gLyogZW5kIGxvb3AgKi8KLX0KLQotCi0vKiBDb21tYW5kIGxpbmUgcGFyc2luZyBjb2RlICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHZvaWQpCi0vKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCi17Ci0gIGZwcmludGYoc3RkZXJyLCAid3JqcGdjb20gaW5zZXJ0cyBhIHRleHR1YWwgY29tbWVudCBpbiBhIEpQRUcgZmlsZS5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIllvdSBjYW4gYWRkIHRvIG9yIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvbW1lbnQocykuXG4iKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKLSNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQotICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKLSNlbHNlCi0gIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOwotI2VuZGlmCi0KLSAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlcGxhY2UgICAgICAgICBEZWxldGUgYW55IGV4aXN0aW5nIGNvbW1lbnRzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1jb21tZW50IFwidGV4dFwiICBJbnNlcnQgY29tbWVudCB3aXRoIGdpdmVuIHRleHRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNmaWxlIG5hbWUgICAgICBSZWFkIGNvbW1lbnQgZnJvbSBuYW1lZCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJOb3RpY2UgdGhhdCB5b3UgbXVzdCBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgY29tbWVudCB0ZXh0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJ3aGVuIHlvdSB1c2UgLWNvbW1lbnQuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJJZiB5b3UgZG8gbm90IGdpdmUgZWl0aGVyIC1jb21tZW50IG9yIC1jZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lLFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAidGhlbiB0aGUgY29tbWVudCB0ZXh0IGlzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIkl0IGNhbiBiZSBtdWx0aXBsZSBsaW5lcywgdXAgdG8gJXUgY2hhcmFjdGVycyB0b3RhbC5cbiIsCi0JICAodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCk7Ci0jaWZuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCi0gIGZwcmludGYoc3RkZXJyLCAiWW91IG11c3Qgc3BlY2lmeSBhbiBpbnB1dCBKUEVHIGZpbGUgbmFtZSB3aGVuIHN1cHBseWluZ1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiY29tbWVudCB0ZXh0IGZyb20gc3RhbmRhcmQgaW5wdXQuXG4iKTsKLSNlbmRpZgotCi0gIGV4aXQoRVhJVF9GQUlMVVJFKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1rZXltYXRjaCAoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykKLS8qIENhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb2YgKHBvc3NpYmx5IGFiYnJldmlhdGVkKSBrZXl3b3JkIHN3aXRjaGVzLiAqLwotLyoga2V5d29yZCBpcyB0aGUgY29uc3RhbnQga2V5d29yZCAobXVzdCBiZSBsb3dlciBjYXNlIGFscmVhZHkpLCAqLwotLyogbWluY2hhcnMgaXMgbGVuZ3RoIG9mIG1pbmltdW0gbGVnYWwgYWJicmV2aWF0aW9uLiAqLwotewotICByZWdpc3RlciBpbnQgY2EsIGNrOwotICByZWdpc3RlciBpbnQgbm1hdGNoZWQgPSAwOwotCi0gIHdoaWxlICgoY2EgPSAqYXJnKyspICE9ICdcMCcpIHsKLSAgICBpZiAoKGNrID0gKmtleXdvcmQrKykgPT0gJ1wwJykKLSAgICAgIHJldHVybiAwOwkJCS8qIGFyZyBsb25nZXIgdGhhbiBrZXl3b3JkLCBubyBnb29kICovCi0gICAgaWYgKGlzdXBwZXIoY2EpKQkJLyogZm9yY2UgYXJnIHRvIGxjYXNlIChhc3N1bWUgY2sgaXMgYWxyZWFkeSkgKi8KLSAgICAgIGNhID0gdG9sb3dlcihjYSk7Ci0gICAgaWYgKGNhICE9IGNrKQotICAgICAgcmV0dXJuIDA7CQkJLyogbm8gZ29vZCAqLwotICAgIG5tYXRjaGVkKys7CQkJLyogY291bnQgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCi0gIH0KLSAgLyogcmVhY2hlZCBlbmQgb2YgYXJndW1lbnQ7IGZhaWwgaWYgaXQncyB0b28gc2hvcnQgZm9yIHVuaXF1ZSBhYmJyZXYgKi8KLSAgaWYgKG5tYXRjaGVkIDwgbWluY2hhcnMpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwkJCS8qIEEtT0sgKi8KLX0KLQotCi0vKgotICogVGhlIG1haW4gcHJvZ3JhbS4KLSAqLwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgaW50IGFyZ247Ci0gIGNoYXIgKiBhcmc7Ci0gIGludCBrZWVwX0NPTSA9IDE7Ci0gIGNoYXIgKiBjb21tZW50X2FyZyA9IE5VTEw7Ci0gIEZJTEUgKiBjb21tZW50X2ZpbGUgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgY29tbWVudF9sZW5ndGggPSAwOwotICBpbnQgbWFya2VyOwotCi0gIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCi0jaWZkZWYgVVNFX0NDT01NQU5ECi0gIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7Ci0jZW5kaWYKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCi0gICAgcHJvZ25hbWUgPSAid3JqcGdjb20iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KLQotICAvKiBQYXJzZSBzd2l0Y2hlcywgaWYgYW55ICovCi0gIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKLSAgICBhcmcgPSBhcmd2W2FyZ25dOwotICAgIGlmIChhcmdbMF0gIT0gJy0nKQotICAgICAgYnJlYWs7CQkJLyogbm90IHN3aXRjaCwgbXVzdCBiZSBmaWxlIG5hbWUgKi8KLSAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIG92ZXIgJy0nICovCi0gICAgaWYgKGtleW1hdGNoKGFyZywgInJlcGxhY2UiLCAxKSkgewotICAgICAga2VlcF9DT00gPSAwOwotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY2ZpbGUiLCAyKSkgewotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKSB1c2FnZSgpOwotICAgICAgaWYgKChjb21tZW50X2ZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCAiciIpKSA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOwotCWV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvbW1lbnQiLCAxKSkgewotICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKSB1c2FnZSgpOwotICAgICAgY29tbWVudF9hcmcgPSBhcmd2W2FyZ25dOwotICAgICAgLyogSWYgdGhlIGNvbW1lbnQgdGV4dCBzdGFydHMgd2l0aCAnIicsIHRoZW4gd2UgYXJlIHByb2JhYmx5IHJ1bm5pbmcKLSAgICAgICAqIHVuZGVyIE1TLURPRyBhbmQgbXVzdCBwYXJzZSBvdXQgdGhlIHF1b3RlZCBzdHJpbmcgb3Vyc2VsdmVzLiAgU2lnaC4KLSAgICAgICAqLwotICAgICAgaWYgKGNvbW1lbnRfYXJnWzBdID09ICciJykgewotCWNvbW1lbnRfYXJnID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIE1BWF9DT01fTEVOR1RIKTsKLQlpZiAoY29tbWVudF9hcmcgPT0gTlVMTCkKLQkgIEVSUkVYSVQoIkluc3VmZmljaWVudCBtZW1vcnkiKTsKLQlzdHJjcHkoY29tbWVudF9hcmcsIGFyZ3ZbYXJnbl0rMSk7Ci0JZm9yICg7OykgewotCSAgY29tbWVudF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBzdHJsZW4oY29tbWVudF9hcmcpOwotCSAgaWYgKGNvbW1lbnRfbGVuZ3RoID4gMCAmJiBjb21tZW50X2FyZ1tjb21tZW50X2xlbmd0aC0xXSA9PSAnIicpIHsKLQkgICAgY29tbWVudF9hcmdbY29tbWVudF9sZW5ndGgtMV0gPSAnXDAnOyAvKiB6YXAgdGVybWluYXRpbmcgcXVvdGUgKi8KLQkgICAgYnJlYWs7Ci0JICB9Ci0JICBpZiAoKythcmduID49IGFyZ2MpCi0JICAgIEVSUkVYSVQoIk1pc3NpbmcgZW5kaW5nIHF1b3RlIG1hcmsiKTsKLQkgIHN0cmNhdChjb21tZW50X2FyZywgIiAiKTsKLQkgIHN0cmNhdChjb21tZW50X2FyZywgYXJndlthcmduXSk7Ci0JfQotICAgICAgfQotICAgICAgY29tbWVudF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBzdHJsZW4oY29tbWVudF9hcmcpOwotICAgIH0gZWxzZQotICAgICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8qIENhbm5vdCB1c2UgYm90aCAtY29tbWVudCBhbmQgLWNmaWxlLiAqLwotICBpZiAoY29tbWVudF9hcmcgIT0gTlVMTCAmJiBjb21tZW50X2ZpbGUgIT0gTlVMTCkKLSAgICB1c2FnZSgpOwotICAvKiBJZiB0aGVyZSBpcyBuZWl0aGVyIC1jb21tZW50IG5vciAtY2ZpbGUsIHdlIHdpbGwgcmVhZCB0aGUgY29tbWVudCB0ZXh0Ci0gICAqIGZyb20gc3RkaW47IGluIHRoaXMgY2FzZSB0aGVyZSBNVVNUIGJlIGFuIGlucHV0IEpQRUcgZmlsZSBuYW1lLgotICAgKi8KLSAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwgJiYgY29tbWVudF9maWxlID09IE5VTEwgJiYgYXJnbiA+PSBhcmdjKQotICAgIHVzYWdlKCk7Ci0KLSAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gKi8KLSAgaWYgKGFyZ24gPCBhcmdjKSB7Ci0gICAgaWYgKChpbmZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCi0jaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCi0gICAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCi0gICAgaWYgKChpbmZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIHN0ZGluXG4iLCBwcm9nbmFtZSk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotI2Vsc2UKLSAgICBpbmZpbGUgPSBzdGRpbjsKLSNlbmRpZgotICB9Ci0KLSAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCi0jaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKLSAgLyogTXVzdCBoYXZlIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KLSAgaWYgKGFyZ24gIT0gYXJnYy0yKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAotCSAgICBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotICBpZiAoKG91dGZpbGUgPSBmb3Blbihhcmd2W2FyZ24rMV0sIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduKzFdKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSNlbHNlCi0gIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KLSAgaWYgKGFyZ24gPCBhcmdjLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7Ci0gICAgdXNhZ2UoKTsKLSAgfQotICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLwotI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLwotICBzZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCi0gIGlmICgob3V0ZmlsZSA9IGZkb3BlbihmaWxlbm8oc3Rkb3V0KSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3Rkb3V0XG4iLCBwcm9nbmFtZSk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0jZWxzZQotICBvdXRmaWxlID0gc3Rkb3V0OwotI2VuZGlmCi0jZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KLQotICAvKiBDb2xsZWN0IGNvbW1lbnQgdGV4dCBmcm9tIGNvbW1lbnRfZmlsZSBvciBzdGRpbiwgaWYgbmVjZXNzYXJ5ICovCi0gIGlmIChjb21tZW50X2FyZyA9PSBOVUxMKSB7Ci0gICAgRklMRSAqIHNyY19maWxlOwotICAgIGludCBjOwotCi0gICAgY29tbWVudF9hcmcgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgTUFYX0NPTV9MRU5HVEgpOwotICAgIGlmIChjb21tZW50X2FyZyA9PSBOVUxMKQotICAgICAgRVJSRVhJVCgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOwotICAgIGNvbW1lbnRfbGVuZ3RoID0gMDsKLSAgICBzcmNfZmlsZSA9IChjb21tZW50X2ZpbGUgIT0gTlVMTCA/IGNvbW1lbnRfZmlsZSA6IHN0ZGluKTsKLSAgICB3aGlsZSAoKGMgPSBnZXRjKHNyY19maWxlKSkgIT0gRU9GKSB7Ci0gICAgICBpZiAoY29tbWVudF9sZW5ndGggPj0gKHVuc2lnbmVkIGludCkgTUFYX0NPTV9MRU5HVEgpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbW1lbnQgdGV4dCBtYXkgbm90IGV4Y2VlZCAldSBieXRlc1xuIiwKLQkJKHVuc2lnbmVkIGludCkgTUFYX0NPTV9MRU5HVEgpOwotCWV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgIH0KLSAgICAgIGNvbW1lbnRfYXJnW2NvbW1lbnRfbGVuZ3RoKytdID0gKGNoYXIpIGM7Ci0gICAgfQotICAgIGlmIChjb21tZW50X2ZpbGUgIT0gTlVMTCkKLSAgICAgIGZjbG9zZShjb21tZW50X2ZpbGUpOwotICB9Ci0KLSAgLyogQ29weSBKUEVHIGhlYWRlcnMgdW50aWwgU09GbiBtYXJrZXI7Ci0gICAqIHdlIHdpbGwgaW5zZXJ0IHRoZSBuZXcgY29tbWVudCBtYXJrZXIganVzdCBiZWZvcmUgU09Gbi4KLSAgICogVGhpcyAoYSkgY2F1c2VzIHRoZSBuZXcgY29tbWVudCB0byBhcHBlYXIgYWZ0ZXIsIHJhdGhlciB0aGFuIGJlZm9yZSwKLSAgICogZXhpc3RpbmcgY29tbWVudHM7IGFuZCAoYikgZW5zdXJlcyB0aGF0IGNvbW1lbnRzIGNvbWUgYWZ0ZXIgYW55IEpGSUYKLSAgICogb3IgSkZYWCBtYXJrZXJzLCBhcyByZXF1aXJlZCBieSB0aGUgSkZJRiBzcGVjaWZpY2F0aW9uLgotICAgKi8KLSAgbWFya2VyID0gc2Nhbl9KUEVHX2hlYWRlcihrZWVwX0NPTSk7Ci0gIC8qIEluc2VydCB0aGUgbmV3IENPTSBtYXJrZXIsIGJ1dCBvbmx5IGlmIG5vbmVtcHR5IHRleHQgaGFzIGJlZW4gc3VwcGxpZWQgKi8KLSAgaWYgKGNvbW1lbnRfbGVuZ3RoID4gMCkgewotICAgIHdyaXRlX21hcmtlcihNX0NPTSk7Ci0gICAgd3JpdGVfMl9ieXRlcyhjb21tZW50X2xlbmd0aCArIDIpOwotICAgIHdoaWxlIChjb21tZW50X2xlbmd0aCA+IDApIHsKLSAgICAgIHdyaXRlXzFfYnl0ZSgqY29tbWVudF9hcmcrKyk7Ci0gICAgICBjb21tZW50X2xlbmd0aC0tOwotICAgIH0KLSAgfQotICAvKiBEdXBsaWNhdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgc291cmNlIGZpbGUuCi0gICAqIE5vdGUgdGhhdCBhbnkgQ09NIG1hcmtlcnMgb2NjdXJpbmcgYWZ0ZXIgU09GIHdpbGwgbm90IGJlIHRvdWNoZWQuCi0gICAqLwotICB3cml0ZV9tYXJrZXIobWFya2VyKTsKLSAgY29weV9yZXN0X29mX2ZpbGUoKTsKLQotICAvKiBBbGwgZG9uZS4gKi8KLSAgZXhpdChFWElUX1NVQ0NFU1MpOwotICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dycHBtLmMgYi9saWJqcGVndHdycC93cnBwbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZkOTA4Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dycHBtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIHdycHBtLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIFBQTS9QR00gZm9ybWF0LgotICogVGhlIGV4dGVuZGVkIDItYnl0ZS1wZXItc2FtcGxlIHJhdyBQUE0vUEdNIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KLSAqIFRoZSBQQk1QTFVTIGxpYnJhcnkgaXMgTk9UIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhpcyBzb2Z0d2FyZQotICogKGJ1dCBpdCBpcyBoaWdobHkgdXNlZnVsIGFzIGEgc2V0IG9mIFBQTSBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMpLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgUFBNX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBGb3IgMTItYml0IEpQRUcgZGF0YSwgd2UgZWl0aGVyIGRvd25zY2FsZSB0aGUgdmFsdWVzIHRvIDggYml0cwotICogKHRvIHdyaXRlIHN0YW5kYXJkIGJ5dGUtcGVyLXNhbXBsZSBQUE0vUEdNIGZpbGVzKSwgb3Igb3V0cHV0Ci0gKiBub25zdGFuZGFyZCB3b3JkLXBlci1zYW1wbGUgUFBNL1BHTSBmaWxlcy4gIERvd25zY2FsaW5nIGlzIGRvbmUKLSAqIGlmIFBQTV9OT1JBV1dPUkQgaXMgZGVmaW5lZCAodGhpcyBjYW4gYmUgZG9uZSBpbiB0aGUgTWFrZWZpbGUKLSAqIG9yIGluIGpjb25maWcuaCkuCi0gKiAoV2hlbiB0aGUgY29yZSBsaWJyYXJ5IHN1cHBvcnRzIGRhdGEgcHJlY2lzaW9uIHJlZHVjdGlvbiwgYSBjbGVhbmVyCi0gKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHRvIGFzayBmb3IgdGhhdCBpbnN0ZWFkLikKLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KSAgKnB0cisrID0gKGNoYXIpICh2KQotI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAxCi0jZGVmaW5lIFBQTV9NQVhWQUwgMjU1Ci0jZWxzZQotI2lmZGVmIFBQTV9OT1JBV1dPUkQKLSNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KSAgKnB0cisrID0gKGNoYXIpICgodikgPj4gKEJJVFNfSU5fSlNBTVBMRS04KSkKLSNkZWZpbmUgQllURVNQRVJTQU1QTEUgMQotI2RlZmluZSBQUE1fTUFYVkFMIDI1NQotI2Vsc2UKLS8qIFRoZSB3b3JkLXBlci1zYW1wbGUgZm9ybWF0IGFsd2F5cyBwdXRzIHRoZSBMU0IgZmlyc3QuICovCi0jZGVmaW5lIFBVVFBQTVNBTVBMRShwdHIsdikJCQlcCi0JeyByZWdpc3RlciBpbnQgdmFsXyA9IHY7CQlcCi0JICAqcHRyKysgPSAoY2hhcikgKHZhbF8gJiAweEZGKTsJXAotCSAgKnB0cisrID0gKGNoYXIpICgodmFsXyA+PiA4KSAmIDB4RkYpOwlcCi0JfQotI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAyCi0jZGVmaW5lIFBQTV9NQVhWQUwgKCgxPDxCSVRTX0lOX0pTQU1QTEUpLTEpCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qCi0gKiBXaGVuIEpTQU1QTEUgaXMgdGhlIHNhbWUgc2l6ZSBhcyBjaGFyLCB3ZSBjYW4ganVzdCBmd3JpdGUoKSB0aGUKLSAqIGRlY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBQUE0gb3IgUEdNIGZpbGUuICBPbiBQQ3MsIGluIG9yZGVyIHRvIG1ha2UgdGhpcwotICogd29yayB0aGUgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGFsbG9jYXRlZCBpbiBuZWFyIGRhdGEgc3BhY2UsIGJlY2F1c2Ugd2UgYXJlCi0gKiBhc3N1bWluZyBzbWFsbC1kYXRhIG1lbW9yeSBtb2RlbCB3aGVyZWluIGZ3cml0ZSgpIGNhbid0IHJlYWNoIGZhciBtZW1vcnkuCi0gKiBJZiB5b3UgbmVlZCB0byBwcm9jZXNzIHZlcnkgd2lkZSBpbWFnZXMgb24gYSBQQywgeW91IG1pZ2h0IGhhdmUgdG8gY29tcGlsZQotICogaW4gbGFyZ2UtbWVtb3J5IG1vZGVsLCBvciBlbHNlIHJlcGxhY2UgZndyaXRlKCkgd2l0aCBhIHB1dGMoKSBsb29wIC0tLQotICogd2hpY2ggd2lsbCBiZSBtdWNoIHNsb3dlci4KLSAqLwotCi0KLS8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBVc3VhbGx5IHRoZXNlIHR3byBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBwbGFjZTogKi8KLSAgY2hhciAqaW9idWZmZXI7CQkvKiBmd3JpdGUncyBJL08gYnVmZmVyICovCi0gIEpTQU1QUk9XIHBpeHJvdzsJCS8qIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyICovCi0gIHNpemVfdCBidWZmZXJfd2lkdGg7CQkvKiB3aWR0aCBvZiBJL08gYnVmZmVyICovCi0gIEpESU1FTlNJT04gc2FtcGxlc19wZXJfcm93OwkvKiBKU0FNUExFcyBwZXIgb3V0cHV0IHJvdyAqLwotfSBwcG1fZGVzdF9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgcHBtX2Rlc3Rfc3RydWN0ICogcHBtX2Rlc3RfcHRyOwotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCi0gKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCi0gKgotICogcHV0X3BpeGVsX3Jvd3MgaGFuZGxlcyB0aGUgIm5vcm1hbCIgOC1iaXQgY2FzZSB3aGVyZSB0aGUgZGVjb21wcmVzc29yCi0gKiBvdXRwdXQgYnVmZmVyIGlzIHBoeXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIGZ3cml0ZSBidWZmZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKLQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBUaGlzIGNvZGUgaXMgdXNlZCB3aGVuIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSBhbmQgYXBwbHkgYSBwaXhlbAotICogZm9ybWF0IHRyYW5zbGF0aW9uLiAgVHlwaWNhbGx5IHRoaXMgb25seSBoYXBwZW5zIGluIDEyLWJpdCBtb2RlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotY29weV9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgY2hhciAqIGJ1ZmZlcnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLQotICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBkZXN0LT5zYW1wbGVzX3Blcl9yb3c7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRSgqcHRyKyspKTsKLSAgfQotICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEgd2hlbiBjb2xvciBxdWFudGl6YXRpb24gaXMgaW4gZWZmZWN0LgotICogV2UgaGF2ZSB0byBkZW1hcCB0aGUgY29sb3IgaW5kZXggdmFsdWVzIHRvIHN0cmFpZ2h0IGRhdGEuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfZGVtYXBwZWRfcmdiIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi17Ci0gIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87Ci0gIHJlZ2lzdGVyIGNoYXIgKiBidWZmZXJwdHI7Ci0gIHJlZ2lzdGVyIGludCBwaXh2YWw7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMSA9IGNpbmZvLT5jb2xvcm1hcFsxXTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gZGVzdC0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBwaXh2YWwgPSBHRVRKU0FNUExFKCpwdHIrKyk7Ci0gICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXAwW3BpeHZhbF0pKTsKLSAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcDFbcGl4dmFsXSkpOwotICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwMltwaXh2YWxdKSk7Ci0gIH0KLSAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLXB1dF9kZW1hcHBlZF9ncmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotewotICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBjaGFyICogYnVmZmVycHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgYnVmZmVycHRyID0gZGVzdC0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcFtHRVRKU0FNUExFKCpwdHIrKyldKSk7Ci0gIH0KLSAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLX0KLQotCi0vKgotICogU3RhcnR1cDogd3JpdGUgdGhlIGZpbGUgaGVhZGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfb3V0cHV0X3BwbSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87Ci0KLSAgLyogRW1pdCBmaWxlIGhlYWRlciAqLwotICBzd2l0Y2ggKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIC8qIGVtaXQgaGVhZGVyIGZvciByYXcgUEdNIGZvcm1hdCAqLwotICAgIGZwcmludGYoZGVzdC0+cHViLm91dHB1dF9maWxlLCAiUDVcbiVsZCAlbGRcbiVkXG4iLAotCSAgICAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwgKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LAotCSAgICBQUE1fTUFYVkFMKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotICAgIC8qIGVtaXQgaGVhZGVyIGZvciByYXcgUFBNIGZvcm1hdCAqLwotICAgIGZwcmludGYoZGVzdC0+cHViLm91dHB1dF9maWxlLCAiUDZcbiVsZCAlbGRcbiVkXG4iLAotCSAgICAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwgKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LAotCSAgICBQUE1fTUFYVkFMKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9DT0xPUlNQQUNFKTsKLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBmZmx1c2goZGluZm8tPm91dHB1dF9maWxlKTsKLSAgaWYgKGZlcnJvcihkaW5mby0+b3V0cHV0X2ZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFBQTSBmb3JtYXQgb3V0cHV0LgotICovCi0KLUdMT0JBTChkanBlZ19kZXN0X3B0cikKLWppbml0X3dyaXRlX3BwbSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcHBtX2Rlc3RfcHRyIGRlc3Q7Ci0KLSAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLwotICBkZXN0ID0gKHBwbV9kZXN0X3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YocHBtX2Rlc3Rfc3RydWN0KSk7Ci0gIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfcHBtOwotICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfcHBtOwotCi0gIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KLSAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKLQotICAvKiBDcmVhdGUgcGh5c2ljYWwgSS9PIGJ1ZmZlci4gIE5vdGUgd2UgbWFrZSB0aGlzIG5lYXIgb24gYSBQQy4gKi8KLSAgZGVzdC0+c2FtcGxlc19wZXJfcm93ID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKLSAgZGVzdC0+YnVmZmVyX3dpZHRoID0gZGVzdC0+c2FtcGxlc19wZXJfcm93ICogKEJZVEVTUEVSU0FNUExFICogU0laRU9GKGNoYXIpKTsKLSAgZGVzdC0+aW9idWZmZXIgPSAoY2hhciAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgfHwgQklUU19JTl9KU0FNUExFICE9IDggfHwKLSAgICAgIFNJWkVPRihKU0FNUExFKSAhPSBTSVpFT0YoY2hhcikpIHsKLSAgICAvKiBXaGVuIHF1YW50aXppbmcsIHdlIG5lZWQgYW4gb3V0cHV0IGJ1ZmZlciBmb3IgY29sb3JtYXAgaW5kZXhlcwotICAgICAqIHRoYXQncyBzZXBhcmF0ZSBmcm9tIHRoZSBwaHlzaWNhbCBJL08gYnVmZmVyLiAgV2UgYWxzbyBuZWVkIGEKLSAgICAgKiBzZXBhcmF0ZSBidWZmZXIgaWYgcGl4ZWwgZm9ybWF0IHRyYW5zbGF0aW9uIG11c3QgdGFrZSBwbGFjZS4KLSAgICAgKi8KLSAgICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMsIChKRElNRU5TSU9OKSAxKTsKLSAgICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Ci0gICAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IGNvcHlfcGl4ZWxfcm93czsKLSAgICBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpCi0gICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZGVtYXBwZWRfZ3JheTsKLSAgICBlbHNlCi0gICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZGVtYXBwZWRfcmdiOwotICB9IGVsc2UgewotICAgIC8qIFdlIHdpbGwgZndyaXRlKCkgZGlyZWN0bHkgZnJvbSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAvKiBTeW50aGVzaXplIGEgSlNBTVBBUlJBWSBwb2ludGVyIHN0cnVjdHVyZSAqLwotICAgIC8qIENhc3QgaGVyZSBpbXBsaWVzIG5lYXItPmZhciBwb2ludGVyIGNvbnZlcnNpb24gb24gUENzICovCi0gICAgZGVzdC0+cGl4cm93ID0gKEpTQU1QUk9XKSBkZXN0LT5pb2J1ZmZlcjsKLSAgICBkZXN0LT5wdWIuYnVmZmVyID0gJiBkZXN0LT5waXhyb3c7Ci0gICAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOwotICB9Ci0KLSAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKLX0KLQotI2VuZGlmIC8qIFBQTV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dycmxlLmMgYi9saWJqcGVndHdycC93cnJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU3MzM3Li4wMDAwMDAwCi0tLSBhL2xpYmpwZWd0d3JwL3dycmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIHdycmxlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIFJMRSBmb3JtYXQuCi0gKiBUaGUgVXRhaCBSYXN0ZXIgVG9vbGtpdCBsaWJyYXJ5IGlzIHJlcXVpcmVkICh2ZXJzaW9uIDMuMSBvciBsYXRlcikuCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKLSAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bwotICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgotICoKLSAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTWlrZSBMaWpld3NraSwKLSAqIHdpdGggdXBkYXRlcyBmcm9tIFJvYmVydCBIdXRjaGluc29uLgotICovCi0KLSNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCi0KLSNpZmRlZiBSTEVfU1VQUE9SVEVECi0KLS8qIHJsZS5oIGlzIHByb3ZpZGVkIGJ5IHRoZSBVdGFoIFJhc3RlciBUb29sa2l0LiAqLwotCi0jaW5jbHVkZSA8cmxlLmg+Ci0KLS8qCi0gKiBXZSBhc3N1bWUgdGhhdCBKU0FNUExFIGhhcyB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBhcyBybGVfcGl4ZWwsCi0gKiB0byB3aXQsICJ1bnNpZ25lZCBjaGFyIi4gIEhlbmNlIHdlIGNhbid0IGNvcGUgd2l0aCAxMi0gb3IgMTYtYml0IHNhbXBsZXMuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDgtYml0IEpTQU1QTEVzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBTaW5jZSBSTEUgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKLSAqIGZyb20gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSBzYXZlIHRoZSBvdXRnb2luZyBkYXRhCi0gKiBpbiBhIHZpcnR1YWwgYXJyYXkgZHVyaW5nIHB1dF9waXhlbF9yb3cgY2FsbHMsIHRoZW4gYWN0dWFsbHkgZW1pdCB0aGUKLSAqIFJMRSBmaWxlIGR1cmluZyBmaW5pc2hfb3V0cHV0LgotICovCi0KLQotLyoKLSAqIEZvciBub3csIGlmIHdlIGVtaXQgYW4gUkxFIGNvbG9yIG1hcCB0aGVuIGl0IGlzIGFsd2F5cyAyNTYgZW50cmllcyBsb25nLAotICogdGhvdWdoIG5vdCBhbGwgb2YgdGhlIGVudHJpZXMgbmVlZCBiZSB1c2VkLgotICovCi0KLSNkZWZpbmUgQ01BUEJJVFMJOAotI2RlZmluZSBDTUFQTEVOR1RICSgxPDwoQ01BUEJJVFMpKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBqdmlydF9zYXJyYXlfcHRyIGltYWdlOwkvKiB2aXJ0dWFsIGFycmF5IHRvIHN0b3JlIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgcmxlX21hcCAqY29sb3JtYXA7CSAJLyogUkxFLXN0eWxlIGNvbG9yIG1hcCwgb3IgTlVMTCBpZiBub25lICovCi0gIHJsZV9waXhlbCAqKnJsZV9yb3c7CQkvKiBUbyBwYXNzIHJvd3MgdG8gcmxlX3B1dHJvdygpICovCi0KLX0gcmxlX2Rlc3Rfc3RydWN0OwotCi10eXBlZGVmIHJsZV9kZXN0X3N0cnVjdCAqIHJsZV9kZXN0X3B0cjsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBybGVfcHV0X3BpeGVsX3Jvd3MKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCSBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpKTsKLQotCi0vKgotICogV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgotICoKLSAqIEluIHRoaXMgbW9kdWxlIGl0J3MgZWFzaWVyIHRvIHdhaXQgdGlsbCBmaW5pc2hfb3V0cHV0IHRvIHdyaXRlIGFueXRoaW5nLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfb3V0cHV0X3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIHJsZV9kZXN0X3B0ciBkZXN0ID0gKHJsZV9kZXN0X3B0cikgZGluZm87Ci0gIHNpemVfdCBjbWFwc2l6ZTsKLSAgaW50IGksIGNpOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0jZW5kaWYKLQotICAvKgotICAgKiBNYWtlIHN1cmUgdGhlIGltYWdlIGNhbiBiZSBzdG9yZWQgaW4gUkxFIGZvcm1hdC4KLSAgICoKLSAgICogLSBSTEUgc3RvcmVzIGltYWdlIGRpbWVuc2lvbnMgYXMgKnNpZ25lZCogMTYgYml0IGludGVnZXJzLiAgSlBFRwotICAgKiAgIHVzZXMgdW5zaWduZWQsIHNvIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHdpZHRoLgotICAgKgotICAgKiAtIENvbG9yc3BhY2UgaXMgZXhwZWN0ZWQgdG8gYmUgZ3JheXNjYWxlIG9yIFJHQi4KLSAgICoKLSAgICogLSBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIChjb21wb25lbnRzKSBpcyBleHBlY3RlZCB0byBiZSAxIChncmF5c2NhbGUvCi0gICAqICAgcHNldWRvY29sb3IpIG9yIDMgKHRydWVjb2xvci9kaXJlY3Rjb2xvcikuCi0gICAqICAgKGNvdWxkIGJlIDIgb3IgNCBpZiB1c2luZyBhbiBhbHBoYSBjaGFubmVsLCBidXQgd2UgYXJlbid0KQotICAgKi8KLQotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCA+IDMyNzY3IHx8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID4gMzI3NjcpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfUkxFX0RJTUVOU0lPTlMsIGNpbmZvLT5vdXRwdXRfd2lkdGgsIAotCSAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQpOwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKLSAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9DT0xPUlNQQUNFKTsKLQotICBpZiAoY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDEgJiYgY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUkxFX1RPT01BTllDSEFOTkVMUywgY2luZm8tPm51bV9jb21wb25lbnRzKTsKLQotICAvKiBDb252ZXJ0IGNvbG9ybWFwLCBpZiBhbnksIHRvIFJMRSBmb3JtYXQuICovCi0KLSAgZGVzdC0+Y29sb3JtYXAgPSBOVUxMOwotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgLyogQWxsb2NhdGUgc3RvcmFnZSBmb3IgUkxFLXN0eWxlIGNtYXAsIHplcm8gYW55IGV4dHJhIGVudHJpZXMgKi8KLSAgICBjbWFwc2l6ZSA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAqIENNQVBMRU5HVEggKiBTSVpFT0YocmxlX21hcCk7Ci0gICAgZGVzdC0+Y29sb3JtYXAgPSAocmxlX21hcCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgY21hcHNpemUpOwotICAgIE1FTVpFUk8oZGVzdC0+Y29sb3JtYXAsIGNtYXBzaXplKTsKLQotICAgIC8qIFNhdmUgYXdheSBkYXRhIGluIFJMRSBmb3JtYXQgLS0tIG5vdGUgOC1iaXQgbGVmdCBzaGlmdCEgKi8KLSAgICAvKiBTaGlmdGluZyB3b3VsZCBuZWVkIGFkanVzdG1lbnQgZm9yIEpTQU1QTEVzIHdpZGVyIHRoYW4gOCBiaXRzLiAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgY2krKykgewotICAgICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsgaSsrKSB7Ci0gICAgICAgIGRlc3QtPmNvbG9ybWFwW2NpICogQ01BUExFTkdUSCArIGldID0KLSAgICAgICAgICBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFtjaV1baV0pIDw8IDg7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogU2V0IHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBmaXJzdCByb3cgKi8KLSAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsIChKRElNRU5TSU9OKSAwLCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7Ci0gIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKLQotICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBybGVfcHV0X3BpeGVsX3Jvd3M7Ci0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7ICAvKiBjb3VudCBmaWxlIHdyaXRpbmcgYXMgc2VwYXJhdGUgcGFzcyAqLwotICB9Ci0jZW5kaWYKLX0KLQotCi0vKgotICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgotICoKLSAqIFRoaXMgcm91dGluZSBqdXN0IHNhdmVzIHRoZSBkYXRhIGF3YXkgaW4gYSB2aXJ0dWFsIGFycmF5LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmxlX3B1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJICAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKLQotICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KSB7Ci0gICAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKLSAgICAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lLCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7Ci0gIH0KLX0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICoKLSAqIEhlcmUgaXMgd2hlcmUgd2UgcmVhbGx5IG91dHB1dCB0aGUgUkxFIGZpbGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfb3V0cHV0X3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIHJsZV9kZXN0X3B0ciBkZXN0ID0gKHJsZV9kZXN0X3B0cikgZGluZm87Ci0gIHJsZV9oZHIgaGVhZGVyOwkJLyogT3V0cHV0IGZpbGUgaW5mb3JtYXRpb24gKi8KLSAgcmxlX3BpeGVsICoqcmxlX3JvdywgKnJlZCwgKmdyZWVuLCAqYmx1ZTsKLSAgSlNBTVBST1cgb3V0cHV0X3JvdzsKLSAgY2hhciBjbWFwY29tbWVudFs4MF07Ci0gIGludCByb3csIGNvbDsKLSAgaW50IGNpOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7Ci0jZW5kaWYKLQotICAvKiBJbml0aWFsaXplIHRoZSBoZWFkZXIgaW5mbyAqLwotICBoZWFkZXIgPSAqcmxlX2hkcl9pbml0KE5VTEwpOwotICBoZWFkZXIucmxlX2ZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7Ci0gIGhlYWRlci54bWluICAgICA9IDA7Ci0gIGhlYWRlci54bWF4ICAgICA9IGNpbmZvLT5vdXRwdXRfd2lkdGggIC0gMTsKLSAgaGVhZGVyLnltaW4gICAgID0gMDsKLSAgaGVhZGVyLnltYXggICAgID0gY2luZm8tPm91dHB1dF9oZWlnaHQgLSAxOwotICBoZWFkZXIuYWxwaGEgICAgPSAwOwotICBoZWFkZXIubmNvbG9ycyAgPSBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7Ci0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsgY2krKykgewotICAgIFJMRV9TRVRfQklUKGhlYWRlciwgY2kpOwotICB9Ci0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgaGVhZGVyLm5jbWFwICAgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci0gICAgaGVhZGVyLmNtYXBsZW4gPSBDTUFQQklUUzsKLSAgICBoZWFkZXIuY21hcCAgICA9IGRlc3QtPmNvbG9ybWFwOwotICAgIC8qIEFkZCBhIGNvbW1lbnQgdG8gdGhlIG91dHB1dCBpbWFnZSB3aXRoIHRoZSB0cnVlIGNvbG9ybWFwIGxlbmd0aC4gKi8KLSAgICBzcHJpbnRmKGNtYXBjb21tZW50LCAiY29sb3JfbWFwX2xlbmd0aD0lZCIsIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyk7Ci0gICAgcmxlX3B1dGNvbShjbWFwY29tbWVudCwgJmhlYWRlcik7Ci0gIH0KLQotICAvKiBFbWl0IHRoZSBSTEUgaGVhZGVyIGFuZCBjb2xvciBtYXAgKGlmIGFueSkgKi8KLSAgcmxlX3B1dF9zZXR1cCgmaGVhZGVyKTsKLQotICAvKiBOb3cgb3V0cHV0IHRoZSBSTEUgZGF0YSBmcm9tIG91ciB2aXJ0dWFsIGFycmF5LgotICAgKiBXZSBhc3N1bWUgaGVyZSB0aGF0IChhKSBybGVfcGl4ZWwgaXMgcmVwcmVzZW50ZWQgdGhlIHNhbWUgYXMgSlNBTVBMRSwKLSAgICogYW5kIChiKSB3ZSBhcmUgbm90IG9uIGEgbWFjaGluZSB3aGVyZSBGQVIgcG9pbnRlcnMgZGlmZmVyIGZyb20gcmVndWxhci4KLSAgICovCi0KLSNpZmRlZiBQUk9HUkVTU19SRVBPUlQKLSAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLSAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IDA7Ci0gICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPT0gMSkgewotICAgIGZvciAocm93ID0gY2luZm8tPm91dHB1dF9oZWlnaHQtMTsgcm93ID49IDA7IHJvdy0tKSB7Ci0gICAgICBybGVfcm93ID0gKHJsZV9waXhlbCAqKikgKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsCi0JIChKRElNRU5TSU9OKSByb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0gICAgICBybGVfcHV0cm93KHJsZV9yb3csIChpbnQpIGNpbmZvLT5vdXRwdXRfd2lkdGgsICZoZWFkZXIpOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKLSAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodC0xOyByb3cgPj0gMDsgcm93LS0pIHsKLSAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSBkZXN0LT5ybGVfcm93OwotICAgICAgb3V0cHV0X3JvdyA9ICogKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0gICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsCi0JIChKRElNRU5TSU9OKSByb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7Ci0gICAgICByZWQgPSBybGVfcm93WzBdOwotICAgICAgZ3JlZW4gPSBybGVfcm93WzFdOwotICAgICAgYmx1ZSA9IHJsZV9yb3dbMl07Ci0gICAgICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgICAgICpyZWQrKyA9IEdFVEpTQU1QTEUoKm91dHB1dF9yb3crKyk7Ci0gICAgICAgICpncmVlbisrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKLSAgICAgICAgKmJsdWUrKyA9IEdFVEpTQU1QTEUoKm91dHB1dF9yb3crKyk7Ci0gICAgICB9Ci0gICAgICBybGVfcHV0cm93KHJsZV9yb3csIChpbnQpIGNpbmZvLT5vdXRwdXRfd2lkdGgsICZoZWFkZXIpOwotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKLSAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotI2lmZGVmIFBST0dSRVNTX1JFUE9SVAotICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOwotI2VuZGlmCi0KLSAgLyogRW1pdCBmaWxlIHRyYWlsZXIgKi8KLSAgcmxlX3B1dGVvZigmaGVhZGVyKTsKLSAgZmZsdXNoKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7Ci0gIGlmIChmZXJyb3IoZGVzdC0+cHViLm91dHB1dF9maWxlKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOwotfQotCi0KLS8qCi0gKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBSTEUgZm9ybWF0IG91dHB1dC4KLSAqLwotCi1HTE9CQUwoZGpwZWdfZGVzdF9wdHIpCi1qaW5pdF93cml0ZV9ybGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHJsZV9kZXN0X3B0ciBkZXN0OwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZGVzdCA9IChybGVfZGVzdF9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVPRihybGVfZGVzdF9zdHJ1Y3QpKTsKLSAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9ybGU7Ci0gIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9ybGU7Ci0KLSAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotCi0gIC8qIEFsbG9jYXRlIGEgd29yayBhcnJheSBmb3Igb3V0cHV0IHRvIHRoZSBSTEUgbGlicmFyeS4gKi8KLSAgZGVzdC0+cmxlX3JvdyA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0gICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChKRElNRU5TSU9OKSBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMpOwotCi0gIC8qIEFsbG9jYXRlIGEgdmlydHVhbCBhcnJheSB0byBob2xkIHRoZSBpbWFnZS4gKi8KLSAgZGVzdC0+aW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0gICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0gICAgIChKRElNRU5TSU9OKSAoY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyksCi0gICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7Ci0KLSAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKLX0KLQotI2VuZGlmIC8qIFJMRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYmpwZWd0d3JwL3dydGFyZ2EuYyBiL2xpYmpwZWd0d3JwL3dydGFyZ2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMDRkMi4uMDAwMDAwMAotLS0gYS9saWJqcGVndHdycC93cnRhcmdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIHdydGFyZ2EuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gVGFyZ2EgZm9ybWF0LgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCi0gKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KLSAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KLSAqCi0gKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IExlZSBEYW5pZWwgQ3JvY2tlci4KLSAqLwotCi0jaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLwotCi0jaWZkZWYgVEFSR0FfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRvIHN1cHBvcnQgMTItYml0IEpQRUcgZGF0YSwgd2UnZCBoYXZlIHRvIHNjYWxlIG91dHB1dCBkb3duIHRvIDggYml0cy4KLSAqIFRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLS8qCi0gKiBUaGUgb3V0cHV0IGJ1ZmZlciBuZWVkcyB0byBiZSB3cml0YWJsZSBieSBmd3JpdGUoKS4gIE9uIFBDcywgd2UgbXVzdAotICogYWxsb2NhdGUgdGhlIGJ1ZmZlciBpbiBuZWFyIGRhdGEgc3BhY2UsIGJlY2F1c2Ugd2UgYXJlIGFzc3VtaW5nIHNtYWxsLWRhdGEKLSAqIG1lbW9yeSBtb2RlbCwgd2hlcmVpbiBmd3JpdGUoKSBjYW4ndCByZWFjaCBmYXIgbWVtb3J5LiAgSWYgeW91IG5lZWQgdG8KLSAqIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlIGluIGxhcmdlLW1lbW9yeQotICogbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmd3JpdGUoKSB3aXRoIGEgcHV0YygpIGxvb3AgLS0tIHdoaWNoIHdpbGwgYmUgbXVjaAotICogc2xvd2VyLgotICovCi0KLQotLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGNoYXIgKmlvYnVmZmVyOwkJLyogcGh5c2ljYWwgSS9PIGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIGJ1ZmZlcl93aWR0aDsJLyogd2lkdGggb2Ygb25lIHJvdyAqLwotfSB0Z2FfZGVzdF9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgdGdhX2Rlc3Rfc3RydWN0ICogdGdhX2Rlc3RfcHRyOwotCi0KLUxPQ0FMKHZvaWQpCi13cml0ZV9oZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLCBpbnQgbnVtX2NvbG9ycykKLS8qIENyZWF0ZSBhbmQgd3JpdGUgYSBUYXJnYSBoZWFkZXIgKi8KLXsKLSAgY2hhciB0YXJnYWhlYWRlclsxOF07Ci0KLSAgLyogU2V0IHVudXNlZCBmaWVsZHMgb2YgaGVhZGVyIHRvIDAgKi8KLSAgTUVNWkVSTyh0YXJnYWhlYWRlciwgU0laRU9GKHRhcmdhaGVhZGVyKSk7Ci0KLSAgaWYgKG51bV9jb2xvcnMgPiAwKSB7Ci0gICAgdGFyZ2FoZWFkZXJbMV0gPSAxOwkJLyogY29sb3IgbWFwIHR5cGUgMSAqLwotICAgIHRhcmdhaGVhZGVyWzVdID0gKGNoYXIpIChudW1fY29sb3JzICYgMHhGRik7Ci0gICAgdGFyZ2FoZWFkZXJbNl0gPSAoY2hhcikgKG51bV9jb2xvcnMgPj4gOCk7Ci0gICAgdGFyZ2FoZWFkZXJbN10gPSAyNDsJLyogMjQgYml0cyBwZXIgY21hcCBlbnRyeSAqLwotICB9Ci0KLSAgdGFyZ2FoZWFkZXJbMTJdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMHhGRik7Ci0gIHRhcmdhaGVhZGVyWzEzXSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF93aWR0aCA+PiA4KTsKLSAgdGFyZ2FoZWFkZXJbMTRdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X2hlaWdodCAmIDB4RkYpOwotICB0YXJnYWhlYWRlclsxNV0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID4+IDgpOwotICB0YXJnYWhlYWRlclsxN10gPSAweDIwOwkvKiBUb3AtZG93biwgbm9uLWludGVybGFjZWQgKi8KLQotICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7Ci0gICAgdGFyZ2FoZWFkZXJbMl0gPSAzOwkJLyogaW1hZ2UgdHlwZSA9IHVuY29tcHJlc3NlZCBncmF5LXNjYWxlICovCi0gICAgdGFyZ2FoZWFkZXJbMTZdID0gODsJLyogYml0cyBwZXIgcGl4ZWwgKi8KLSAgfSBlbHNlIHsJCQkvKiBtdXN0IGJlIFJHQiAqLwotICAgIGlmIChudW1fY29sb3JzID4gMCkgewotICAgICAgdGFyZ2FoZWFkZXJbMl0gPSAxOwkvKiBpbWFnZSB0eXBlID0gY29sb3JtYXBwZWQgUkdCICovCi0gICAgICB0YXJnYWhlYWRlclsxNl0gPSA4OwotICAgIH0gZWxzZSB7Ci0gICAgICB0YXJnYWhlYWRlclsyXSA9IDI7CS8qIGltYWdlIHR5cGUgPSB1bmNvbXByZXNzZWQgUkdCICovCi0gICAgICB0YXJnYWhlYWRlclsxNl0gPSAyNDsKLSAgICB9Ci0gIH0KLQotICBpZiAoSkZXUklURShkaW5mby0+b3V0cHV0X2ZpbGUsIHRhcmdhaGVhZGVyLCAxOCkgIT0gKHNpemVfdCkgMTgpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKLX0KLQotCi0vKgotICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgotICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAotCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCi0vKiB1c2VkIGZvciB1bnF1YW50aXplZCBmdWxsLWNvbG9yIG91dHB1dCAqLwotewotICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0KLSAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOwotICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewotICAgIG91dHB0clswXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzJdKTsgLyogUkdCIHRvIEJHUiBvcmRlciAqLwotICAgIG91dHB0clsxXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzFdKTsKLSAgICBvdXRwdHJbMl0gPSAoY2hhcikgR0VUSlNBTVBMRShpbnB0clswXSk7Ci0gICAgaW5wdHIgKz0gMywgb3V0cHRyICs9IDM7Ci0gIH0KLSAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLX0KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfZ3JheV9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkgICAgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQotLyogdXNlZCBmb3IgZ3JheXNjYWxlIE9SIHF1YW50aXplZCBjb2xvciBvdXRwdXQgKi8KLXsKLSAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIGNoYXIgKiBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgb3V0cHRyID0gZGVzdC0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqb3V0cHRyKysgPSAoY2hhcikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7Ci0gIH0KLSAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLX0KLQotCi0vKgotICogV3JpdGUgc29tZSBkZW1hcHBlZCBwaXhlbCBkYXRhIHdoZW4gY29sb3IgcXVhbnRpemF0aW9uIGlzIGluIGVmZmVjdC4KLSAqIEZvciBUYXJnYSwgdGhpcyBpcyBvbmx5IGFwcGxpZWQgdG8gZ3JheXNjYWxlIGRhdGEuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wdXRfZGVtYXBwZWRfZ3JheSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCi0JCSAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKLXsKLSAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIGNoYXIgKiBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcDAgPSBjaW5mby0+Y29sb3JtYXBbMF07Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotCi0gIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKLSAgb3V0cHRyID0gZGVzdC0+aW9idWZmZXI7Ci0gIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKLSAgICAqb3V0cHRyKysgPSAoY2hhcikgR0VUSlNBTVBMRShjb2xvcl9tYXAwW0dFVEpTQU1QTEUoKmlucHRyKyspXSk7Ci0gIH0KLSAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKLX0KLQotCi0vKgotICogU3RhcnR1cDogd3JpdGUgdGhlIGZpbGUgaGVhZGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfb3V0cHV0X3RnYSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCi17Ci0gIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87Ci0gIGludCBudW1fY29sb3JzLCBpOwotICBGSUxFICpvdXRmaWxlOwotCi0gIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKLSAgICAvKiBUYXJnYSBkb2Vzbid0IGhhdmUgYSBtYXBwZWQgZ3JheXNjYWxlIGZvcm1hdCwgc28gd2Ugd2lsbCAqLwotICAgIC8qIGRlbWFwIHF1YW50aXplZCBncmF5IG91dHB1dC4gIE5ldmVyIGVtaXQgYSBjb2xvcm1hcC4gKi8KLSAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCAwKTsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9ncmF5OwotICAgIGVsc2UKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAgIC8qIFdlIG9ubHkgc3VwcG9ydCA4LWJpdCBjb2xvcm1hcCBpbmRleGVzLCBzbyBvbmx5IDI1NiBjb2xvcnMgKi8KLSAgICAgIG51bV9jb2xvcnMgPSBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7Ci0gICAgICBpZiAobnVtX2NvbG9ycyA+IDI1NikKLQlFUlJFWElUMShjaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIG51bV9jb2xvcnMpOwotICAgICAgd3JpdGVfaGVhZGVyKGNpbmZvLCBkaW5mbywgbnVtX2NvbG9ycyk7Ci0gICAgICAvKiBXcml0ZSB0aGUgY29sb3JtYXAuICBOb3RlIFRhcmdhIHVzZXMgQkdSIGJ5dGUgb3JkZXIgKi8KLSAgICAgIG91dGZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgaSsrKSB7Ci0JcHV0YyhHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpXSksIG91dGZpbGUpOwotCXB1dGMoR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMV1baV0pLCBvdXRmaWxlKTsKLQlwdXRjKEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7Ci0gICAgICB9Ci0gICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOwotICAgIH0gZWxzZSB7Ci0gICAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCAwKTsKLSAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9DT0xPUlNQQUNFKTsKLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9vdXRwdXRfdGdhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKLXsKLSAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLwotICBmZmx1c2goZGluZm8tPm91dHB1dF9maWxlKTsKLSAgaWYgKGZlcnJvcihkaW5mby0+b3V0cHV0X2ZpbGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Ci19Ci0KLQotLyoKLSAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFRhcmdhIGZvcm1hdCBvdXRwdXQuCi0gKi8KLQotR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQotamluaXRfd3JpdGVfdGFyZ2EgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHRnYV9kZXN0X3B0ciBkZXN0OwotCi0gIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKHRnYV9kZXN0X3N0cnVjdCkpOwotICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X3RnYTsKLSAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X3RnYTsKLQotICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCi0gIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7Ci0KLSAgLyogQ3JlYXRlIEkvTyBidWZmZXIuICBOb3RlIHdlIG1ha2UgdGhpcyBuZWFyIG9uIGEgUEMuICovCi0gIGRlc3QtPmJ1ZmZlcl93aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7Ci0gIGRlc3QtPmlvYnVmZmVyID0gKGNoYXIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCShzaXplX3QpIChkZXN0LT5idWZmZXJfd2lkdGggKiBTSVpFT0YoY2hhcikpKTsKLQotICAvKiBDcmVhdGUgZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCi0gIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLSAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBkZXN0LT5idWZmZXJfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKLSAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOwotCi0gIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Ci19Ci0KLSNlbmRpZiAvKiBUQVJHQV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL21pbnVpdHdycC9BbmRyb2lkLm1rIGIvbWludWl0d3JwL0FuZHJvaWQubWsKaW5kZXggMGE3NjBkZS4uZTFiZjc2ZSAxMDA2NDQKLS0tIGEvbWludWl0d3JwL0FuZHJvaWQubWsKKysrIGIvbWludWl0d3JwL0FuZHJvaWQubWsKQEAgLTEzLDcgKzEzLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIGV4dGVybmFsL2xpYnBuZyBcCiAgICAgZXh0ZXJuYWwvemxpYiBcCi0gICAgc3lzdGVtL2NvcmUvaW5jbHVkZQorICAgIHN5c3RlbS9jb3JlL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2pwZWcKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgYm9vdGFibGUvcmVjb3ZlcnkvbGlianBlZ3R3cnAKQEAgLTU3LDkgKzU4LDkgQEAKIGlmbmVxICgkKEJPQVJEX1VTRV9DVVNUT01fUkVDT1ZFUllfRk9OVCksKQogICBMT0NBTF9DRkxBR1MgKz0gLURCT0FSRF9VU0VfQ1VTVE9NX1JFQ09WRVJZX0ZPTlQ9JChCT0FSRF9VU0VfQ1VTVE9NX1JFQ09WRVJZX0ZPTlQpCiBlbmRpZgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ6IGxpYmMgbGliY3V0aWxzCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnBuZyBsaWJqcGVndHdycCBsaWJwaXhlbGZsaW5nZXJfc3RhdGljCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnogbGliYyBsaWJjdXRpbHMgbGlianBlZworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJwbmcgbGlicGl4ZWxmbGluZ2VyX3N0YXRpYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gZW5nCiBMT0NBTF9NT0RVTEUgOj0gbGlibWludWl0d3JwCiAKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9taW51aXR3cnAvZ3JhcGhpY3MuYyBiL21pbnVpdHdycC9ncmFwaGljcy5jCmluZGV4IDYyN2UzNDMuLmZjMzRiNmIgMTAwNjQ0Ci0tLSBhL21pbnVpdHdycC9ncmFwaGljcy5jCisrKyBiL21pbnVpdHdycC9ncmFwaGljcy5jCkBAIC0yNTksMTAgKzI1OSwxNCBAQAogI2lmZGVmIEJPQVJEX0hBU19GTElQUEVEX1NDUkVFTgogICAgIC8qIGZsaXAgYnVmZmVyIDE4MCBkZWdyZWVzIGZvciBkZXZpY2VzIHdpdGggcGh5c2ljYWx5IGludmVydGVkIHNjcmVlbnMgKi8KICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgKHZpLnhyZXMgKiB2aS55cmVzKTsgaSsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHRtcCA9IGdyX21lbV9zdXJmYWNlLmRhdGFbaV07Ci0gICAgICAgIGdyX21lbV9zdXJmYWNlLmRhdGFbaV0gPSBncl9tZW1fc3VyZmFjZS5kYXRhWyh2aS54cmVzICogdmkueXJlcyAqIDIpIC0gaV07Ci0gICAgICAgIGdyX21lbV9zdXJmYWNlLmRhdGFbKHZpLnhyZXMgKiB2aS55cmVzICogMikgLSBpXSA9IHRtcDsKKyAgICB1bnNpZ25lZCBpbnQgajsKKyAgICB1aW50OF90IHRtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKCh2aS54cmVzX3ZpcnR1YWwgKiB2aS55cmVzKS8yKTsgaSsrKSB7CisJZm9yIChqID0gMDsgaiA8IFBJWEVMX1NJWkU7IGorKykgeworCQl0bXAgPSBncl9tZW1fc3VyZmFjZS5kYXRhW2kgKiBQSVhFTF9TSVpFICsgal07CisJCWdyX21lbV9zdXJmYWNlLmRhdGFbaSAqIFBJWEVMX1NJWkUgKyBqXSA9IGdyX21lbV9zdXJmYWNlLmRhdGFbKHZpLnhyZXNfdmlydHVhbCAqIHZpLnlyZXMgKiBQSVhFTF9TSVpFKSAtICgoaSsxKSAqIFBJWEVMX1NJWkUpICsgal07CisJCWdyX21lbV9zdXJmYWNlLmRhdGFbKHZpLnhyZXNfdmlydHVhbCAqIHZpLnlyZXMgKiBQSVhFTF9TSVpFKSAtICgoaSsxKSAqIFBJWEVMX1NJWkUpICsgal0gPSB0bXA7CisJfQogICAgIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9taW51aXR3cnAvcmVzb3VyY2VzLmMgYi9taW51aXR3cnAvcmVzb3VyY2VzLmMKaW5kZXggNGM4ZDhhOS4uYzU4OWM5ZCAxMDA2NDQKLS0tIGEvbWludWl0d3JwL3Jlc291cmNlcy5jCisrKyBiL21pbnVpdHdycC9yZXNvdXJjZXMuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAogI2luY2x1ZGUgPHBuZy5oPgotI2luY2x1ZGUgIi4uL2xpYmpwZWd0d3JwL2pwZWdsaWIuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCiAKICNpbmNsdWRlICJtaW51aS5oIgogCmRpZmYgLS1naXQgYS9wYXJ0aXRpb24uY3BwIGIvcGFydGl0aW9uLmNwcAppbmRleCA3Y2YwYWIzLi5lMDJkZWYwIDEwMDY0NAotLS0gYS9wYXJ0aXRpb24uY3BwCisrKyBiL3BhcnRpdGlvbi5jcHAKQEAgLTQ5LDEwICs0OSwxNSBAQAogI2lmZGVmIFRXX0lOQ0xVREVfQ1JZUFRPX1NBTVNVTkcKIAkjaW5jbHVkZSAiY3J5cHRvL2xpYmNyeXB0X3NhbXN1bmcvaW5jbHVkZS9saWJjcnlwdF9zYW1zdW5nLmgiCiAjZW5kaWYKKyNpZmRlZiBVU0VfRVhUNAorCSNpbmNsdWRlICJtYWtlX2V4dDRmcy5oIgorI2VuZGlmCiB9CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK2V4dGVybiBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlbGludXhfaGFuZGxlOworCiBUV1BhcnRpdGlvbjo6VFdQYXJ0aXRpb24odm9pZCkgewogCUNhbl9CZV9Nb3VudGVkID0gZmFsc2U7CiAJQ2FuX0JlX1dpcGVkID0gZmFsc2U7CkBAIC05MDIsNyArOTA3LDkgQEAKIAkJCUxPR0lORk8oIlN1Y2Nlc3NmdWxseSBtb3VudGVkIGVjcnlwdGZzIGZvciAnJXMnXG4iLCBNb3VudF9Qb2ludC5jX3N0cigpKTsKIAkJCUlzX0RlY3J5cHRlZCA9IHRydWU7CiAJCX0KLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoTW91bnRfUG9pbnQgPT0gRVhQQU5EKFRXX0VYVEVSTkFMX1NUT1JBR0VfUEFUSCkpIHsKKwkJaWYgKElzX0RlY3J5cHRlZCkKKwkJCUxPR0lORk8oIk1vdW50aW5nIGV4dGVybmFsIHN0b3JhZ2UsICclcycgaXMgbm90IGVuY3J5cHRlZFxuIiwgTW91bnRfUG9pbnQuY19zdHIoKSk7CiAJCUlzX0RlY3J5cHRlZCA9IGZhbHNlOwogCX0KICNlbmRpZgpAQCAtMTA1NSw3ICsxMDYyLDcgQEAKIAogCWd1aV9wcmludCgiV2lwaW5nICVzXG4iLCBCYWNrdXBfRGlzcGxheV9OYW1lLmNfc3RyKCkpOwogCVRXRnVuYzo6cmVtb3ZlRGlyKE1vdW50X1BvaW50ICsgIi8uYW5kcm9pZF9zZWN1cmUvIiwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHRydWU7CisJcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgVFdQYXJ0aXRpb246OkJhY2t1cChzdHJpbmcgYmFja3VwX2ZvbGRlcikgewpAQCAtMTI1NSw2ICsxMjYyLDE5IEBACiAJaWYgKCFVbk1vdW50KHRydWUpKQogCQlyZXR1cm4gZmFsc2U7CiAKKyNpZmRlZiBVU0VfRVhUNAorCWd1aV9wcmludCgiRm9ybWF0dGluZyAlcyB1c2luZyBtYWtlX2V4dDRmcyBmdW5jdGlvbi5cbiIsIERpc3BsYXlfTmFtZS5jX3N0cigpKTsKKyNpZmRlZiBIQVZFX1NFTElOVVgKKwlpZiAobWFrZV9leHQ0ZnMoQWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpLCBMZW5ndGgsIE1vdW50X1BvaW50LmNfc3RyKCksIHNlbGludXhfaGFuZGxlKSAhPSAwKSB7CisjZWxzZQorCWlmIChtYWtlX2V4dDRmcyhBY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksIExlbmd0aCkgIT0gMCkgeworI2VuZGlmCisJCUxPR0VSUigiVW5hYmxlIHRvIHdpcGUgJyVzJyB1c2luZyBmdW5jdGlvbiBjYWxsLlxuIiwgTW91bnRfUG9pbnQuY19zdHIoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisjZWxzZQogCWlmIChUV0Z1bmM6OlBhdGhfRXhpc3RzKCIvc2Jpbi9tYWtlX2V4dDRmcyIpKSB7CiAJCXN0cmluZyBDb21tYW5kLCByZXN1bHQ7CiAKQEAgLTEyODEsNyArMTMwMSw3IEBACiAJCX0KIAl9IGVsc2UKIAkJcmV0dXJuIFdpcGVfRVhUMjMoImV4dDQiKTsKLQorI2VuZGlmCiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xMzQxLDMxICsxMzYxLDMxIEBACiAKIAlndWlfcHJpbnQoIk1URCBGb3JtYXR0aW5nIFwiJXNcIlxuIiwgTVREX05hbWUuY19zdHIoKSk7CiAKLSAgICBtdGRfc2Nhbl9wYXJ0aXRpb25zKCk7Ci0gICAgY29uc3QgTXRkUGFydGl0aW9uKiBtdGQgPSBtdGRfZmluZF9wYXJ0aXRpb25fYnlfbmFtZShNVERfTmFtZS5jX3N0cigpKTsKLSAgICBpZiAobXRkID09IE5VTEwpIHsKLSAgICAgICAgTE9HRVJSKCJObyBtdGQgcGFydGl0aW9uIG5hbWVkICclcyciLCBNVERfTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKwltdGRfc2Nhbl9wYXJ0aXRpb25zKCk7CisJY29uc3QgTXRkUGFydGl0aW9uKiBtdGQgPSBtdGRfZmluZF9wYXJ0aXRpb25fYnlfbmFtZShNVERfTmFtZS5jX3N0cigpKTsKKwlpZiAobXRkID09IE5VTEwpIHsKKwkJTE9HRVJSKCJObyBtdGQgcGFydGl0aW9uIG5hbWVkICclcyciLCBNVERfTmFtZS5jX3N0cigpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAotICAgIE10ZFdyaXRlQ29udGV4dCogY3R4ID0gbXRkX3dyaXRlX3BhcnRpdGlvbihtdGQpOwotICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICBMT0dFUlIoIkNhbid0IHdyaXRlICclcycsIGZhaWxlZCB0byBmb3JtYXQuIiwgTVREX05hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG10ZF9lcmFzZV9ibG9ja3MoY3R4LCAtMSkgPT0gLTEpIHsKLSAgICAgICAgbXRkX3dyaXRlX2Nsb3NlKGN0eCk7Ci0gICAgICAgIExPR0VSUigiRmFpbGVkIHRvIGZvcm1hdCAnJXMnIiwgTVREX05hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG10ZF93cml0ZV9jbG9zZShjdHgpICE9IDApIHsKLSAgICAgICAgTE9HRVJSKCJGYWlsZWQgdG8gY2xvc2UgJyVzJyIsIE1URF9OYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorCU10ZFdyaXRlQ29udGV4dCogY3R4ID0gbXRkX3dyaXRlX3BhcnRpdGlvbihtdGQpOworCWlmIChjdHggPT0gTlVMTCkgeworCQlMT0dFUlIoIkNhbid0IHdyaXRlICclcycsIGZhaWxlZCB0byBmb3JtYXQuIiwgTVREX05hbWUuY19zdHIoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKG10ZF9lcmFzZV9ibG9ja3MoY3R4LCAtMSkgPT0gLTEpIHsKKwkJbXRkX3dyaXRlX2Nsb3NlKGN0eCk7CisJCUxPR0VSUigiRmFpbGVkIHRvIGZvcm1hdCAnJXMnIiwgTVREX05hbWUuY19zdHIoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKG10ZF93cml0ZV9jbG9zZShjdHgpICE9IDApIHsKKwkJTE9HRVJSKCJGYWlsZWQgdG8gY2xvc2UgJyVzJyIsIE1URF9OYW1lLmNfc3RyKCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQogCUN1cnJlbnRfRmlsZV9TeXN0ZW0gPSAieWFmZnMyIjsKIAlSZWNyZWF0ZV9BbmRTZWNfRm9sZGVyKCk7CiAJZ3VpX3ByaW50KCJEb25lLlxuIik7Ci0gICAgcmV0dXJuIHRydWU7CisJcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgVFdQYXJ0aXRpb246OldpcGVfUk1SRigpIHsKQEAgLTEzOTUsNyArMTQxNSw3IEBACiAJCQlpZiAoc3RyY21wKGRlLT5kX25hbWUsICIuIikgPT0gMCB8fCBzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikgPT0gMCkgICBjb250aW51ZTsKIAkJCS8vIFRoZSBtZWRpYSBmb2xkZXIgaXMgdGhlICJpbnRlcm5hbCBzZGNhcmQiCiAJCQkvLyBUaGUgLmxheW91dF92ZXJzaW9uIGZpbGUgaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgNC4yIGRlY2lkZXMgdXAgdXBncmFkZQotCQkJLy8gICAgdGhlIG1lZGlhIGZvbGRlciBmb3IgbXVsdGktdXNlci4KKwkJCS8vIHRoZSBtZWRpYSBmb2xkZXIgZm9yIG11bHRpLXVzZXIuCiAJCQlpZiAoc3RyY21wKGRlLT5kX25hbWUsICJtZWRpYSIpID09IDAgfHwgc3RyY21wKGRlLT5kX25hbWUsICIubGF5b3V0X3ZlcnNpb24iKSA9PSAwKSAgIGNvbnRpbnVlOwogCQkJCiAJCQlkaXIgPSAiL2RhdGEvIjsKQEAgLTE1NDAsNyArMTU2MCw3IEBACiAJfSBlbHNlIHsKIAkJZ3VpX3ByaW50KCJXaXBpbmcgJXMuLi5cbiIsIERpc3BsYXlfTmFtZS5jX3N0cigpKTsKIAkJaWYgKCFXaXBlKFJlc3RvcmVfRmlsZV9TeXN0ZW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlUV0Z1bmM6OkdVSV9PcGVyYXRpb25fVGV4dChUV19SRVNUT1JFX1RFWFQsIEJhY2t1cF9EaXNwbGF5X05hbWUsICJSZXN0b3JpbmciKTsKIAlndWlfcHJpbnQoIlJlc3RvcmluZyAlcy4uLlxuIiwgQmFja3VwX0Rpc3BsYXlfTmFtZS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL3BhcnRpdGlvbm1hbmFnZXIuY3BwIGIvcGFydGl0aW9ubWFuYWdlci5jcHAKaW5kZXggZmM3NmMxYS4uNzdjZjM3ZSAxMDA2NDQKLS0tIGEvcGFydGl0aW9ubWFuYWdlci5jcHAKKysrIGIvcGFydGl0aW9ubWFuYWdlci5jcHAKQEAgLTYxMSw2ICs2MTEsOCBAQAogCQkJCWlmICgoKnN1YnBhcnQpLT5DYW5fQmVfQmFja2VkX1VwICYmICgqc3VicGFydCktPklzX1N1YlBhcnRpdGlvbiAmJiAoKnN1YnBhcnQpLT5TdWJQYXJ0aXRpb25fT2YgPT0gUGFydC0+TW91bnRfUG9pbnQpIHsKIAkJCQkJaWYgKCEoKnN1YnBhcnQpLT5CYWNrdXAoQmFja3VwX0ZvbGRlcikpCiAJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCXN5bmMoKTsKKwkJCQkJc3luYygpOwogCQkJCQlpZiAoIU1ha2VfTUQ1KGdlbmVyYXRlX21kNSwgQmFja3VwX0ZvbGRlciwgKCpzdWJwYXJ0KS0+QmFja3VwX0ZpbGVOYW1lKSkKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJaWYgKFBhcnQtPkJhY2t1cF9NZXRob2QgPT0gMSkgewpAQCAtMTEwMiwxNCArMTEwNCwxNCBAQAogCQl9CiAJfQogCVRXUGFydGl0aW9uKiBzZGV4dCA9IEZpbmRfUGFydGl0aW9uX0J5X1BhdGgoIi9zZC1leHQiKTsKLQlpZiAoc2RleHQgIT0gTlVMTCkgewotCQlpZiAoc2RleHQtPklzX1ByZXNlbnQgJiYgc2RleHQtPk1vdW50KGZhbHNlKSkgewotCQkJaWYgKHN0YXQoIi9zZC1leHQvZGFsdmlrLWNhY2hlIiwgJnN0KSA9PSAwKSB7Ci0JCQkJVFdGdW5jOjpyZW1vdmVEaXIoIi9zZC1leHQvZGFsdmlrLWNhY2hlIiwgZmFsc2UpOwotICAgICAgICAJICAgIAkJZ3VpX3ByaW50KCJDbGVhbmVkOiAvc2QtZXh0L2RhbHZpay1jYWNoZS4uLlxuIik7Ci0JCQl9CisJaWYgKHNkZXh0ICYmIHNkZXh0LT5Jc19QcmVzZW50ICYmIHNkZXh0LT5Nb3VudChmYWxzZSkpCisJeworCQlpZiAoc3RhdCgiL3NkLWV4dC9kYWx2aWstY2FjaGUiLCAmc3QpID09IDApCisJCXsKKwkJCVRXRnVuYzo6cmVtb3ZlRGlyKCIvc2QtZXh0L2RhbHZpay1jYWNoZSIsIGZhbHNlKTsKKwkgICAJICAgIGd1aV9wcmludCgiQ2xlYW5lZDogL3NkLWV4dC9kYWx2aWstY2FjaGUuLi5cbiIpOwogCQl9Ci0gICAgICAgIH0KKwl9CiAJZ3VpX3ByaW50KCItLSBEYWx2aWsgQ2FjaGUgRGlyZWN0b3JpZXMgV2lwZSBDb21wbGV0ZSFcblxuIik7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xNDUxLDYgKzE0NTMsNyBAQAogCQkJCQlzZGNhcmQtPk1vdW50KGZhbHNlKTsKIAkJCQl9CiAJCQl9IGVsc2UgeworCQkJCUxPR0lORk8oIkV4dGVybmFsIHN0b3JhZ2UgJyVzJyBpcyBub3QgZW5jcnlwdGVkLlxuIiwgc2RjYXJkLT5Nb3VudF9Qb2ludC5jX3N0cigpKTsKIAkJCQlzZGNhcmQtPklzX0RlY3J5cHRlZCA9IGZhbHNlOwogCQkJCXNkY2FyZC0+RGVjcnlwdGVkX0Jsb2NrX0RldmljZSA9ICIiOwogCQkJfQpAQCAtMTg5MCw0ICsxODkzLDQgQEAKIAkJfQogCX0KIAlmY2xvc2UoZnApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3BhcnRpdGlvbnMuaHBwIGIvcGFydGl0aW9ucy5ocHAKaW5kZXggZWZlMDhkNy4uNzM2MzA0ZSAxMDA2NDQKLS0tIGEvcGFydGl0aW9ucy5ocHAKKysrIGIvcGFydGl0aW9ucy5ocHAKQEAgLTUyLDMzICs1Miw2MSBAQAogCXZpcnR1YWwgflRXUGFydGl0aW9uKCk7CiAKIHB1YmxpYzoKLQl2aXJ0dWFsIGJvb2wgSXNfTW91bnRlZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrcyBtb3VudCB0byBzZWUgaWYgdGhlIHBhcnRpdGlvbiBpcyBjdXJyZW50bHkgbW91bnRlZAotCXZpcnR1YWwgYm9vbCBNb3VudChib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW91bnRzIHRoZSBwYXJ0aXRpb24gaWYgaXQgaXMgbm90IG1vdW50ZWQKLQl2aXJ0dWFsIGJvb2wgVW5Nb3VudChib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVubW91bnRzIHRoZSBwYXJ0aXRpb24gaWYgaXQgaXMgbW91bnRlZAotCXZpcnR1YWwgYm9vbCBXaXBlKHN0cmluZyBOZXdfRmlsZV9TeXN0ZW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgdGhlIHBhcnRpdGlvbgotCXZpcnR1YWwgYm9vbCBXaXBlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgdGhlIHBhcnRpdGlvbgotCXZpcnR1YWwgYm9vbCBXaXBlX0FuZFNlYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgYW5kcm9pZCBzZWN1cmUKLQl2aXJ0dWFsIGJvb2wgQmFja3VwKHN0cmluZyBiYWNrdXBfZm9sZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhY2tzIHVwIHRoZSBwYXJ0aXRpb24gdG8gdGhlIGZvbGRlciBzcGVjaWZpZWQKLQl2aXJ0dWFsIGJvb2wgQ2hlY2tfTUQ1KHN0cmluZyByZXN0b3JlX2ZvbGRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrcyBNRDUgb2YgYSBiYWNrdXAKLQl2aXJ0dWFsIGJvb2wgUmVzdG9yZShzdHJpbmcgcmVzdG9yZV9mb2xkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSBwYXJ0aXRpb24gdXNpbmcgdGhlIGJhY2t1cCBmb2xkZXIgcHJvdmlkZWQKLQl2aXJ0dWFsIHN0cmluZyBCYWNrdXBfTWV0aG9kX0J5X05hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGJhY2t1cCBtZXRob2QgZm9yIGh1bWFuIHJlYWRhYmxlIG91dHB1dAotCXZpcnR1YWwgYm9vbCBEZWNyeXB0KHN0cmluZyBQYXNzd29yZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjcnlwdHMgdGhlIHBhcnRpdGlvbiwgcmV0dXJuIDAgZm9yIGZhaWx1cmUgYW5kIC0xIGZvciBzdWNjZXNzCi0JdmlydHVhbCBib29sIFdpcGVfRW5jcnlwdGlvbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmVzIHdpcGUgY29tbWFuZHMgZm9yIC9kYXRhL21lZGlhIGRldmljZXMgYW5kIGZvcm1hdHMgdGhlIG9yaWdpbmFsIGJsb2NrIGRldmljZQotCXZpcnR1YWwgdm9pZCBDaGVja19GU19UeXBlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIHRoZSBmcyB0eXBlIHVzaW5nIGJsa2lkLCBkb2VzIG5vdCBkbyBhbnl0aGluZyBvbiBNVEQgLyB5YWZmczIgYmVjYXVzZSB0aGlzIGNyYXNoZXMgb24gc29tZSBkZXZpY2VzCi0JdmlydHVhbCBib29sIFVwZGF0ZV9TaXplKGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGVzIHNpemUgaW5mb3JtYXRpb24KLQl2aXJ0dWFsIHZvaWQgUmVjcmVhdGVfTWVkaWFfRm9sZGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyB0aGUgL2RhdGEvbWVkaWEgZm9sZGVyCisJYm9vbCBJc19Nb3VudGVkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgbW91bnQgdG8gc2VlIGlmIHRoZSBwYXJ0aXRpb24gaXMgY3VycmVudGx5IG1vdW50ZWQKKwlib29sIE1vdW50KGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdW50cyB0aGUgcGFydGl0aW9uIGlmIGl0IGlzIG5vdCBtb3VudGVkCisJYm9vbCBVbk1vdW50KGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbm1vdW50cyB0aGUgcGFydGl0aW9uIGlmIGl0IGlzIG1vdW50ZWQKKwlib29sIFdpcGUoc3RyaW5nIE5ld19GaWxlX1N5c3RlbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIHRoZSBwYXJ0aXRpb24KKwlib29sIFdpcGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIHRoZSBwYXJ0aXRpb24KKwlib29sIFdpcGVfQW5kU2VjKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGFuZHJvaWQgc2VjdXJlCisJYm9vbCBCYWNrdXAoc3RyaW5nIGJhY2t1cF9mb2xkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrcyB1cCB0aGUgcGFydGl0aW9uIHRvIHRoZSBmb2xkZXIgc3BlY2lmaWVkCisJYm9vbCBDaGVja19NRDUoc3RyaW5nIHJlc3RvcmVfZm9sZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgTUQ1IG9mIGEgYmFja3VwCisJYm9vbCBSZXN0b3JlKHN0cmluZyByZXN0b3JlX2ZvbGRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgcGFydGl0aW9uIHVzaW5nIHRoZSBiYWNrdXAgZm9sZGVyIHByb3ZpZGVkCisJc3RyaW5nIEJhY2t1cF9NZXRob2RfQnlfTmFtZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBiYWNrdXAgbWV0aG9kIGZvciBodW1hbiByZWFkYWJsZSBvdXRwdXQKKwlib29sIERlY3J5cHQoc3RyaW5nIFBhc3N3b3JkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlY3J5cHRzIHRoZSBwYXJ0aXRpb24sIHJldHVybiAwIGZvciBmYWlsdXJlIGFuZCAtMSBmb3Igc3VjY2VzcworCWJvb2wgV2lwZV9FbmNyeXB0aW9uKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlcyB3aXBlIGNvbW1hbmRzIGZvciAvZGF0YS9tZWRpYSBkZXZpY2VzIGFuZCBmb3JtYXRzIHRoZSBvcmlnaW5hbCBibG9jayBkZXZpY2UKKwl2b2lkIENoZWNrX0ZTX1R5cGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrcyB0aGUgZnMgdHlwZSB1c2luZyBibGtpZCwgZG9lcyBub3QgZG8gYW55dGhpbmcgb24gTVREIC8geWFmZnMyIGJlY2F1c2UgdGhpcyBjcmFzaGVzIG9uIHNvbWUgZGV2aWNlcworCWJvb2wgVXBkYXRlX1NpemUoYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlcyBzaXplIGluZm9ybWF0aW9uCisJdm9pZCBSZWNyZWF0ZV9NZWRpYV9Gb2xkZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgdGhlIC9kYXRhL21lZGlhIGZvbGRlcgogCiBwdWJsaWM6CiAJc3RyaW5nIEN1cnJlbnRfRmlsZV9TeXN0ZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGZpbGUgc3lzdGVtCiAJc3RyaW5nIEFjdHVhbF9CbG9ja19EZXZpY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3R1YWwgYmxvY2sgZGV2aWNlIChvbmUgb2YgcHJpbWFyeSwgYWx0ZXJuYXRlLCBvciBkZWNyeXB0ZWQpCiAJc3RyaW5nIE1URF9OYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lIG9mIHRoZSBwYXJ0aXRpb24gZm9yIE1URCBkZXZpY2VzCiAKLQotcHJvdGVjdGVkOgorcHJpdmF0ZToKIAlib29sIFByb2Nlc3NfRnN0YWJfTGluZShzdHJpbmcgTGluZSwgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NlcyBhIGZzdGFiIGxpbmUKIAl2b2lkIEZpbmRfQWN0dWFsX0Jsb2NrX0RldmljZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZXMgdGhlIGNvcnJlY3QgYmxvY2sgZGV2aWNlIGFuZCBzdG9yZXMgaXQgaW4gQWN0dWFsX0Jsb2NrX0RldmljZQogCi1wcm90ZWN0ZWQ6CisJYm9vbCBQcm9jZXNzX0ZsYWdzKHN0cmluZyBGbGFncywgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGN1c3RvbSBmc3RhYiBmbGFncworCWJvb2wgSXNfRmlsZV9TeXN0ZW0oc3RyaW5nIEZpbGVfU3lzdGVtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlsZSBzeXN0ZW0gZ2l2ZW4gaXMgY29uc2lkZXJlZCBhIGZpbGUgc3lzdGVtCisJYm9vbCBJc19JbWFnZShzdHJpbmcgRmlsZV9TeXN0ZW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIHN5c3RlbSBnaXZlbiBpcyBjb25zaWRlcmVkIGFuIGltYWdlCisJdm9pZCBTZXR1cF9GaWxlX1N5c3RlbShib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIGRlZmF1bHRzIGZvciBhIGZpbGUgc3lzdGVtIHBhcnRpdGlvbgorCXZvaWQgU2V0dXBfSW1hZ2UoYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyBkZWZhdWx0cyBmb3IgYW4gaW1hZ2UgcGFydGl0aW9uCisJdm9pZCBTZXR1cF9BbmRTZWModm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHVwIC5hbmRyb2lkX3NlY3VyZSBzZXR0aW5ncworCXZvaWQgRmluZF9SZWFsX0Jsb2NrX0RldmljZShzdHJpbmcmIEJsb2NrX0RldmljZSwgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgLy8gQ2hlY2tzIHRoZSBibG9jayBkZXZpY2UgZ2l2ZW4gYW5kIGZvbGxvd3Mgc3ltbGlua3MgdW50aWwgaXQgZ2V0cyB0byB0aGUgcmVhbCBibG9jayBkZXZpY2UKKwlib29sIEZpbmRfUGFydGl0aW9uX1NpemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmRzIHRoZSBwYXJ0aXRpb24gc2l6ZSBmcm9tIC9wcm9jL3BhcnRpdGlvbnMKKwl1bnNpZ25lZCBsb25nIGxvbmcgR2V0X1NpemVfVmlhX2R1KHN0cmluZyBQYXRoLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgIC8vIFVzZXMgZHUgdG8gZ2V0IHNpemVzCisJYm9vbCBXaXBlX0VYVDIzKHN0cmluZyBGaWxlX1N5c3RlbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXRzIGFzIGV4dDMgb3IgZXh0MgorCWJvb2wgV2lwZV9FWFQ0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0cyB1c2luZyBleHQ0LCB1c2VzIG1ha2VfZXh0NGZzIHdoZW4gcHJlc2VudAorCWJvb2wgV2lwZV9GQVQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0cyBhcyBGQVQgaWYgbWtkb3NmcyBleGl0cyBvdGhlcndpc2Ugcm0gLXJmIHdpcGUKKwlib29sIFdpcGVfRVhGQVQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdHMgYXMgRVhGQVQKKwlib29sIFdpcGVfTVREKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdHMgYXMgeWFmZnMyIGZvciBNVEQgbWVtb3J5IHR5cGVzCisJYm9vbCBXaXBlX1JNUkYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VzIHJtIC1yZiB0byB3aXBlCisJYm9vbCBXaXBlX0RhdGFfV2l0aG91dF9XaXBpbmdfTWVkaWEoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VzIHJtIC1yZiB0byB3aXBlIGJ1dCBkb2VzIG5vdCB3aXBlIC9kYXRhL21lZGlhCisJYm9vbCBCYWNrdXBfVGFyKHN0cmluZyBiYWNrdXBfZm9sZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrcyB1cCB1c2luZyB0YXIgZm9yIGZpbGUgc3lzdGVtcworCWJvb2wgQmFja3VwX0REKHN0cmluZyBiYWNrdXBfZm9sZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFja3MgdXAgdXNpbmcgZGQgZm9yIGVtbWMgbWVtb3J5IHR5cGVzCisJYm9vbCBCYWNrdXBfRHVtcF9JbWFnZShzdHJpbmcgYmFja3VwX2ZvbGRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrcyB1cCB1c2luZyBkdW1wX2ltYWdlIGZvciBNVEQgbWVtb3J5IHR5cGVzCisJYm9vbCBSZXN0b3JlX1RhcihzdHJpbmcgcmVzdG9yZV9mb2xkZXIsIHN0cmluZyBSZXN0b3JlX0ZpbGVfU3lzdGVtKTsgICAgICAvLyBSZXN0b3JlIHVzaW5nIHRhciBmb3IgZmlsZSBzeXN0ZW1zCisJYm9vbCBSZXN0b3JlX0REKHN0cmluZyByZXN0b3JlX2ZvbGRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHVzaW5nIGRkIGZvciBlbW1jIG1lbW9yeSB0eXBlcworCWJvb2wgUmVzdG9yZV9GbGFzaF9JbWFnZShzdHJpbmcgcmVzdG9yZV9mb2xkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB1c2luZyBmbGFzaF9pbWFnZSBmb3IgTVREIG1lbW9yeSB0eXBlcworCWJvb2wgR2V0X1NpemVfVmlhX3N0YXRmcyhib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IFBhcnRpdGlvbiBzaXplLCB1c2VkLCBhbmQgZnJlZSBzcGFjZSB1c2luZyBzdGF0ZnMKKwlib29sIEdldF9TaXplX1ZpYV9kZihib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBQYXJ0aXRpb24gc2l6ZSwgdXNlZCwgYW5kIGZyZWUgc3BhY2UgdXNpbmcgZGYgY29tbWFuZAorCWJvb2wgTWFrZV9EaXIoc3RyaW5nIFBhdGgsIGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QKKwlib29sIEZpbmRfTVREX0Jsb2NrX0RldmljZShzdHJpbmcgTVREX05hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmRzIHRoZSBtdGQgYmxvY2sgZGV2aWNlIGJhc2VkIG9uIHRoZSBuYW1lIGZyb20gdGhlIGZzdGFiCisJdm9pZCBSZWNyZWF0ZV9BbmRTZWNfRm9sZGVyKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgdGhlIC5hbmRyb2lkX3NlY3VyZSBmb2xkZXIKKwl2b2lkIE1vdW50X1N0b3JhZ2VfUmV0cnkodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWVzIG11bHRpcGxlIHRpbWVzIHdpdGggYSBoYWxmIHNlY29uZCBkZWxheSB0byBtb3VudCBhIGRldmljZSBpbiBjYXNlIHN0b3JhZ2UgaXMgc2xvdyB0byBtb3VudAorCitwcml2YXRlOgogCWJvb2wgQ2FuX0JlX01vdW50ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHBhcnRpdGlvbiBjYW4gYmUgbW91bnRlZAogCWJvb2wgQ2FuX0JlX1dpcGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHBhcnRpdGlvbiBjYW4gYmUgd2lwZWQKIAlib29sIENhbl9CZV9CYWNrZWRfVXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyB0aGF0IHRoZSBwYXJ0aXRpb24gd2lsbCBzaG93IHVwIGluIHRoZSBiYWNrdXAgbGlzdApAQCAtMTI1LDM2ICsxNTMsNiBAQAogCXN0cmluZyBFY3J5cHRGU19QYXNzd29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byBzdG9yZSB0aGUgZW5jcnlwdGlvbiBwYXNzd29yZCB0byByZW1vdW50CiAjZW5kaWYKIAotcHJpdmF0ZToKLQlib29sIFByb2Nlc3NfRmxhZ3Moc3RyaW5nIEZsYWdzLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgY3VzdG9tIGZzdGFiIGZsYWdzCi0JYm9vbCBJc19GaWxlX1N5c3RlbShzdHJpbmcgRmlsZV9TeXN0ZW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIHN5c3RlbSBnaXZlbiBpcyBjb25zaWRlcmVkIGEgZmlsZSBzeXN0ZW0KLQlib29sIElzX0ltYWdlKHN0cmluZyBGaWxlX1N5c3RlbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrcyB0byBzZWUgaWYgdGhlIGZpbGUgc3lzdGVtIGdpdmVuIGlzIGNvbnNpZGVyZWQgYW4gaW1hZ2UKLQl2b2lkIFNldHVwX0ZpbGVfU3lzdGVtKGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgZGVmYXVsdHMgZm9yIGEgZmlsZSBzeXN0ZW0gcGFydGl0aW9uCi0Jdm9pZCBTZXR1cF9JbWFnZShib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIGRlZmF1bHRzIGZvciBhbiBpbWFnZSBwYXJ0aXRpb24KLQl2b2lkIFNldHVwX0FuZFNlYyh2b2lkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgdXAgLmFuZHJvaWRfc2VjdXJlIHNldHRpbmdzCi0Jdm9pZCBGaW5kX1JlYWxfQmxvY2tfRGV2aWNlKHN0cmluZyYgQmxvY2tfRGV2aWNlLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAvLyBDaGVja3MgdGhlIGJsb2NrIGRldmljZSBnaXZlbiBhbmQgZm9sbG93cyBzeW1saW5rcyB1bnRpbCBpdCBnZXRzIHRvIHRoZSByZWFsIGJsb2NrIGRldmljZQotCWJvb2wgRmluZF9QYXJ0aXRpb25fU2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZHMgdGhlIHBhcnRpdGlvbiBzaXplIGZyb20gL3Byb2MvcGFydGl0aW9ucwotCXVuc2lnbmVkIGxvbmcgbG9uZyBHZXRfU2l6ZV9WaWFfZHUoc3RyaW5nIFBhdGgsIGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgLy8gVXNlcyBkdSB0byBnZXQgc2l6ZXMKLQlib29sIFdpcGVfRVhUMjMoc3RyaW5nIEZpbGVfU3lzdGVtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdHMgYXMgZXh0MyBvciBleHQyCi0JYm9vbCBXaXBlX0VYVDQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXRzIHVzaW5nIGV4dDQsIHVzZXMgbWFrZV9leHQ0ZnMgd2hlbiBwcmVzZW50Ci0JYm9vbCBXaXBlX0ZBVCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXRzIGFzIEZBVCBpZiBta2Rvc2ZzIGV4aXRzIG90aGVyd2lzZSBybSAtcmYgd2lwZQotCWJvb2wgV2lwZV9FWEZBVCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0cyBhcyBFWEZBVCAKLQlib29sIFdpcGVfTVREKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdHMgYXMgeWFmZnMyIGZvciBNVEQgbWVtb3J5IHR5cGVzCi0JYm9vbCBXaXBlX1JNUkYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VzIHJtIC1yZiB0byB3aXBlCi0JYm9vbCBXaXBlX0RhdGFfV2l0aG91dF9XaXBpbmdfTWVkaWEoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VzIHJtIC1yZiB0byB3aXBlIGJ1dCBkb2VzIG5vdCB3aXBlIC9kYXRhL21lZGlhCi0JYm9vbCBCYWNrdXBfVGFyKHN0cmluZyBiYWNrdXBfZm9sZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrcyB1cCB1c2luZyB0YXIgZm9yIGZpbGUgc3lzdGVtcwotCWJvb2wgQmFja3VwX0REKHN0cmluZyBiYWNrdXBfZm9sZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFja3MgdXAgdXNpbmcgZGQgZm9yIGVtbWMgbWVtb3J5IHR5cGVzCi0JYm9vbCBCYWNrdXBfRHVtcF9JbWFnZShzdHJpbmcgYmFja3VwX2ZvbGRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrcyB1cCB1c2luZyBkdW1wX2ltYWdlIGZvciBNVEQgbWVtb3J5IHR5cGVzCi0JYm9vbCBSZXN0b3JlX1RhcihzdHJpbmcgcmVzdG9yZV9mb2xkZXIsIHN0cmluZyBSZXN0b3JlX0ZpbGVfU3lzdGVtKTsgICAgICAvLyBSZXN0b3JlIHVzaW5nIHRhciBmb3IgZmlsZSBzeXN0ZW1zCi0JYm9vbCBSZXN0b3JlX0REKHN0cmluZyByZXN0b3JlX2ZvbGRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHVzaW5nIGRkIGZvciBlbW1jIG1lbW9yeSB0eXBlcwotCWJvb2wgUmVzdG9yZV9GbGFzaF9JbWFnZShzdHJpbmcgcmVzdG9yZV9mb2xkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB1c2luZyBmbGFzaF9pbWFnZSBmb3IgTVREIG1lbW9yeSB0eXBlcwotCWJvb2wgR2V0X1NpemVfVmlhX3N0YXRmcyhib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IFBhcnRpdGlvbiBzaXplLCB1c2VkLCBhbmQgZnJlZSBzcGFjZSB1c2luZyBzdGF0ZnMKLQlib29sIEdldF9TaXplX1ZpYV9kZihib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBQYXJ0aXRpb24gc2l6ZSwgdXNlZCwgYW5kIGZyZWUgc3BhY2UgdXNpbmcgZGYgY29tbWFuZAotCWJvb2wgTWFrZV9EaXIoc3RyaW5nIFBhdGgsIGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QKLQlib29sIEZpbmRfTVREX0Jsb2NrX0RldmljZShzdHJpbmcgTVREX05hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmRzIHRoZSBtdGQgYmxvY2sgZGV2aWNlIGJhc2VkIG9uIHRoZSBuYW1lIGZyb20gdGhlIGZzdGFiCi0Jdm9pZCBSZWNyZWF0ZV9BbmRTZWNfRm9sZGVyKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgdGhlIC5hbmRyb2lkX3NlY3VyZSBmb2xkZXIKLQl2b2lkIE1vdW50X1N0b3JhZ2VfUmV0cnkodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWVzIG11bHRpcGxlIHRpbWVzIHdpdGggYSBoYWxmIHNlY29uZCBkZWxheSB0byBtb3VudCBhIGRldmljZSBpbiBjYXNlIHN0b3JhZ2UgaXMgc2xvdyB0byBtb3VudAotCiBmcmllbmQgY2xhc3MgVFdQYXJ0aXRpb25NYW5hZ2VyOwogZnJpZW5kIGNsYXNzIERhdGFNYW5hZ2VyOwogZnJpZW5kIGNsYXNzIEdVSVBhcnRpdGlvbkxpc3Q7CkBAIC0xNjQsNTMgKzE2Miw1MyBAQAogewogcHVibGljOgogCVRXUGFydGl0aW9uTWFuYWdlcigpIHt9Ci0JdmlydHVhbCB+VFdQYXJ0aXRpb25NYW5hZ2VyKCkge30KKwl+VFdQYXJ0aXRpb25NYW5hZ2VyKCkge30KIAogcHVibGljOgotCXZpcnR1YWwgaW50IFByb2Nlc3NfRnN0YWIoc3RyaW5nIEZzdGFiX0ZpbGVuYW1lLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgLy8gUGFyc2VzIHRoZSBmc3RhYiBhbmQgcG9wdWxhdGVzIHRoZSBwYXJ0aXRpb25zCi0JdmlydHVhbCBpbnQgV3JpdGVfRnN0YWIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIC9ldGMvZnN0YWIgZmlsZSB0aGF0J3MgdXNlZCBieSB0aGUgY29tbWFuZCBsaW5lIGZvciBtb3VudCBjb21tYW5kcwotCXZpcnR1YWwgdm9pZCBPdXRwdXRfUGFydGl0aW9uX0xvZ2dpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0cHV0cyBwYXJ0aXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIGxvZwotCXZpcnR1YWwgaW50IE1vdW50X0J5X1BhdGgoc3RyaW5nIFBhdGgsIGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgLy8gTW91bnRzIHBhcnRpdGlvbiBiYXNlZCBvbiBwYXRoIChlLmcuIC9zeXN0ZW0pCi0JdmlydHVhbCBpbnQgTW91bnRfQnlfQmxvY2soc3RyaW5nIEJsb2NrLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAvLyBNb3VudHMgcGFydGl0aW9uIGJhc2VkIG9uIGJsb2NrIGRldmljZSAoZS5nLiAvZGV2L2Jsb2NrL21tY2JsazFwMSkKLQl2aXJ0dWFsIGludCBNb3VudF9CeV9OYW1lKHN0cmluZyBOYW1lLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgIC8vIE1vdW50cyBwYXJ0aXRpb24gYmFzZWQgb24gZGlzcGxheSBuYW1lIChlLmcuIFN5c3RlbSkKLQl2aXJ0dWFsIGludCBVbk1vdW50X0J5X1BhdGgoc3RyaW5nIFBhdGgsIGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgIC8vIFVubW91bnRzIHBhcnRpdGlvbiBiYXNlZCBvbiBwYXRoCi0JdmlydHVhbCBpbnQgVW5Nb3VudF9CeV9CbG9jayhzdHJpbmcgQmxvY2ssIGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAvLyBVbm1vdW50cyBwYXJ0aXRpb24gYmFzZWQgb24gYmxvY2sgZGV2aWNlCi0JdmlydHVhbCBpbnQgVW5Nb3VudF9CeV9OYW1lKHN0cmluZyBOYW1lLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAvLyBVbm1vdW50cyBwYXJ0aXRpb24gYmFzZWQgb24gZGlzcGxheSBuYW1lCi0JdmlydHVhbCBpbnQgSXNfTW91bnRlZF9CeV9QYXRoKHN0cmluZyBQYXRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgaWYgcGFydGl0aW9uIGlzIG1vdW50ZWQgYmFzZWQgb24gcGF0aAotCXZpcnR1YWwgaW50IElzX01vdW50ZWRfQnlfQmxvY2soc3RyaW5nIEJsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIGlmIHBhcnRpdGlvbiBpcyBtb3VudGVkIGJhc2VkIG9uIGJsb2NrIGRldmljZQotCXZpcnR1YWwgaW50IElzX01vdW50ZWRfQnlfTmFtZShzdHJpbmcgTmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIGlmIHBhcnRpdGlvbiBpcyBtb3VudGVkIGJhc2VkIG9uIGRpc3BsYXkgbmFtZQotCXZpcnR1YWwgaW50IE1vdW50X0N1cnJlbnRfU3RvcmFnZShib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgLy8gTW91bnRzIHRoZSBjdXJyZW50IHN0b3JhZ2UgbG9jYXRpb24KLQl2aXJ0dWFsIGludCBNb3VudF9TZXR0aW5nc19TdG9yYWdlKGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgIC8vIE1vdW50cyB0aGUgc2V0dGluZ3MgZmlsZSBzdG9yYWdlIGxvY2F0aW9uICh1c3VhbGx5IGludGVybmFsKQorCWludCBQcm9jZXNzX0ZzdGFiKHN0cmluZyBGc3RhYl9GaWxlbmFtZSwgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgLy8gUGFyc2VzIHRoZSBmc3RhYiBhbmQgcG9wdWxhdGVzIHRoZSBwYXJ0aXRpb25zCisJaW50IFdyaXRlX0ZzdGFiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIC9ldGMvZnN0YWIgZmlsZSB0aGF0J3MgdXNlZCBieSB0aGUgY29tbWFuZCBsaW5lIGZvciBtb3VudCBjb21tYW5kcworCXZvaWQgT3V0cHV0X1BhcnRpdGlvbl9Mb2dnaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0cHV0cyBwYXJ0aXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIGxvZworCWludCBNb3VudF9CeV9QYXRoKHN0cmluZyBQYXRoLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gTW91bnRzIHBhcnRpdGlvbiBiYXNlZCBvbiBwYXRoIChlLmcuIC9zeXN0ZW0pCisJaW50IE1vdW50X0J5X0Jsb2NrKHN0cmluZyBCbG9jaywgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAvLyBNb3VudHMgcGFydGl0aW9uIGJhc2VkIG9uIGJsb2NrIGRldmljZSAoZS5nLiAvZGV2L2Jsb2NrL21tY2JsazFwMSkKKwlpbnQgTW91bnRfQnlfTmFtZShzdHJpbmcgTmFtZSwgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdW50cyBwYXJ0aXRpb24gYmFzZWQgb24gZGlzcGxheSBuYW1lIChlLmcuIFN5c3RlbSkKKwlpbnQgVW5Nb3VudF9CeV9QYXRoKHN0cmluZyBQYXRoLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgIC8vIFVubW91bnRzIHBhcnRpdGlvbiBiYXNlZCBvbiBwYXRoCisJaW50IFVuTW91bnRfQnlfQmxvY2soc3RyaW5nIEJsb2NrLCBib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAvLyBVbm1vdW50cyBwYXJ0aXRpb24gYmFzZWQgb24gYmxvY2sgZGV2aWNlCisJaW50IFVuTW91bnRfQnlfTmFtZShzdHJpbmcgTmFtZSwgYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAvLyBVbm1vdW50cyBwYXJ0aXRpb24gYmFzZWQgb24gZGlzcGxheSBuYW1lCisJaW50IElzX01vdW50ZWRfQnlfUGF0aChzdHJpbmcgUGF0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgaWYgcGFydGl0aW9uIGlzIG1vdW50ZWQgYmFzZWQgb24gcGF0aAorCWludCBJc19Nb3VudGVkX0J5X0Jsb2NrKHN0cmluZyBCbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIGlmIHBhcnRpdGlvbiBpcyBtb3VudGVkIGJhc2VkIG9uIGJsb2NrIGRldmljZQorCWludCBJc19Nb3VudGVkX0J5X05hbWUoc3RyaW5nIE5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIGlmIHBhcnRpdGlvbiBpcyBtb3VudGVkIGJhc2VkIG9uIGRpc3BsYXkgbmFtZQorCWludCBNb3VudF9DdXJyZW50X1N0b3JhZ2UoYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW91bnRzIHRoZSBjdXJyZW50IHN0b3JhZ2UgbG9jYXRpb24KKwlpbnQgTW91bnRfU2V0dGluZ3NfU3RvcmFnZShib29sIERpc3BsYXlfRXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdW50cyB0aGUgc2V0dGluZ3MgZmlsZSBzdG9yYWdlIGxvY2F0aW9uICh1c3VhbGx5IGludGVybmFsKQogCVRXUGFydGl0aW9uKiBGaW5kX1BhcnRpdGlvbl9CeV9QYXRoKHN0cmluZyBQYXRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBwYXJ0aXRpb24gYmFzZWQgb24gcGF0aAogCVRXUGFydGl0aW9uKiBGaW5kX1BhcnRpdGlvbl9CeV9CbG9jayhzdHJpbmcgQmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBwYXJ0aXRpb24gYmFzZWQgb24gYmxvY2sgZGV2aWNlCiAJVFdQYXJ0aXRpb24qIEZpbmRfUGFydGl0aW9uX0J5X05hbWUoc3RyaW5nIEJsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHBhcnRpdGlvbiBiYXNlZCBvbiBuYW1lCi0JdmlydHVhbCBpbnQgQ2hlY2tfQmFja3VwX05hbWUoYm9vbCBEaXNwbGF5X0Vycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgdGhlIGN1cnJlbnQgYmFja3VwIG5hbWUgdG8gZW5zdXJlIHRoYXQgaXQgaXMgdmFsaWQKLQl2aXJ0dWFsIGludCBSdW5fQmFja3VwKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYXRlcyBhIGJhY2t1cCBpbiB0aGUgY3VycmVudCBzdG9yYWdlCi0JdmlydHVhbCBpbnQgUnVuX1Jlc3RvcmUoc3RyaW5nIFJlc3RvcmVfTmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlcyBhIGJhY2t1cAotCXZpcnR1YWwgdm9pZCBTZXRfUmVzdG9yZV9GaWxlcyhzdHJpbmcgUmVzdG9yZV9OYW1lKTsgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCB0byBnYXRoZXIgYSBsaXN0IG9mIGF2YWlsYWJsZSBiYWNrdXAgcGFydGl0aW9ucyBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGZvciBhIHJlc3RvcmUKLQl2aXJ0dWFsIGludCBXaXBlX0J5X1BhdGgoc3RyaW5nIFBhdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGEgcGFydGl0aW9uIGJhc2VkIG9uIHBhdGgKLQl2aXJ0dWFsIGludCBXaXBlX0J5X0Jsb2NrKHN0cmluZyBCbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGEgcGFydGl0aW9uIGJhc2VkIG9uIGJsb2NrIGRldmljZQotCXZpcnR1YWwgaW50IFdpcGVfQnlfTmFtZShzdHJpbmcgTmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgYSBwYXJ0aXRpb24gYmFzZWQgb24gZGlzcGxheSBuYW1lCi0JdmlydHVhbCBpbnQgRmFjdG9yeV9SZXNldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtcyBhIGZhY3RvcnkgcmVzZXQKLQl2aXJ0dWFsIGludCBXaXBlX0RhbHZpa19DYWNoZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGRhbHZpayBjYWNoZQotCXZpcnR1YWwgaW50IFdpcGVfUm90YXRlX0RhdGEoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgcm90YXRpb24gZGF0YSAtLSAKLQl2aXJ0dWFsIGludCBXaXBlX0JhdHRlcnlfU3RhdHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGUgYmF0dGVyeSBzdGF0cyAtLSAvZGF0YS9zeXN0ZW0vYmF0dGVyeXN0YXRzLmJpbgotCXZpcnR1YWwgaW50IFdpcGVfQW5kcm9pZF9TZWN1cmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgYW5kcm9pZCBzZWN1cmUKLQl2aXJ0dWFsIGludCBGb3JtYXRfRGF0YSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWxseSBmb3JtYXRzIGRhdGEgb24gL2RhdGEvbWVkaWEgZGV2aWNlcyAtLSBhbHNvIHJlbW92ZXMgZW5jcnlwdGlvbgotCXZpcnR1YWwgaW50IFdpcGVfTWVkaWFfRnJvbV9EYXRhKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlcyBhbmQgcmVjcmVhdGVzIHRoZSBtZWRpYSBmb2xkZXIgb24gL2RhdGEvbWVkaWEgZGV2aWNlcwotCXZpcnR1YWwgdm9pZCBSZWZyZXNoX1NpemVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVmcmVzaGVzIHNpemUgZGF0YSBvZiBwYXJ0aXRpb25zCi0JdmlydHVhbCB2b2lkIFVwZGF0ZV9TeXN0ZW1fRGV0YWlscygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGVzIGZzdGFiLCBmaWxlIHN5c3RlbXMsIHNpemVzLCBldGMuCi0JdmlydHVhbCBpbnQgRGVjcnlwdF9EZXZpY2Uoc3RyaW5nIFBhc3N3b3JkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGRlY3J5cHQgYW55IGVuY3J5cHRlZCBwYXJ0aXRpb25zCi0JdmlydHVhbCBpbnQgdXNiX3N0b3JhZ2VfZW5hYmxlKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgVVNCIHN0b3JhZ2UgbW9kZQotCXZpcnR1YWwgaW50IHVzYl9zdG9yYWdlX2Rpc2FibGUodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBVU0Igc3RvcmFnZSBtb2RlCi0JdmlydHVhbCB2b2lkIE1vdW50X0FsbF9TdG9yYWdlKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3VudHMgYWxsIHN0b3JhZ2UgbG9jYXRpb25zCi0JdmlydHVhbCB2b2lkIFVuTW91bnRfTWFpbl9QYXJ0aXRpb25zKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbm1vdW50cyBzeXN0ZW0gYW5kIGRhdGEgaWYgbm90IGRhdGEvbWVkaWEgYW5kIGJvb3QgaWYgYm9vdCBpcyBtb3VudGFibGUKLQl2aXJ0dWFsIGludCBQYXJ0aXRpb25fU0RDYXJkKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGFydGl0aW9ucyB0aGUgc2RjYXJkCisJaW50IENoZWNrX0JhY2t1cF9OYW1lKGJvb2wgRGlzcGxheV9FcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3MgdGhlIGN1cnJlbnQgYmFja3VwIG5hbWUgdG8gZW5zdXJlIHRoYXQgaXQgaXMgdmFsaWQKKwlpbnQgUnVuX0JhY2t1cCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYXRlcyBhIGJhY2t1cCBpbiB0aGUgY3VycmVudCBzdG9yYWdlCisJaW50IFJ1bl9SZXN0b3JlKHN0cmluZyBSZXN0b3JlX05hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlcyBhIGJhY2t1cAorCXZvaWQgU2V0X1Jlc3RvcmVfRmlsZXMoc3RyaW5nIFJlc3RvcmVfTmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCB0byBnYXRoZXIgYSBsaXN0IG9mIGF2YWlsYWJsZSBiYWNrdXAgcGFydGl0aW9ucyBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGZvciBhIHJlc3RvcmUKKwlpbnQgV2lwZV9CeV9QYXRoKHN0cmluZyBQYXRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGEgcGFydGl0aW9uIGJhc2VkIG9uIHBhdGgKKwlpbnQgV2lwZV9CeV9CbG9jayhzdHJpbmcgQmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGEgcGFydGl0aW9uIGJhc2VkIG9uIGJsb2NrIGRldmljZQorCWludCBXaXBlX0J5X05hbWUoc3RyaW5nIE5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgYSBwYXJ0aXRpb24gYmFzZWQgb24gZGlzcGxheSBuYW1lCisJaW50IEZhY3RvcnlfUmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtcyBhIGZhY3RvcnkgcmVzZXQKKwlpbnQgV2lwZV9EYWx2aWtfQ2FjaGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpcGVzIGRhbHZpayBjYWNoZQorCWludCBXaXBlX1JvdGF0ZV9EYXRhKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZXMgcm90YXRpb24gZGF0YSAtLQorCWludCBXaXBlX0JhdHRlcnlfU3RhdHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lwZSBiYXR0ZXJ5IHN0YXRzIC0tIC9kYXRhL3N5c3RlbS9iYXR0ZXJ5c3RhdHMuYmluCisJaW50IFdpcGVfQW5kcm9pZF9TZWN1cmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXBlcyBhbmRyb2lkIHNlY3VyZQorCWludCBGb3JtYXRfRGF0YSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhbGx5IGZvcm1hdHMgZGF0YSBvbiAvZGF0YS9tZWRpYSBkZXZpY2VzIC0tIGFsc28gcmVtb3ZlcyBlbmNyeXB0aW9uCisJaW50IFdpcGVfTWVkaWFfRnJvbV9EYXRhKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIGFuZCByZWNyZWF0ZXMgdGhlIG1lZGlhIGZvbGRlciBvbiAvZGF0YS9tZWRpYSBkZXZpY2VzCisJdm9pZCBSZWZyZXNoX1NpemVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWZyZXNoZXMgc2l6ZSBkYXRhIG9mIHBhcnRpdGlvbnMKKwl2b2lkIFVwZGF0ZV9TeXN0ZW1fRGV0YWlscygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZXMgZnN0YWIsIGZpbGUgc3lzdGVtcywgc2l6ZXMsIGV0Yy4KKwlpbnQgRGVjcnlwdF9EZXZpY2Uoc3RyaW5nIFBhc3N3b3JkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZGVjcnlwdCBhbnkgZW5jcnlwdGVkIHBhcnRpdGlvbnMKKwlpbnQgdXNiX3N0b3JhZ2VfZW5hYmxlKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBVU0Igc3RvcmFnZSBtb2RlCisJaW50IHVzYl9zdG9yYWdlX2Rpc2FibGUodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIFVTQiBzdG9yYWdlIG1vZGUKKwl2b2lkIE1vdW50X0FsbF9TdG9yYWdlKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdW50cyBhbGwgc3RvcmFnZSBsb2NhdGlvbnMKKwl2b2lkIFVuTW91bnRfTWFpbl9QYXJ0aXRpb25zKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVubW91bnRzIHN5c3RlbSBhbmQgZGF0YSBpZiBub3QgZGF0YS9tZWRpYSBhbmQgYm9vdCBpZiBib290IGlzIG1vdW50YWJsZQorCWludCBQYXJ0aXRpb25fU0RDYXJkKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwYXJ0aXRpb25zIHRoZSBzZGNhcmQKIAotCXZpcnR1YWwgaW50IEZpeF9QZXJtaXNzaW9ucygpOyAKLQl2aXJ0dWFsIHZvaWQgR2V0X1BhcnRpdGlvbl9MaXN0KHN0cmluZyBMaXN0VHlwZSwgc3RkOjp2ZWN0b3I8UGFydGl0aW9uTGlzdD4gKlBhcnRpdGlvbl9MaXN0KTsKLQl2aXJ0dWFsIGludCBGc3RhYl9Qcm9jZXNzZWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBpZiB0aGUgZnN0YWIgaGFzIGJlZW4gcHJvY2Vzc2VkIG9yIG5vdAotCXZpcnR1YWwgdm9pZCBPdXRwdXRfU3RvcmFnZV9Gc3RhYigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIC9jYWNoZS9yZWNvdmVyeS9zdG9yYWdlLmZzdGFiIGZpbGUgd2l0aCBhIGxpc3Qgb2YgYWxsIHBvdGVudGlhbCBzdG9yYWdlIGxvY2F0aW9ucyBmb3IgYXBwIHVzZQorCWludCBGaXhfUGVybWlzc2lvbnMoKTsKKwl2b2lkIEdldF9QYXJ0aXRpb25fTGlzdChzdHJpbmcgTGlzdFR5cGUsIHN0ZDo6dmVjdG9yPFBhcnRpdGlvbkxpc3Q+ICpQYXJ0aXRpb25fTGlzdCk7CisJaW50IEZzdGFiX1Byb2Nlc3NlZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgaWYgdGhlIGZzdGFiIGhhcyBiZWVuIHByb2Nlc3NlZCBvciBub3QKKwl2b2lkIE91dHB1dF9TdG9yYWdlX0ZzdGFiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSAvY2FjaGUvcmVjb3Zlcnkvc3RvcmFnZS5mc3RhYiBmaWxlIHdpdGggYSBsaXN0IG9mIGFsbCBwb3RlbnRpYWwgc3RvcmFnZSBsb2NhdGlvbnMgZm9yIGFwcCB1c2UKIAogcHJpdmF0ZToKIAlib29sIE1ha2VfTUQ1KGJvb2wgZ2VuZXJhdGVfbWQ1LCBzdHJpbmcgQmFja3VwX0ZvbGRlciwgc3RyaW5nIEJhY2t1cF9GaWxlbmFtZSk7IC8vIEdlbmVyYXRlcyBhbiBNRDUgYWZ0ZXIgYSBiYWNrdXAgaXMgbWFkZQpkaWZmIC0tZ2l0IGEvcHJlYnVpbHQvQW5kcm9pZC5tayBiL3ByZWJ1aWx0L0FuZHJvaWQubWsKaW5kZXggMTQ3MDk1MS4uNzQ5MjNhMCAxMDA2NDQKLS0tIGEvcHJlYnVpbHQvQW5kcm9pZC5taworKysgYi9wcmVidWlsdC9BbmRyb2lkLm1rCkBAIC00Niw4ICs0NiwxNCBAQAogUkVMSU5LX1NPVVJDRV9GSUxFUyArPSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliZmxhc2h1dGlscy5zbwogUkVMSU5LX1NPVVJDRV9GSUxFUyArPSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGlic3RscG9ydC5zbwogI1JFTElOS19TT1VSQ0VfRklMRVMgKz0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYm1pbmNyeXB0LnNvCi1SRUxJTktfU09VUkNFX0ZJTEVTICs9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJleHQ0X3V0aWxzLnNvCitpZmVxICgkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQ0KSwgdHJ1ZSkKKyAgICBSRUxJTktfU09VUkNFX0ZJTEVTICs9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJleHQ0X3V0aWxzLnNvCitlbmRpZgogUkVMSU5LX1NPVVJDRV9GSUxFUyArPSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliYW9zcHJlY292ZXJ5LnNvCitSRUxJTktfU09VUkNFX0ZJTEVTICs9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJqcGVnLnNvCitpZm5lcSAoJCh3aWxkY2FyZCBleHRlcm5hbC9saWJzZWxpbnV4L0FuZHJvaWQubWspLCkKKyAgICBSRUxJTktfU09VUkNFX0ZJTEVTICs9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJzZWxpbnV4LnNvCitlbmRpZgogaWZlcSAoJChCVUlMRF9JRCksIEdJTkdFUkJSRUFEKQogICAgIFRXX05PX0VYRkFUIDo9IHRydWUKIGVuZGlmCmRpZmYgLS1naXQgYS90d2Jvb3Rsb2FkZXIuY3BwIGIvdHdib290bG9hZGVyLmNwcAppbmRleCA4MjZjZWNhLi5kMGU0OWUwIDEwMDY0NAotLS0gYS90d2Jvb3Rsb2FkZXIuY3BwCisrKyBiL3R3Ym9vdGxvYWRlci5jcHAKQEAgLTMzLDMzICszMywzNSBAQAogc3RhdGljIGludCBzZXRfYm9vdGxvYWRlcl9tZXNzYWdlX2Jsb2NrKGNvbnN0IHN0cnVjdCBib290bG9hZGVyX21lc3NhZ2UgKmluLCBjb25zdCBUV1BhcnRpdGlvbiogUGFydGl0aW9uKTsKIAogaW50IGdldF9ib290bG9hZGVyX21lc3NhZ2Uoc3RydWN0IGJvb3Rsb2FkZXJfbWVzc2FnZSAqb3V0KSB7Ci0gICAgVFdQYXJ0aXRpb24qIFBhcnQgPSBQYXJ0aXRpb25NYW5hZ2VyLkZpbmRfUGFydGl0aW9uX0J5X1BhdGgoIi9taXNjIik7Ci0gICAgaWYgKFBhcnQgPT0gTlVMTCkgewotICAgICAgLy9MT0dFKCJDYW5ub3QgbG9hZCB2b2x1bWUgL21pc2MhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKFBhcnQtPkN1cnJlbnRfRmlsZV9TeXN0ZW0gPT0gIm10ZCIpIHsKLSAgICAgICAgcmV0dXJuIGdldF9ib290bG9hZGVyX21lc3NhZ2VfbXRkKG91dCwgUGFydCk7Ci0gICAgfSBlbHNlIGlmIChQYXJ0LT5DdXJyZW50X0ZpbGVfU3lzdGVtID09ICJlbW1jIikgewotICAgICAgICByZXR1cm4gZ2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZV9ibG9jayhvdXQsIFBhcnQpOwotICAgIH0KLSAgICBMT0dFKCJ1bmtub3duIG1pc2MgcGFydGl0aW9uIGZzX3R5cGUgXCIlc1wiXG4iLCBQYXJ0LT5DdXJyZW50X0ZpbGVfU3lzdGVtLmNfc3RyKCkpOwotICAgIHJldHVybiAtMTsKKwlUV1BhcnRpdGlvbiogUGFydCA9IFBhcnRpdGlvbk1hbmFnZXIuRmluZF9QYXJ0aXRpb25fQnlfUGF0aCgiL21pc2MiKTsKKwlpZiAoUGFydCA9PSBOVUxMKSB7CisJICAvL0xPR0UoIkNhbm5vdCBsb2FkIHZvbHVtZSAvbWlzYyFcbiIpOworCSAgcmV0dXJuIC0xOworCX0KKworCWlmIChQYXJ0LT5DdXJyZW50X0ZpbGVfU3lzdGVtID09ICJtdGQiKQorCQlyZXR1cm4gZ2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZV9tdGQob3V0LCBQYXJ0KTsKKwllbHNlIGlmIChQYXJ0LT5DdXJyZW50X0ZpbGVfU3lzdGVtID09ICJlbW1jIikKKwkJcmV0dXJuIGdldF9ib290bG9hZGVyX21lc3NhZ2VfYmxvY2sob3V0LCBQYXJ0KTsKKworCUxPR0UoInVua25vd24gbWlzYyBwYXJ0aXRpb24gZnNfdHlwZSBcIiVzXCJcbiIsIFBhcnQtPkN1cnJlbnRfRmlsZV9TeXN0ZW0uY19zdHIoKSk7CisJcmV0dXJuIC0xOwogfQogCiBpbnQgc2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZShjb25zdCBzdHJ1Y3QgYm9vdGxvYWRlcl9tZXNzYWdlICppbikgewotICAgIFRXUGFydGl0aW9uKiBQYXJ0ID0gUGFydGl0aW9uTWFuYWdlci5GaW5kX1BhcnRpdGlvbl9CeV9QYXRoKCIvbWlzYyIpOwotICAgIGlmIChQYXJ0ID09IE5VTEwpIHsKLSAgICAgIC8vTE9HRSgiQ2Fubm90IGxvYWQgdm9sdW1lIC9taXNjIVxuIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChQYXJ0LT5DdXJyZW50X0ZpbGVfU3lzdGVtID09ICJtdGQiKSB7Ci0gICAgICAgIHJldHVybiBzZXRfYm9vdGxvYWRlcl9tZXNzYWdlX210ZChpbiwgUGFydCk7Ci0gICAgfSBlbHNlIGlmIChQYXJ0LT5DdXJyZW50X0ZpbGVfU3lzdGVtID09ICJlbW1jIikgewotICAgICAgICByZXR1cm4gc2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZV9ibG9jayhpbiwgUGFydCk7Ci0gICAgfQotICAgIExPR0UoInVua25vd24gbWlzYyBwYXJ0aXRpb24gZnNfdHlwZSBcIiVzXCJcbiIsIFBhcnQtPkN1cnJlbnRfRmlsZV9TeXN0ZW0uY19zdHIoKSk7Ci0gICAgcmV0dXJuIC0xOworCVRXUGFydGl0aW9uKiBQYXJ0ID0gUGFydGl0aW9uTWFuYWdlci5GaW5kX1BhcnRpdGlvbl9CeV9QYXRoKCIvbWlzYyIpOworCWlmIChQYXJ0ID09IE5VTEwpIHsKKwkgIC8vTE9HRSgiQ2Fubm90IGxvYWQgdm9sdW1lIC9taXNjIVxuIik7CisJICByZXR1cm4gLTE7CisJfQorCisJaWYgKFBhcnQtPkN1cnJlbnRfRmlsZV9TeXN0ZW0gPT0gIm10ZCIpCisJCXJldHVybiBzZXRfYm9vdGxvYWRlcl9tZXNzYWdlX210ZChpbiwgUGFydCk7CisJZWxzZSBpZiAoUGFydC0+Q3VycmVudF9GaWxlX1N5c3RlbSA9PSAiZW1tYyIpCisJCXJldHVybiBzZXRfYm9vdGxvYWRlcl9tZXNzYWdlX2Jsb2NrKGluLCBQYXJ0KTsKKworCUxPR0UoInVua25vd24gbWlzYyBwYXJ0aXRpb24gZnNfdHlwZSBcIiVzXCJcbiIsIFBhcnQtPkN1cnJlbnRfRmlsZV9TeXN0ZW0uY19zdHIoKSk7CisJcmV0dXJuIC0xOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcxLDEzNCArNzMsMTQxIEBACiAKIHN0YXRpYyBpbnQgZ2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZV9tdGQoc3RydWN0IGJvb3Rsb2FkZXJfbWVzc2FnZSAqb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUV1BhcnRpdGlvbiogUGFydGl0aW9uKSB7Ci0gICAgc2l6ZV90IHdyaXRlX3NpemU7Ci0gICAgbXRkX3NjYW5fcGFydGl0aW9ucygpOwotICAgIGNvbnN0IE10ZFBhcnRpdGlvbiAqcGFydCA9IG10ZF9maW5kX3BhcnRpdGlvbl9ieV9uYW1lKFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSk7Ci0gICAgaWYgKHBhcnQgPT0gTlVMTCB8fCBtdGRfcGFydGl0aW9uX2luZm8ocGFydCwgTlVMTCwgTlVMTCwgJndyaXRlX3NpemUpKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IGZpbmQgJXNcbiIsIFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisJc2l6ZV90IHdyaXRlX3NpemU7CisJbXRkX3NjYW5fcGFydGl0aW9ucygpOworCWNvbnN0IE10ZFBhcnRpdGlvbiAqcGFydCA9IG10ZF9maW5kX3BhcnRpdGlvbl9ieV9uYW1lKFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSk7CisJaWYgKHBhcnQgPT0gTlVMTCB8fCBtdGRfcGFydGl0aW9uX2luZm8ocGFydCwgTlVMTCwgTlVMTCwgJndyaXRlX3NpemUpKSB7CisJCUxPR0UoIkNhbid0IGZpbmQgJXNcbiIsIFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSk7CisJCXJldHVybiAtMTsKKwl9CiAKLSAgICBNdGRSZWFkQ29udGV4dCAqcmVhZCA9IG10ZF9yZWFkX3BhcnRpdGlvbihwYXJ0KTsKLSAgICBpZiAocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IG9wZW4gJXNcbiglcylcbiIsIFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwlNdGRSZWFkQ29udGV4dCAqcmVhZCA9IG10ZF9yZWFkX3BhcnRpdGlvbihwYXJ0KTsKKwlpZiAocmVhZCA9PSBOVUxMKSB7CisJCUxPR0UoIkNhbid0IG9wZW4gJXNcbiglcylcbiIsIFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIGNvbnN0IHNzaXplX3Qgc2l6ZSA9IHdyaXRlX3NpemUgKiBNSVNDX1BBR0VTOwotICAgIGNoYXIgZGF0YVtzaXplXTsKLSAgICBzc2l6ZV90IHIgPSBtdGRfcmVhZF9kYXRhKHJlYWQsIGRhdGEsIHNpemUpOwotICAgIGlmIChyICE9IHNpemUpIExPR0UoIkNhbid0IHJlYWQgJXNcbiglcylcbiIsIFBhcnRpdGlvbi0+TVREX05hbWUuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBtdGRfcmVhZF9jbG9zZShyZWFkKTsKLSAgICBpZiAociAhPSBzaXplKSByZXR1cm4gLTE7CisJY29uc3Qgc3NpemVfdCBzaXplID0gd3JpdGVfc2l6ZSAqIE1JU0NfUEFHRVM7CisJY2hhciBkYXRhW3NpemVdOworCXNzaXplX3QgciA9IG10ZF9yZWFkX2RhdGEocmVhZCwgZGF0YSwgc2l6ZSk7CisJaWYgKHIgIT0gc2l6ZSkgTE9HRSgiQ2FuJ3QgcmVhZCAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworCW10ZF9yZWFkX2Nsb3NlKHJlYWQpOworCWlmIChyICE9IHNpemUpIHJldHVybiAtMTsKIAotICAgIG1lbWNweShvdXQsICZkYXRhW3dyaXRlX3NpemUgKiBNSVNDX0NPTU1BTkRfUEFHRV0sIHNpemVvZigqb3V0KSk7Ci0gICAgcmV0dXJuIDA7CisJbWVtY3B5KG91dCwgJmRhdGFbd3JpdGVfc2l6ZSAqIE1JU0NfQ09NTUFORF9QQUdFXSwgc2l6ZW9mKCpvdXQpKTsKKwlyZXR1cm4gMDsKIH0KIHN0YXRpYyBpbnQgc2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZV9tdGQoY29uc3Qgc3RydWN0IGJvb3Rsb2FkZXJfbWVzc2FnZSAqaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRXUGFydGl0aW9uKiBQYXJ0aXRpb24pIHsKLSAgICBzaXplX3Qgd3JpdGVfc2l6ZTsKLSAgICBtdGRfc2Nhbl9wYXJ0aXRpb25zKCk7Ci0gICAgY29uc3QgTXRkUGFydGl0aW9uICpwYXJ0ID0gbXRkX2ZpbmRfcGFydGl0aW9uX2J5X25hbWUoUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpKTsKLSAgICBpZiAocGFydCA9PSBOVUxMIHx8IG10ZF9wYXJ0aXRpb25faW5mbyhwYXJ0LCBOVUxMLCBOVUxMLCAmd3JpdGVfc2l6ZSkpIHsKLSAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCAlc1xuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwlzaXplX3Qgd3JpdGVfc2l6ZTsKKwltdGRfc2Nhbl9wYXJ0aXRpb25zKCk7CisJY29uc3QgTXRkUGFydGl0aW9uICpwYXJ0ID0gbXRkX2ZpbmRfcGFydGl0aW9uX2J5X25hbWUoUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpKTsKKwlpZiAocGFydCA9PSBOVUxMIHx8IG10ZF9wYXJ0aXRpb25faW5mbyhwYXJ0LCBOVUxMLCBOVUxMLCAmd3JpdGVfc2l6ZSkpIHsKKwkJTE9HRSgiQ2FuJ3QgZmluZCAlc1xuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIE10ZFJlYWRDb250ZXh0ICpyZWFkID0gbXRkX3JlYWRfcGFydGl0aW9uKHBhcnQpOwotICAgIGlmIChyZWFkID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiQ2FuJ3Qgb3BlbiAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorCU10ZFJlYWRDb250ZXh0ICpyZWFkID0gbXRkX3JlYWRfcGFydGl0aW9uKHBhcnQpOworCWlmIChyZWFkID09IE5VTEwpIHsKKwkJTE9HRSgiQ2FuJ3Qgb3BlbiAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQogCi0gICAgc3NpemVfdCBzaXplID0gd3JpdGVfc2l6ZSAqIE1JU0NfUEFHRVM7Ci0gICAgY2hhciBkYXRhW3NpemVdOwotICAgIHNzaXplX3QgciA9IG10ZF9yZWFkX2RhdGEocmVhZCwgZGF0YSwgc2l6ZSk7Ci0gICAgaWYgKHIgIT0gc2l6ZSkgTE9HRSgiQ2FuJ3QgcmVhZCAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIG10ZF9yZWFkX2Nsb3NlKHJlYWQpOwotICAgIGlmIChyICE9IHNpemUpIHJldHVybiAtMTsKKwlzc2l6ZV90IHNpemUgPSB3cml0ZV9zaXplICogTUlTQ19QQUdFUzsKKwljaGFyIGRhdGFbc2l6ZV07CisJc3NpemVfdCByID0gbXRkX3JlYWRfZGF0YShyZWFkLCBkYXRhLCBzaXplKTsKKwlpZiAociAhPSBzaXplKSBMT0dFKCJDYW4ndCByZWFkICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPk1URF9OYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CisJbXRkX3JlYWRfY2xvc2UocmVhZCk7CisJaWYgKHIgIT0gc2l6ZSkgcmV0dXJuIC0xOwogCi0gICAgbWVtY3B5KCZkYXRhW3dyaXRlX3NpemUgKiBNSVNDX0NPTU1BTkRfUEFHRV0sIGluLCBzaXplb2YoKmluKSk7CisJbWVtY3B5KCZkYXRhW3dyaXRlX3NpemUgKiBNSVNDX0NPTU1BTkRfUEFHRV0sIGluLCBzaXplb2YoKmluKSk7CiAKLSAgICBNdGRXcml0ZUNvbnRleHQgKndyaXRlID0gbXRkX3dyaXRlX3BhcnRpdGlvbihwYXJ0KTsKLSAgICBpZiAod3JpdGUgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDYW4ndCBvcGVuICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPk1URF9OYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKG10ZF93cml0ZV9kYXRhKHdyaXRlLCBkYXRhLCBzaXplKSAhPSBzaXplKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IHdyaXRlICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPk1URF9OYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIG10ZF93cml0ZV9jbG9zZSh3cml0ZSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKG10ZF93cml0ZV9jbG9zZSh3cml0ZSkpIHsKLSAgICAgICAgTE9HRSgiQ2FuJ3QgZmluaXNoICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPk1URF9OYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisJTXRkV3JpdGVDb250ZXh0ICp3cml0ZSA9IG10ZF93cml0ZV9wYXJ0aXRpb24ocGFydCk7CisJaWYgKHdyaXRlID09IE5VTEwpIHsKKwkJTE9HRSgiQ2FuJ3Qgb3BlbiAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtdGRfd3JpdGVfZGF0YSh3cml0ZSwgZGF0YSwgc2l6ZSkgIT0gc2l6ZSkgeworCQlMT0dFKCJDYW4ndCB3cml0ZSAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworCQltdGRfd3JpdGVfY2xvc2Uod3JpdGUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtdGRfd3JpdGVfY2xvc2Uod3JpdGUpKSB7CisJCUxPR0UoIkNhbid0IGZpbmlzaCAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5NVERfTmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQogCi0gICAgTE9HSSgiU2V0IGJvb3QgY29tbWFuZCBcIiVzXCJcbiIsIGluLT5jb21tYW5kWzBdICE9IDI1NSA/IGluLT5jb21tYW5kIDogIiIpOwotICAgIHJldHVybiAwOworCUxPR0koIlNldCBib290IGNvbW1hbmQgXCIlc1wiXG4iLCBpbi0+Y29tbWFuZFswXSAhPSAyNTUgPyBpbi0+Y29tbWFuZCA6ICIiKTsKKwlyZXR1cm4gMDsKIH0KIAotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIGZvciBtaXNjIHBhcnRpdGlvbnMgb24gYmxvY2sgZGV2aWNlcwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkIHdhaXRfZm9yX2RldmljZShjb25zdCBjaGFyKiBmbikgewotICAgIGludCB0cmllcyA9IDA7Ci0gICAgaW50IHJldDsKLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgZG8gewotICAgICAgICArK3RyaWVzOwotICAgICAgICByZXQgPSBzdGF0KGZuLCAmYnVmKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgcHJpbnRmKCJzdGF0ICVzIHRyeSAlZDogJXNcbiIsIGZuLCB0cmllcywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAocmV0ICYmIHRyaWVzIDwgMTApOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcHJpbnRmKCJmYWlsZWQgdG8gc3RhdCAlc1xuIiwgZm4pOwotICAgIH0KKwlpbnQgdHJpZXMgPSAwOworCWludCByZXQ7CisJc3RydWN0IHN0YXQgYnVmOworCisJZG8geworCQkrK3RyaWVzOworCQlyZXQgPSBzdGF0KGZuLCAmYnVmKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRmKCJzdGF0ICVzIHRyeSAlZDogJXNcbiIsIGZuLCB0cmllcywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXNsZWVwKDEpOworCQl9CisJfSB3aGlsZSAocmV0ICYmIHRyaWVzIDwgMTApOworCisJaWYgKHJldCkKKwkJcHJpbnRmKCJmYWlsZWQgdG8gc3RhdCAlc1xuIiwgZm4pOwogfQogCiBzdGF0aWMgaW50IGdldF9ib290bG9hZGVyX21lc3NhZ2VfYmxvY2soc3RydWN0IGJvb3Rsb2FkZXJfbWVzc2FnZSAqb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRXUGFydGl0aW9uKiBQYXJ0aXRpb24pIHsKLSAgICB3YWl0X2Zvcl9kZXZpY2UoUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCkpOwotICAgIEZJTEUqIGYgPSBmb3BlbihQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgInJiIik7Ci0gICAgaWYgKGYgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDYW4ndCBvcGVuICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzdHJ1Y3QgYm9vdGxvYWRlcl9tZXNzYWdlIHRlbXA7Ci0gICAgaW50IGNvdW50ID0gZnJlYWQoJnRlbXAsIHNpemVvZih0ZW1wKSwgMSwgZik7Ci0gICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHJlYWRpbmcgJXNcbiglcylcbiIsIFBhcnRpdGlvbi0+QWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChmY2xvc2UoZikgIT0gMCkgewotICAgICAgICBMT0dFKCJGYWlsZWQgY2xvc2luZyAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbWVtY3B5KG91dCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgcmV0dXJuIDA7CisJd2FpdF9mb3JfZGV2aWNlKFBhcnRpdGlvbi0+QWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpKTsKKworCUZJTEUqIGYgPSBmb3BlbihQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgInJiIik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlMT0dFKCJDYW4ndCBvcGVuICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cnVjdCBib290bG9hZGVyX21lc3NhZ2UgdGVtcDsKKwlpbnQgY291bnQgPSBmcmVhZCgmdGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBmKTsKKwlpZiAoY291bnQgIT0gMSkgeworCQlMT0dFKCJGYWlsZWQgcmVhZGluZyAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmNsb3NlKGYpICE9IDApIHsKKwkJTE9HRSgiRmFpbGVkIGNsb3NpbmcgJXNcbiglcylcbiIsIFBhcnRpdGlvbi0+QWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KG91dCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2V0X2Jvb3Rsb2FkZXJfbWVzc2FnZV9ibG9jayhjb25zdCBzdHJ1Y3QgYm9vdGxvYWRlcl9tZXNzYWdlICppbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUV1BhcnRpdGlvbiogUGFydGl0aW9uKSB7Ci0gICAgd2FpdF9mb3JfZGV2aWNlKFBhcnRpdGlvbi0+QWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpKTsKLSAgICBGSUxFKiBmID0gZm9wZW4oUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksICJ3YiIpOwotICAgIGlmIChmID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiQ2FuJ3Qgb3BlbiAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gZndyaXRlKGluLCBzaXplb2YoKmluKSwgMSwgZik7Ci0gICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHdyaXRpbmcgJXNcbiglcylcbiIsIFBhcnRpdGlvbi0+QWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChmY2xvc2UoZikgIT0gMCkgewotICAgICAgICBMT0dFKCJGYWlsZWQgY2xvc2luZyAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJd2FpdF9mb3JfZGV2aWNlKFBhcnRpdGlvbi0+QWN0dWFsX0Jsb2NrX0RldmljZS5jX3N0cigpKTsKKworCUZJTEUqIGYgPSBmb3BlbihQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgIndiIik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlMT0dFKCJDYW4ndCBvcGVuICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWludCBjb3VudCA9IGZ3cml0ZShpbiwgc2l6ZW9mKCppbiksIDEsIGYpOworCWlmIChjb3VudCAhPSAxKSB7CisJCUxPR0UoIkZhaWxlZCB3cml0aW5nICVzXG4oJXMpXG4iLCBQYXJ0aXRpb24tPkFjdHVhbF9CbG9ja19EZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmY2xvc2UoZikgIT0gMCkgeworCQlMT0dFKCJGYWlsZWQgY2xvc2luZyAlc1xuKCVzKVxuIiwgUGFydGl0aW9uLT5BY3R1YWxfQmxvY2tfRGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90d2luc3RhbGwuY3BwIGIvdHdpbnN0YWxsLmNwcAppbmRleCBlN2QyM2VjLi4wNDFjNzhkIDEwMDY0NAotLS0gYS90d2luc3RhbGwuY3BwCisrKyBiL3R3aW5zdGFsbC5jcHAKQEAgLTg3LDM3ICs4NywzNyBAQAogCWNoaWxkX2RhdGEgPSBmZG9wZW4ocGlwZV9mZFswXSwgInIiKTsKIAl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgY2hpbGRfZGF0YSkgIT0gTlVMTCkgewogCQljaGFyKiBjb21tYW5kID0gc3RydG9rKGJ1ZmZlciwgIiBcbiIpOwotICAgICAgICBpZiAoY29tbWFuZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoY29tbWFuZCwgInByb2dyZXNzIikgPT0gMCkgewotICAgICAgICAgICAgY2hhciogZnJhY3Rpb25fY2hhciA9IHN0cnRvayhOVUxMLCAiIFxuIik7Ci0gICAgICAgICAgICBjaGFyKiBzZWNvbmRzX2NoYXIgPSBzdHJ0b2soTlVMTCwgIiBcbiIpOworCQlpZiAoY29tbWFuZCA9PSBOVUxMKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoY29tbWFuZCwgInByb2dyZXNzIikgPT0gMCkgeworCQkJY2hhciogZnJhY3Rpb25fY2hhciA9IHN0cnRvayhOVUxMLCAiIFxuIik7CisJCQljaGFyKiBzZWNvbmRzX2NoYXIgPSBzdHJ0b2soTlVMTCwgIiBcbiIpOwogCi0gICAgICAgICAgICBmbG9hdCBmcmFjdGlvbl9mbG9hdCA9IHN0cnRvZihmcmFjdGlvbl9jaGFyLCBOVUxMKTsKLSAgICAgICAgICAgIGludCBzZWNvbmRzX2Zsb2F0ID0gc3RydG9sKHNlY29uZHNfY2hhciwgTlVMTCwgMTApOworCQkJZmxvYXQgZnJhY3Rpb25fZmxvYXQgPSBzdHJ0b2YoZnJhY3Rpb25fY2hhciwgTlVMTCk7CisJCQlpbnQgc2Vjb25kc19mbG9hdCA9IHN0cnRvbChzZWNvbmRzX2NoYXIsIE5VTEwsIDEwKTsKIAotICAgICAgICAgICAgaWYgKHppcF92ZXJpZnkpCisJCQlpZiAoemlwX3ZlcmlmeSkKIAkJCQlEYXRhTWFuYWdlcjo6U2hvd1Byb2dyZXNzKGZyYWN0aW9uX2Zsb2F0ICogKDEgLSBWRVJJRklDQVRJT05fUFJPR1JFU1NfRlJBQ1RJT04pLCBzZWNvbmRzX2Zsb2F0KTsKIAkJCWVsc2UKIAkJCQlEYXRhTWFuYWdlcjo6U2hvd1Byb2dyZXNzKGZyYWN0aW9uX2Zsb2F0LCBzZWNvbmRzX2Zsb2F0KTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoY29tbWFuZCwgInNldF9wcm9ncmVzcyIpID09IDApIHsKLSAgICAgICAgICAgIGNoYXIqIGZyYWN0aW9uX2NoYXIgPSBzdHJ0b2soTlVMTCwgIiBcbiIpOwotICAgICAgICAgICAgZmxvYXQgZnJhY3Rpb25fZmxvYXQgPSBzdHJ0b2YoZnJhY3Rpb25fY2hhciwgTlVMTCk7Ci0gICAgICAgICAgICBEYXRhTWFuYWdlcjo6U2V0UHJvZ3Jlc3MoZnJhY3Rpb25fZmxvYXQpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAidWlfcHJpbnQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBjaGFyKiBkaXNwbGF5X3ZhbHVlID0gc3RydG9rKE5VTEwsICJcbiIpOwotICAgICAgICAgICAgaWYgKGRpc3BsYXlfdmFsdWUpIHsKLSAgICAgICAgICAgICAgICBndWlfcHJpbnQoIiVzIiwgZGlzcGxheV92YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGd1aV9wcmludCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoY29tbWFuZCwgIndpcGVfY2FjaGUiKSA9PSAwKSB7Ci0gICAgICAgICAgICAqd2lwZV9jYWNoZSA9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGNvbW1hbmQsICJjbGVhcl9kaXNwbGF5IikgPT0gMCkgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZywgbm90IHN1cHBvcnRlZCBieSBUV1JQCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dFUlIoInVua25vd24gY29tbWFuZCBbJXNdXG4iLCBjb21tYW5kKTsKLSAgICAgICAgfQorCQl9IGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAic2V0X3Byb2dyZXNzIikgPT0gMCkgeworCQkJY2hhciogZnJhY3Rpb25fY2hhciA9IHN0cnRvayhOVUxMLCAiIFxuIik7CisJCQlmbG9hdCBmcmFjdGlvbl9mbG9hdCA9IHN0cnRvZihmcmFjdGlvbl9jaGFyLCBOVUxMKTsKKwkJCURhdGFNYW5hZ2VyOjpTZXRQcm9ncmVzcyhmcmFjdGlvbl9mbG9hdCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKGNvbW1hbmQsICJ1aV9wcmludCIpID09IDApIHsKKwkJCWNoYXIqIGRpc3BsYXlfdmFsdWUgPSBzdHJ0b2soTlVMTCwgIlxuIik7CisJCQlpZiAoZGlzcGxheV92YWx1ZSkgeworCQkJCWd1aV9wcmludCgiJXMiLCBkaXNwbGF5X3ZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJZ3VpX3ByaW50KCJcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAid2lwZV9jYWNoZSIpID09IDApIHsKKwkJCSp3aXBlX2NhY2hlID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoY29tbWFuZCwgImNsZWFyX2Rpc3BsYXkiKSA9PSAwKSB7CisJCQkvLyBEbyBub3RoaW5nLCBub3Qgc3VwcG9ydGVkIGJ5IFRXUlAKKwkJfSBlbHNlIHsKKwkJCUxPR0VSUigidW5rbm93biBjb21tYW5kIFslc11cbiIsIGNvbW1hbmQpOworCQl9CiAJfQogCWZjbG9zZShjaGlsZF9kYXRhKTsKIApkaWZmIC0tZ2l0IGEvdHdycC1mdW5jdGlvbnMuY3BwIGIvdHdycC1mdW5jdGlvbnMuY3BwCmluZGV4IDQ2MzUyMjYuLmU1NGU3NjAgMTAwNjQ0Ci0tLSBhL3R3cnAtZnVuY3Rpb25zLmNwcAorKysgYi90d3JwLWZ1bmN0aW9ucy5jcHAKQEAgLTM2LDUyICszNiwyMSBAQAogCiAvKiBFeGVjdXRlIGEgY29tbWFuZCAqLwogaW50IFRXRnVuYzo6RXhlY19DbWQoc3RyaW5nIGNtZCwgc3RyaW5nICZyZXN1bHQpIHsKLSAgIGludCBmZFsyXTsKLSAgIGludCByZXQgPSAtMTsKLSAgIGlmKHBpcGUoZmQpIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JcGlkX3QgcGlkID0gZm9yaygpOwotCWlmIChwaWQgPCAwKQotCXsKLQkJY2xvc2UoZmRbMF0pOwotCQljbG9zZShmZFsxXSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZihwaWQgPT0gMCkgLy8gY2hpbGQKLQl7Ci0JCWNsb3NlKGZkWzBdKTsKLQkJZHVwMihmZFsxXSwgMSk7ICAvLyBzZW5kIHN0ZG91dCB0byB0aGUgcGlwZQotCQlkdXAyKGZkWzFdLCAyKTsgIC8vIHNlbmQgc3RkZXJyIHRvIHRoZSBwaXBlCi0JCWNsb3NlKGZkWzFdKTsKLQotCQlyZXQgPSBzeXN0ZW0oY21kLmNfc3RyKCkpOwotCQlpZihyZXQgIT0gLTEpCi0JCQlyZXQgPSBXRVhJVFNUQVRVUyhyZXQpOwotCQllbHNlCi0JCQlMT0dFUlIoIkV4ZWNfQ21kOiBzeXN0ZW0oKSBmYWlsZWQgd2l0aCAtMSAoJWQpIVxuIiwgZXJybm8pOwotCQlleGl0KHJldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWNsb3NlKGZkWzFdKTsKLQotCQlpbnQgbGVuOwotCQljaGFyIGJ1ZmZlclsxMjhdOwotCQlidWZmZXJbc2l6ZW9mKGJ1ZmZlciktMV0gPSAwOwotCQl3aGlsZSAoKGxlbiA9IHJlYWQoZmRbMF0sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciktMSkpID4gMCkKLQkJewotCQkJYnVmZmVyW2xlbl0gPSAwOwotCQkJYnVmZmVyW3NpemVvZihidWZmZXIpLTJdID0gJ1xuJzsKLQkJCUxPR0lORk8oIiVzIiwgYnVmZmVyKTsKKwlGSUxFKiBleGVjOworCWNoYXIgYnVmZmVyWzEzMF07CisJaW50IHJldCA9IDA7CisJZXhlYyA9IF9fcG9wZW4oY21kLmNfc3RyKCksICJyIik7CisJaWYgKCFleGVjKSByZXR1cm4gLTE7CisJd2hpbGUoIWZlb2YoZXhlYykpIHsKKwkJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwkJaWYgKGZnZXRzKGJ1ZmZlciwgMTI4LCBleGVjKSAhPSBOVUxMKSB7CisJCQlidWZmZXJbMTI4XSA9ICdcbic7CisJCQlidWZmZXJbMTI5XSA9IE5VTEw7CiAJCQlyZXN1bHQgKz0gYnVmZmVyOwogCQl9Ci0KLQkJd2FpdHBpZChwaWQsICZyZXQsIDApOwotCQlyZXR1cm4gV0VYSVRTVEFUVVMocmV0KTsKIAl9Ci0JcmV0dXJuIC0xOworCXJldCA9IF9fcGNsb3NlKGV4ZWMpOworCXJldHVybiByZXQ7CiB9CiAKIC8vIFJldHVybnMgImZpbGUubmFtZSIgZnJvbSBhIGZ1bGwgL3BhdGgvdG8vZmlsZS5uYW1lCkBAIC0yMTYsNyArMTg1LDcgQEAKIAogCXdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSAhPSBOVUxMKQogCXsKLQkJaWYgKGRlLT5kX3R5cGUgPT0gRFRfRElSICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpICE9IDAgJiYgc3RyY21wKGRlLT5kX25hbWUsICIuLiIpICE9IDApCisJCWlmIChkZS0+ZF90eXBlID09IERUX0RJUiAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAibG9zdCtmb3VuZCIpICE9IDApCiAJCXsKIAkJCWR1dGVtcCA9IEdldF9Gb2xkZXJfU2l6ZSgoUGF0aCArICIvIiArIGRlLT5kX25hbWUpLCBEaXNwbGF5X0Vycm9yKTsKIAkJCWR1c2l6ZSArPSBkdXRlbXA7CkBAIC00NTUsMTUgKzQyNCwxNyBAQAogfQogCiBpbnQgVFdGdW5jOjpyZWFkX2ZpbGUoc3RyaW5nIGZuLCBzdHJpbmcmIHJlc3VsdHMpIHsKLSAgICAgICAgaWZzdHJlYW0gZmlsZTsKLSAgICAgICAgZmlsZS5vcGVuKGZuLmNfc3RyKCksIGlvczo6aW4pOwotICAgICAgICBpZiAoZmlsZS5pc19vcGVuKCkpIHsKLSAgICAgICAgICAgICAgICBmaWxlID4+IHJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworCWlmc3RyZWFtIGZpbGU7CisJZmlsZS5vcGVuKGZuLmNfc3RyKCksIGlvczo6aW4pOworCisJaWYgKGZpbGUuaXNfb3BlbigpKSB7CisJCWZpbGUgPj4gcmVzdWx0czsKKwkJZmlsZS5jbG9zZSgpOworCQlyZXR1cm4gMDsKIAl9Ci0gICAgICAgIExPR0lORk8oIkNhbm5vdCBmaW5kIGZpbGUgJXNcbiIsIGZuLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gLTE7CisKKwlMT0dJTkZPKCJDYW5ub3QgZmluZCBmaWxlICVzXG4iLCBmbi5jX3N0cigpKTsKKwlyZXR1cm4gLTE7CiB9CiAKIGludCBUV0Z1bmM6OnJlYWRfZmlsZShzdHJpbmcgZm4sIHZlY3RvcjxzdHJpbmc+JiByZXN1bHRzKSB7CkBAIC01MjksNyArNTAwLDcgQEAKIAlyZXR1cm4gdGVtcDsKIH0KIAotIGludCBUV0Z1bmM6OmRyb3BfY2FjaGVzKHZvaWQpIHsKK2ludCBUV0Z1bmM6OmRyb3BfY2FjaGVzKHZvaWQpIHsKIAlzdHJpbmcgZmlsZSA9ICIvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMiOwogCXN0cmluZyB2YWx1ZSA9ICIzIjsKIAlpZiAod3JpdGVfZmlsZShmaWxlLCB2YWx1ZSkgIT0gMCkKQEAgLTYyMCw3ICs1OTEsOCBAQAogaW50IFRXRnVuYzo6dHdfY2htb2Qoc3RyaW5nIGZuLCBzdHJpbmcgbW9kZSkgewogCWxvbmcgbWFzayA9IDA7CiAKLQlmb3IgKCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG4gPSAwOyBuIDwgbW9kZS5sZW5ndGgoKTsgKytuKSB7CisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBuID0gKG1vZGUubGVuZ3RoKCkgPT0gMykgPyAxIDogMDsKKwlmb3IgKDsgbiA8IG1vZGUubGVuZ3RoKCk7ICsrbikgewogCQlpZiAobiA9PSAwKSB7CiAJCQlpZiAobW9kZVtuXSA9PSAnMCcpCiAJCQkJY29udGludWU7CkBAIC03NDQsNyArNzE2LDcgQEAKIAlzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsKIAlpbnQgZmlyc3RieXRlID0gMCwgc2Vjb25kYnl0ZSA9IDA7CiAJY2hhciBoZWFkZXJbM107Ci0gICAgICAgIAorCiAJaWZzdHJlYW0gZjsKIAlmLm9wZW4oZm4uY19zdHIoKSwgaW9zOjppbiB8IGlvczo6YmluYXJ5KTsKIAlmLmdldChoZWFkZXIsIDMpOwpAQCAtNzUyLDEzICs3MjQsMTIgQEAKIAlmaXJzdGJ5dGUgPSBoZWFkZXJbaV0gJiAweGZmOwogCXNlY29uZGJ5dGUgPSBoZWFkZXJbKytpXSAmIDB4ZmY7CiAKLQlpZiAoZmlyc3RieXRlID09IDB4MWYgJiYgc2Vjb25kYnl0ZSA9PSAweDhiKSB7CisJaWYgKGZpcnN0Ynl0ZSA9PSAweDFmICYmIHNlY29uZGJ5dGUgPT0gMHg4YikKIAkJcmV0dXJuIDE7IC8vIENvbXByZXNzZWQKLQl9IGVsc2UgaWYgKGZpcnN0Ynl0ZSA9PSAweDRmICYmIHNlY29uZGJ5dGUgPT0gMHg0MSkgeworCWVsc2UgaWYgKGZpcnN0Ynl0ZSA9PSAweDRmICYmIHNlY29uZGJ5dGUgPT0gMHg0MSkKIAkJcmV0dXJuIDI7IC8vIEVuY3J5cHRlZAotCX0gZWxzZSB7CisJZWxzZQogCQlyZXR1cm4gMDsgLy8gVW5rbm93bgotCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdHdycC1mdW5jdGlvbnMuaHBwIGIvdHdycC1mdW5jdGlvbnMuaHBwCmluZGV4IDlmNjY2MjEuLjg1MzFjMDkgMTAwNjQ0Ci0tLSBhL3R3cnAtZnVuY3Rpb25zLmhwcAorKysgYi90d3JwLWZ1bmN0aW9ucy5ocHAKQEAgLTgsMTIgKzgsMTIgQEAKIAogdHlwZWRlZiBlbnVtCiB7Ci0gICAgcmJfY3VycmVudCA9IDAsCi0gICAgcmJfc3lzdGVtLAotICAgIHJiX3JlY292ZXJ5LAotICAgIHJiX3Bvd2Vyb2ZmLAotICAgIHJiX2Jvb3Rsb2FkZXIsICAgICAvLyBNYXkgYWxzbyBiZSBmYXN0Ym9vdAotICAgIHJiX2Rvd25sb2FkLAorCXJiX2N1cnJlbnQgPSAwLAorCXJiX3N5c3RlbSwKKwlyYl9yZWNvdmVyeSwKKwlyYl9wb3dlcm9mZiwKKwlyYl9ib290bG9hZGVyLCAgICAgLy8gTWF5IGFsc28gYmUgZmFzdGJvb3QKKwlyYl9kb3dubG9hZCwKIH0gUmVib290Q29tbWFuZDsKIAogLy8gUGFydGl0aW9uIGNsYXNzCmRpZmYgLS1naXQgYS90d3JwLmNwcCBiL3R3cnAuY3BwCmluZGV4IGJjM2NlN2IuLjJjMmFlZDQgMTAwNjQ0Ci0tLSBhL3R3cnAuY3BwCisrKyBiL3R3cnAuY3BwCkBAIC00Niw2ICs0NiwxMSBAQAogI2luY2x1ZGUgIm9wZW5yZWNvdmVyeXNjcmlwdC5ocHAiCiAjaW5jbHVkZSAidmFyaWFibGVzLmgiCiAKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyNpbmNsdWRlICJzZWxpbnV4L2xhYmVsLmgiCitzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlbGludXhfaGFuZGxlOworI2VuZGlmCisKIFRXUGFydGl0aW9uTWFuYWdlciBQYXJ0aXRpb25NYW5hZ2VyOwogaW50IExvZ19PZmZzZXQ7CiAKQEAgLTkwLDYgKzk1LDE3IEBACiAJLy8gTG9hZCB1cCBhbGwgdGhlIHJlc291cmNlcwogCWd1aV9sb2FkUmVzb3VyY2VzKCk7CiAKKyNpZmRlZiBIQVZFX1NFTElOVVgKKwlzdHJ1Y3Qgc2VsaW51eF9vcHQgc2VsaW51eF9vcHRpb25zW10gPSB7CisJCXsgU0VMQUJFTF9PUFRfUEFUSCwgIi9maWxlX2NvbnRleHRzIiB9CisJfTsKKyAgICBzZWxpbnV4X2hhbmRsZSA9IHNlbGFiZWxfb3BlbihTRUxBQkVMX0NUWF9GSUxFLCBzZWxpbnV4X29wdGlvbnMsIDEpOworCWlmICghc2VsaW51eF9oYW5kbGUpCisJCXByaW50ZigiTm8gZmlsZSBjb250ZXh0cyBmb3IgU0VMaW51eFxuIik7CisJZWxzZQorCQlwcmludGYoIlNFTGludXggY29udGV4dHMgbG9hZGVkIGZyb20gL2ZpbGVfY29udGV4dHNcbiIpOworI2VuZGlmCisKIAlQYXJ0aXRpb25NYW5hZ2VyLk1vdW50X0J5X1BhdGgoIi9jYWNoZSIsIHRydWUpOwogCiAJc3RyaW5nIFppcF9GaWxlLCBSZWJvb3RfVmFsdWU7CkBAIC0xMzYsNyArMTUyLDcgQEAKIAkJfQogCX0KIAotICAgIGNoYXIgdHdycF9ib290ZWRbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKwljaGFyIHR3cnBfYm9vdGVkW1BST1BFUlRZX1ZBTFVFX01BWF07CiAJcHJvcGVydHlfZ2V0KCJyby50d3JwLmJvb3QiLCB0d3JwX2Jvb3RlZCwgIjAiKTsKIAlpZiAoc3RyY21wKHR3cnBfYm9vdGVkLCAiMCIpID09IDApIHsKIAkJcHJvcGVydHlfbGlzdChQcmludF9Qcm9wLCBOVUxMKTsKQEAgLTIyNiwxMCArMjQyLDEwIEBACiAJCVBhcnRpdGlvbk1hbmFnZXIuVW5Nb3VudF9CeV9QYXRoKCIvc3lzdGVtIiwgZmFsc2UpOwogCX0KIAotICAgIC8vIFJlYm9vdAorCS8vIFJlYm9vdAogCVRXRnVuYzo6VXBkYXRlX0ludGVudF9GaWxlKFJlYm9vdF9WYWx1ZSk7Ci0gICAgVFdGdW5jOjpVcGRhdGVfTG9nX0ZpbGUoKTsKLSAgICBndWlfcHJpbnQoIlJlYm9vdGluZy4uLlxuIik7CisJVFdGdW5jOjpVcGRhdGVfTG9nX0ZpbGUoKTsKKwlndWlfcHJpbnQoIlJlYm9vdGluZy4uLlxuIik7CiAJc3RyaW5nIFJlYm9vdF9Bcmc7CiAJRGF0YU1hbmFnZXI6OkdldFZhbHVlKCJ0d19yZWJvb3RfYXJnIiwgUmVib290X0FyZyk7CiAJaWYgKFJlYm9vdF9BcmcgPT0gInJlY292ZXJ5IikKQEAgLTI0NCw5ICsyNjAsOSBAQAogCQlUV0Z1bmM6OnR3X3JlYm9vdChyYl9zeXN0ZW0pOwogCiAjaWZkZWYgQU5EUk9JRF9SQl9SRVNUQVJUCi0gICAgYW5kcm9pZF9yZWJvb3QoQU5EUk9JRF9SQl9SRVNUQVJULCAwLCAwKTsKKwlhbmRyb2lkX3JlYm9vdChBTkRST0lEX1JCX1JFU1RBUlQsIDAsIDApOwogI2Vsc2UKIAlyZWJvb3QoUkJfQVVUT0JPT1QpOwogI2VuZGlmCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90d3JwRGlnZXN0LmNwcCBiL3R3cnBEaWdlc3QuY3BwCmluZGV4IDY2M2QwODUuLmNlM2Q4N2MgMTAwNjQ0Ci0tLSBhL3R3cnBEaWdlc3QuY3BwCisrKyBiL3R3cnBEaWdlc3QuY3BwCkBAIC0xNiwxMCArMTYsMTIgQEAKIAlhbG9uZyB3aXRoIFRXUlAuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwogCi1leHRlcm4gIkMiIHsKK2V4dGVybiAiQyIKK3sKIAkjaW5jbHVkZSAiZGlnZXN0L21kNS5oIgogCSNpbmNsdWRlICJsaWJjcmVjb3ZlcnkvY29tbW9uLmgiCiB9CisKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHNzdHJlYW0+CmRpZmYgLS1naXQgYS90d3JwRGlnZXN0LmhwcCBiL3R3cnBEaWdlc3QuaHBwCmluZGV4IDM5NWMwYWUuLjIzN2U1ODAgMTAwNjQ0Ci0tLSBhL3R3cnBEaWdlc3QuaHBwCisrKyBiL3R3cnBEaWdlc3QuaHBwCkBAIC0xOCwxOCArMTgsMjEgQEAKIGV4dGVybiAiQyIgewogCSNpbmNsdWRlICJkaWdlc3QvbWQ1LmgiCiB9CisKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLWNsYXNzIHR3cnBEaWdlc3QgewotCXB1YmxpYzoKLSAgICAgICAgICAgICAgICB2b2lkIHNldGZuKHN0cmluZyBmbik7Ci0gICAgICAgICAgICAgICAgdm9pZCBzZXRkaXIoc3RyaW5nIGRpcik7Ci0JCWludCBjb21wdXRlTUQ1KHZvaWQpOwotCQlpbnQgdmVyaWZ5X21kNWRpZ2VzdCh2b2lkKTsKLQkJaW50IHdyaXRlX21kNWRpZ2VzdCh2b2lkKTsKLQlwcml2YXRlOgotCQlpbnQgcmVhZF9tZDVkaWdlc3Qodm9pZCk7Ci0JCXN0cmluZyBtZDVmbjsKLQkJc3RyaW5nIGxpbmU7Ci0JCXVuc2lnbmVkIGNoYXIgbWQ1c3VtW01ENUxFTkdUSF07CitjbGFzcyB0d3JwRGlnZXN0Cit7CitwdWJsaWM6CisJdm9pZCBzZXRmbihzdHJpbmcgZm4pOworCXZvaWQgc2V0ZGlyKHN0cmluZyBkaXIpOworCWludCBjb21wdXRlTUQ1KHZvaWQpOworCWludCB2ZXJpZnlfbWQ1ZGlnZXN0KHZvaWQpOworCWludCB3cml0ZV9tZDVkaWdlc3Qodm9pZCk7CisKK3ByaXZhdGU6CisJaW50IHJlYWRfbWQ1ZGlnZXN0KHZvaWQpOworCXN0cmluZyBtZDVmbjsKKwlzdHJpbmcgbGluZTsKKwl1bnNpZ25lZCBjaGFyIG1kNXN1bVtNRDVMRU5HVEhdOwogfTsKZGlmZiAtLWdpdCBhL3R3cnBUYXIuY3BwIGIvdHdycFRhci5jcHAKaW5kZXggYTI3Mzc0YS4uMmI4Y2Q3ZCAxMDA2NDQKLS0tIGEvdHdycFRhci5jcHAKKysrIGIvdHdycFRhci5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkJCQljb250aW51ZTsgLy8gU2tpcCAvZGF0YS9tZWRpYQogCQkJCWlmIChkZS0+ZF90eXBlID09IERUX0JMSyB8fCBkZS0+ZF90eXBlID09IERUX0NIUikKIAkJCQkJY29udGludWU7Ci0JCQkJaWYgKGRlLT5kX3R5cGUgPT0gRFRfRElSICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpICE9IDAgJiYgc3RyY21wKGRlLT5kX25hbWUsICIuLiIpICE9IDApIHsKKwkJCQlpZiAoZGUtPmRfdHlwZSA9PSBEVF9ESVIgJiYgc3RyY21wKGRlLT5kX25hbWUsICIuIikgIT0gMCAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikgIT0gMCAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgImxvc3QrZm91bmQiKSAhPSAwKSB7CiAJCQkJCWl0ZW1fbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOwogCQkJCQlpZiAodXNlcmRhdGFfZW5jcnlwdGlvbiAmJiAoKGl0ZW1fbGVuID49IDMgJiYgc3RybmNtcChkZS0+ZF9uYW1lLCAiYXBwIiwgMykgPT0gMCkgfHwgKGl0ZW1fbGVuID49IDYgJiYgc3RybmNtcChkZS0+ZF9uYW1lLCAiZGFsdmlrIiwgNikgPT0gMCkpKSB7CiAJCQkJCQlpZiAoR2VuZXJhdGVfVGFyTGlzdChGaWxlTmFtZSwgJlJlZ3VsYXJMaXN0LCAmdGFyZ2V0X3NpemUsICZyZWd1bGFyX3RocmVhZF9pZCkgPCAwKSB7CkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJCQkJY29udGludWU7IC8vIFNraXAgL2RhdGEvbWVkaWEKIAkJCQlpZiAoZGUtPmRfdHlwZSA9PSBEVF9CTEsgfHwgZGUtPmRfdHlwZSA9PSBEVF9DSFIpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWlmIChkZS0+ZF90eXBlID09IERUX0RJUiAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSAhPSAwKSB7CisJCQkJaWYgKGRlLT5kX3R5cGUgPT0gRFRfRElSICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpICE9IDAgJiYgc3RyY21wKGRlLT5kX25hbWUsICIuLiIpICE9IDAgJiYgc3RyY21wKGRlLT5kX25hbWUsICJsb3N0K2ZvdW5kIikgIT0gMCkgewogCQkJCQlpdGVtX2xlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKIAkJCQkJaWYgKHVzZXJkYXRhX2VuY3J5cHRpb24gJiYgKChpdGVtX2xlbiA+PSAzICYmIHN0cm5jbXAoZGUtPmRfbmFtZSwgImFwcCIsIDMpID09IDApIHx8IChpdGVtX2xlbiA+PSA2ICYmIHN0cm5jbXAoZGUtPmRfbmFtZSwgImRhbHZpayIsIDYpID09IDApKSkgewogCQkJCQkJLy8gRG8gbm90aGluZywgd2UgYWRkZWQgdGhlc2UgdG8gUmVndWxhckxpc3QgZWFybGllcgpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJCQljb250aW51ZTsKIAkJVGFySXRlbS5mbiA9IEZpbGVOYW1lOwogCQlUYXJJdGVtLnRocmVhZF9pZCA9ICp0aHJlYWRfaWQ7Ci0JCWlmIChkZS0+ZF90eXBlID09IERUX0RJUiAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSAhPSAwKSB7CisJCWlmIChkZS0+ZF90eXBlID09IERUX0RJUiAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAibG9zdCtmb3VuZCIpICE9IDApIHsKIAkJCVRhckxpc3QtPnB1c2hfYmFjayhUYXJJdGVtKTsKIAkJCWlmIChHZW5lcmF0ZV9UYXJMaXN0KEZpbGVOYW1lLCBUYXJMaXN0LCBUYXJnZXRfU2l6ZSwgdGhyZWFkX2lkKSA8IDApCiAJCQkJcmV0dXJuIC0xOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAJCQljb250aW51ZTsgLy8gU2tpcCAvZGF0YS9tZWRpYQogCQlpZiAoZGUtPmRfdHlwZSA9PSBEVF9CTEsgfHwgZGUtPmRfdHlwZSA9PSBEVF9DSFIpCiAJCQljb250aW51ZTsKLQkJaWYgKGRlLT5kX3R5cGUgPT0gRFRfRElSICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpICE9IDAgJiYgc3RyY21wKGRlLT5kX25hbWUsICIuLiIpICE9IDApCisJCWlmIChkZS0+ZF90eXBlID09IERUX0RJUiAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSAhPSAwICYmIHN0cmNtcChkZS0+ZF9uYW1lLCAibG9zdCtmb3VkIikgIT0gMCkKIAkJewogCQkJdW5zaWduZWQgbG9uZyBsb25nIGZvbGRlcl9zaXplID0gVFdGdW5jOjpHZXRfRm9sZGVyX1NpemUoRmlsZU5hbWUsIGZhbHNlKTsKIAkJCWlmIChBcmNoaXZlX0N1cnJlbnRfU2l6ZSArIGZvbGRlcl9zaXplID4gTUFYX0FSQ0hJVkVfU0laRSkgewpAQCAtNjY2LDcgKzY2Niw3IEBACiAJYm9vbCBza2lwOwogCiAJZCA9IG9wZW5kaXIodGFyZGlyLmNfc3RyKCkpOwotCWlmIChkICE9IE5VTEwpIHsJCQorCWlmIChkICE9IE5VTEwpIHsKIAkJaWYgKCF0YXJleGNsdWRlLmVtcHR5KCkpIHsKIAkJCXN0cmNweShleGNsLCB0YXJleGNsdWRlLmNfc3RyKCkpOwogCQkJc3BsaXQgPSBUV0Z1bmM6OnNwbGl0X3N0cmluZyh0YXJleGNsdWRlLCAnICcsIHRydWUpOwpAQCAtNjc2LDcgKzY3Niw3IEBACiAjaWZkZWYgUkVDT1ZFUllfU0RDQVJEX09OX0RBVEEKIAkJCWlmICgodGFyZGlyID09ICIvZGF0YSIgfHwgdGFyZGlyID09ICIvZGF0YS8iKSAmJiBzdHJjbXAoZGUtPmRfbmFtZSwgIm1lZGlhIikgPT0gMCkgY29udGludWU7CiAjZW5kaWYKLQkJCWlmIChkZS0+ZF90eXBlID09IERUX0JMSyB8fCBkZS0+ZF90eXBlID09IERUX0NIUiB8fCBzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikgPT0gMCkKKwkJCWlmIChkZS0+ZF90eXBlID09IERUX0JMSyB8fCBkZS0+ZF90eXBlID09IERUX0NIUiB8fCBzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikgPT0gMCB8fCBzdHJjbXAoZGUtPmRfbmFtZSwgImxvc3QrZm91bmQiKSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCiAJCQkvLyBTa2lwIGV4Y2x1ZGVkIHN0dWZmCkBAIC04NDAsMTAgKzg0MCwxMCBAQAogaW50IHR3cnBUYXI6OmFkZEZpbGVzVG9FeGlzdGluZ1Rhcih2ZWN0b3IgPHN0cmluZz4gZmlsZXMsIHN0cmluZyBmbikgewogCWNoYXIqIGNoYXJUYXJGaWxlID0gKGNoYXIqKSBmbi5jX3N0cigpOwogCi0JaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgPT0gLTEpCisJaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSA9PSAtMSkKIAkJcmV0dXJuIC0xOwogCXJlbW92ZUVPVChjaGFyVGFyRmlsZSk7Ci0JaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fTEFSR0VGSUxFLCAwNjQ0LCBUQVJfR05VKSA9PSAtMSkKKwlpZiAodGFyX29wZW4oJnQsIGNoYXJUYXJGaWxlLCBOVUxMLCBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgPT0gLTEpCiAJCXJldHVybiAtMTsKIAlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgKytpKSB7CiAJCWNoYXIqIGZpbGUgPSAoY2hhciopIGZpbGVzLmF0KGkpLmNfc3RyKCk7CkBAIC05MTAsNyArOTEwLDcgQEAKIAkJCQlyZXR1cm4gLTE7CiAJCQl9IGVsc2UgaWYgKG9hZXNfcGlkID09IDApIHsKIAkJCQkvLyBvcGVuYWVzIENoaWxkCi0JCQkJaW50IG91dHB1dF9mZCA9IG9wZW4odGFyZm4uY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworCQkJCWludCBvdXRwdXRfZmQgPSBvcGVuKHRhcmZuLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgpOwogCQkJCWlmIChvdXRwdXRfZmQgPCAwKSB7CiAJCQkJCUxPR0VSUigiRmFpbGVkIHRvIG9wZW4gJyVzJ1xuIiwgdGFyZm4uY19zdHIoKSk7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCkBAIC05MzYsNyArOTM2LDcgQEAKIAkJCQljbG9zZShwaXBlc1syXSk7CiAJCQkJY2xvc2UocGlwZXNbM10pOwogCQkJCWZkID0gcGlwZXNbMV07Ci0JCQkJaWYodGFyX2Zkb3BlbigmdCwgZmQsIGNoYXJSb290RGlyLCBOVUxMLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgIT0gMCkgeworCQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgIT0gMCkgewogCQkJCQljbG9zZShmZCk7CiAJCQkJCUxPR0VSUigidGFyX2Zkb3BlbiBmYWlsZWRcbiIpOwogCQkJCQlyZXR1cm4gLTE7CkBAIC05NjQsNyArOTY0LDcgQEAKIAkJfSBlbHNlIGlmIChwaWd6X3BpZCA9PSAwKSB7CiAJCQkvLyBDaGlsZAogCQkJY2xvc2UocGlnemZkWzFdKTsgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0IHBpcGUKLQkJCWludCBvdXRwdXRfZmQgPSBvcGVuKHRhcmZuLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKwkJCWludCBvdXRwdXRfZmQgPSBvcGVuKHRhcmZuLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgpOwogCQkJaWYgKG91dHB1dF9mZCA8IDApIHsKIAkJCQlMT0dFUlIoIkZhaWxlZCB0byBvcGVuICclcydcbiIsIHRhcmZuLmNfc3RyKCkpOwogCQkJCWNsb3NlKHBpZ3pmZFswXSk7CkBAIC05ODIsNyArOTgyLDcgQEAKIAkJCS8vIFBhcmVudAogCQkJY2xvc2UocGlnemZkWzBdKTsgLy8gY2xvc2UgcGFyZW50IGlucHV0CiAJCQlmZCA9IHBpZ3pmZFsxXTsgICAvLyBjb3B5IHBhcmVudCBvdXRwdXQKLQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgIT0gMCkgewogCQkJCWNsb3NlKGZkKTsKIAkJCQlMT0dFUlIoInRhcl9mZG9wZW4gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLTE7CkBAIC0xMDA1LDcgKzEwMDUsNyBAQAogCQl9IGVsc2UgaWYgKG9hZXNfcGlkID09IDApIHsKIAkJCS8vIENoaWxkCiAJCQljbG9zZShvYWVzZmRbMV0pOyAgIC8vIGNsb3NlIHVudXNlZAotCQkJaW50IG91dHB1dF9mZCA9IG9wZW4odGFyZm4uY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworCQkJaW50IG91dHB1dF9mZCA9IG9wZW4odGFyZm4uY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCk7CiAJCQlpZiAob3V0cHV0X2ZkIDwgMCkgewogCQkJCUxPR0VSUigiRmFpbGVkIHRvIG9wZW4gJyVzJ1xuIiwgdGFyZm4uY19zdHIoKSk7CiAJCQkJX2V4aXQoLTEpOwpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIAkJCS8vIFBhcmVudAogCQkJY2xvc2Uob2Flc2ZkWzBdKTsgLy8gY2xvc2UgcGFyZW50IGlucHV0CiAJCQlmZCA9IG9hZXNmZFsxXTsgICAvLyBjb3B5IHBhcmVudCBvdXRwdXQKLQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCwgVEFSX0dOVSkgIT0gMCkgewogCQkJCWNsb3NlKGZkKTsKIAkJCQlMT0dFUlIoInRhcl9mZG9wZW4gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLTE7CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogCX0gZWxzZSB7CiAJCS8vIE5vdCBjb21wcmVzc2VkIG9yIGVuY3J5cHRlZAogCQlpbml0X2xpYnRhcl9idWZmZXIoMCk7Ci0JCWlmICh0YXJfb3BlbigmdCwgY2hhclRhckZpbGUsICZ0eXBlLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgPT0gLTEpIHsKKwkJaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgJnR5cGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgsIFRBUl9HTlUpID09IC0xKSB7CiAJCQlMT0dFUlIoInRhcl9vcGVuIGVycm9yIG9wZW5pbmcgJyVzJ1xuIiwgdGFyZm4uY19zdHIoKSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTExMTUsNyArMTExNSw3IEBACiAJCQkJY2xvc2UocGlwZXNbMV0pOwogCQkJCWNsb3NlKHBpcGVzWzNdKTsKIAkJCQlmZCA9IHBpcGVzWzJdOwotCQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgIT0gMCkgeworCQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSAhPSAwKSB7CiAJCQkJCWNsb3NlKGZkKTsKIAkJCQkJTE9HRVJSKCJ0YXJfZmRvcGVuIGZhaWxlZFxuIik7CiAJCQkJCXJldHVybiAtMTsKQEAgLTExNTYsNyArMTE1Niw3IEBACiAJCQkvLyBQYXJlbnQKIAkJCWNsb3NlKG9hZXNmZFsxXSk7IC8vIGNsb3NlIHBhcmVudCBvdXRwdXQKIAkJCWZkID0gb2Flc2ZkWzBdOyAgIC8vIGNvcHkgcGFyZW50IGlucHV0Ci0JCQlpZih0YXJfZmRvcGVuKCZ0LCBmZCwgY2hhclJvb3REaXIsIE5VTEwsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSAhPSAwKSB7CiAJCQkJY2xvc2UoZmQpOwogCQkJCUxPR0VSUigidGFyX2Zkb3BlbiBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtMTsKQEAgLTExOTMsMTMgKzExOTMsMTMgQEAKIAkJCS8vIFBhcmVudAogCQkJY2xvc2UocGlnemZkWzFdKTsgLy8gY2xvc2UgcGFyZW50IG91dHB1dAogCQkJZmQgPSBwaWd6ZmRbMF07ICAgLy8gY29weSBwYXJlbnQgaW5wdXQKLQkJCWlmKHRhcl9mZG9wZW4oJnQsIGZkLCBjaGFyUm9vdERpciwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMDY0NCwgVEFSX0dOVSkgIT0gMCkgeworCQkJaWYodGFyX2Zkb3BlbigmdCwgZmQsIGNoYXJSb290RGlyLCBOVUxMLCBPX1JET05MWSB8IE9fTEFSR0VGSUxFLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgsIFRBUl9HTlUpICE9IDApIHsKIAkJCQljbG9zZShmZCk7CiAJCQkJTE9HRVJSKCJ0YXJfZmRvcGVuIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9Ci0JfSBlbHNlIGlmICh0YXJfb3BlbigmdCwgY2hhclRhckZpbGUsIE5VTEwsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUsIDA2NDQsIFRBUl9HTlUpICE9IDApIHsKKwl9IGVsc2UgaWYgKHRhcl9vcGVuKCZ0LCBjaGFyVGFyRmlsZSwgTlVMTCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RILCBUQVJfR05VKSAhPSAwKSB7CiAJCUxPR0VSUigiVW5hYmxlIHRvIG9wZW4gdGFyIGFyY2hpdmUgJyVzJ1xuIiwgY2hhclRhckZpbGUpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTI1MSw3ICsxMjUxLDcgQEAKIAkJTE9HRVJSKCJVbmFibGUgdG8gY2xvc2UgdGFyIGFyY2hpdmU6ICclcydcbiIsIHRhcmZuLmNfc3RyKCkpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChBcmNoaXZlX0N1cnJlbnRfVHlwZSA+IDEpIHsKKwlpZiAoQXJjaGl2ZV9DdXJyZW50X1R5cGUgPiAwKSB7CiAJCWNsb3NlKGZkKTsKIAkJaW50IHN0YXR1czsKIAkJaWYgKHBpZ3pfcGlkID4gMCAmJiBUV0Z1bmM6OldhaXRfRm9yX0NoaWxkKHBpZ3pfcGlkLCAmc3RhdHVzLCAicGlneiIpICE9IDApCkBAIC0xMjYwLDcgKzEyNjAsNiBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAlmcmVlX2xpYnRhcl9idWZmZXIoKTsKLQlUV0Z1bmM6OnR3X2NobW9kKHRhcmZuLCAiNjQ0Iik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOTgsNyArMTI5Nyw3IEBACiAKIHVuc2lnbmVkIGxvbmcgbG9uZyB0d3JwVGFyOjp1bmNvbXByZXNzZWRTaXplKCkgewogCWludCB0eXBlID0gMDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX3NpemUgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9zaXplID0gMDsKIAlzdHJpbmcgVGFyLCBDb21tYW5kLCByZXN1bHQ7CiAJdmVjdG9yPHN0cmluZz4gc3BsaXQ7CiAKZGlmZiAtLWdpdCBhL3R3cnBUYXIuaHBwIGIvdHdycFRhci5ocHAKaW5kZXggZTI3MGQ5MC4uODhlZWRiNSAxMDA2NDQKLS0tIGEvdHdycFRhci5ocHAKKysrIGIvdHdycFRhci5ocHAKQEAgLTE3LDcgKzE3LDcgQEAKICovCiAKIGV4dGVybiAiQyIgewotICAgICAgICAjaW5jbHVkZSAibGlidGFyL2xpYnRhci5oIgorCSNpbmNsdWRlICJsaWJ0YXIvbGlidGFyLmgiCiB9CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTQxLDU5ICs0MSw2MCBAQAogfTsKIAogY2xhc3MgdHdycFRhciB7Ci0JcHVibGljOgotCQl0d3JwVGFyKCk7Ci0JCXZpcnR1YWwgfnR3cnBUYXIoKTsKLQkJaW50IGNyZWF0ZVRhckZvcmsoKTsKLQkJaW50IGV4dHJhY3RUYXJGb3JrKCk7Ci0JCWludCBzcGxpdEFyY2hpdmVGb3JrKCk7Ci0JCXZvaWQgc2V0ZXhjbChzdHJpbmcgZXhjbHVkZSk7Ci0JCXZvaWQgc2V0Zm4oc3RyaW5nIGZuKTsKLQkJdm9pZCBzZXRkaXIoc3RyaW5nIGRpcik7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyB1bmNvbXByZXNzZWRTaXplKCk7Ci0JCQotCXB1YmxpYzoKLQkJaW50IHVzZV9lbmNyeXB0aW9uOwotCQlpbnQgdXNlcmRhdGFfZW5jcnlwdGlvbjsKLQkJaW50IHVzZV9jb21wcmVzc2lvbjsKLQkJaW50IHNwbGl0X2FyY2hpdmVzOwotCQlpbnQgaGFzX2RhdGFfbWVkaWE7Ci0JCXN0cmluZyBiYWNrdXBfbmFtZTsKK3B1YmxpYzoKKwl0d3JwVGFyKCk7CisJdmlydHVhbCB+dHdycFRhcigpOworCWludCBjcmVhdGVUYXJGb3JrKCk7CisJaW50IGV4dHJhY3RUYXJGb3JrKCk7CisJaW50IHNwbGl0QXJjaGl2ZUZvcmsoKTsKKwl2b2lkIHNldGV4Y2woc3RyaW5nIGV4Y2x1ZGUpOworCXZvaWQgc2V0Zm4oc3RyaW5nIGZuKTsKKwl2b2lkIHNldGRpcihzdHJpbmcgZGlyKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdW5jb21wcmVzc2VkU2l6ZSgpOworCQorcHVibGljOgorCWludCB1c2VfZW5jcnlwdGlvbjsKKwlpbnQgdXNlcmRhdGFfZW5jcnlwdGlvbjsKKwlpbnQgdXNlX2NvbXByZXNzaW9uOworCWludCBzcGxpdF9hcmNoaXZlczsKKwlpbnQgaGFzX2RhdGFfbWVkaWE7CisJc3RyaW5nIGJhY2t1cF9uYW1lOwogCi0JcHJpdmF0ZToKLQkJaW50IGV4dHJhY3QoKTsKLQkJaW50IGFkZEZpbGVzVG9FeGlzdGluZ1Rhcih2ZWN0b3IgPHN0cmluZz4gZmlsZXMsIHN0cmluZyB0YXJGaWxlKTsKLQkJaW50IGNyZWF0ZVRhcigpOwotCQlpbnQgYWRkRmlsZShzdHJpbmcgZm4sIGJvb2wgaW5jbHVkZV9yb290KTsKLQkJaW50IGVudHJ5RXhpc3RzKHN0cmluZyBlbnRyeSk7Ci0JCWludCBjbG9zZVRhcigpOwotCQlpbnQgY3JlYXRlKCk7Ci0JCWludCBTcGxpdF9BcmNoaXZlKCk7Ci0JCWludCByZW1vdmVFT1Qoc3RyaW5nIHRhckZpbGUpOwotCQlpbnQgZXh0cmFjdFRhcigpOwotCQlpbnQgdGFyRGlycyhib29sIGluY2x1ZGVfcm9vdCk7Ci0JCWludCBHZW5lcmF0ZV9NdWx0aXBsZV9BcmNoaXZlcyhzdHJpbmcgUGF0aCk7Ci0JCXN0cmluZyBTdHJpcF9Sb290X0RpcihzdHJpbmcgUGF0aCk7Ci0JCWludCBvcGVuVGFyKCk7Ci0JCWludCBBcmNoaXZlX0ZpbGVfQ291bnQ7Ci0JCWludCBBcmNoaXZlX0N1cnJlbnRfVHlwZTsKLQkJdW5zaWduZWQgbG9uZyBsb25nIEFyY2hpdmVfQ3VycmVudF9TaXplOwotCQlUQVIgKnQ7Ci0JCWludCBmZDsKLQkJcGlkX3QgcGlnel9waWQ7Ci0JCXBpZF90IG9hZXNfcGlkOworcHJpdmF0ZToKKwlpbnQgZXh0cmFjdCgpOworCWludCBhZGRGaWxlc1RvRXhpc3RpbmdUYXIodmVjdG9yIDxzdHJpbmc+IGZpbGVzLCBzdHJpbmcgdGFyRmlsZSk7CisJaW50IGNyZWF0ZVRhcigpOworCWludCBhZGRGaWxlKHN0cmluZyBmbiwgYm9vbCBpbmNsdWRlX3Jvb3QpOworCWludCBlbnRyeUV4aXN0cyhzdHJpbmcgZW50cnkpOworCWludCBjbG9zZVRhcigpOworCWludCBjcmVhdGUoKTsKKwlpbnQgU3BsaXRfQXJjaGl2ZSgpOworCWludCByZW1vdmVFT1Qoc3RyaW5nIHRhckZpbGUpOworCWludCBleHRyYWN0VGFyKCk7CisJaW50IHRhckRpcnMoYm9vbCBpbmNsdWRlX3Jvb3QpOworCWludCBHZW5lcmF0ZV9NdWx0aXBsZV9BcmNoaXZlcyhzdHJpbmcgUGF0aCk7CisJc3RyaW5nIFN0cmlwX1Jvb3RfRGlyKHN0cmluZyBQYXRoKTsKKwlpbnQgb3BlblRhcigpOworCWludCBHZW5lcmF0ZV9UYXJMaXN0KHN0cmluZyBQYXRoLCBzdGQ6OnZlY3RvcjxUYXJMaXN0U3RydWN0PiAqVGFyTGlzdCwgdW5zaWduZWQgbG9uZyBsb25nICpUYXJnZXRfU2l6ZSwgdW5zaWduZWQgKnRocmVhZF9pZCk7CisJc3RhdGljIHZvaWQqIGNyZWF0ZUxpc3Qodm9pZCAqY29va2llKTsKKwlzdGF0aWMgdm9pZCogZXh0cmFjdE11bHRpKHZvaWQgKmNvb2tpZSk7CisJaW50IHRhckxpc3QoYm9vbCBpbmNsdWRlX3Jvb3QsIHN0ZDo6dmVjdG9yPFRhckxpc3RTdHJ1Y3Q+ICpUYXJMaXN0LCB1bnNpZ25lZCB0aHJlYWRfaWQpOwogCi0JCXN0cmluZyB0YXJkaXI7Ci0JCXN0cmluZyB0YXJmbjsKLQkJc3RyaW5nIGJhc2VmbjsKLQkJc3RyaW5nIHRhcmV4Y2x1ZGU7CisJaW50IEFyY2hpdmVfRmlsZV9Db3VudDsKKwlpbnQgQXJjaGl2ZV9DdXJyZW50X1R5cGU7CisJdW5zaWduZWQgbG9uZyBsb25nIEFyY2hpdmVfQ3VycmVudF9TaXplOworCVRBUiAqdDsKKwlpbnQgZmQ7CisJcGlkX3QgcGlnel9waWQ7CisJcGlkX3Qgb2Flc19waWQ7CiAKLQkJdmVjdG9yPHN0cmluZz4gc3BsaXQ7CisJc3RyaW5nIHRhcmRpcjsKKwlzdHJpbmcgdGFyZm47CisJc3RyaW5nIGJhc2VmbjsKKwlzdHJpbmcgdGFyZXhjbHVkZTsKIAotCQlpbnQgR2VuZXJhdGVfVGFyTGlzdChzdHJpbmcgUGF0aCwgc3RkOjp2ZWN0b3I8VGFyTGlzdFN0cnVjdD4gKlRhckxpc3QsIHVuc2lnbmVkIGxvbmcgbG9uZyAqVGFyZ2V0X1NpemUsIHVuc2lnbmVkICp0aHJlYWRfaWQpOwotCQlzdGF0aWMgdm9pZCogY3JlYXRlTGlzdCh2b2lkICpjb29raWUpOwotCQlzdGF0aWMgdm9pZCogZXh0cmFjdE11bHRpKHZvaWQgKmNvb2tpZSk7Ci0JCWludCB0YXJMaXN0KGJvb2wgaW5jbHVkZV9yb290LCBzdGQ6OnZlY3RvcjxUYXJMaXN0U3RydWN0PiAqVGFyTGlzdCwgdW5zaWduZWQgdGhyZWFkX2lkKTsKLQkJc3RkOjp2ZWN0b3I8VGFyTGlzdFN0cnVjdD4gKkl0ZW1MaXN0OwotCQlpbnQgdGhyZWFkX2lkOworCXZlY3RvcjxzdHJpbmc+IHNwbGl0OworCisJc3RkOjp2ZWN0b3I8VGFyTGlzdFN0cnVjdD4gKkl0ZW1MaXN0OworCWludCB0aHJlYWRfaWQ7CiB9OyAKZGlmZiAtLWdpdCBhL3ZhcmlhYmxlcy5oIGIvdmFyaWFibGVzLmgKaW5kZXggNDAyMGI3NS4uYjhhOTM4MCAxMDA2NDQKLS0tIGEvdmFyaWFibGVzLmgKKysrIGIvdmFyaWFibGVzLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgX1ZBUklBQkxFU19IRUFERVJfCiAjZGVmaW5lIF9WQVJJQUJMRVNfSEVBREVSXwogCi0jZGVmaW5lIFRXX1ZFUlNJT05fU1RSICAgICAgICAgICAgICAiMi42LjAuMCIKKyNkZWZpbmUgVFdfVkVSU0lPTl9TVFIgICAgICAgICAgICAgICIyLjYuMC40IgogCiAjZGVmaW5lIFRXX1VTRV9DT01QUkVTU0lPTl9WQVIgICAgICAidHdfdXNlX2NvbXByZXNzaW9uIgogI2RlZmluZSBUV19GSUxFTkFNRSAgICAgICAgICAgICAgICAgInR3X2ZpbGVuYW1lIgo=