ZGlmZiAtLWdpdCBhL3Zta2l0L01ha2VmaWxlLnJ1bGVzIGIvdm1raXQvTWFrZWZpbGUucnVsZXMKaW5kZXggNDdhYWMyYy4uNzE0YjEyNCAxMDA2NDQKLS0tIGEvdm1raXQvTWFrZWZpbGUucnVsZXMKKysrIGIvdm1raXQvTWFrZWZpbGUucnVsZXMKQEAgLTIzLDcgKzIzLDcgQEAKICAgTExDX0ZMQUdTKz0gLU89MwogICBPUFRfRkxBR1MrPSAtZGlzYWJsZS1vcHQKICAgQ1BQR0VOX0ZMQUdTKz0tc3RyaXAtZGVidWcKLSAgQ09NTU9OX0NGTEFHUys9IC1PMworICBDT01NT05fQ0ZMQUdTKz0tTzMKIGVsc2UKICAgTExDX0ZMQUdTKz0tTz0wIC1hc20tdmVyYm9zZQogICBPUFRfRkxBR1MrPS1kaXNhYmxlLW9wdCAtaW5saW5lCkBAIC0zNiw3ICszNiw3IEBACiBPUFRfRkxBR1MrPS1kaXNhYmxlLWNmaSAtZGlzYWJsZS1mcC1lbGltIAogCiBJTkNMVURFUys9LUkkKFBST0pfU1JDX0NXRCkgLUkkKFBST0pfU1JDX1JPT1QpL2luY2x1ZGUgLUkkKFBST0pfU1JDX1JPT1QpL2xpYi92bWtpdC9NTVRrIC1JJChCVUlMRF9ESVIpIFwKLQkJCQkJLUkkKHNoZWxsICQoTExWTV9DT05GSUcpIC0taW5jbHVkZWRpcikgLUkkKHNoZWxsICQoTExWTV9DT05GSUcpIC0tb2JqLXJvb3QpL2luY2x1ZGUgLUkkKHNoZWxsICQoTExWTV9DT05GSUcpIC0tc3JjLXJvb3QpCisJCQkJCS1JJChzaGVsbCAkKExMVk1fQ09ORklHKSAtLWluY2x1ZGVkaXIpIC1JJChzaGVsbCAkKExMVk1fQ09ORklHKSAtLWJpbmRpcikvLi4vaW5jbHVkZSAtSSQoc2hlbGwgJChMTFZNX0NPTkZJRykgLS1zcmMtcm9vdCkKIAogV0FSTl9DRkxBR1M9ICAtV2FsbCAtV25vLWxvbmctbG9uZyAtV25vLXZhcmlhZGljLW1hY3JvcyAtV25vLXVudXNlZC1wcml2YXRlLWZpZWxkIC1Xbm8tdW51c2VkLXZhcmlhYmxlCiBDT01NT05fQ0ZMQUdTKz0gJChJTkNMVURFUykgLWFuc2kgLXBlZGFudGljICQoV0FSTl9DRkxBR1MpIC1mUElDIFwKQEAgLTQ0LDEwICs0NCwxMCBAQAogCQkJCQkJCQktZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4gCiAKIENGTEFHUys9JChDT01NT05fQ0ZMQUdTKQotQ1hYRkxBR1MrPSQoQ09NTU9OX0NGTEFHUykgLVdvdmVybG9hZGVkLXZpcnR1YWwgLVdjYXN0LXF1YWwgLWZuby1leGNlcHRpb25zICQoTExWTV9SVFRJKQorQ1hYRkxBR1MrPSQoQ09NTU9OX0NGTEFHUykgLXN0ZD1jKysxMSAtc3RkbGliPWxpYmMrKyAtV292ZXJsb2FkZWQtdmlydHVhbCAtV2Nhc3QtcXVhbCAtZm5vLWV4Y2VwdGlvbnMgJChMTFZNX1JUVEkpCiBMREZMQUdTKz0kKENPTU1PTl9DRkxBR1MpICQoc2hlbGwgJChMTFZNX0NPTkZJRykgLS1sZGZsYWdzKSAkKExET1BUKQotU0hPUFQrPSQoQ09NTU9OX0NGTEFHUykKLUxJQlMrPSQoc2hlbGwgJChMTFZNX0NPTkZJRykgLS1saWJzKSAtbHoKK1NIT1BUKz0kKENPTU1PTl9DRkxBR1MpIC1sYysrIC1sYysrYWJpCitMSUJTKz0kKHNoZWxsICQoTExWTV9DT05GSUcpIC0tbGlicykgLWx6IC1scHRocmVhZCAtbGRsIC1sYysrIC1sYysrYWJpCiAKIERFUEVORF9PUFRJT05TPS1NTUQgLU1QIC1NRiAiJChCVUlMRF9ESVIpLyQkKi5kLnRtcCIgLU1UICIkKEJVSUxEX0RJUikvJCQqLmJjIiAtTVQgIiQoQlVJTERfRElSKS8kJCouZCIKIERPTT10aGVuIG12IC1mICIkKEJVSUxEX0RJUikvJCQqLmQudG1wIiAiJChCVUlMRF9ESVIpLyQkKi5kIjsgZWxzZSBybSAtZiAiJChCVUlMRF9ESVIpLyQkKi5kLnRtcCI7IGV4aXQgMTsgZmkKQEAgLTI2MiwxMSArMjYyLDExIEBACiAKICQoQklOX0RJUikvJChUT09MKSQoRVhFRVhUKTogJChNT0RVTEVfQSkgJChERVBfTElCUykgJChCVUlMRF9ESVIpL2ZyYW1ldGFibGVzLm8gJChTRUxGKSAkKEJJTl9ESVIpLy5kaXIKIAkkKEVjaG8pICJMaW5raW5nIGV4ZWN1dGFibGUgJyQobm90ZGlyICRAKSciCi0JJChWZXJiKSAkKENMQU5HWFgpIC1vICRAICAkKExERkxBR1MpICQoTU9EVUxFX0EpICQoQlVJTERfRElSKS9mcmFtZXRhYmxlcy5vICQoREVQX0xJQlMpICQoREVQX0xJQlMpICQoTElCUykKKwkkKFZlcmIpICQoQ0xBTkdYWCkgLXN0ZD1jKysxMSAtc3RkbGliPWxpYmMrKyAtbyAkQCAgJChMREZMQUdTKSAkKE1PRFVMRV9BKSAkKEJVSUxEX0RJUikvZnJhbWV0YWJsZXMubyAkKERFUF9MSUJTKSAkKERFUF9MSUJTKSAkKExJQlMpCiAKICQoTElCX0RJUikvJChMSUJSQVJZKSQoU0hMSUJFWFQpOiAkKE1PRFVMRV9BKSAkKERFUF9MSUJTKSAkKFNFTEYpICQoTElCX0RJUikvLmRpcgogCSQoRWNobykgIkxpbmtpbmcgc2hhcmVkIGxpYnJhcnkgJyQobm90ZGlyICRAKSciCi0JJChWZXJiKSAkKENMQU5HWFgpIC1vICRAICQoU0hPUFQpIC1zaGFyZWQgLVdsLC0td2hvbGUtYXJjaGl2ZSAkKE1PRFVMRV9BKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlICQoREVQX0xJQlMpCisJJChWZXJiKSAkKENMQU5HWFgpIC1zdGQ9YysrMTEgLXN0ZGxpYj1saWJjKysgLUwkKHNoZWxsICQoTExWTV9DT05GSUcpIC0tYmluZGlyKS8uLi9saWIgLW8gJEAgJChTSE9QVCkgLXNoYXJlZCAtV2wsLS13aG9sZS1hcmNoaXZlICQoTU9EVUxFX0EpIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgJChERVBfTElCUykKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyAgIEZyYW1ldGFibGVzCmRpZmYgLS1naXQgYS92bWtpdC9SRUFETUUuVFhUIGIvdm1raXQvUkVBRE1FLlRYVAppbmRleCA4OWUyZjllLi42MjAyZTQwIDEwMDY0NAotLS0gYS92bWtpdC9SRUFETUUuVFhUCisrKyBiL3Zta2l0L1JFQURNRS5UWFQKQEAgLTI0LDE0ICsyNCwxNCBAQAogLi9jb25maWd1cmUgLS1kaXNhYmxlLXBsdWdpbiAtLWRpc2FibGUtZXhhbXBsZXMgLS1kaXNhYmxlLVdlcnJvciAtLXdpdGgtYW50bHItamFyPS9vcHQvL2xvY2FsL3NoYXJlL2phdmEvYW50bHIuamFyCiBtYWtlIC1qMTIKIGNkIGxpYgotbG4gLXMgLi4vbmF0aXZlL2puaS9ndGstcGVlci8ubGlicy9saWJndGtwZWVyLmR5bGliOwotbG4gLXMgLi4vbmF0aXZlL2puaS9nY29uZi1wZWVyLy5saWJzL2xpYmdjb25mcGVlci5keWxpYjsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1pby8ubGlicy9saWJqYXZhaW8uZHlsaWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZ3JlZmxlY3QuZHlsaWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZy5keWxpYjsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uZXQvLmxpYnMvbGliamF2YW5ldC5keWxpYjsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uaW8vLmxpYnMvbGliamF2YW5pby5keWxpYjsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS11dGlsLy5saWJzL2xpYmphdmF1dGlsLmR5bGliOworbG4gLXMgLi4vbmF0aXZlL2puaS9ndGstcGVlci8ubGlicy9saWJndGtwZWVyLnNvOworbG4gLXMgLi4vbmF0aXZlL2puaS9nY29uZi1wZWVyLy5saWJzL2xpYmdjb25mcGVlci5zbzsKK2xuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1pby8ubGlicy9saWJqYXZhaW8uc287CitsbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZ3JlZmxlY3Quc287CitsbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZy5zbzsKK2xuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uZXQvLmxpYnMvbGliamF2YW5ldC5zbzsKK2xuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uaW8vLmxpYnMvbGliamF2YW5pby5zbzsKK2xuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS11dGlsLy5saWJzL2xpYmphdmF1dGlsLnNvOwogCiAqIEZvciBMaW51eCB1c2VyczoKIHdnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9jbGFzc3BhdGgvY2xhc3NwYXRoLTAuOTkudGFyLmd6CkBAIC04MCw4ICs4MCw4IEBACiAKICogTWFrZSBpdCAocmVsZWFzZSBtb2RlKToKIAotLi9jb25maWd1cmUgLS1lbmFibGUtb3B0aW1pemVkIC0tZW5hYmxlLWFzc2VydGlvbnMgLS1lbmFibGUtaml0IC0tZW5hYmxlLWN4eDExIC0tZW5hYmxlLXRocmVhZHMgLS1lbmFibGUtcHRocmVhZHMgLS1lbmFibGUtcGljIC0tZW5hYmxlLXRhcmdldHM9aG9zdCxjcHAgLS1lbmFibGUtemxpYiAtLWRpc2FibGUtZG9jcyAtLWRpc2FibGUtZG94eWdlbgotbWFrZSAtajEyIEJVSUxEX0VYQU1QTEVTPTAgRU5BQkxFX0RPQ1M9MAorLi9jb25maWd1cmUgLS1lbmFibGUtb3B0aW1pemVkIC0tZW5hYmxlLWFzc2VydGlvbnMgLS1lbmFibGUtaml0IC0tZW5hYmxlLWN4eDExIC0tZW5hYmxlLWxpYmNwcCAtLWVuYWJsZS10aHJlYWRzIC0tZW5hYmxlLXB0aHJlYWRzIC0tZW5hYmxlLXBpYyAtLWVuYWJsZS10YXJnZXRzPWhvc3QsY3BwIC0tZW5hYmxlLXpsaWIgLS1kaXNhYmxlLWRvY3MgLS1kaXNhYmxlLWRveHlnZW4KK21ha2UgLWoxMgogCiAqIFlvdSBjYW4gYWxzbyBtYWtlIGl0IGluIGRlYnVnIG1vZGUsIGJ1dCB0aGlzIGlzIGlzIG5vdCBuZWNlc3NhcnkgdG8gZGVidWcgY29tcGlsZWQgcHJvZ3JhbXM6CiAKQEAgLTEwNSwxNSArMTA1LDE1IEBACiAKICogTWFrZSBpdCAocmVsZWFzZSBtb2RlKToKIAotLi9jb25maWd1cmUgLS13aXRoLWxsdm0tY29uZmlnLXBhdGg9QFBBVEhfVE9fTExWTUAvUmVsZWFzZStBc3NlcnRzL2Jpbi9sbHZtLWNvbmZpZyAtLXdpdGgtZ251LWNsYXNzcGF0aC1saWJzPUBQQVRIX1RPX0dOVUNMQVNTUEFUSEAvbGliIC0td2l0aC1nbnUtY2xhc3NwYXRoLWdsaWJqPUBQQVRIX1RPX0dOVUNMQVNTUEFUSEAvbGliL2dsaWJqLnppcAorLi9jb25maWd1cmUgLS13aXRoLWxsdm0tY29uZmlnLXBhdGg9QFBBVEhfVE9fTExWTUAvUmVsZWFzZStBc3NlcnRzL2Jpbi9sbHZtLWNvbmZpZyAtLXdpdGgtY2xhbmctcGF0aD1AUEFUSF9UT19MTFZNQC9SZWxlYXNlK0Fzc2VydHMvYmluIC0td2l0aC1nbnUtY2xhc3NwYXRoLWxpYnM9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIgLS13aXRoLWdudS1jbGFzc3BhdGgtZ2xpYmo9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIvZ2xpYmouemlwCiAKICogT3IgeW91IGNhbiBtYWtlIGl0IGluIGRlYnVnIG1vZGU6CiAKLS4vY29uZmlndXJlIC0td2l0aC1sbHZtLWNvbmZpZy1wYXRoPUBQQVRIX1RPX0xMVk1AL1JlbGVhc2UrQXNzZXJ0cy9iaW4vbGx2bS1jb25maWcgLS13aXRoLWdudS1jbGFzc3BhdGgtbGlicz1AUEFUSF9UT19HTlVDTEFTU1BBVEhAL2xpYiAtLXdpdGgtZ251LWNsYXNzcGF0aC1nbGliaj1AUEFUSF9UT19HTlVDTEFTU1BBVEhAL2xpYi9nbGliai56aXAgLS1lbmFibGUtYXNzZXJ0PXllcyAtLWRpc2FibGUtb3B0aW1pemVkIC0tZW5hYmxlLWRlYnVnPXllcworLi9jb25maWd1cmUgLS13aXRoLWxsdm0tY29uZmlnLXBhdGg9QFBBVEhfVE9fTExWTUAvUmVsZWFzZStBc3NlcnRzL2Jpbi9sbHZtLWNvbmZpZyAtLXdpdGgtY2xhbmctcGF0aD1AUEFUSF9UT19MTFZNQC9SZWxlYXNlK0Fzc2VydHMvYmluIC0td2l0aC1nbnUtY2xhc3NwYXRoLWxpYnM9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIgLS13aXRoLWdudS1jbGFzc3BhdGgtZ2xpYmo9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIvZ2xpYmouemlwIC0tZW5hYmxlLWFzc2VydD15ZXMgLS1kaXNhYmxlLW9wdGltaXplZCAtLWVuYWJsZS1kZWJ1Zz15ZXMKIAogKiBPciB5b3UgY2FuIGVuYWJsZSBPU0dpIEluY2luZXJhdG9yIGJ1aWxkOgogCi0uL2NvbmZpZ3VyZSAtLXdpdGgtbGx2bS1jb25maWctcGF0aD1AUEFUSF9UT19MTFZNQC9SZWxlYXNlK0Fzc2VydHMvYmluL2xsdm0tY29uZmlnIC0td2l0aC1nbnUtY2xhc3NwYXRoLWxpYnM9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIgLS13aXRoLWdudS1jbGFzc3BhdGgtZ2xpYmo9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIvZ2xpYmouemlwIC0tZW5hYmxlLWluY2luZXJhdG9yPXllcworLi9jb25maWd1cmUgLS13aXRoLWxsdm0tY29uZmlnLXBhdGg9QFBBVEhfVE9fTExWTUAvUmVsZWFzZStBc3NlcnRzL2Jpbi9sbHZtLWNvbmZpZyAtLXdpdGgtY2xhbmctcGF0aD1AUEFUSF9UT19MTFZNQC9SZWxlYXNlK0Fzc2VydHMvYmluIC0td2l0aC1nbnUtY2xhc3NwYXRoLWxpYnM9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIgLS13aXRoLWdudS1jbGFzc3BhdGgtZ2xpYmo9QFBBVEhfVE9fR05VQ0xBU1NQQVRIQC9saWIvZ2xpYmouemlwIC0tZW5hYmxlLWluY2luZXJhdG9yPXllcwogCiAqIEJ1aWxkIGl0OgogCmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL2RlYnVnLmggYi92bWtpdC9pbmNsdWRlL2RlYnVnLmgKaW5kZXggMDcxN2I2OC4uYTNmOWJiOSAxMDA2NDQKLS0tIGEvdm1raXQvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL3Zta2l0L2luY2x1ZGUvZGVidWcuaApAQCAtMjcsNyArMjcsNyBAQAogI2RlZmluZSBfQk9MRCAiMDEiCiAjZGVmaW5lIF9TT1VMSUdORSAiMDQiCiAKLSNkZWZpbmUgTUtfQ09MT1IodHlwZSwgYmcpIHR5cGUiOyJiZworI2RlZmluZSBNS19DT0xPUih0eXBlLCBiZykgdHlwZSI7IiBiZwogCiAvKgogI2RlZmluZSBNS19DT0xPUih0eXBlLCBiZywgZmcpIHR5cGUiOyJiZyI7ImZnCmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL2ozL0ozSW50cmluc2ljcy5oIGIvdm1raXQvaW5jbHVkZS9qMy9KM0ludHJpbnNpY3MuaAppbmRleCA0MzdmOGU5Li45NDEzZWU3IDEwMDY0NAotLS0gYS92bWtpdC9pbmNsdWRlL2ozL0ozSW50cmluc2ljcy5oCisrKyBiL3Zta2l0L2luY2x1ZGUvajMvSjNJbnRyaW5zaWNzLmgKQEAgLTQ1LDEwICs0NSwxOSBAQAogICBsbHZtOjpUeXBlKiBKYXZhTWV0aG9kVHlwZTsKICAgbGx2bTo6VHlwZSogSmF2YUZpZWxkVHlwZTsKICAgbGx2bTo6VHlwZSogQXR0cmlidXRlVHlwZTsKKyAgbGx2bTo6VHlwZSogVGhyZWFkVHlwZTsKICAgbGx2bTo6VHlwZSogSmF2YVRocmVhZFR5cGU7CiAgIGxsdm06OlR5cGUqIE11dGF0b3JUaHJlYWRUeXBlOwogICBsbHZtOjpUeXBlKiBKM0RlbnNlTWFwVHlwZTsKLSAgCisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgbGx2bTo6VHlwZSogVGllcklEVHlwZTsKKyNlbmRpZgorCisjaWYgRU1CRURERURfTElTVF9JTl9DQUxMX1NUQUNLCisgIGxsdm06OlR5cGUqIFN0YWNrRW1iZWRkZWRMaXN0Tm9kZVR5cGU7CisjZW5kaWYKKwogICBsbHZtOjpGdW5jdGlvbiogVlRBbGxvY2F0ZUZ1bmN0aW9uOwogICBsbHZtOjpGdW5jdGlvbiogVlRBbGxvY2F0ZVVucmVzb2x2ZWRGdW5jdGlvbjsKIApAQCAtMTA5LDYgKzExOCwxNiBAQAogICBsbHZtOjpGdW5jdGlvbiogR2V0RmluYWxGbG9hdEZpZWxkRnVuY3Rpb247CiAgIGxsdm06OkZ1bmN0aW9uKiBHZXRGaW5hbERvdWJsZUZpZWxkRnVuY3Rpb247CiAgIAorI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKyAgbGx2bTo6RnVuY3Rpb24qIFB1c2hDaGFyZ2VkVGllck5vZGVGdW5jdGlvbjsKKyAgbGx2bTo6RnVuY3Rpb24qIFBvcENoYXJnZWRUaWVyTm9kZUZ1bmN0aW9uOworI2VuZGlmCisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgbGx2bTo6Q29uc3RhbnQqIEludmFsaWRUaWVySURDb25zdGFudDsKKyAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldENoYXJnZWRUaWVySURJblRocmVhZENvbnN0YW50OworI2VuZGlmCisKICAgbGx2bTo6Q29uc3RhbnQqIEphdmFBcnJheVNpemVPZmZzZXRDb25zdGFudDsKICAgbGx2bTo6Q29uc3RhbnQqIEphdmFBcnJheUVsZW1lbnRzT2Zmc2V0Q29uc3RhbnQ7CiAgIGxsdm06OkNvbnN0YW50KiBIZWFkZXJPYmplY3RMb2NrT2Zmc2V0Q29uc3RhbnQ7CkBAIC0xMzEsNiArMTUwLDE1IEBACiAgIGxsdm06OkNvbnN0YW50KiBPZmZzZXRKTklJbkphdmFUaHJlYWRDb25zdGFudDsKICAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldEphdmFFeGNlcHRpb25JbkphdmFUaHJlYWRDb25zdGFudDsKIAorI2lmIEVNQkVEREVEX0xJU1RfSU5fQ0FMTF9TVEFDSworICBsbHZtOjpDb25zdGFudCogT2Zmc2V0U3RhY2tFbWJlZGRlZExpc3RIZWFkSW5UaHJlYWRDb25zdGFudDsKKworICBsbHZtOjpDb25zdGFudCogT2Zmc2V0Q2FsbGVyTm9kZUluU3RhY2tFbWJlZGRlZExpc3ROb2RlQ29uc3RhbnQ7CisgIGxsdm06OkNvbnN0YW50KiBPZmZzZXREYXRhSW5TdGFja0VtYmVkZGVkTGlzdE5vZGVDb25zdGFudDsKKyNlbmRpZgorCisgIGxsdm06OkNvbnN0YW50KiBjb25zdGFudE51bGxKYXZhTWV0aG9kUHRyOworCiAgIGxsdm06OkNvbnN0YW50KiBPZmZzZXRDbGFzc0luVlRDb25zdGFudDsKICAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldERlcHRoSW5WVENvbnN0YW50OwogICBsbHZtOjpDb25zdGFudCogT2Zmc2V0RGlzcGxheUluVlRDb25zdGFudDsKQEAgLTE0MCwxMiArMTY4LDE4IEBACiAgIGxsdm06OkNvbnN0YW50KiBPZmZzZXRCYXNlQ2xhc3NJbkFycmF5Q2xhc3NDb25zdGFudDsKICAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldExvZ1NpemVJblByaW1pdGl2ZUNsYXNzQ29uc3RhbnQ7CiAgIAorICBsbHZtOjpDb25zdGFudCogT2Zmc2V0T2Zmc2V0SW5KYXZhTWV0aG9kQ29uc3RhbnQ7CisKICAgbGx2bTo6Q29uc3RhbnQqIENsYXNzUmVhZHlDb25zdGFudDsKIAogICBsbHZtOjpDb25zdGFudCogSmF2YU9iamVjdE51bGxDb25zdGFudDsKICAgbGx2bTo6Q29uc3RhbnQqIE1heEFycmF5U2l6ZUNvbnN0YW50OwogICBsbHZtOjpDb25zdGFudCogSmF2YUFycmF5U2l6ZUNvbnN0YW50OwogCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldFRvdGFsQ2FsbGVkTWV0aG9kc0NvdW50ZXJJblRocmVhZDsKKyNlbmRpZgorCiAgIGxsdm06OkZ1bmN0aW9uKiBUaHJvd0V4Y2VwdGlvbkZ1bmN0aW9uOwogICBsbHZtOjpGdW5jdGlvbiogTnVsbFBvaW50ZXJFeGNlcHRpb25GdW5jdGlvbjsKICAgbGx2bTo6RnVuY3Rpb24qIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25GdW5jdGlvbjsKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvdm1raXQvR0MuaCBiL3Zta2l0L2luY2x1ZGUvdm1raXQvR0MuaAppbmRleCBlZTk4MjRhLi5hY2MyYzA0IDEwMDY0NAotLS0gYS92bWtpdC9pbmNsdWRlL3Zta2l0L0dDLmgKKysrIGIvdm1raXQvaW5jbHVkZS92bWtpdC9HQy5oCkBAIC0xNiwxNyArMTYsNjMgQEAKIAogY2xhc3MgZ2M7CiAKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKworLyoKKwlUaWVySUQgYml0cyA9IHkgeHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKKwl5OiBtYXJrZWQgYml0LCB1c2VkIHRvIGF2b2lkIGNvdW50aW5nIG9uZSBvYmplY3QgdHdpY2UKKwl4Li4ueDogdW5zaWduZWQgaW50ZWdlciBpZGVudGlmaWVyCisqLworCisjZW5kaWYKKwogY2xhc3MgZ2NIZWFkZXIgewogcHVibGljOgogCXdvcmRfdCBfaGVhZGVyOworCisjaWYgT1NHSV9PQkpFQ1RfVElFUl9UQUdHSU5HCisJdHlwZWRlZiB1aW50MTZfdAlUaWVySURUeXBlOwkJLy8gMTYtYml0cyB3aWRlIHRhZworCXN0YXRpYyBjb25zdCB1aW50MTZfdCBUaWVySURCaXRNYXNrX01hcmsgPSAweDgwMDAsIFRpZXJJREJpdE1hc2tfSUQgPSAweDdGRkY7CisKKwlUaWVySURUeXBlIF90aWVyX2lkOworI2VuZGlmCisKIAlpbmxpbmUgZ2MqIHRvUmVmZXJlbmNlKCkgeyByZXR1cm4gKGdjKikoKHVpbnRwdHJfdCl0aGlzICsgaGlkZGVuSGVhZGVyU2l6ZSgpKTsgfQogCXN0YXRpYyBpbmxpbmUgc2l6ZV90IGhpZGRlbkhlYWRlclNpemUoKSB7IHJldHVybiBzaXplb2YoZ2NIZWFkZXIpOyB9CiB9OwogCiBjbGFzcyBnY1Jvb3QgewogcHVibGljOgotICB3b3JkX3QmIGhlYWRlcigpe3JldHVybiB0b0hlYWRlcigpLT5faGVhZGVyOyB9Ci0gIGlubGluZSBnY0hlYWRlciogdG9IZWFkZXIoKSB7IHJldHVybiAoZ2NIZWFkZXIqKSgodWludHB0cl90KXRoaXMgLSBnY0hlYWRlcjo6aGlkZGVuSGVhZGVyU2l6ZSgpKTsgfQorI2lmIE9TR0lfT0JKRUNUX1RJRVJfVEFHR0lORworICBpbmxpbmUgZ2NIZWFkZXI6OlRpZXJJRFR5cGUgZ2V0VGllcklEKCkgY29uc3QgeworCSAgcmV0dXJuICh0b0hlYWRlcigpLT5fdGllcl9pZCAmIGdjSGVhZGVyOjpUaWVySURCaXRNYXNrX0lEKTt9CisKKyAgaW5saW5lIHZvaWQgc2V0VGllcklEKGdjSGVhZGVyOjpUaWVySURUeXBlIHRpZXJJRCkKKyAgeworCSAgZ2NIZWFkZXI6OlRpZXJJRFR5cGUmIHRpZCA9IHRvSGVhZGVyKCktPl90aWVyX2lkOworCSAgdGlkICY9IGdjSGVhZGVyOjpUaWVySURCaXRNYXNrX01hcms7CisJICB0aWQgfD0gKHRpZXJJRCAmIGdjSGVhZGVyOjpUaWVySURCaXRNYXNrX0lEKTsKKyAgfQorCisgIGlubGluZSBib29sIGdldFRpZXJPYmplY3RNYXJrU3RhdGUoKSBjb25zdCB7CisJICByZXR1cm4gKCh0b0hlYWRlcigpLT5fdGllcl9pZCAmIGdjSGVhZGVyOjpUaWVySURCaXRNYXNrX01hcmspICE9IDApO30KKworICBpbmxpbmUgdm9pZCBzZXRUaWVyT2JqZWN0TWFya1N0YXRlKGJvb2wgbWFya1N0YXRlKQorICB7CisJICBnY0hlYWRlcjo6VGllcklEVHlwZSYgdGlkID0gdG9IZWFkZXIoKS0+X3RpZXJfaWQ7CisJICBpZiAobWFya1N0YXRlKQorCQkgIHRpZCB8PSBnY0hlYWRlcjo6VGllcklEQml0TWFza19NYXJrOworCSAgZWxzZQorCQkgIHRpZCAmPSB+Z2NIZWFkZXI6OlRpZXJJREJpdE1hc2tfTWFyazsKKyAgfQorI2VuZGlmCisKKyAgaW5saW5lICAgICAgIHdvcmRfdCYgaGVhZGVyKCkgICAgICAge3JldHVybiB0b0hlYWRlcigpLT5faGVhZGVyOyB9CisgIGlubGluZSBjb25zdCB3b3JkX3QmIGhlYWRlcigpIGNvbnN0IHtyZXR1cm4gY29uc3RfY2FzdDxnY1Jvb3QqPih0aGlzKS0+aGVhZGVyKCk7IH0KKworICBpbmxpbmUgICAgICAgZ2NIZWFkZXIqIHRvSGVhZGVyKCkgICAgICAgeworICAgICAgcmV0dXJuIChnY0hlYWRlciopKCh1aW50cHRyX3QpdGhpcyAtIGdjSGVhZGVyOjpoaWRkZW5IZWFkZXJTaXplKCkpOyB9CisgIGlubGluZSBjb25zdCBnY0hlYWRlciogdG9IZWFkZXIoKSBjb25zdCB7cmV0dXJuIGNvbnN0X2Nhc3Q8Z2NSb290Kj4odGhpcyktPnRvSGVhZGVyKCk7IH0KIH07CiAKIG5hbWVzcGFjZSB2bWtpdCB7CmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL3Zta2l0L1N0YWNrRW1iZWRkZWRMaXN0LmggYi92bWtpdC9pbmNsdWRlL3Zta2l0L1N0YWNrRW1iZWRkZWRMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0MDI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L2luY2x1ZGUvdm1raXQvU3RhY2tFbWJlZGRlZExpc3QuaApAQCAtMCwwICsxLDYzIEBACisKKyNpZm5kZWYgU1RBQ0tfRU1CRURERURfTElTVF9IXworI2RlZmluZSBTVEFDS19FTUJFRERFRF9MSVNUX0hfCisKKyNpbmNsdWRlICJ2bWtpdC9TeXN0ZW0uaCIKKyNpbmNsdWRlICJ2bWtpdC9TdGFja1dhbGtlci5oIgorCisjaW5jbHVkZSA8bGlzdD4KKworI2lmIEVNQkVEREVEX0xJU1RfSU5fQ0FMTF9TVEFDSworCituYW1lc3BhY2Ugdm1raXQgeworCitjbGFzcyBUaHJlYWQ7CisKK2VudW0gU3RhY2tFbWJlZGRlZExpc3RJRCB7CisJU3RhY2tFbWJlZGRlZExpc3RDaGFyZ2VkVGllciA9IDAsCisKKwlTdGFja0VtYmVkZGVkTGlzdE5vZGVDb3VudFBlclRocmVhZAorfTsKKworc3RydWN0IFN0YWNrRW1iZWRkZWRMaXN0Tm9kZSB7CisJU3RhY2tFbWJlZGRlZExpc3ROb2RlKgljYWxsZXJOb2RlOworCXdvcmRfdAkJCQkJZGF0YVsxXTsKKworCXZvaWQgZHVtcCgpIGNvbnN0IF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Cit9OworCit9CisKKy8qCitjbGFzcyBTdGFja0VtYmVkZGVkTGlzdFdhbGtlcgoreworcHJvdGVjdGVkOgorCWNvbnN0IFN0YWNrRW1iZWRkZWRMaXN0Tm9kZSoJX2N1cnJlbnRfbm9kZTsKKwlTdGFja1dhbGtlcgkJCQkJCV9zdGFja193YWxrZXI7CisJc3RkOjpsaXN0PFN0YWNrV2Fsa2VyPgkJCV93YWxrZWRfc3RhY2s7CisKK3B1YmxpYzoKKwlTdGFja0VtYmVkZGVkTGlzdFdhbGtlcihUaHJlYWQqIHRocmVhZCkgOgorCQlfY3VycmVudF9ub2RlKG51bGxwdHIpLCBfc3RhY2tfd2Fsa2VyKHRocmVhZCkge30KKwl2aXJ0dWFsIH5TdGFja0VtYmVkZGVkTGlzdFdhbGtlcigpIHt9CisKKwlib29sIGZpbmRTdGFja0ZyYW1lT2ZFbWJlZGRlZE5vZGUoKTsKKwlib29sIG5leHQoKTsKKworCVN0YWNrV2Fsa2VyJiBnZXRTdGFja1dhbGtlcigpIHtyZXR1cm4gX3N0YWNrX3dhbGtlcjt9CisJdWludDMyX3QgZ2V0Q2hhcmdlZFRpZXJJRCgpIGNvbnN0IHsKKwkJcmV0dXJuICghX2N1cnJlbnRfbm9kZSkKKwkJCT8gMCA6IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3Q+KF9jdXJyZW50X25vZGUtPmRhdGFbMF0pOworCX0KK307CisKK2V4dGVybiAiQyIgdm9pZCBwdXNoQ2hhcmdlZFRpZXJOb2RlKHZta2l0OjpUaHJlYWQqIHRocmVhZCwKKwl2bWtpdDo6U3RhY2tFbWJlZGRlZExpc3ROb2RlKiBub2RlKTsKKworZXh0ZXJuICJDIiB2b2lkIHBvcENoYXJnZWRUaWVyTm9kZSh2bWtpdDo6VGhyZWFkKiB0aHJlYWQsCisJdm1raXQ6OlN0YWNrRW1iZWRkZWRMaXN0Tm9kZSogbm9kZSk7CisqLworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL3Zta2l0L1N0YWNrV2Fsa2VyLmggYi92bWtpdC9pbmNsdWRlL3Zta2l0L1N0YWNrV2Fsa2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwMWM0NgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L2luY2x1ZGUvdm1raXQvU3RhY2tXYWxrZXIuaApAQCAtMCwwICsxLDM2IEBACisKKyNpZm5kZWYgX1ZNS0lUX1NUQUNLX1dBTEtFUl9IXworI2RlZmluZSBfVk1LSVRfU1RBQ0tfV0FMS0VSX0hfCisKK25hbWVzcGFjZSB2bWtpdCB7CisKK2NsYXNzIFRocmVhZDsKK2NsYXNzIEtub3duRnJhbWU7CitjbGFzcyBGcmFtZUluZm87CisKKy8vLyBTdGFja1dhbGtlciAtIFRoaXMgY2xhc3Mgd2Fsa3MgdGhlIHN0YWNrIG9mIHRocmVhZHMsIHJldHVybmluZyBhIEZyYW1lSW5mbworLy8vIG9iamVjdCBhdCBlYWNoIGl0ZXJhdGlvbi4KKy8vLworY2xhc3MgU3RhY2tXYWxrZXIKK3sKK3B1YmxpYzoKKyAgd29yZF90IGNhbGxGcmFtZUFkZHJlc3M7CisgIHdvcmRfdCByZXR1cm5BZGRyZXNzOworICBLbm93bkZyYW1lKiBmcmFtZTsKKyAgVGhyZWFkKiB0aHJlYWQ7CisKKyAgU3RhY2tXYWxrZXIoKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKKyAgU3RhY2tXYWxrZXIoVGhyZWFkKiB0aCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CisgIHZvaWQgb3BlcmF0b3IrKygpOworICB3b3JkX3Qgb3BlcmF0b3IqKCk7CisgIEZyYW1lSW5mbyogZ2V0KCk7CisKKyAgRnJhbWVJbmZvKiBnZXROZXh0RnJhbWVXaXRoTWV0YWRhdGEoKTsKKyAgRnJhbWVJbmZvKiBnZXROZXh0RnJhbWVXaXRoTWV0YWRhdGEoc2l6ZV90JiB0b3RhbEZyYW1lU2l6ZVdpdGhvdXRNZXRhZGF0YSk7CisgIEZyYW1lSW5mbyogZ2V0TmV4dEZyYW1lV2l0aE1ldGFkYXRhKAorICAgIHdvcmRfdCYgY2FsbEZyYW1lQWRkcmVzcywgd29yZF90JiByZXR1cm5BZGRyZXNzLCBLbm93bkZyYW1lKiYgZnJhbWUpOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvdm1raXQvU3lzdGVtLmggYi92bWtpdC9pbmNsdWRlL3Zta2l0L1N5c3RlbS5oCmluZGV4IGJmMDU0OWQuLjEwMTE0M2QgMTAwNjQ0Ci0tLSBhL3Zta2l0L2luY2x1ZGUvdm1raXQvU3lzdGVtLmgKKysrIGIvdm1raXQvaW5jbHVkZS92bWtpdC9TeXN0ZW0uaApAQCAtMTcsNiArMTcsMTIgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgInZta2l0L2NvbmZpZy5oIgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKK2V4dGVybiAiQyIgdm9pZCBKbmp2bV9kdW1wR2xvYmFsU3RhdHMoKTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAjZGVmaW5lIExJTlVYX09TIDEKICNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQpAQCAtOTQsMTEgKzEwMCwzNiBAQAogCiBjb25zdCB3b3JkX3Qga0dDTWVtb3J5U2l6ZSA9IDB4MzAwMDAwMDA7CiAKKyNpZiBKQVZBX0NIQVJHRURfVElFUl9DQUxMX1NUQUNLCisKKyNkZWZpbmUgVFJZIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZta2l0OjpUaHJlYWQqIF9fY3VycmVudF90aHJlYWRfID0gdm1raXQ6OlRocmVhZDo6Z2V0KCk7ICAgICAgICBcCisJdm1raXQ6OlN0YWNrRW1iZWRkZWRMaXN0Tm9kZSogbm9kZSA9IF9fY3VycmVudF90aHJlYWRfLT4gICAgICAgIFwKKwkJc3RhY2tFbWJlZGRlZExpc3RIZWFkW3Zta2l0OjpTdGFja0VtYmVkZGVkTGlzdENoYXJnZWRUaWVyXTsgXAorCXZta2l0OjpFeGNlcHRpb25CdWZmZXIgX19idWZmZXJfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCFTRVRKTVAoX19idWZmZXJfXy5idWZmZXIpKQorCisjZGVmaW5lIENBVENICQllbHNlIHsgIFwKKwlfX2N1cnJlbnRfdGhyZWFkXy0+ICAgICBcCisJCXN0YWNrRW1iZWRkZWRMaXN0SGVhZFt2bWtpdDo6U3RhY2tFbWJlZGRlZExpc3RDaGFyZ2VkVGllcl0gPSBub2RlOworCisjZGVmaW5lIElHTk9SRSAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX19jdXJyZW50X3RocmVhZF8tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXN0YWNrRW1iZWRkZWRMaXN0SGVhZFt2bWtpdDo6U3RhY2tFbWJlZGRlZExpc3RDaGFyZ2VkVGllcl0gPSBub2RlOyBcCisJX19jdXJyZW50X3RocmVhZF8tPmNsZWFyRXhjZXB0aW9uKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9fQorCisjZGVmaW5lIEVORF9DQVRDSCB9fQorCisjZWxzZQorCiAjZGVmaW5lIFRSWSB7IHZta2l0OjpFeGNlcHRpb25CdWZmZXIgX19idWZmZXJfXzsgaWYgKCFTRVRKTVAoX19idWZmZXJfXy5idWZmZXIpKQogI2RlZmluZSBDQVRDSCBlbHNlCiAjZGVmaW5lIElHTk9SRSBlbHNlIHsgdm1raXQ6OlRocmVhZDo6Z2V0KCktPmNsZWFyRXhjZXB0aW9uKCk7IH19CiAjZGVmaW5lIEVORF9DQVRDSCB9CiAKKyNlbmRpZgorCiBjbGFzcyBTeXN0ZW0gewogcHVibGljOgogICBzdGF0aWMgYm9vbCBJc1dvcmRBbGlnbmVkKHdvcmRfdCBwdHIpIHsKQEAgLTE0OCw3ICsxNzksNyBAQAogICAgIHJldHVybiBwYWdlc2l6ZTsKICAgfQogCi0gIHN0YXRpYyB3b3JkX3QgR2V0Q2FsbGVyQWRkcmVzcygpIF9fYXR0cmlidXRlKChhbHdheXNfaW5saW5lKSkgeworICBzdGF0aWMgd29yZF90IEdldENhbGxGcmFtZUFkZHJlc3MoKSBfX2F0dHJpYnV0ZSgoYWx3YXlzX2lubGluZSkpIHsKICNpZiBkZWZpbmVkKEFSQ0hfWDg2KSB8fCBkZWZpbmVkKEFSQ0hfWDY0KQogICAgIHJldHVybiAod29yZF90KV9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOwogI2Vsc2UKQEAgLTE1NiwxNSArMTg3LDE1IEBACiAjZW5kaWYKICAgfQogCi0gIHN0YXRpYyB3b3JkX3QgR2V0Q2FsbGVyT2ZBZGRyZXNzKHdvcmRfdCBhZGRyKSB7Ci0gICAgcmV0dXJuICgod29yZF90KilhZGRyKVswXTsKKyAgc3RhdGljIHdvcmRfdCBHZXRDYWxsZXJDYWxsRnJhbWUod29yZF90IGN1cnJlbnRDYWxsRnJhbWUpIHsKKyAgICByZXR1cm4gKih3b3JkX3QqKWN1cnJlbnRDYWxsRnJhbWU7CiAgIH0KIAotICBzdGF0aWMgd29yZF90IEdldElQRnJvbUNhbGxlckFkZHJlc3Mod29yZF90IGFkZHIpIHsKKyAgc3RhdGljIHdvcmRfdCBHZXRSZXR1cm5BZGRyZXNzT2ZDYWxsRnJhbWUod29yZF90IGN1cnJlbnRDYWxsRnJhbWUpIHsKICNpZiBkZWZpbmVkKE1BQ09TX09TKSAmJiBkZWZpbmVkKEFSQ0hfUFBDKQotICAgIHJldHVybiAoKHdvcmRfdCopYWRkcilbMl07CisgICAgcmV0dXJuICgod29yZF90KiljdXJyZW50Q2FsbEZyYW1lKVsyXTsKICNlbHNlCi0gICAgcmV0dXJuICgod29yZF90KilhZGRyKVsxXTsKKyAgICByZXR1cm4gKCh3b3JkX3QqKWN1cnJlbnRDYWxsRnJhbWUpWzFdOwogI2VuZGlmCiAgIH0KIApAQCAtMjMzLDcgKzI2NCwxMSBAQAogICB9CiAKICAgc3RhdGljIHZvaWQgRXhpdChpbnQgdmFsdWUpIHsKLSAgICBfZXhpdCh2YWx1ZSk7CisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgSm5qdm1fZHVtcEdsb2JhbFN0YXRzKCk7CisjZW5kaWYKKworICBfZXhpdCh2YWx1ZSk7CiAgIH0KIAogICBzdGF0aWMgYm9vbCBTdXBwb3J0c0hhcmR3YXJlTnVsbENoZWNrKCk7CmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL3Zta2l0L1RocmVhZC5oIGIvdm1raXQvaW5jbHVkZS92bWtpdC9UaHJlYWQuaAppbmRleCA5YWY2ZTIzLi5kMzg2OTk0IDEwMDY0NAotLS0gYS92bWtpdC9pbmNsdWRlL3Zta2l0L1RocmVhZC5oCisrKyBiL3Zta2l0L2luY2x1ZGUvdm1raXQvVGhyZWFkLmgKQEAgLTE4LDcgKzE4LDExIEBACiAjaW5jbHVkZSAidHlwZXMuaCIKIAogI2luY2x1ZGUgInZta2l0L1N5c3RlbS5oIgorI2luY2x1ZGUgInZta2l0L1N0YWNrV2Fsa2VyLmgiCiAKKyNpZiBFTUJFRERFRF9MSVNUX0lOX0NBTExfU1RBQ0sKKyNpbmNsdWRlICJ2bWtpdC9TdGFja0VtYmVkZGVkTGlzdC5oIgorI2VuZGlmCiAKIG5hbWVzcGFjZSB2bWtpdCB7CiAKQEAgLTExNyw2ICsxMjEsMTQgQEAKICAgVGhyZWFkKCkgewogICAgIGxhc3RFeGNlcHRpb25CdWZmZXIgPSAwOwogICAgIGxhc3RLbm93bkZyYW1lID0gMDsKKworI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKyAgICBzdGFja0VtYmVkZGVkTGlzdEhlYWRbU3RhY2tFbWJlZGRlZExpc3RDaGFyZ2VkVGllcl0gPSBudWxscHRyOworI2VuZGlmCisKKyNpZiBNT05JVE9SX0NSRUFURURfT0JKRUNUU19DT1VOVAorICAgIHRvdGFsX2NhbGxlZF9tZXRob2RzX2NvdW50ID0gMDsKKyNlbmRpZgogICB9CiAKICAgLy8vIHlpZWxkIC0gWWllbGQgdGhlIHByb2Nlc3NvciB0byBhbm90aGVyIHRocmVhZC4KQEAgLTE3Miw3ICsxODQsNyBAQAogICAvLy8gZ2V0IC0gR2V0IHRoZSB0aHJlYWQgc3BlY2lmaWMgZGF0YSBvZiB0aGUgY3VycmVudCB0aHJlYWQuCiAgIC8vLwogICBzdGF0aWMgVGhyZWFkKiBnZXQoKSB7Ci0gICAgcmV0dXJuIChUaHJlYWQqKShTeXN0ZW06OkdldENhbGxlckFkZHJlc3MoKSAmIFN5c3RlbTo6R2V0VGhyZWFkSURNYXNrKCkpOworICAgIHJldHVybiAoVGhyZWFkKikoU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCkgJiBTeXN0ZW06OkdldFRocmVhZElETWFzaygpKTsKICAgfQogICAKIHByaXZhdGU6CkBAIC0yMzksNyArMjUxLDcgQEAKICAgLy8vIHN0YWNrT3ZlcmZsb3cgLSBSZXR1cm5zIGlmIHRoZXJlIGlzIGEgc3RhY2sgb3ZlcmZsb3cgaW4gSmF2YSBsYW5kLgogICAvLy8KICAgYm9vbCBzdGFja092ZXJmbG93KCkgewotICAgIHJldHVybiAoU3lzdGVtOjpHZXRDYWxsZXJBZGRyZXNzKCkgJiBTdGFja092ZXJmbG93TWFzaykgPT0gMDsKKyAgICByZXR1cm4gKFN5c3RlbTo6R2V0Q2FsbEZyYW1lQWRkcmVzcygpICYgU3RhY2tPdmVyZmxvd01hc2spID09IDA7CiAgIH0KIAogICAvLy8gb3BlcmF0b3IgbmV3IC0gQWxsb2NhdGUgdGhlIFRocmVhZCBvYmplY3QgYXMgd2VsbCBhcyB0aGUgc3RhY2sgZm9yIHRoaXMKQEAgLTI3Niw2ICsyODgsMjUgQEAKICAgLy8vCiAgIEV4Y2VwdGlvbkJ1ZmZlciogbGFzdEV4Y2VwdGlvbkJ1ZmZlcjsKIAorI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKyAgdWludDMyX3QJY2hhcmdlZFRpZXJJRDsKKyNlbHNlCisgIHVpbnQzMl90CXVudXNlZF8xOworI2VuZGlmCisKKyNpZiBFTUJFRERFRF9MSVNUX0lOX0NBTExfU1RBQ0sKKyAgU3RhY2tFbWJlZGRlZExpc3ROb2RlKgorICAgIHN0YWNrRW1iZWRkZWRMaXN0SGVhZFtTdGFja0VtYmVkZGVkTGlzdE5vZGVDb3VudFBlclRocmVhZF07CisjZWxzZQorICB2b2lkKgl1bnVzZWRfMlsxXTsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgdWludDY0X3QgdG90YWxfY2FsbGVkX21ldGhvZHNfY291bnQ7CisjZWxzZQorICB1aW50NjRfdCB1bnVzZWRfMzsKKyNlbmRpZgorCiAgIHZvaWQgaW50ZXJuYWxUaHJvd0V4Y2VwdGlvbigpOwogCiAgIHZvaWQgc3RhcnRLbm93bkZyYW1lKEtub3duRnJhbWUmIEYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwpAQCAtMzI2LDIzICszNTcsNiBAQAogICBFeGNlcHRpb25CdWZmZXIqIHByZXZpb3VzQnVmZmVyOwogfTsKIAotLy8vIFN0YWNrV2Fsa2VyIC0gVGhpcyBjbGFzcyB3YWxrcyB0aGUgc3RhY2sgb2YgdGhyZWFkcywgcmV0dXJuaW5nIGEgRnJhbWVJbmZvCi0vLy8gb2JqZWN0IGF0IGVhY2ggaXRlcmF0aW9uLgotLy8vCi1jbGFzcyBTdGFja1dhbGtlciB7Ci1wdWJsaWM6Ci0gIHdvcmRfdCBhZGRyOwotICB3b3JkX3QgaXA7Ci0gIEtub3duRnJhbWUqIGZyYW1lOwotICB2bWtpdDo6VGhyZWFkKiB0aHJlYWQ7Ci0KLSAgU3RhY2tXYWxrZXIodm1raXQ6OlRocmVhZCogdGgpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgd29yZF90IG9wZXJhdG9yKigpOwotICBGcmFtZUluZm8qIGdldCgpOwotCi19OwotCiAKIH0gLy8gZW5kIG5hbWVzcGFjZSB2bWtpdAogI2VuZGlmIC8vIFZNS0lUX1RIUkVBRF9ICmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL3Zta2l0L1VURjguaCBiL3Zta2l0L2luY2x1ZGUvdm1raXQvVVRGOC5oCmluZGV4IDY2MTI0ZjAuLmNkNWViOWIgMTAwNjQ0Ci0tLSBhL3Zta2l0L2luY2x1ZGUvdm1raXQvVVRGOC5oCisrKyBiL3Zta2l0L2luY2x1ZGUvdm1raXQvVVRGOC5oCkBAIC0xMiw2ICsxMiwyNSBAQAogCiBjbGFzcyBVVEY4TWFwOwogCit0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CitpbnQgY29tcGFyZV9udWxsX3Rlcm1pbmF0ZWRfYXJyYXlzKGNvbnN0IFQxKiBhcnJheTEsIHNpemVfdCBzaXplMSwgY29uc3QgVDIqIGFycmF5Miwgc2l6ZV90IHNpemUyKQoreworCS8vIE5VTEwgYXJyYXkgaXMgdHJlYXRlZCBhcyBlbXB0eQorCWlmICghYXJyYXkxKSBzaXplMSA9IDA7CisJaWYgKCFhcnJheTIpIHNpemUyID0gMDsKKworCS8vIENvbXB1dGUgcmVhbCBzaXplcywgZXhjbHVkaW5nIG51bGwgdGVybWluYXRvcnMKKwlmb3IgKDsgKHNpemUxICE9IDApICYmIChhcnJheTFbc2l6ZTEgLSAxXSA9PSAwKTsgLS1zaXplMSk7CisJZm9yICg7IChzaXplMiAhPSAwKSAmJiAoYXJyYXkyW3NpemUyIC0gMV0gPT0gMCk7IC0tc2l6ZTIpOworCisJaW50IGRpZmYgPSBzaXplMSAtIHNpemUyOwkvLyBDb21wYXJlIHNpemVzCisJaWYgKGRpZmYgPT0gMCkgewkvLyBFcXVhbCBzaXplcywgY29tcGFyZSBjb250ZW50cworCQlmb3IgKDsgKHNpemUxICE9IDApICYmIChkaWZmID09IDApOyAtLXNpemUxLCArK2FycmF5MSwgKythcnJheTIpCisJCQlkaWZmID0gKmFycmF5MSAtICphcnJheTI7CisJfQorCXJldHVybiBkaWZmOworfQorCiBjbGFzcyBVVEY4IHsKICAgZnJpZW5kIGNsYXNzIFVURjhNYXA7CiBwcml2YXRlOgpAQCAtMzYsOCArNTUsNyBAQAogICAvLy8gZXF1YWxzIC0gQXJlIHRoZSB0d28gVVRGOHMgZXF1YWw/CiAgIGJvb2wgZXF1YWxzKGNvbnN0IFVURjgqIG90aGVyKSBjb25zdCB7CiAgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKHNpemUgIT0gb3RoZXItPnNpemUpIHJldHVybiBmYWxzZTsKLSAgICBlbHNlIHJldHVybiAhbWVtY21wKGVsZW1lbnRzLCBvdGhlci0+ZWxlbWVudHMsIHNpemUgKiBzaXplb2YodWludDE2KSk7CisgICAgcmV0dXJuICgqdGhpcykgPT0gKCpvdGhlcik7CiAgIH0KICAgCiAgIC8vLyBlcXVhbHMgLSBEb2VzIHRoZSBVVEY4IGVxdWFsIHRvIHRoZSBidWZmZXI/IApAQCAtNDcsMTIgKzY1LDggQEAKICAgfQogCiAgIC8vLyBsZXNzVGhhbiAtIHN0cmNtcC1saWtlIGZ1bmN0aW9uIGZvciBVVEY4cywgdXNlZCBieSBoYXNoIHRhYmxlcy4KLSAgYm9vbCBsZXNzVGhhbihjb25zdCBVVEY4KiBvdGhlcikgY29uc3QgewotICAgIGlmIChzaXplIDwgb3RoZXItPnNpemUpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKHNpemUgPiBvdGhlci0+c2l6ZSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgcmV0dXJuIG1lbWNtcCgoY29uc3QgY2hhciopZWxlbWVudHMsIChjb25zdCBjaGFyKilvdGhlci0+ZWxlbWVudHMsIAotICAgICAgICAgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKHVpbnQxNikpIDwgMDsKLSAgfQorICBib29sIGxlc3NUaGFuKGNvbnN0IFVURjgqIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuICgqdGhpcykgPCAoKm90aGVyKTsgfQogCiAJc3RhdGljIHVpbnQzMl90IHJlYWRlckhhc2hlcihjb25zdCB1aW50MTYqIGJ1Ziwgc2ludDMyIHNpemUpOwogCQpAQCAtNjQsOSArNzgsMjYgQEAKICAgICBzaXplID0gbjsKICAgfQogCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIDwgKGNvbnN0IFVURjgmIHN0cjEsIGNvbnN0IFVURjgmIHN0cjIpIHsKKyAgICByZXR1cm4gVVRGODo6Y29tcGFyZSgmc3RyMSwgJnN0cjIpIDwgMDsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgVVRGOCYgc3RyMSwgY29uc3QgVVRGOCYgc3RyMikgeworICAgIHJldHVybiBVVEY4Ojpjb21wYXJlKCZzdHIxLCAmc3RyMikgPT0gMDsKKyAgfQogICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiwgY29uc3QgVVRGOCYpOworCiAgIHZvaWQgZHVtcCgpIGNvbnN0IF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci0gIGludCBjb21wYXJlKGNvbnN0IGNoYXIgKikgY29uc3Q7CisgIGludCBjb21wYXJlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbmd0aCA9IC0xKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVfbnVsbF90ZXJtaW5hdGVkX2FycmF5cygKKyAgICAgIGVsZW1lbnRzLCBzaXplLCBzdHIsIChsZW5ndGggPT0gLTEpID8gc3RybGVuKHN0cikgOiBsZW5ndGgpOworICB9CisgIGludCBjb21wYXJlKGNvbnN0IFVURjgmIHN0cikgY29uc3Qge3JldHVybiBVVEY4Ojpjb21wYXJlKHRoaXMsICZzdHIpO30KKyAgc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFVURjgqIHN0cjEsIGNvbnN0IFVURjgqIHN0cjIpIHsKKyAgICBpZiAoIXN0cjEgJiYgIXN0cjIpIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlX251bGxfdGVybWluYXRlZF9hcnJheXMoCisgICAgCSghc3RyMSA/IE5VTEwgOiBzdHIxLT5lbGVtZW50cyksICghc3RyMSA/IDAgOiBzdHIxLT5zaXplKSwKKyAgICAJKCFzdHIyID8gTlVMTCA6IHN0cjItPmVsZW1lbnRzKSwgKCFzdHIyID8gMCA6IHN0cjItPnNpemUpKTsKKyAgfQogICBzdGQ6OnN0cmluZyYgdG9TdHJpbmcoc3RkOjpzdHJpbmcmIGJ1ZmZlcikgY29uc3Q7CiB9OwogCkBAIC04Myw2ICsxMTQsMTMgQEAKICAgfQogfTsKIAorY2xhc3MgVVRGOF9Db21wYXJhdG9yIHsKK3B1YmxpYzoKKwlib29sIG9wZXJhdG9yKCkgKGNvbnN0IFVURjgqIHN0cjEsIGNvbnN0IFVURjgqIHN0cjIpIGNvbnN0IHsKKwkJcmV0dXJuICgqc3RyMSkgPCAoKnN0cjIpOworCX0KK307CisKIC8vIFByb3ZpZGUgVm1raXREZW5zZU1hcEluZm8gZm9yIFVURjguCiB0ZW1wbGF0ZTw+CiBzdHJ1Y3QgVm1raXREZW5zZU1hcEluZm88Y29uc3QgVVRGOCo+IHsKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvdm1raXQvVmlydHVhbE1hY2hpbmUuaCBiL3Zta2l0L2luY2x1ZGUvdm1raXQvVmlydHVhbE1hY2hpbmUuaAppbmRleCA4OWE4NGRiLi5jOGIwZWM1IDEwMDY0NAotLS0gYS92bWtpdC9pbmNsdWRlL3Zta2l0L1ZpcnR1YWxNYWNoaW5lLmgKKysrIGIvdm1raXQvaW5jbHVkZS92bWtpdC9WaXJ0dWFsTWFjaGluZS5oCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSAidm1raXQvTG9ja3MuaCIKICNpbmNsdWRlICJ2bWtpdC9HQy5oIgogCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxtYXA+Ci0KIG5hbWVzcGFjZSB2bWtpdCB7CiAKIGNsYXNzIENvbXBpbGVkRnJhbWVzOwpAQCAtMTA0LDcgKzEwMSw3IEBACiAKICAgLy8vIGRvRXhpdCAtIFNob3VsZCB0aGUgVk0gZXhpdCBub3c/CiAgIGJvb2wgZG9FeGl0OwotICAKKwogICAvLy8gc2V0TWFpblRocmVhZCAtIFNldCB0aGUgbWFpbiB0aHJlYWQgb2YgdGhpcyBWTS4KICAgLy8vCiAgIHZvaWQgc2V0TWFpblRocmVhZCh2bWtpdDo6VGhyZWFkKiB0aCkgeyBtYWluVGhyZWFkID0gdGg7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvdm1raXQvY29uZmlnLmggYi92bWtpdC9pbmNsdWRlL3Zta2l0L2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGY0NTgKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9pbmNsdWRlL3Zta2l0L2NvbmZpZy5oCkBAIC0wLDAgKzEsOSBAQAorLyogaW5jbHVkZS92bWtpdC9jb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisjZGVmaW5lIE9TR0lfT0JKRUNUX1RJRVJfVEFHR0lORyAgICAgICAgICAgIDEKKyNkZWZpbmUgT1NHSV9CVU5ETEVfU1RBVEVfSU5GTyAgICAgICAgICAgICAgMQorI2RlZmluZSBFTUJFRERFRF9MSVNUX0lOX0NBTExfU1RBQ0sgICAgICAgICAxCisjZGVmaW5lIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sgICAgICAgIDEKKyNkZWZpbmUgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HICAgICAgICAgICAgMQorI2RlZmluZSBPU0dJX1NUQUNLX1NQQUNFX1RJRVJfVEFHR0lORyAgICAgICAxCisjZGVmaW5lIEVNQkVEREVEX0xJU1RfVVBEQVRFICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQgICAgICAgMApkaWZmIC0tZ2l0IGEvdm1raXQvaW5jbHVkZS92bWtpdC9jb25maWcuaC5pbiBiL3Zta2l0L2luY2x1ZGUvdm1raXQvY29uZmlnLmguaW4KaW5kZXggZTY5ZGUyOS4uYzExOTQ0OCAxMDA2NDQKLS0tIGEvdm1raXQvaW5jbHVkZS92bWtpdC9jb25maWcuaC5pbgorKysgYi92bWtpdC9pbmNsdWRlL3Zta2l0L2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcgICAgICAgICAgICAwCisjZGVmaW5lIE9TR0lfQlVORExFX1NUQVRFX0lORk8gICAgICAgICAgICAgIDAKKyNkZWZpbmUgRU1CRURERURfTElTVF9JTl9DQUxMX1NUQUNLICAgICAgICAgMAorI2RlZmluZSBKQVZBX0NIQVJHRURfVElFUl9DQUxMX1NUQUNLICAgICAgICAwCisjZGVmaW5lIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORyAgICAgICAgICAgIDAKKyNkZWZpbmUgT1NHSV9TVEFDS19TUEFDRV9USUVSX1RBR0dJTkcgICAgICAgMAorI2RlZmluZSBFTUJFRERFRF9MSVNUX1VQREFURSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PTklUT1JfQ1JFQVRFRF9PQkpFQ1RTX0NPVU5UICAgICAgIDAKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvdm1raXQvY29uZmlnLmguaW4ub3JpZyBiL3Zta2l0L2luY2x1ZGUvdm1raXQvY29uZmlnLmguaW4ub3JpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0MjFjOC4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL3Zta2l0L2NvbmZpZy5oLmluLm9yaWcKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBpbmNsdWRlL3Zta2l0L2NvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gYXV0b2NvbmYvY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgaW50NjRfdCcuICovCi0jdW5kZWYgSEFWRV9JTlQ2NF9UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9JTlRUWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KLSN1bmRlZiBIQVZFX0xJQloKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb25nam1wJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0xPTkdKTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGptcCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRKTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERJTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVpbnQ2NF90Jy4gKi8KLSN1bmRlZiBIQVZFX1VJTlQ2NF9UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVfaW50NjRfdCcuICovCi0jdW5kZWYgSEFWRV9VX0lOVDY0X1QKLQotLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCi0jdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9TVFJJTkcKLQotLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVVJMCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9WRVJTSU9OCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBgc3RydWN0IHRtJy4gKi8KLSN1bmRlZiBUTV9JTl9TWVNfVElNRQotCi0vKiBCdWlsZGluZyBvbiBhIHBsYXRmb3JtIHdpdGggNjRiaXQgY2FzICovCi0jdW5kZWYgV0lUSF82NAotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCi0jdW5kZWYgcGlkX3QKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwotI3VuZGVmIHNpemVfdApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL0NsYXNzTGliL0dOVUNsYXNzcGF0aC9DbGFzc3BhdGhWTU1ldGhvZC5pbmMgYi92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0NsYXNzcGF0aFZNTWV0aG9kLmluYwppbmRleCBmZjc0NTI5Li43ODdlNGIwIDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0NsYXNzcGF0aFZNTWV0aG9kLmluYworKysgYi92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0NsYXNzcGF0aFZNTWV0aG9kLmluYwpAQCAtMjg5LDYgKzI4OSw3IEBACiAKICAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwogICBKYXZhTWV0aG9kKiBtZXRoID0gSmF2YU9iamVjdFZNTWV0aG9kOjpnZXRJbnRlcm5hbE1ldGhvZChNZXRoKTsKKwogICBVc2VyQ29tbW9uQ2xhc3MqIF9jbCA9ICAoVXNlckNvbW1vbkNsYXNzKilKYXZhT2JqZWN0Vk1NZXRob2Q6OmdldENsYXNzKE1ldGgpOwogCiAgIHNpbnQzMiBuYkFyZ3MgPSBhcmdzID8gQXJyYXlPYmplY3Q6OmdldFNpemUoYXJncykgOiAwOwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL0NsYXNzTGliL0dOVUNsYXNzcGF0aC9KYXZhVXBjYWxscy5jcHAgYi92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0phdmFVcGNhbGxzLmNwcAppbmRleCA0Yzk2ZDVkLi44MjU1Y2Y4IDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0phdmFVcGNhbGxzLmNwcAorKysgYi92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0phdmFVcGNhbGxzLmNwcApAQCAtMjA2LDYgKzIwNiw3IEBACiBKYXZhTWV0aG9kKiBDbGFzc3BhdGg6OkluaXRDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIEphdmFNZXRob2QqIENsYXNzcGF0aDo6SW5pdE9iamVjdDsKIEphdmFNZXRob2QqIENsYXNzcGF0aDo6RmluYWxpemVPYmplY3Q7CitKYXZhTWV0aG9kKiBDbGFzc3BhdGg6OnRvU3RyaW5nOwogSmF2YU1ldGhvZCogQ2xhc3NwYXRoOjpJbnRUb1N0cmluZzsKIAogSmF2YU1ldGhvZCogQ2xhc3NwYXRoOjpTeXN0ZW1BcnJheWNvcHk7CkBAIC05MDUsNiArOTA2LDkgQEAKICAgCiAgIEZpbmFsaXplT2JqZWN0ID0gVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvT2JqZWN0IiwgImZpbmFsaXplIiwgIigpViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0NfVklSVFVBTCk7CisKKyAgdG9TdHJpbmcgPSBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9PYmplY3QiLCAidG9TdHJpbmciLAorICAgICAgICAgICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsIEFDQ19WSVJUVUFMKTsKICAgCiAgIEludFRvU3RyaW5nID0gVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvSW50ZWdlciIsICJ0b1N0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsIEFDQ19TVEFUSUMpOwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL0NsYXNzTGliL0dOVUNsYXNzcGF0aC9KYXZhVXBjYWxscy5oIGIvdm1raXQvbGliL2ozL0NsYXNzTGliL0dOVUNsYXNzcGF0aC9KYXZhVXBjYWxscy5oCmluZGV4IDhlMWMzMWEuLjIzOTU5OTQgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9DbGFzc0xpYi9HTlVDbGFzc3BhdGgvSmF2YVVwY2FsbHMuaAorKysgYi92bWtpdC9saWIvajMvQ2xhc3NMaWIvR05VQ2xhc3NwYXRoL0phdmFVcGNhbGxzLmgKQEAgLTI1MSw2ICsyNTEsNyBAQAogCiAgIElTT0xBVEVfU1RBVElDIEphdmFNZXRob2QqIEluaXRPYmplY3Q7CiAgIElTT0xBVEVfU1RBVElDIEphdmFNZXRob2QqIEZpbmFsaXplT2JqZWN0OworICBJU09MQVRFX1NUQVRJQyBKYXZhTWV0aG9kKiB0b1N0cmluZzsKIAogICBJU09MQVRFX1NUQVRJQyBKYXZhTWV0aG9kKiBFcnJvcldpdGhFeGNwTm9DbGFzc0RlZkZvdW5kRXJyb3I7CiAgIElTT0xBVEVfU1RBVElDIEphdmFNZXRob2QqIEVycm9yV2l0aEV4Y3BFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3I7CmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvQ2xhc3NMaWIvT3BlbkpESy9KYXZhVXBjYWxscy5jcHAgYi92bWtpdC9saWIvajMvQ2xhc3NMaWIvT3BlbkpESy9KYXZhVXBjYWxscy5jcHAKaW5kZXggNDg4Mzg0NS4uM2U1NDNkOCAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL0NsYXNzTGliL09wZW5KREsvSmF2YVVwY2FsbHMuY3BwCisrKyBiL3Zta2l0L2xpYi9qMy9DbGFzc0xpYi9PcGVuSkRLL0phdmFVcGNhbGxzLmNwcApAQCAtMTk3LDYgKzE5Nyw3IEBACiBKYXZhTWV0aG9kKiBDbGFzc3BhdGg6OkluaXRDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIEphdmFNZXRob2QqIENsYXNzcGF0aDo6SW5pdE9iamVjdDsKIEphdmFNZXRob2QqIENsYXNzcGF0aDo6RmluYWxpemVPYmplY3Q7CitKYXZhTWV0aG9kKiBDbGFzc3BhdGg6OnRvU3RyaW5nOwogSmF2YU1ldGhvZCogQ2xhc3NwYXRoOjpJbnRUb1N0cmluZzsKIAogSmF2YU1ldGhvZCogQ2xhc3NwYXRoOjpTeXN0ZW1BcnJheWNvcHk7CkBAIC03ODcsNiArNzg4LDkgQEAKICAgRmluYWxpemVPYmplY3QgPSBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9PYmplY3QiLCAiZmluYWxpemUiLCAiKClWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ19WSVJUVUFMKTsKIAorICB0b1N0cmluZyA9IFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL09iamVjdCIsICJ0b1N0cmluZyIsCisgICAgICAgICAgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgQUNDX1ZJUlRVQUwpOworCiAgIEludFRvU3RyaW5nID0gVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvSW50ZWdlciIsICJ0b1N0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsIEFDQ19TVEFUSUMpOwogCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvQ2xhc3NMaWIvT3BlbkpESy9KYXZhVXBjYWxscy5oIGIvdm1raXQvbGliL2ozL0NsYXNzTGliL09wZW5KREsvSmF2YVVwY2FsbHMuaAppbmRleCA2OTBkMDFhLi5iNzBjN2VhIDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvQ2xhc3NMaWIvT3BlbkpESy9KYXZhVXBjYWxscy5oCisrKyBiL3Zta2l0L2xpYi9qMy9DbGFzc0xpYi9PcGVuSkRLL0phdmFVcGNhbGxzLmgKQEAgLTI0MCw2ICsyNDAsNyBAQAogCiAgIElTT0xBVEVfU1RBVElDIEphdmFNZXRob2QqIEluaXRPYmplY3Q7CiAgIElTT0xBVEVfU1RBVElDIEphdmFNZXRob2QqIEZpbmFsaXplT2JqZWN0OworICBJU09MQVRFX1NUQVRJQyBKYXZhTWV0aG9kKiB0b1N0cmluZzsKIAogICBJU09MQVRFX1NUQVRJQyBKYXZhTWV0aG9kKiBFcnJvcldpdGhFeGNwTm9DbGFzc0RlZkZvdW5kRXJyb3I7CiAgIElTT0xBVEVfU1RBVElDIEphdmFNZXRob2QqIEVycm9yV2l0aEV4Y3BFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3I7CmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvQ29tcGlsZXIvSjNJbnRyaW5zaWNzLmNwcCBiL3Zta2l0L2xpYi9qMy9Db21waWxlci9KM0ludHJpbnNpY3MuY3BwCmluZGV4IDc1NTEzZjEuLmU2OGI4OGEgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KM0ludHJpbnNpY3MuY3BwCisrKyBiL3Zta2l0L2xpYi9qMy9Db21waWxlci9KM0ludHJpbnNpY3MuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiB1c2luZyBuYW1lc3BhY2UgajM7CiB1c2luZyBuYW1lc3BhY2UgbGx2bTsKIAorCiBuYW1lc3BhY2UgajMgeyAKICAgbmFtZXNwYWNlIGxsdm1fcnVudGltZSB7IAogICAgICNpbmNsdWRlICJMTFZNUnVudGltZS5pbmMiCkBAIC00Nyw2ICs0OCw5IEBACiAKICAgUmVzb2x2ZWRDb25zdGFudFBvb2xUeXBlID0gcHRyUHRyVHlwZTsKICAKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgVGllcklEVHlwZSA9IEludGVnZXJUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpOworI2VuZGlmCiAKICAgT2JqZWN0SGVhZGVyVHlwZSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRQb2ludGVyU2l6ZSgpID09IE1vZHVsZTo6UG9pbnRlcjMyID8KICAgCQkgICAgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSA6IFR5cGU6OmdldEludDY0VHkoQ29udGV4dCkpOwpAQCAtOTksMTUgKzEwMywyMSBAQAogICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJVVEY4IikpOwogICBBdHRyaWJ1dGVUeXBlID0KICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiQXR0cmlidXRlIikpOworICBUaHJlYWRUeXBlID0KKyAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiVGhyZWFkIikpOwogICBKYXZhVGhyZWFkVHlwZSA9CiAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkphdmFUaHJlYWQiKSk7CiAgIE11dGF0b3JUaHJlYWRUeXBlID0KICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiTXV0YXRvclRocmVhZCIpKTsKICAgCisjaWYgRU1CRURERURfTElTVF9JTl9DQUxMX1NUQUNLCisgIFN0YWNrRW1iZWRkZWRMaXN0Tm9kZVR5cGUgPQorICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJTdGFja0VtYmVkZGVkTGlzdE5vZGUiKSk7CisjZW5kaWYKKwogICBKM0RlbnNlTWFwVHlwZSA9CiAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkozRGVuc2VNYXAiKSk7Ci0gIAotICAKKwogICBKYXZhT2JqZWN0TnVsbENvbnN0YW50ID0KICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEozSW50cmluc2ljczo6SmF2YU9iamVjdFR5cGUpOwogICBNYXhBcnJheVNpemVDb25zdGFudCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwKQEAgLTEyNSw2ICsxMzUsOSBAQAogCiAgIEphdmFPYmplY3RWVE9mZnNldENvbnN0YW50ID0gY29uc3RhbnRaZXJvOwogCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIEludmFsaWRUaWVySURDb25zdGFudCA9IGNvbnN0YW50TWludXNPbmU7CisjZW5kaWYKIAogICBPZmZzZXRDbGFzc0luVlRDb25zdGFudCA9CiAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLApAQCAtMTUyLDYgKzE2NSwxNiBAQAogICBPZmZzZXRCYXNlQ2xhc3NJbkFycmF5Q2xhc3NDb25zdGFudCA9IGNvbnN0YW50T25lOwogICBPZmZzZXRMb2dTaXplSW5QcmltaXRpdmVDbGFzc0NvbnN0YW50ID0gY29uc3RhbnRPbmU7CiAKKyAgT2Zmc2V0T2Zmc2V0SW5KYXZhTWV0aG9kQ29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDkpOworCisjaWYgRU1CRURERURfTElTVF9JTl9DQUxMX1NUQUNLCisgIE9mZnNldENhbGxlck5vZGVJblN0YWNrRW1iZWRkZWRMaXN0Tm9kZUNvbnN0YW50CT0gY29uc3RhbnRaZXJvOworICBPZmZzZXREYXRhSW5TdGFja0VtYmVkZGVkTGlzdE5vZGVDb25zdGFudAkJCT0gY29uc3RhbnRPbmU7CisgIE9mZnNldFN0YWNrRW1iZWRkZWRMaXN0SGVhZEluVGhyZWFkQ29uc3RhbnQgPQlDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDEzKTsKKyNlbmRpZgorCisgIGNvbnN0YW50TnVsbEphdmFNZXRob2RQdHIgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHRoaXMtPkphdmFNZXRob2RUeXBlKTsKKwogICBPZmZzZXRPYmplY3RTaXplSW5DbGFzc0NvbnN0YW50ID0gY29uc3RhbnRPbmU7CiAgIE9mZnNldFZUSW5DbGFzc0NvbnN0YW50ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCA3KTsKICAgT2Zmc2V0VGFza0NsYXNzTWlycm9ySW5DbGFzc0NvbnN0YW50ID0gY29uc3RhbnRUaHJlZTsKQEAgLTE2Niw2ICsxODksMTAgQEAKICAgT2Zmc2V0Sk5JSW5KYXZhVGhyZWFkQ29uc3RhbnQgPSAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAxKTsKICAgT2Zmc2V0SmF2YUV4Y2VwdGlvbkluSmF2YVRocmVhZENvbnN0YW50ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAyKTsKIAorI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICBPZmZzZXRDaGFyZ2VkVGllcklESW5UaHJlYWRDb25zdGFudCA9ICAgICAJQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAxMik7CisjZW5kaWYKKwogICBDbGFzc1JlYWR5Q29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgcmVhZHkpOwogICAKICAgSW50ZXJmYWNlTG9va3VwRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM0ludGVyZmFjZUxvb2t1cCIpOwpAQCAtMjQ2LDUgKzI3MywxNSBAQAogICBHZXRMb2NrRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRMb2NrIik7CiAgIFRocm93RXhjZXB0aW9uRnJvbUpJVEZ1bmN0aW9uID0KICAgICBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM1Rocm93RXhjZXB0aW9uRnJvbUpJVCIpOyAKKworI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKyAgUHVzaENoYXJnZWRUaWVyTm9kZUZ1bmN0aW9uCT0gbW9kdWxlLT5nZXRGdW5jdGlvbigicHVzaENoYXJnZWRUaWVyTm9kZSIpOworICBQb3BDaGFyZ2VkVGllck5vZGVGdW5jdGlvbgk9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oInBvcENoYXJnZWRUaWVyTm9kZSIpOworI2VuZGlmCisKKyNpZiBNT05JVE9SX0NSRUFURURfT0JKRUNUU19DT1VOVAorICBPZmZzZXRUb3RhbENhbGxlZE1ldGhvZHNDb3VudGVySW5UaHJlYWQgPQorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMTQpOworI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhQU9UQ29tcGlsZXIuY3BwIGIvdm1raXQvbGliL2ozL0NvbXBpbGVyL0phdmFBT1RDb21waWxlci5jcHAKaW5kZXggYzdlYmQ3MC4uYmI4ZWVlMyAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL0NvbXBpbGVyL0phdmFBT1RDb21waWxlci5jcHAKKysrIGIvdm1raXQvbGliL2ozL0NvbXBpbGVyL0phdmFBT1RDb21waWxlci5jcHAKQEAgLTIxNDMsNyArMjE0Myw4IEBACiAKICAgSmF2YUpJVENvbXBpbGVyKiBDb21wID0gTlVMTDsKICAgaWYgKCFNLT5jbGluaXRzLT5lbXB0eSgpKSB7Ci0gICAgQ29tcCA9IEphdmFKSVRDb21waWxlcjo6Q3JlYXRlQ29tcGlsZXIoIkpJVCIpOworICAgIENvbXAgPSBKYXZhSklUQ29tcGlsZXI6OkNyZWF0ZUNvbXBpbGVyKAorICAgICAgIkpJVCIsIE0tPmlzQ29tcGlsaW5nR2FyYmFnZUNvbGxlY3RvcigpKTsKICAgICBDb21wLT5FbWl0RnVuY3Rpb25OYW1lID0gdHJ1ZTsKICAgICBpZiAoIU0tPnVzZUNvb3BlcmF0aXZlR0MoKSkgewogICAgICAgQ29tcC0+ZGlzYWJsZUNvb3BlcmF0aXZlR0MoKTsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhSklULmNwcCBiL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhSklULmNwcAppbmRleCA4N2ZkM2UyLi5kM2EzNmZjIDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvQ29tcGlsZXIvSmF2YUpJVC5jcHAKKysrIGIvdm1raXQvbGliL2ozL0NvbXBpbGVyL0phdmFKSVQuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkYXJnPgogCiAjaW5jbHVkZSA8bGx2bS9JUi9Db25zdGFudHMuaD4KICNpbmNsdWRlIDxsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oPgpAQCAtNDcsNiArNDgsNTkgQEAKIHVzaW5nIG5hbWVzcGFjZSBsbHZtOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorI2lmIE1PTklUT1JfQ1JFQVRFRF9PQkpFQ1RTX0NPVU5UCisKK3ZvaWQgSmF2YUpJVDo6aW5jcmVtZW50VG90YWxDYWxsZWRNZXRob2RzQ291bnRlcigpCit7CisJaWYgKFRoZUNvbXBpbGVyLT5pc0NvbXBpbGluZ0dhcmJhZ2VDb2xsZWN0b3IoKSkgcmV0dXJuOworCisJYXV0byBUb3RhbENhbGxlZE1ldGhvZHNDb3VudFB0ciA9IGdldEVsZW1lbnRQdHIoCisJCSJUb3RhbENhbGxlZE1ldGhvZHNDb3VudFB0ciIsIGdldFRocmVhZFB0cigpLCBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCisJCWludHJpbnNpY3MtPk9mZnNldFRvdGFsQ2FsbGVkTWV0aG9kc0NvdW50ZXJJblRocmVhZCwgbnVsbHB0cik7CisKKwlhdXRvIHZhbHVlX3R5cGUgPQorCQlUb3RhbENhbGxlZE1ldGhvZHNDb3VudFB0ci0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyRWxlbWVudFR5cGUoKTsKKwlhdXRvIHVpNjRfb25lID0gQ29uc3RhbnRJbnQ6OmdldCh2YWx1ZV90eXBlLCAxKTsKKwlhdXRvIG9sZF92YWwgPSBuZXcgTG9hZEluc3QoVG90YWxDYWxsZWRNZXRob2RzQ291bnRQdHIsCisJCSJUb3RhbENhbGxlZE1ldGhvZHNDb3VudE9sZFZhbHVlIiwgY3VycmVudEJsb2NrKTsKKwlhdXRvIG5ld192YWwgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKG9sZF92YWwsIHVpNjRfb25lLAorCQkiVG90YWxDYWxsZWRNZXRob2RzQ291bnRlck5ld1ZhbHVlIiwgY3VycmVudEJsb2NrKTsKKwluZXcgU3RvcmVJbnN0KG5ld192YWwsIFRvdGFsQ2FsbGVkTWV0aG9kc0NvdW50UHRyLCBjdXJyZW50QmxvY2spOworfQorCisjZW5kaWYKKworVmFsdWUqIEphdmFKSVQ6OmFsbG9jYXRlT25TdGFjaygKKwljb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgYnl0ZUNvdW50LCBUeXBlKiByZWFsVHlwZSkKK3sKKwlzdGQ6OnN0cmluZyBidWZmZXJOYW1lKG5hbWUpOworCWJ1ZmZlck5hbWUgKz0gIkJ1ZmZlciI7CisKKwlhdXRvIHdvcmRDb3VudCA9IENvbnN0YW50SW50OjpnZXQoCisJCVR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwKKwkJdm1raXQ6OlN5c3RlbTo6V29yZEFsaWduVXAoYnl0ZUNvdW50KSAvIHNpemVvZih2b2lkKikpOworCisJYXV0byBidWZmZXIgPSBuZXcgQWxsb2NhSW5zdChpbnRyaW5zaWNzLT5wdHJUeXBlLAorCQl3b3JkQ291bnQsIHNpemVvZih2b2lkKiksIGJ1ZmZlck5hbWUsIGN1cnJlbnRCbG9jayk7CisJcmV0dXJuIG5ldyBCaXRDYXN0SW5zdChidWZmZXIsIHJlYWxUeXBlLCBuYW1lLCBjdXJyZW50QmxvY2spOworfQorCitWYWx1ZSogSmF2YUpJVDo6Z2V0RWxlbWVudFB0cigKKwljb25zdCBjaGFyICpuYW1lLCBWYWx1ZSogZWxlbWVudCwgVmFsdWUqIGZpcnN0SW5kZXgsIC4uLikKK3sKKwlzdGQ6OnZlY3RvcjxWYWx1ZSo+IGluZGV4TGlzdDsKKwlpbmRleExpc3QucHVzaF9iYWNrKGZpcnN0SW5kZXgpOworCisJdmFfbGlzdCBhcmdMaXN0OworCVZhbHVlKiBhcmc7CisJdmFfc3RhcnQoYXJnTGlzdCwgZmlyc3RJbmRleCk7CisJd2hpbGUgKChhcmcgPSB2YV9hcmcoYXJnTGlzdCwgVmFsdWUqKSkgIT0gbnVsbHB0cikKKwkJaW5kZXhMaXN0LnB1c2hfYmFjayhhcmcpOworCXZhX2VuZChhcmdMaXN0KTsKKworCXJldHVybiBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKGVsZW1lbnQsIGluZGV4TGlzdCwgbmFtZSwgY3VycmVudEJsb2NrKTsKK30KKwogdm9pZCBKYXZhSklUOjp1cGRhdGVTdGFja0luZm8oT3BpbmZvJiBpbmZvKSB7CiAgIGlmIChzdGFja1NpemUoKSkgewogICAgIGlmICghaW5mby5zdGFjay5zaXplKCkpIHsKQEAgLTE5Niw2ICsyNTAsMTAgQEAKICAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCAgPSB2aXJ0dWFsVHlwZS0+cGFyYW1fZW5kKCk7CiAgIGxsdm06OlR5cGUqIHJldFR5cGUgPSB2aXJ0dWFsVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwogCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIGNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VWaXJ0dWFsKGluZGV4KTsKKyNlbmRpZgorCiAgIGJvb2wgbmVlZHNJbml0ID0gZmFsc2U7CiAgIGlmIChjYW5CZURpcmVjdCAmJiBjYW5CZUlubGluZWQobWV0aCwgY3VzdG9taXplZCkpIHsKICAgICBtYWtlQXJncyhpdCwgaW5kZXgsIGFyZ3MsIHNpZ25hdHVyZS0+bmJBcmd1bWVudHMgKyAxKTsKQEAgLTIyMSwzNyArMjc5LDQ3IEBACiAgICAgICBpbmRleGVzMlsxXSA9IE9mZnNldDsKICAgICB9IGVsc2UgewogICAgICAgbnVsbENoZWNrZWQgPSB0cnVlOwotICAgICAgR2xvYmFsVmFyaWFibGUqIEdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpsbHZtRnVuY3Rpb24tPmdldFBhcmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgIiIpOwotICAgIAorICAgICAgR2xvYmFsVmFyaWFibGUqIGNhY2hlZE1ldGhvZFB0ciA9IG5ldyBHbG9iYWxWYXJpYWJsZSgKKyAgICAgICAgKmxsdm1GdW5jdGlvbi0+Z2V0UGFyZW50KCksIGludHJpbnNpY3MtPkphdmFNZXRob2RUeXBlLAorICAgICAgICBmYWxzZSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKKyAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnROdWxsSmF2YU1ldGhvZFB0ciwgImNhY2hlZE1ldGhvZFB0ciIpOworICAgICAgVmFsdWUqIGNhY2hlZE1ldGhvZCA9IG5ldyBMb2FkSW5zdCgKKyAgICAgICAgY2FjaGVkTWV0aG9kUHRyLCAiY2FjaGVkTWV0aG9kIiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7CisKICAgICAgIEJhc2ljQmxvY2sqIHJlc29sdmVWaXJ0dWFsID0gY3JlYXRlQmFzaWNCbG9jaygicmVzb2x2ZVZpcnR1YWwiKTsKICAgICAgIEJhc2ljQmxvY2sqIGVuZFJlc29sdmVWaXJ0dWFsID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kUmVzb2x2ZVZpcnR1YWwiKTsKLSAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUmVzb2x2ZVZpcnR1YWwpOworICAgICAgUEhJTm9kZSogbWV0aG9kUHRyID0gUEhJTm9kZTo6Q3JlYXRlKAorICAgICAgICBpbnRyaW5zaWNzLT5KYXZhTWV0aG9kVHlwZSwgMiwgIm1ldGhvZFB0ciIsIGVuZFJlc29sdmVWaXJ0dWFsKTsKKyAgICAgIG1ldGhvZFB0ci0+YWRkSW5jb21pbmcoY2FjaGVkTWV0aG9kLCBjdXJyZW50QmxvY2spOwogCi0gICAgICBWYWx1ZSogbG9hZCA9IG5ldyBMb2FkSW5zdChHViwgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgVmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sICIiKTsKKyAgICAgIFZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KAorICAgICAgICAqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgY2FjaGVkTWV0aG9kLAorICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudE51bGxKYXZhTWV0aG9kUHRyLCAiaXNDYWNoZUVtcHR5Iik7CiAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzb2x2ZVZpcnR1YWwsIGVuZFJlc29sdmVWaXJ0dWFsLCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAgICAgbm9kZS0+YWRkSW5jb21pbmcobG9hZCwgY3VycmVudEJsb2NrKTsKKwogICAgICAgY3VycmVudEJsb2NrID0gcmVzb2x2ZVZpcnR1YWw7CiAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IEFyZ3M7CiAgICAgICBBcmdzLnB1c2hfYmFjayhUaGVDb21waWxlci0+Z2V0TmF0aXZlQ2xhc3MoY29tcGlsaW5nQ2xhc3MpKTsKICAgICAgIEFyZ3MucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCBpbmRleCkpOwotICAgICAgQXJncy5wdXNoX2JhY2soR1YpOworICAgICAgQXJncy5wdXNoX2JhY2soY2FjaGVkTWV0aG9kUHRyKTsKICAgICAgIFZhbHVlKiB0YXJnZXRPYmplY3QgPSBnZXRUYXJnZXQoc2lnbmF0dXJlKTsKLSAgICAgIHRhcmdldE9iamVjdCA9IG5ldyBMb2FkSW5zdCh0YXJnZXRPYmplY3QsICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKKyAgICAgIHRhcmdldE9iamVjdCA9IG5ldyBMb2FkSW5zdCgKKyAgICAgICAgdGFyZ2V0T2JqZWN0LCAidGFyZ2V0T2JqZWN0IiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7CiAgICAgICBpZiAoIXRoaXNSZWZlcmVuY2UpIEpJVFZlcmlmeU51bGwodGFyZ2V0T2JqZWN0KTsKICAgICAgIEFyZ3MucHVzaF9iYWNrKHRhcmdldE9iamVjdCk7Ci0gICAgICBsb2FkID0gaW52b2tlKGludHJpbnNpY3MtPlZpcnR1YWxMb29rdXBGdW5jdGlvbiwgQXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBub2RlLT5hZGRJbmNvbWluZyhsb2FkLCBjdXJyZW50QmxvY2spOworICAgICAgVmFsdWUqIGNhbGN1bGF0ZWRNZXRob2RQdHIgPSBpbnZva2UoaW50cmluc2ljcy0+VmlydHVhbExvb2t1cEZ1bmN0aW9uLAorICAgICAgICBBcmdzLCAiY2FsY3VsYXRlZE1ldGhvZCIsIGN1cnJlbnRCbG9jayk7CisgICAgICBtZXRob2RQdHItPmFkZEluY29taW5nKGNhbGN1bGF0ZWRNZXRob2RQdHIsIGN1cnJlbnRCbG9jayk7CisKICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRSZXNvbHZlVmlydHVhbCwgY3VycmVudEJsb2NrKTsKICAgICAgIGN1cnJlbnRCbG9jayA9IGVuZFJlc29sdmVWaXJ0dWFsOwogCi0gICAgICBpbmRleGVzMlsxXSA9IG5vZGU7CisgICAgICBWYWx1ZSogbWV0aG9kT2Zmc2V0ID0gZ2V0RWxlbWVudFB0cigKKyAgICAgICAgIm1ldGhvZE9mZnNldFB0ciIsIG1ldGhvZFB0ciwgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAorICAgICAgICBpbnRyaW5zaWNzLT5PZmZzZXRPZmZzZXRJbkphdmFNZXRob2RDb25zdGFudCwgbnVsbHB0cik7CisgICAgICBtZXRob2RPZmZzZXQgPSBuZXcgTG9hZEluc3QobWV0aG9kT2Zmc2V0LCAibWV0aG9kT2Zmc2V0IiwgY3VycmVudEJsb2NrKTsKKworICAgICAgaW5kZXhlczJbMV0gPSBtZXRob2RPZmZzZXQ7CiAgICAgfQogCiAgICAgbWFrZUFyZ3MoaXQsIGluZGV4LCBhcmdzLCBzaWduYXR1cmUtPm5iQXJndW1lbnRzICsgMSk7CkBAIC0yODcsMjIgKzM1NSwzOSBAQAogICAgICAgfQogICAgIH0KICAgfQorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIHJlc2V0Q2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCiB9CiAKIGxsdm06OlZhbHVlKiBKYXZhSklUOjpnZXRNdXRhdG9yVGhyZWFkUHRyKCkgewotICBWYWx1ZSogRnJhbWVBZGRyID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5sbHZtX2ZyYW1lYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIHRocmVhZElkID0gbmV3IFB0clRvSW50SW5zdChGcmFtZUFkZHIsIGludHJpbnNpY3MtPnBvaW50ZXJTaXplVHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkgY3VycmVudEJsb2NrKTsKLSAgdGhyZWFkSWQgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKHRocmVhZElkLCBpbnRyaW5zaWNzLT5jb25zdGFudFRocmVhZElETWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICB0aHJlYWRJZCA9IG5ldyBJbnRUb1B0ckluc3QodGhyZWFkSWQsIGludHJpbnNpY3MtPk11dGF0b3JUaHJlYWRUeXBlLCAiTXV0YXRvclRocmVhZFB0ciIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgcmV0dXJuIHRocmVhZElkOworCXJldHVybiBuZXcgQml0Q2FzdEluc3QoCisJCWdldFRocmVhZFB0cigpLCBpbnRyaW5zaWNzLT5NdXRhdG9yVGhyZWFkVHlwZSwgIk11dGF0b3JUaHJlYWRQdHIiLCBjdXJyZW50QmxvY2spOwogfQogCi1sbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0SmF2YVRocmVhZFB0cihsbHZtOjpWYWx1ZSogbXV0YXRvclRocmVhZFB0cikgewotICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KG11dGF0b3JUaHJlYWRQdHIsIGludHJpbnNpY3MtPkphdmFUaHJlYWRUeXBlLCAiSmF2YVRocmVhZFB0ciIsIGN1cnJlbnRCbG9jayk7CitsbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0VGhyZWFkUHRyKCkKK3sKKwlpZiAoIWN1cnJlbnRUaHJlYWRQdHIpIHsKKwkJVmFsdWUqIGZyYW1lQWRkciA9IENhbGxJbnN0OjpDcmVhdGUoCisJCQlpbnRyaW5zaWNzLT5sbHZtX2ZyYW1lYWRkcmVzcywgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAorCQkJImZyYW1lQWRkcmVzcyIsIGN1cnJlbnRCbG9jayk7CisJCVZhbHVlKiBwdHIgPSBuZXcgUHRyVG9JbnRJbnN0KAorCQkJZnJhbWVBZGRyLCBpbnRyaW5zaWNzLT5wb2ludGVyU2l6ZVR5cGUsICIiLCBjdXJyZW50QmxvY2spOworCQlwdHIgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKAorCQkJcHRyLCBpbnRyaW5zaWNzLT5jb25zdGFudFRocmVhZElETWFzaywgIiIsIGN1cnJlbnRCbG9jayk7CisJCXB0ciA9IG5ldyBJbnRUb1B0ckluc3QoCisJCQlwdHIsIGludHJpbnNpY3MtPlRocmVhZFR5cGUsICJ0aHJlYWRQdHIiLCBjdXJyZW50QmxvY2spOworCisJCWN1cnJlbnRUaHJlYWRQdHIgPSBwdHI7CisJfQorCisJcmV0dXJuIGN1cnJlbnRUaHJlYWRQdHI7Cit9CisKK2xsdm06OlZhbHVlKiBKYXZhSklUOjpnZXRKYXZhVGhyZWFkUHRyKCkgeworCXJldHVybiBuZXcgQml0Q2FzdEluc3QoCisJCWdldFRocmVhZFB0cigpLCBpbnRyaW5zaWNzLT5KYXZhVGhyZWFkVHlwZSwgIkphdmFUaHJlYWRQdHIiLCBjdXJyZW50QmxvY2spOwogfQogCiBsbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0SXNvbGF0ZUlEUHRyKGxsdm06OlZhbHVlKiBtdXRhdG9yVGhyZWFkUHRyKSB7IApAQCAtNDIwLDcgKzUwNSw2IEBACiAgICAgcmV0dXJuIGxsdm1GdW5jdGlvbjsKICAgfQogICAKLSAgCiAgIEZ1bmN0aW9uKiBmdW5jID0gbGx2bUZ1bmN0aW9uOwogICBpZiAoajMpIHsKICAgICBGdW5jdGlvbiogY2FsbGVlID0gRnVuY3Rpb246OkNyZWF0ZShsbHZtRnVuY3Rpb24tPmdldEZ1bmN0aW9uVHlwZSgpLApAQCAtNDI5LDYgKzUxMywxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1GdW5jdGlvbi0+Z2V0UGFyZW50KCkpOwogICAgIFRoZUNvbXBpbGVyLT5zZXRNZXRob2QoY2FsbGVlLCAodm9pZCopbmF0UHRyLCBmdW5jdGlvbk5hbWUpOwogICAgIGN1cnJlbnRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soInN0YXJ0Iik7CisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgICBnZXRUaHJlYWRQdHIoKTsKKyAgICBhbGxvY2F0ZUNoYXJnZWRUaWVySUQoKTsKKyAgICBpbml0aWFsaXplQ2hhcmdlZFRpZXJJRCgpOworICAgIGNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VOYXRpdmUoKTsKKyAgICBzZXRDaGFyZ2VkVGllcklEKCk7CisjZW5kaWYKKworI2lmIE1PTklUT1JfQ1JFQVRFRF9PQkpFQ1RTX0NPVU5UCisgICAgaW5jcmVtZW50VG90YWxDYWxsZWRNZXRob2RzQ291bnRlcigpOworI2VuZGlmCisKICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7CiAgICAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSBmdW5jLT5hcmdfYmVnaW4oKSwgZSA9IGZ1bmMtPmFyZ19lbmQoKTsKICAgICAgICAgIGkgIT0gZTsKQEAgLTQzNiw2ICs1MzMsMTEgQEAKICAgICAgIGFyZ3MucHVzaF9iYWNrKGkpOwogICAgIH0KICAgICBWYWx1ZSogcmVzID0gQ2FsbEluc3Q6OkNyZWF0ZShjYWxsZWUsIGFyZ3MsICIiLCBjdXJyZW50QmxvY2spOworCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgICAgcmVzdG9yZUNoYXJnZWRUaWVySUQoKTsKKyNlbmRpZgorCiAgICAgaWYgKHJldHVyblR5cGUgIT0gVHlwZTo6Z2V0Vm9pZFR5KCpsbHZtQ29udGV4dCkpIHsKICAgICAgIFJldHVybkluc3Q6OkNyZWF0ZSgqbGx2bUNvbnRleHQsIHJlcywgY3VycmVudEJsb2NrKTsKICAgICB9IGVsc2UgewpAQCAtNDQ2LDMwICs1NDgsMzcgQEAKIAogICBjdXJyZW50RXhjZXB0aW9uQmxvY2sgPSBlbmRFeGNlcHRpb25CbG9jayA9IDA7CiAgIGN1cnJlbnRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soInN0YXJ0Iik7Ci0gIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIGJsb2NrIik7CisgIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kQmxvY2siKTsKICAgCisgIGdldFRocmVhZFB0cigpOworCisjaWYgSkFWQV9DSEFSR0VEX1RJRVJfQ0FMTF9TVEFDSworICBhbGxvY2F0ZUNoYXJnZWRUaWVySUQoKTsKKyNlbmRpZgorCiAgIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKSB7CiAgICAgZW5kTm9kZSA9IFBISU5vZGU6OkNyZWF0ZShyZXR1cm5UeXBlLCAwLCAiIiwgZW5kQmxvY2spOwogICB9CiAgIAogICAvLyBBbGxvY2F0ZSBjdXJyZW50TG9jYWxJbmRleE51bWJlciBwb2ludGVyCi0gIFZhbHVlKiB0ZW1wID0gbmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOworICBWYWx1ZSogdGVtcCA9IG5ldyBBbGxvY2FJbnN0KAorCVR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgImN1cnJlbnRMb2NhbEluZGV4TnVtYmVyIiwgY3VycmVudEJsb2NrKTsKICAgbmV3IFN0b3JlSW5zdChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIHRlbXAsIGZhbHNlLCBjdXJyZW50QmxvY2spOwogICAKICAgLy8gQWxsb2NhdGUgb2xkQ3VycmVudExvY2FsSW5kZXhOdW1iZXIgcG9pbnRlcgotICBWYWx1ZSogb2xkQ0xJTiA9IG5ldyBBbGxvY2FJbnN0KFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKKyAgVmFsdWUqIG9sZENMSU4gPSBuZXcgQWxsb2NhSW5zdCgKKwlQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSksCisJIm9sZExvY2FsSW5kZXhOdW1iZXIiLCBjdXJyZW50QmxvY2spOwogICAKICAgQ29uc3RhbnQqIHNpemVGID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIHNpemVvZih2bWtpdDo6S25vd25GcmFtZSkpOwotICBWYWx1ZSogRnJhbWUgPSBuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSwgc2l6ZUYsICIiLCBjdXJyZW50QmxvY2spOworICBWYWx1ZSogRnJhbWUgPSBuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSwgc2l6ZUYsICJrbm93bkZyYW1lIiwgY3VycmVudEJsb2NrKTsKICAgCiAgIHVpbnQzMiBuYXJncyA9IGZ1bmMtPmFyZ19zaXplKCkgKyAxICsgKHN0YXQgPyAxIDogMCk7IAogICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IG5hdGl2ZUFyZ3M7CiAgIG5hdGl2ZUFyZ3MucHVzaF9iYWNrKE5VTEwpOyAvLyBXaWxsIGNvbnRhaW4gdGhlIGNhbGxlZQogICAKICAgCi0gIFZhbHVlKiBqbmlFbnYgPSBnZXRKTklFbnZQdHIoZ2V0SmF2YVRocmVhZFB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpKTsKKyAgVmFsdWUqIGpuaUVudiA9IGdldEpOSUVudlB0cihnZXRKYXZhVGhyZWFkUHRyKCkpOwogIAogICBqbmlFbnYgPSBuZXcgQml0Q2FzdEluc3Qoam5pRW52LCBpbnRyaW5zaWNzLT5wdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKIApAQCAtNDg3LDEwICs1OTYsMTAgQEAKICAgICAgICBpbmRleCA8IG5hcmdzOyArK2ksICsraW5kZXgpIHsKICAgICAKICAgICBpZiAoaS0+Z2V0VHlwZSgpID09IGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKSB7Ci0gICAgICBCYXNpY0Jsb2NrKiBCQiA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOwotICAgICAgQmFzaWNCbG9jayogTm90WmVybyA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOworICAgICAgQmFzaWNCbG9jayogQkIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb250aW51ZSIpOworICAgICAgQmFzaWNCbG9jayogTm90WmVybyA9IGNyZWF0ZUJhc2ljQmxvY2soInN0b3JlT2JqUGFyYW1PblN0YWNrIik7CiAgICAgICBUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUpOwotICAgICAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZShUeSwgMiwgIiIsIEJCKTsKKyAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoVHksIDIsICJzdGFja19vYmpfcGFyYW1fIiwgQkIpOwogCiAgICAgICBWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsICIiKTsKQEAgLTUwMCw4ICs2MDksOSBAQAogCiAgICAgICBjdXJyZW50QmxvY2sgPSBOb3RaZXJvOwogCi0gICAgICBJbnN0cnVjdGlvbiogdGVtcCA9IG5ldyBBbGxvY2FJbnN0KGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy0+YmVnaW4oKS0+Z2V0VGVybWluYXRvcigpKTsKKyAgICAgIEluc3RydWN0aW9uKiB0ZW1wID0gbmV3IEFsbG9jYUluc3QoCisgICAgCWludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAibm9uTnVsbE9ialBhcmFtT25TdGFjayIsCisgICAgICAgIGZ1bmMtPmJlZ2luKCktPmdldFRlcm1pbmF0b3IoKSk7CiAgICAgICBpZiAoaSA9PSBmdW5jLT5hcmdfYmVnaW4oKSAmJiAhc3RhdCkgewogICAgICAgICB0aGlzLT50aGlzT2JqZWN0ID0gdGVtcDsKICAgICAgIH0KQEAgLTUyOSwxMSArNjM5LDEwIEBACiAgICAgfQogICB9CiAgIAotICAKICAgSW5zdHJ1Y3Rpb24qIFJlc3VsdE9iamVjdCA9IDA7CiAgIGlmIChyZXR1cm5UeXBlID09IGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKSB7Ci0gICAgUmVzdWx0T2JqZWN0ID0gbmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMtPmJlZ2luKCktPmJlZ2luKCkpOworICAgIFJlc3VsdE9iamVjdCA9IG5ldyBBbGxvY2FJbnN0KAorICAgIAlpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgInJlc3VsdE9iak9uU3RhY2siLCBmdW5jLT5iZWdpbigpLT5iZWdpbigpKTsKICAgICAKICAgICBpZiAoVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSkgewogICAgICAgCkBAIC01NDksMTQgKzY1OCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwogICAgIH0KICAgfQotICAKKworI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICBpbml0aWFsaXplQ2hhcmdlZFRpZXJJRCgpOworICBjYWxjdWxhdGVDaGFyZ2VkVGllcklERm9ySW52b2tlTmF0aXZlKCk7CisgIHNldENoYXJnZWRUaWVySUQoKTsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgaW5jcmVtZW50VG90YWxDYWxsZWRNZXRob2RzQ291bnRlcigpOworI2VuZGlmCisKICAgVmFsdWUqIG5hdGl2ZUZ1bmMgPSBUaGVDb21waWxlci0+Z2V0TmF0aXZlRnVuY3Rpb24oY29tcGlsaW5nTWV0aG9kLCAodm9pZCopbmF0UHRyKTsKICAgaWYgKFRoZUNvbXBpbGVyLT5pc1N0YXRpY0NvbXBpbGluZygpKSB7CiAgICAgVmFsdWUqIEFyZyA9IFRoZUNvbXBpbGVyLT5nZXRNZXRob2RJbkNsYXNzKGNvbXBpbGluZ01ldGhvZCk7IAogICAgIAogICAgIC8vIElmIHRoZSBnbG9iYWwgdmFyaWFibGUgaXMgbnVsbCwgdGhlbiBsb2FkIGl0LgotICAgIEJhc2ljQmxvY2sqIHVubG9hZGVkQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCIiKTsKLSAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOworICAgIEJhc2ljQmxvY2sqIHVubG9hZGVkQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ1bmxvYWRlZEJsb2NrIik7CisgICAgQmFzaWNCbG9jayogZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmRCbG9jayIpOwogICAgIFZhbHVlKiB0ZXN0ID0gbmV3IExvYWRJbnN0KG5hdGl2ZUZ1bmMsICIiLCBjdXJyZW50QmxvY2spOwogICAgIFR5cGUqIFR5ID0gdGVzdC0+Z2V0VHlwZSgpOwogICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoVHksIDIsICIiLCBlbmRCbG9jayk7CkBAIC01OTUsNyArNzE0LDcgQEAKICAgICBUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUpOwogICAgIENvbnN0YW50KiBDID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSk7CiAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgcmVzdWx0LCBDLCAiIik7Ci0gICAgQmFzaWNCbG9jayogbG9hZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiIik7CisgICAgQmFzaWNCbG9jayogbG9hZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygibG9hZEJsb2NrIik7CiAKICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCBjdXJyZW50QmxvY2spOwogICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgbG9hZEJsb2NrLCBjbXAsIGN1cnJlbnRCbG9jayk7CkBAIC02MTIsNyArNzMxLDYgQEAKICAgCiAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKIAotCiAgIGN1cnJlbnRCbG9jayA9IGVuZEJsb2NrOyAKICAKICAgVmFsdWUqIEFyZ3MyWzFdID0geyBvbGRDTElOIH07CkBAIC02MjMsMjEgKzc0MSwzMSBAQAogICBpZiAoaXNTeW5jaHJvKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSkKICAgICBlbmRTeW5jaHJvbml6ZSgpOwogCi0gIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygiIik7Ci0gIEJhc2ljQmxvY2sqIGlmRXhjZXB0aW9uID0gY3JlYXRlQmFzaWNCbG9jaygiIik7Ci0gIFZhbHVlKiBqYXZhRXhjZXB0aW9uUHRyID0gZ2V0SmF2YUV4Y2VwdGlvblB0cihnZXRKYXZhVGhyZWFkUHRyKGdldE11dGF0b3JUaHJlYWRQdHIoKSkpOworICBCYXNpY0Jsb2NrKiBpZk5vcm1hbCA9IGNyZWF0ZUJhc2ljQmxvY2soImlmTm9ybWFsIik7CisgIEJhc2ljQmxvY2sqIGlmRXhjZXB0aW9uID0gY3JlYXRlQmFzaWNCbG9jaygiaWZFeGNlcHRpb24iKTsKKyAgVmFsdWUqIGphdmFFeGNlcHRpb25QdHIgPSBnZXRKYXZhRXhjZXB0aW9uUHRyKGdldEphdmFUaHJlYWRQdHIoKSk7CiAgIFZhbHVlKiBvYmogPSBuZXcgTG9hZEluc3QoamF2YUV4Y2VwdGlvblB0ciwgIiIsIGN1cnJlbnRCbG9jayk7CiAgIFZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLCBvYmosIGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsICIiKTsKICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGlmRXhjZXB0aW9uLCBpZk5vcm1hbCwgdGVzdCwgY3VycmVudEJsb2NrKTsKIAogICBjdXJyZW50QmxvY2sgPSBpZkV4Y2VwdGlvbjsKKworI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICByZXN0b3JlQ2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCisKICAgLy8gQ2xlYXIgZXhjZXB0aW9uLgogICBuZXcgU3RvcmVJbnN0KGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsIGphdmFFeGNlcHRpb25QdHIsCiAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKICAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5UaHJvd0V4Y2VwdGlvbkZ1bmN0aW9uLCBvYmosICIiLCBjdXJyZW50QmxvY2spOwogICBuZXcgVW5yZWFjaGFibGVJbnN0KCpsbHZtQ29udGV4dCwgY3VycmVudEJsb2NrKTsKKwogICBjdXJyZW50QmxvY2sgPSBpZk5vcm1hbDsKLSAgCisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgcmVzdG9yZUNoYXJnZWRUaWVySUQoKTsKKyNlbmRpZgorCiAgIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKQogICAgIFJldHVybkluc3Q6OkNyZWF0ZSgqbGx2bUNvbnRleHQsIGVuZE5vZGUsIGN1cnJlbnRCbG9jayk7CiAgIGVsc2UKQEAgLTY4MSw4ICs4MDksOCBAQAogICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBhdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaywgIiIpOwogICAKLSAgQmFzaWNCbG9jayogT0sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzeW5jaHJvbml6ZSBwYXNzZWQiKTsKLSAgQmFzaWNCbG9jayogTm90T0sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzeW5jaHJvbml6ZSBkaWQgbm90IHBhc3MiKTsKKyAgQmFzaWNCbG9jayogT0sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzeW5jaHJvbml6ZVBhc3NlZCIpOworICBCYXNpY0Jsb2NrKiBOb3RPSyA9IGNyZWF0ZUJhc2ljQmxvY2soInN5bmNocm9uaXplRGlkTm90UGFzcyIpOwogCiAgIEJyYW5jaEluc3Q6OkNyZWF0ZShPSywgTm90T0ssIGNtcCwgY3VycmVudEJsb2NrKTsKIApAQCAtNzM0LDcgKzg2Miw3IEBACiAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGF0b21pYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWYWxNYXNrLCAiIik7CiAgIAotICBCYXNpY0Jsb2NrKiBMb2NrRnJlZUNBU0ZhaWxlZCA9IGNyZWF0ZUJhc2ljQmxvY2soIkxvY2stRnJlZSBDQVMgRmFpbGVkIik7CisgIEJhc2ljQmxvY2sqIExvY2tGcmVlQ0FTRmFpbGVkID0gY3JlYXRlQmFzaWNCbG9jaygiTG9ja0ZyZWVDQVNGYWlsZWQiKTsKIAogICBCcmFuY2hJbnN0OjpDcmVhdGUoRW5kQmxvY2ssIExvY2tGcmVlQ0FTRmFpbGVkLCBjbXAsIGN1cnJlbnRCbG9jayk7CiAKQEAgLTEwMzgsMjggKzExNjYsMzQgQEAKICAgICBvcGNvZGVJbmZvc1tpXS5leGNlcHRpb25CbG9jayA9IGVuZEV4Y2VwdGlvbkJsb2NrOwogICB9CiAKKyAgZ2V0VGhyZWFkUHRyKCk7CisKKyNpZiBKQVZBX0NIQVJHRURfVElFUl9DQUxMX1NUQUNLCisgIGFsbG9jYXRlQ2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCisKICAgSW5zdHJ1Y3Rpb24qIHJldHVyblZhbHVlID0gTlVMTDsKICAgaWYgKHJldHVyblR5cGUgPT0gaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUgJiYKICAgICAgIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCkpIHsKLSAgICByZXR1cm5WYWx1ZSA9IG5ldyBBbGxvY2FJbnN0KGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAicmV0dXJuVmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICBJbnN0cnVjdGlvbiogY2FzdCA9IAotICAgICAgICBuZXcgQml0Q2FzdEluc3QocmV0dXJuVmFsdWUsIGludHJpbnNpY3MtPnB0clB0clR5cGUsICIiLCBjdXJyZW50QmxvY2spOworICAgIHJldHVyblZhbHVlID0gbmV3IEFsbG9jYUluc3QoCisgICAgCWludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAicmV0dXJuVmFsdWVTdG9yYWdlIiwgY3VycmVudEJsb2NrKTsKKyAgICBJbnN0cnVjdGlvbiogY2FzdCA9IG5ldyBCaXRDYXN0SW5zdCgKKyAgICAJcmV0dXJuVmFsdWUsIGludHJpbnNpY3MtPnB0clB0clR5cGUsICJyZXR1cm5WYWx1ZSIsIGN1cnJlbnRCbG9jayk7CiAgICAgVmFsdWUqIEdDQXJnc1syXSA9IHsgY2FzdCwgaW50cmluc2ljcy0+Y29uc3RhbnRQdHJOdWxsIH07CiAgICAgICAgIAogICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+bGx2bV9nY19nY3Jvb3QsIEdDQXJncywgIiIsIGN1cnJlbnRCbG9jayk7CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IG1heExvY2FsczsgaSsrKSB7Ci0gICAgaW50TG9jYWxzLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIHNldEluc3RydWN0aW9uTmFtZShpbnN0TmFtZSwgaW5zdE5hbWVMZW4sICJpbnRfJWQiLCBpKSwgY3VycmVudEJsb2NrKSk7CisgICAgaW50TG9jYWxzLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIHNldEluc3RydWN0aW9uTmFtZShpbnN0TmFtZSwgaW5zdE5hbWVMZW4sICJsb2NhbF9pbnRfJWQiLCBpKSwgY3VycmVudEJsb2NrKSk7CiAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSksIGludExvY2Fscy5iYWNrKCksIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIGRvdWJsZUxvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSwgc2V0SW5zdHJ1Y3Rpb25OYW1lKGluc3ROYW1lLCBpbnN0TmFtZUxlbiwgImRvdWJsZV8lZCIsIGkpLCBjdXJyZW50QmxvY2spKTsKKyAgICBkb3VibGVMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksIHNldEluc3RydWN0aW9uTmFtZShpbnN0TmFtZSwgaW5zdE5hbWVMZW4sICJsb2NhbF9kb3VibGVfJWQiLCBpKSwgY3VycmVudEJsb2NrKSk7CiAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCkpLCBkb3VibGVMb2NhbHMuYmFjaygpLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICBsb25nTG9jYWxzLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCksIHNldEluc3RydWN0aW9uTmFtZShpbnN0TmFtZSwgaW5zdE5hbWVMZW4sICJsb25nXyVkIiwgaSksIGN1cnJlbnRCbG9jaykpOworICAgIGxvbmdMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgc2V0SW5zdHJ1Y3Rpb25OYW1lKGluc3ROYW1lLCBpbnN0TmFtZUxlbiwgImxvY2FsX2xvbmdfJWQiLCBpKSwgY3VycmVudEJsb2NrKSk7CiAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSksIGxvbmdMb2NhbHMuYmFjaygpLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICBmbG9hdExvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpLCBzZXRJbnN0cnVjdGlvbk5hbWUoaW5zdE5hbWUsIGluc3ROYW1lTGVuLCAiZmxvYXRfJWQiLCBpKSwgY3VycmVudEJsb2NrKSk7CisgICAgZmxvYXRMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgc2V0SW5zdHJ1Y3Rpb25OYW1lKGluc3ROYW1lLCBpbnN0TmFtZUxlbiwgImxvY2FsX2Zsb2F0XyVkIiwgaSksIGN1cnJlbnRCbG9jaykpOwogICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCkpLCBmbG9hdExvY2Fscy5iYWNrKCksIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIG9iamVjdExvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsIHNldEluc3RydWN0aW9uTmFtZShpbnN0TmFtZSwgaW5zdE5hbWVMZW4sICJvYmplY3RfJWQiLCBpKSwgY3VycmVudEJsb2NrKSk7CisgICAgb2JqZWN0TG9jYWxzLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgc2V0SW5zdHJ1Y3Rpb25OYW1lKGluc3ROYW1lLCBpbnN0TmFtZUxlbiwgImxvY2FsX29iamVjdF8lZCIsIGkpLCBjdXJyZW50QmxvY2spKTsKICAgICAvLyBUaGUgR0NTdHJhdGVneSB3aWxsIGFscmVhZHkgaW5pdGlhbGl6ZSB0aGUgdmFsdWUuCiAgICAgaWYgKCFUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKQogICAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKSwgb2JqZWN0TG9jYWxzLmJhY2soKSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7CkBAIC0xMTMxLDcgKzEyNjUsNyBAQAogCiAgIG5iSGFuZGxlcnMgPSByZWFkRXhjZXB0aW9uVGFibGUocmVhZGVyLCBjb2RlTGVuKTsKICAgaWYgKG5iSGFuZGxlcnMgIT0gMCkgewotICAgIGptcEJ1ZmZlciA9IG5ldyBBbGxvY2FJbnN0KEFycmF5VHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeSgqbGx2bUNvbnRleHQpLCBzaXplb2Yodm1raXQ6OkV4Y2VwdGlvbkJ1ZmZlcikpLCAiIiwgY3VycmVudEJsb2NrKTsKKyAgICBqbXBCdWZmZXIgPSBuZXcgQWxsb2NhSW5zdChBcnJheVR5cGU6OmdldChUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSwgc2l6ZW9mKHZta2l0OjpFeGNlcHRpb25CdWZmZXIpKSwgImV4Y2VwdGlvblNhdmVQb2ludFN0b3JhZ2UiLCBjdXJyZW50QmxvY2spOwogICAgIGptcEJ1ZmZlciA9IG5ldyBCaXRDYXN0SW5zdChqbXBCdWZmZXIsIGludHJpbnNpY3MtPnB0clR5cGUsICJleGNlcHRpb25TYXZlUG9pbnQiLCBjdXJyZW50QmxvY2spOwogICB9CiAKQEAgLTExNDEsOSArMTI3NSwxNyBAQAogICBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZCIpOwogCiAgIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgZW5kTm9kZSA9IGxsdm06OlBISU5vZGU6OkNyZWF0ZShyZXR1cm5UeXBlLCAwLCAiIiwgZW5kQmxvY2spOworICAgIGVuZE5vZGUgPSBsbHZtOjpQSElOb2RlOjpDcmVhdGUocmV0dXJuVHlwZSwgMCwgInJldHVyblZhbHVlUGhpIiwgZW5kQmxvY2spOwogICB9CiAKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgaW5pdGlhbGl6ZUNoYXJnZWRUaWVySUQoKTsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgaW5jcmVtZW50VG90YWxDYWxsZWRNZXRob2RzQ291bnRlcigpOworI2VuZGlmCisKICAgY2hlY2tZaWVsZFBvaW50KCk7CiAgIAogICBpZiAoaXNTeW5jaHJvKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSkgewpAQCAtMTE2NSw4ICsxMzA3LDggQEAKIAogICAgIHN0YWNrQ2hlY2sgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHN0YWNrQ2hlY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFB0clplcm8sICIiKTsKLSAgICBCYXNpY0Jsb2NrKiBzdGFja092ZXJmbG93ID0gY3JlYXRlQmFzaWNCbG9jaygic3RhY2sgb3ZlcmZsb3ciKTsKLSAgICBCYXNpY0Jsb2NrKiBub1N0YWNrT3ZlcmZsb3cgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBzdGFjayBvdmVyZmxvdyIpOworICAgIEJhc2ljQmxvY2sqIHN0YWNrT3ZlcmZsb3cgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzdGFja092ZXJmbG93Iik7CisgICAgQmFzaWNCbG9jayogbm9TdGFja092ZXJmbG93ID0gY3JlYXRlQmFzaWNCbG9jaygibm9TdGFja092ZXJmbG93Iik7CiAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHN0YWNrT3ZlcmZsb3csIG5vU3RhY2tPdmVyZmxvdywgc3RhY2tDaGVjaywKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKICAgICBjdXJyZW50QmxvY2sgPSBzdGFja092ZXJmbG93OwpAQCAtMTIyNyw5ICsxMzY5LDkgQEAKICAgICBjdXJyZW50QmxvY2stPmVyYXNlRnJvbVBhcmVudCgpOwogICB9IGVsc2UgewogICAgIGlmIChuYkhhbmRsZXJzICE9IDApIHsKLSAgICAgIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygiTm8gZXhjZXB0aW9uIHdhcyB0aHJvd24iKTsKLSAgICAgIEJhc2ljQmxvY2sqIGlmRXhjZXB0aW9uID0gY3JlYXRlQmFzaWNCbG9jaygiUmV0aHJvdyBFeGNlcHRpb24iKTsKLSAgICAgIFZhbHVlKiBqYXZhRXhjZXB0aW9uUHRyID0gZ2V0SmF2YUV4Y2VwdGlvblB0cihnZXRKYXZhVGhyZWFkUHRyKGdldE11dGF0b3JUaHJlYWRQdHIoKSkpOworICAgICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub0V4Y2VwdGlvblRocm93biIpOworICAgICAgQmFzaWNCbG9jayogaWZFeGNlcHRpb24gPSBjcmVhdGVCYXNpY0Jsb2NrKCJyZVRocm93RXhjZXB0aW9uIik7CisgICAgICBWYWx1ZSogamF2YUV4Y2VwdGlvblB0ciA9IGdldEphdmFFeGNlcHRpb25QdHIoZ2V0SmF2YVRocmVhZFB0cigpKTsKICAgICAgIFZhbHVlKiBvYmogPSBuZXcgTG9hZEluc3QoamF2YUV4Y2VwdGlvblB0ciwgInBlbmRpbmdFeGNlcHRpb24iLCBjdXJyZW50QmxvY2spOwogICAgICAgVmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfTkUsIG9iaiwgaW50cmluc2ljcy0+SmF2YU9iamVjdE51bGxDb25zdGFudCwgIiIpOwogICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGlmRXhjZXB0aW9uLCBpZk5vcm1hbCwgdGVzdCwgY3VycmVudEJsb2NrKTsKQEAgLTEzODEsOCArMTUyMyw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgIFZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBvYmosIGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsICIiKTsKIAotICAgICAgQmFzaWNCbG9jayogbnVsbE9iakJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygib2JqZWN0IGlzIG51bGwiKTsKLSAgICAgIEJhc2ljQmxvY2sqIG5vdE51bGxPYmpCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIm9iamVjdCBpcyBub3QgbnVsbCIpOworICAgICAgQmFzaWNCbG9jayogbnVsbE9iakJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygib2JqZWN0SXNOdWxsIik7CisgICAgICBCYXNpY0Jsb2NrKiBub3ROdWxsT2JqQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJvYmplY3RJc05vdE51bGwiKTsKIAogICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKG51bGxPYmpCbG9jaywgbm90TnVsbE9iakJsb2NrLCB0ZXN0LCBjdXJyZW50QmxvY2spOwogICAgICAgY3VycmVudEJsb2NrID0gbnVsbE9iakJsb2NrOwpAQCAtMTQwOCw4ICsxNTUwLDggQEAKICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1VMVCwgaW5kZXgsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CiAKLSAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSAgY3JlYXRlQmFzaWNCbG9jaygidHJ1ZSB2ZXJpZnlBbmRDb21wdXRlUHRyIik7Ci0gICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIHZlcmlmeUFuZENvbXB1dGVQdHIiKTsKKyAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSAgY3JlYXRlQmFzaWNCbG9jaygidHJ1ZVZlcmlmeUFuZENvbXB1dGVQdHIiKTsKKyAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VWZXJpZnlBbmRDb21wdXRlUHRyIik7CiAKICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7CiAgICAgCkBAIC0xNjU5LDYgKzE4MDEsMTAgQEAKICAgICBmdW5jID0gVGhlQ29tcGlsZXItPmdldE1ldGhvZChtZXRoLCBOVUxMKTsKICAgfQogCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIGNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VTcGVjaWFsKGluZGV4KTsKKyNlbmRpZgorCiAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKICAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCAgPSB2aXJ0dWFsVHlwZS0+cGFyYW1fZW5kKCk7CiAgIG1ha2VBcmdzKGl0LCBpbmRleCwgYXJncywgc2lnbmF0dXJlLT5uYkFyZ3VtZW50cyArIDEpOwpAQCAtMTY4OCw2ICsxODM0LDEwIEBACiAgICAgICB9CiAgICAgfQogICB9CisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgcmVzZXRDaGFyZ2VkVGllcklEKCk7CisjZW5kaWYKIH0KIAogdm9pZCBKYXZhSklUOjppbnZva2VTdGF0aWModWludDE2IGluZGV4KSB7CkBAIC0xNzA4LDcgKzE4NTgsNiBAQAogCiAgIEphdmFNZXRob2QqIG1ldGggPSBjdHBJbmZvLT5pbmZvT2ZTdGF0aWNPclNwZWNpYWxNZXRob2QoaW5kZXgsIEFDQ19TVEFUSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlKTsKLSAgICAKIAogICB1aW50MzIgY2xJbmRleCA9IGN0cEluZm8tPmdldENsYXNzSW5kZXhGcm9tTWV0aG9kKGluZGV4KTsKICAgVXNlckNsYXNzKiBjbCA9IDA7CkBAIC0xNzE3LDYgKzE4NjYsMTAgQEAKICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkZvcmNlSW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uLCBDbCwgIiIsCiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwogICB9CisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZVN0YXRpYyhpbmRleCk7CisjZW5kaWYKICAgCiAgIFZhbHVlKiBmdW5jID0gMDsKICAgYm9vbCBuZWVkc0luaXQgPSBmYWxzZTsKQEAgLTE3NjAsNiArMTkxMywxMCBAQAogICAgICAgfQogICAgIH0KICAgfQorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIHJlc2V0Q2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCiB9CiAKIFZhbHVlKiBKYXZhSklUOjpnZXRDb25zdGFudFBvb2xBdCh1aW50MzIgaW5kZXgsIEZ1bmN0aW9uKiByZXNvbHZlciwKQEAgLTE4ODAsNyArMjAzNywxMSBAQAogICAgIFNpemUgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldE9iamVjdFNpemVGcm9tQ2xhc3NGdW5jdGlvbiwgQ2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7CiAgIH0KLSAKKworI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICBjYWxjdWxhdGVDaGFyZ2VkVGllcklERm9yTmV3KGluZGV4KTsKKyNlbmRpZgorCiAgIFZUID0gbmV3IEJpdENhc3RJbnN0KFZULCBpbnRyaW5zaWNzLT5wdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKICAgSW5zdHJ1Y3Rpb24qIHZhbCA9IGludm9rZShjbCA/IGludHJpbnNpY3MtPlZUQWxsb2NhdGVGdW5jdGlvbiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5WVEFsbG9jYXRlVW5yZXNvbHZlZEZ1bmN0aW9uLApAQCAtMTg5NSw2ICsyMDU2LDEwIEBACiAgIGlmIChjbCAmJiBjbC0+dmlydHVhbFZULT5oYXNEZXN0cnVjdG9yKCkpIHsKICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZSwgdmFsLCAiIiwgY3VycmVudEJsb2NrKTsKICAgfQorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIHJlc2V0Q2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCiB9CiAKIFZhbHVlKiBKYXZhSklUOjpsZFJlc29sdmVkKHVpbnQxNiBpbmRleCwgYm9vbCBzdGF0LCBWYWx1ZSogb2JqZWN0LCAKQEAgLTE5MTEsMTAgKzIwNzYsOCBAQAogICAgICAgVmFsdWUqIENsID0gVGhlQ29tcGlsZXItPmdldE5hdGl2ZUNsYXNzKGZpZWxkLT5jbGFzc0RlZik7CiAgICAgICBib29sIG5lZWRzQ2hlY2sgPSBuZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soZmllbGQtPmNsYXNzRGVmKTsKICAgICAgIGlmIChuZWVkc0NoZWNrKSB7Ci0gICAgICAgIENsID0gaW52b2tlKGludHJpbnNpY3MtPkluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiwgQ2wsICIiLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkZvcmNlSW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uLCBDbCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKKyAgICAgICAgQ2wgPSBpbnZva2UoaW50cmluc2ljcy0+SW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uLCBDbCwgIiIsIGN1cnJlbnRCbG9jayk7CisgICAgICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+Rm9yY2VJbml0aWFsaXNhdGlvbkNoZWNrRnVuY3Rpb24sIENsLCAiIiwgY3VycmVudEJsb2NrKTsKICAgICAgIH0KIAogICAgICAgb2JqZWN0ID0gVGhlQ29tcGlsZXItPmdldFN0YXRpY0luc3RhbmNlKGZpZWxkLT5jbGFzc0RlZik7CkBAIC0yMTgwLDYgKzIzNDMsMzk0IEBACiAgIH0KIH0KIAorI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKwordm9pZCBKYXZhSklUOjpwdXNoQ2hhcmdlZFRpZXIoKQoreworCWlmICghc3RhY2tFbWJlZGRlZExpc3ROb2RlKSByZXR1cm47CisKKwkvLyBTYXZlIHRoZSBjdXJyZW50IGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0IGludG8gdGhlIG5vZGUuCisJLy8gbm9kZS0+Y2FsbGVyTm9kZSA9ICgqdGhyZWFkSGVhZCk7CisJYXV0byB0aHJlYWRIZWFkUHRyID0gbmV3IExvYWRJbnN0KHRocmVhZFN0YWNrRW1iZWRkZWRMaXN0SGVhZFB0clB0ciwKKwkJInRocmVhZEhlYWRQdHIiLCBjdXJyZW50QmxvY2spOworCW5ldyBTdG9yZUluc3QoCisJCXRocmVhZEhlYWRQdHIsIHN0YWNrRW1iZWRkZWRMaXN0SGVhZENhbGxlck5vZGVQdHIsIGN1cnJlbnRCbG9jayk7CisKKwkvLyBub2RlLT5kYXRhWzBdID0gcmVpbnRlcnByZXRfY2FzdDx3b3JkX3Q+KGNoYXJnZWRUaWVySUQpOworCW5ldyBTdG9yZUluc3QoCisJCWNoYXJnZWRUaWVySUQsIHN0YWNrRW1iZWRkZWRMaXN0SGVhZENoYXJnZWRUaWVyUHRyLCBjdXJyZW50QmxvY2spOworCisJLy8gKnRocmVhZEhlYWQgPSBub2RlOworCW5ldyBTdG9yZUluc3Qoc3RhY2tFbWJlZGRlZExpc3ROb2RlLCB0aHJlYWRTdGFja0VtYmVkZGVkTGlzdEhlYWRQdHJQdHIsCisJCXRydWUsIGN1cnJlbnRCbG9jayk7CS8vIHZvbGF0aWxlID0gdHJ1ZQorfQorCit2b2lkIEphdmFKSVQ6OnBvcENoYXJnZWRUaWVyKCkKK3sKKwlpZiAoIXN0YWNrRW1iZWRkZWRMaXN0Tm9kZSkgcmV0dXJuOworCisJLy8gUmVzdG9yZSB0aGUgbGlua2VkIGxpc3QgaGVhZC4KKwkvLyAqdGhyZWFkSGVhZCA9IG5vZGUtPmNhbGxlck5vZGU7CisJYXV0byBjYWxsZXJOb2RlID0gbmV3IExvYWRJbnN0KHN0YWNrRW1iZWRkZWRMaXN0SGVhZENhbGxlck5vZGVQdHIsCisJCSJjYWxsZXJOb2RlIiwgY3VycmVudEJsb2NrKTsKKwluZXcgU3RvcmVJbnN0KGNhbGxlck5vZGUsIHRocmVhZFN0YWNrRW1iZWRkZWRMaXN0SGVhZFB0clB0ciwKKwkJdHJ1ZSwgY3VycmVudEJsb2NrKTsJLy8gdm9sYXRpbGUgPSB0cnVlCit9CisKK3ZvaWQgSmF2YUpJVDo6YWxsb2NhdGVDaGFyZ2VkVGllcklEKCkKK3sKKwlpZiAoVGhlQ29tcGlsZXItPmlzQ29tcGlsaW5nR2FyYmFnZUNvbGxlY3RvcigpKSByZXR1cm47CisKKwlhc3NlcnQoIXN0YWNrRW1iZWRkZWRMaXN0Tm9kZSAmJiAic3RhY2tFbWJlZGRlZExpc3ROb2RlIGFscmVhZHkgYWxsb2NhdGVkIik7CisKKwkvLyBBbGxvY2F0ZSBzdGFjayBlbWJlZGRlZCBsaXN0IG5vZGUKKwlzdGFja0VtYmVkZGVkTGlzdE5vZGUgPSBhbGxvY2F0ZU9uU3RhY2soImNoYXJnZWRUaWVyTm9kZSIsCisJCXNpemVvZih2bWtpdDo6U3RhY2tFbWJlZGRlZExpc3ROb2RlKSwKKwkJaW50cmluc2ljcy0+U3RhY2tFbWJlZGRlZExpc3ROb2RlVHlwZSk7Cit9CisKKyNlbmRpZgorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisKK3ZvaWQgSmF2YUpJVDo6aW5pdGlhbGl6ZUNoYXJnZWRUaWVySUQoKQoreworCWlmIChUaGVDb21waWxlci0+aXNDb21waWxpbmdHYXJiYWdlQ29sbGVjdG9yKCkpIHJldHVybjsKKworCS8vIGozOjpTdGFja0VtYmVkZGVkTGlzdE5vZGUqKiB0aHJlYWRIZWFkID0KKwkvLyAgICB0aHJlYWQtPnN0YWNrRW1iZWRkZWRMaXN0SGVhZCArIFN0YWNrRW1iZWRkZWRMaXN0SW50ZW5kZWRDYWxsZXI7CisJdGhyZWFkU3RhY2tFbWJlZGRlZExpc3RIZWFkUHRyUHRyID0KKwkJZ2V0RWxlbWVudFB0cigidGhyZWFkSGVhZFB0clB0ciIsIGdldFRocmVhZFB0cigpLAorCQkJaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAorCQkJaW50cmluc2ljcy0+T2Zmc2V0U3RhY2tFbWJlZGRlZExpc3RIZWFkSW5UaHJlYWRDb25zdGFudCwKKwkJCWludHJpbnNpY3MtPmNvbnN0YW50WmVybywgbnVsbHB0cik7CisKKwkvLyBub2RlLT5jYWxsZXJOb2RlCisJc3RhY2tFbWJlZGRlZExpc3RIZWFkQ2FsbGVyTm9kZVB0ciA9IGdldEVsZW1lbnRQdHIoCisJCSJjYWxsZXJOb2RlUHRyIiwgc3RhY2tFbWJlZGRlZExpc3ROb2RlLAorCQlpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCisJCWludHJpbnNpY3MtPk9mZnNldENhbGxlck5vZGVJblN0YWNrRW1iZWRkZWRMaXN0Tm9kZUNvbnN0YW50LCBudWxscHRyKTsKKworCS8vIG5vZGUtPmRhdGEgKyAwCisJc3RhY2tFbWJlZGRlZExpc3RIZWFkQ2hhcmdlZFRpZXJQdHIgPSBnZXRFbGVtZW50UHRyKAorCQkibm9kZUNoYXJnZWRUaWVyUHRyIiwgc3RhY2tFbWJlZGRlZExpc3ROb2RlLAorCQlpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCisJCWludHJpbnNpY3MtPk9mZnNldERhdGFJblN0YWNrRW1iZWRkZWRMaXN0Tm9kZUNvbnN0YW50LAorCQlpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIG51bGxwdHIpOworCisJYXV0byBUaWVySURQdHJUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChpbnRyaW5zaWNzLT5UaWVySURUeXBlKTsKKwlzdGFja0VtYmVkZGVkTGlzdEhlYWRDaGFyZ2VkVGllclB0ciA9IG5ldyBCaXRDYXN0SW5zdCgKKwkJc3RhY2tFbWJlZGRlZExpc3RIZWFkQ2hhcmdlZFRpZXJQdHIsIFRpZXJJRFB0clR5cGUsCisJCSJub2RlQ2hhcmdlZFRpZXJQdHJQdHIiLCBjdXJyZW50QmxvY2spOworCisJLy8gRGV0ZXJtaW5lIG91ciBvd24gdGllciBJRAorCWF1dG8gdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7CisJY29tcGlsaW5nQ2xhc3NUaWVySUQgPSB2bS0+dGllcl9tYW5hZ2VyLmdldEFjY291bnRpbmdDb25maWcoKS4KKwkJZ2V0VGllck9mQ29tbW9uQ2xhc3MoY29tcGlsaW5nQ2xhc3MpOworCisJLy8gUmV0cmlldmUgdGhlIHRocmVhZC1sb2NhbCBjaGFyZ2VkIHRpZXIgSUQKKwl0aHJlYWRDaGFyZ2VkVGllcklEUHRyID0gZ2V0RWxlbWVudFB0cigidGhyZWFkQ2hhcmdlZFRpZXJJRFB0ciIsCisJCWdldFRocmVhZFB0cigpLCBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCisJCWludHJpbnNpY3MtPk9mZnNldENoYXJnZWRUaWVySURJblRocmVhZENvbnN0YW50LCBudWxscHRyKTsKKworCXRocmVhZENoYXJnZWRUaWVySURPbGRWYWx1ZSA9IG5ldyBMb2FkSW5zdCh0aHJlYWRDaGFyZ2VkVGllcklEUHRyLAorCQkidGhyZWFkQ2hhcmdlZFRpZXJJRE9sZFZhbHVlIiwgdHJ1ZSwgLy8gdm9sYXRpbGUgPSB0cnVlCisJCWN1cnJlbnRCbG9jayk7CisKKwkvLyBXZSBhcmUgaW4gbWV0aG9kIHByb2xvZy4gV2UgcmVjZWl2ZWQgYSBjaGFyZ2VkVGllcklEIGZyb20gdGhlIGNhbGxlci4KKwkvLyBJZiB0aGUgY2FsbGVyIHRoaW5rcyB3ZSBzaG91bGQgYmUgY2hhcmdlZCwgaXQgbXVzdCBwYXNzIDB4ZmZmZmZmZmYsCisJLy8gb3RoZXJ3aXNlIHRoZSBjYWxsZXIgc2hvdWxkIHBhc3MgdGhlIHRpZXIgSUQgdG8gYmUgY2hhcmdlZC4KKworCWF1dG8gdGhyZWFkQ2hhcmdlZFRpZXJJRElzSW52YWxpZCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLAorCQlJQ21wSW5zdDo6SUNNUF9FUSwgdGhyZWFkQ2hhcmdlZFRpZXJJRE9sZFZhbHVlLAorCQlpbnRyaW5zaWNzLT5JbnZhbGlkVGllcklEQ29uc3RhbnQsICJ0aHJlYWRDaGFyZ2VkVGllcklESXNJbnZhbGlkIik7CisKKwlhdXRvIGNoYXJnZUNhbGxlZFRpZXJJRCA9IGNyZWF0ZUJhc2ljQmxvY2soImNoYXJnZUNhbGxlZFRpZXJJRCIpOworCWF1dG8gY2hhcmdlQ2FsbGVyVGllcklEID0gY3JlYXRlQmFzaWNCbG9jaygiY2hhcmdlQ2FsbGVyVGllcklEIik7CisJYXV0byBjaGFyZ2VDYWxsZWRUaWVySURFbmQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjaGFyZ2VDYWxsZWRUaWVySURFbmQiKTsKKworCWNoYXJnZWRUaWVySUQgPSBQSElOb2RlOjpDcmVhdGUoCisJCWludHJpbnNpY3MtPlRpZXJJRFR5cGUsIDIsICJjaGFyZ2VkVGllcklEIiwgY2hhcmdlQ2FsbGVkVGllcklERW5kKTsKKworCUJyYW5jaEluc3Q6OkNyZWF0ZShjaGFyZ2VDYWxsZWRUaWVySUQsIGNoYXJnZUNhbGxlclRpZXJJRCwKKwkJdGhyZWFkQ2hhcmdlZFRpZXJJRElzSW52YWxpZCwgY3VycmVudEJsb2NrKTsKKworCS8vIElmIHdlIHNob3VsZCBjaGFyZ2UgdGhlIGNhbGxlZCwgdGhlbiBvdXIgdGllciBpZCBiZWNvbWVzIGNoYXJnZWQuCisJY3VycmVudEJsb2NrID0gY2hhcmdlQ2FsbGVkVGllcklEOworCisJY2hhcmdlZFRpZXJJRC0+YWRkSW5jb21pbmcoQ29uc3RhbnRJbnQ6OmdldChpbnRyaW5zaWNzLT5UaWVySURUeXBlLAorCQljb21waWxpbmdDbGFzc1RpZXJJRCwgZmFsc2UpLCBjdXJyZW50QmxvY2spOworCisJQnJhbmNoSW5zdDo6Q3JlYXRlKGNoYXJnZUNhbGxlZFRpZXJJREVuZCwgY3VycmVudEJsb2NrKTsKKworCS8vIElmIHdlIHNob3VsZCBjaGFyZ2UgdGhlIGNhbGxlciwgdGhlbiB0aGUgY2hhcmdlZCBjb250aW51ZXMgdG8gYmUKKwkvLyB0aGUgcGFzc2VkIHRpZXIgaWQuCisJY3VycmVudEJsb2NrID0gY2hhcmdlQ2FsbGVyVGllcklEOworCisJY2hhcmdlZFRpZXJJRC0+YWRkSW5jb21pbmcodGhyZWFkQ2hhcmdlZFRpZXJJRE9sZFZhbHVlLCBjdXJyZW50QmxvY2spOworCisJQnJhbmNoSW5zdDo6Q3JlYXRlKGNoYXJnZUNhbGxlZFRpZXJJREVuZCwgY3VycmVudEJsb2NrKTsKKworCWN1cnJlbnRCbG9jayA9IGNoYXJnZUNhbGxlZFRpZXJJREVuZDsKKworCW5ld0NoYXJnZWRUaWVySUQgPSB0aHJlYWRDaGFyZ2VkVGllcklET2xkVmFsdWU7Cit9CisKK3ZvaWQgSmF2YUpJVDo6Y2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZVN0YXRpYyh1aW50MTZfdCBpbmRleCkKK3sKKwlpZiAoIWNoYXJnZWRUaWVySUQpIHJldHVybjsKKworCS8vIEdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FsbCBkZXN0aW5hdGlvbi4KKwljb25zdCBVVEY4ICpjYWxsZWRfY2xhc3NfbmFtZSA9IG51bGxwdHIsICpjYWxsZWRfbWV0aG9kX25hbWUgPSBudWxscHRyOworCVNpZ25kZWYqIHNpZ25hdHVyZSA9IG51bGxwdHI7CisJY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPm5hbWVPZlN0YXRpY09yU3BlY2lhbE1ldGhvZCgKKwkJaW5kZXgsIGNhbGxlZF9jbGFzc19uYW1lLCBjYWxsZWRfbWV0aG9kX25hbWUsIHNpZ25hdHVyZSk7CisJYXV0byBtZXRob2QgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+aW5mb09mU3RhdGljT3JTcGVjaWFsTWV0aG9kKAorCQlpbmRleCwgQUNDX1NUQVRJQywgc2lnbmF0dXJlKTsKKworCWF1dG8gY2FsbGVkX3RpZXJfaWQgPSBPU0dpOjpydW50aW1lVGllcklEOworCWNvbnN0IFVURjggKmNhbGxlZF9idW5kbGVfbmFtZSA9IG51bGxwdHI7CisJaWYgKG1ldGhvZCAhPSBudWxscHRyKSB7CisJCU9TR2k6OkJ1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGluZm9faXRlcmF0b3I7CisJCWF1dG8gdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7CisJCWlmICh2bS0+YnVuZGxlX3N0YXRlX21vbml0b3IuZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoCisJCQltZXRob2QtPmNsYXNzRGVmLT5jbGFzc0xvYWRlciwgaW5mb19pdGVyYXRvcikpCisJCXsKKwkJCWF1dG8mIGFjY291bnRpbmdDb25maWcgPSB2bS0+dGllcl9tYW5hZ2VyLmdldEFjY291bnRpbmdDb25maWcoKTsKKworCQkJY2FsbGVkX2J1bmRsZV9uYW1lID0gaW5mb19pdGVyYXRvci0+c2Vjb25kLm5hbWU7CisJCQljYWxsZWRfdGllcl9pZCA9CisJCQkJYWNjb3VudGluZ0NvbmZpZy5nZXRUaWVyT2ZCdW5kbGVOYW1lKGNhbGxlZF9idW5kbGVfbmFtZSk7CisJCX0KKwl9CisKKwljYWxjdWxhdGVDaGFyZ2VkVGllcklERm9ySW52b2tlKE9TR2k6OkNhbGxDb25maWd1cmF0aW9uKAorCQljb21waWxpbmdDbGFzc1RpZXJJRCwgY2FsbGVkX3RpZXJfaWQsCisJCWNhbGxlZF9idW5kbGVfbmFtZSwgY2FsbGVkX2NsYXNzX25hbWUsIGNhbGxlZF9tZXRob2RfbmFtZSkpOworfQorCit2b2lkIEphdmFKSVQ6OmNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VTcGVjaWFsKHVpbnQxNl90IGluZGV4KQoreworCWlmICghY2hhcmdlZFRpZXJJRCkgcmV0dXJuOworCisJLy8gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWxsIGRlc3RpbmF0aW9uLgorCWNvbnN0IFVURjggKmNhbGxlZF9jbGFzc19uYW1lID0gbnVsbHB0ciwgKmNhbGxlZF9tZXRob2RfbmFtZSA9IG51bGxwdHI7CisJU2lnbmRlZiogc2lnbmF0dXJlID0gbnVsbHB0cjsKKwljb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+bmFtZU9mU3RhdGljT3JTcGVjaWFsTWV0aG9kKAorCQlpbmRleCwgY2FsbGVkX2NsYXNzX25hbWUsIGNhbGxlZF9tZXRob2RfbmFtZSwgc2lnbmF0dXJlKTsKKwlhdXRvIG1ldGhvZCA9IGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvLT5pbmZvT2ZTdGF0aWNPclNwZWNpYWxNZXRob2QoCisJCWluZGV4LCBBQ0NfVklSVFVBTCwgc2lnbmF0dXJlKTsKKworCWF1dG8gY2FsbGVkX3RpZXJfaWQgPSBPU0dpOjpydW50aW1lVGllcklEOworCWNvbnN0IFVURjggKmNhbGxlZF9idW5kbGVfbmFtZSA9IG51bGxwdHI7CisJaWYgKG1ldGhvZCAhPSBudWxscHRyKSB7CisJCU9TR2k6OkJ1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGluZm9faXRlcmF0b3I7CisJCWF1dG8gdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7CisJCWlmICh2bS0+YnVuZGxlX3N0YXRlX21vbml0b3IuZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoCisJCQltZXRob2QtPmNsYXNzRGVmLT5jbGFzc0xvYWRlciwgaW5mb19pdGVyYXRvcikpCisJCXsKKwkJCWF1dG8mIGFjY291bnRpbmdDb25maWcgPSB2bS0+dGllcl9tYW5hZ2VyLmdldEFjY291bnRpbmdDb25maWcoKTsKKworCQkJY2FsbGVkX2J1bmRsZV9uYW1lID0gaW5mb19pdGVyYXRvci0+c2Vjb25kLm5hbWU7CisJCQljYWxsZWRfdGllcl9pZCA9CisJCQkJYWNjb3VudGluZ0NvbmZpZy5nZXRUaWVyT2ZCdW5kbGVOYW1lKGNhbGxlZF9idW5kbGVfbmFtZSk7CisJCX0KKwl9CisKKwljYWxjdWxhdGVDaGFyZ2VkVGllcklERm9ySW52b2tlKE9TR2k6OkNhbGxDb25maWd1cmF0aW9uKAorCQljb21waWxpbmdDbGFzc1RpZXJJRCwgY2FsbGVkX3RpZXJfaWQsCisJCWNhbGxlZF9idW5kbGVfbmFtZSwgY2FsbGVkX2NsYXNzX25hbWUsIGNhbGxlZF9tZXRob2RfbmFtZSkpOworfQorCit2b2lkIEphdmFKSVQ6OmNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VJbnRlcmZhY2UodWludDE2X3QgaW5kZXgpCit7CisJaWYgKCFjaGFyZ2VkVGllcklEKSByZXR1cm47CisKKwkvLyBHYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhbGwgZGVzdGluYXRpb24uCisJYXV0byB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKKwlhdXRvJiBhY2NvdW50aW5nQ29uZmlnID0gdm0tPnRpZXJfbWFuYWdlci5nZXRBY2NvdW50aW5nQ29uZmlnKCk7CisJY29uc3QgVVRGOCogY2FsbGVkX21ldGhvZF9uYW1lID0gbnVsbHB0cjsKKwljb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+aW5mb09mSW50ZXJmYWNlT3JWaXJ0dWFsTWV0aG9kKAorCQlpbmRleCwgY2FsbGVkX21ldGhvZF9uYW1lKTsKKworCUNvbW1vbkNsYXNzKiBjbCA9IG51bGxwdHI7CisJSmF2YU1ldGhvZCogbWV0aCA9IG51bGxwdHI7CisJY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPmluZm9PZk1ldGhvZChpbmRleCwgQUNDX1ZJUlRVQUwsIGNsLCBtZXRoKTsKKworCWF1dG8gY2FsbGVkX3RpZXJfaWQgPSBPU0dpOjpydW50aW1lVGllcklEOworCWNvbnN0IFVURjggKmNhbGxlZF9idW5kbGVfbmFtZSA9IG51bGxwdHIsICpjYWxsZWRfaW50ZXJmYWNlX25hbWUgPSBudWxscHRyOworCWlmIChjbCAhPSBudWxscHRyKSB7CisJCWNhbGxlZF9pbnRlcmZhY2VfbmFtZSA9IGNsLT5uYW1lOworCisJCU9TR2k6OkJ1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGluZm9faXRlcmF0b3I7CisJCWlmICh2bS0+YnVuZGxlX3N0YXRlX21vbml0b3IuZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoCisJCQljbC0+Y2xhc3NMb2FkZXIsIGluZm9faXRlcmF0b3IpKQorCQl7CisJCQljYWxsZWRfYnVuZGxlX25hbWUgPSBpbmZvX2l0ZXJhdG9yLT5zZWNvbmQubmFtZTsKKwkJCWNhbGxlZF90aWVyX2lkID0KKwkJCQlhY2NvdW50aW5nQ29uZmlnLmdldFRpZXJPZkJ1bmRsZU5hbWUoY2FsbGVkX2J1bmRsZV9uYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWF1dG8gZW50cnkgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+Y3RwRGVmW2luZGV4XTsKKwkJdWludDMyIGNsYXNzX2luZGV4ID0gZW50cnkgPj4gMTY7CisJCWF1dG8gY2xhc3NfZW50cnkgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+Y3RwRGVmW2NsYXNzX2luZGV4XTsKKwkJY2FsbGVkX2ludGVyZmFjZV9uYW1lID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPlVURjhBdChjbGFzc19lbnRyeSk7CisJfQorCisJY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZShPU0dpOjpDYWxsQ29uZmlndXJhdGlvbigKKwkJY29tcGlsaW5nQ2xhc3NUaWVySUQsIGNhbGxlZF90aWVyX2lkLAorCQljYWxsZWRfYnVuZGxlX25hbWUsIGNhbGxlZF9pbnRlcmZhY2VfbmFtZSwgY2FsbGVkX21ldGhvZF9uYW1lKSk7Cit9CisKK3ZvaWQgSmF2YUpJVDo6Y2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZVZpcnR1YWwodWludDE2X3QgaW5kZXgpCit7CisJaWYgKCFjaGFyZ2VkVGllcklEKSByZXR1cm47CisKKwkvLyBHYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhbGwgZGVzdGluYXRpb24uCisJYXV0byB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKKwlhdXRvJiBhY2NvdW50aW5nQ29uZmlnID0gdm0tPnRpZXJfbWFuYWdlci5nZXRBY2NvdW50aW5nQ29uZmlnKCk7CisJY29uc3QgVVRGOCogY2FsbGVkX21ldGhvZF9uYW1lID0gbnVsbHB0cjsKKwljb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+aW5mb09mSW50ZXJmYWNlT3JWaXJ0dWFsTWV0aG9kKAorCQlpbmRleCwgY2FsbGVkX21ldGhvZF9uYW1lKTsKKworCUNvbW1vbkNsYXNzKiBjbCA9IG51bGxwdHI7CisJSmF2YU1ldGhvZCogbWV0aCA9IG51bGxwdHI7CisJY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPmluZm9PZk1ldGhvZChpbmRleCwgQUNDX1ZJUlRVQUwsIGNsLCBtZXRoKTsKKworCWF1dG8gY2FsbGVkX3RpZXJfaWQgPSBPU0dpOjpydW50aW1lVGllcklEOworCWNvbnN0IFVURjggKmNhbGxlZF9idW5kbGVfbmFtZSA9IG51bGxwdHIsICpjYWxsZWRfaW50ZXJmYWNlX25hbWUgPSBudWxscHRyOworCWlmIChjbCAhPSBudWxscHRyKSB7CisJCWNhbGxlZF9pbnRlcmZhY2VfbmFtZSA9IGNsLT5uYW1lOworCisJCU9TR2k6OkJ1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGluZm9faXRlcmF0b3I7CisJCWlmICh2bS0+YnVuZGxlX3N0YXRlX21vbml0b3IuZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoCisJCQljbC0+Y2xhc3NMb2FkZXIsIGluZm9faXRlcmF0b3IpKQorCQl7CisJCQljYWxsZWRfYnVuZGxlX25hbWUgPSBpbmZvX2l0ZXJhdG9yLT5zZWNvbmQubmFtZTsKKwkJCWNhbGxlZF90aWVyX2lkID0KKwkJCQlhY2NvdW50aW5nQ29uZmlnLmdldFRpZXJPZkJ1bmRsZU5hbWUoY2FsbGVkX2J1bmRsZV9uYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWF1dG8gZW50cnkgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+Y3RwRGVmW2luZGV4XTsKKwkJdWludDMyIGNsYXNzX2luZGV4ID0gZW50cnkgPj4gMTY7CisJCWF1dG8gY2xhc3NfZW50cnkgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+Y3RwRGVmW2NsYXNzX2luZGV4XTsKKwkJY2FsbGVkX2ludGVyZmFjZV9uYW1lID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPlVURjhBdChjbGFzc19lbnRyeSk7CisJfQorCisJY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZShPU0dpOjpDYWxsQ29uZmlndXJhdGlvbigKKwkJY29tcGlsaW5nQ2xhc3NUaWVySUQsIGNhbGxlZF90aWVyX2lkLAorCQljYWxsZWRfYnVuZGxlX25hbWUsIGNhbGxlZF9pbnRlcmZhY2VfbmFtZSwgY2FsbGVkX21ldGhvZF9uYW1lKSk7Cit9CisKK3ZvaWQgSmF2YUpJVDo6Y2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZU5hdGl2ZSgpCit7CisJaWYgKCFjaGFyZ2VkVGllcklEKSByZXR1cm47CisKKwkvLyBHYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhbGwgZGVzdGluYXRpb24uCisJYXV0byBjYWxsZWRfbWV0aG9kX25hbWUgPSBjb21waWxpbmdNZXRob2QtPm5hbWU7CisKKwlhdXRvIGNhbGxlZF90aWVyX2lkID0gT1NHaTo6cnVudGltZVRpZXJJRDsKKwljb25zdCBVVEY4ICpjYWxsZWRfYnVuZGxlX25hbWUgPSBudWxscHRyLCAqY2FsbGVkX2NsYXNzX25hbWUgPSBudWxscHRyOworCWlmIChjb21waWxpbmdNZXRob2QtPmNsYXNzRGVmICE9IG51bGxwdHIpIHsKKwkJY2FsbGVkX2NsYXNzX25hbWUgPSBjb21waWxpbmdNZXRob2QtPmNsYXNzRGVmLT5uYW1lOworCisJCU9TR2k6OkJ1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGluZm9faXRlcmF0b3I7CisJCWF1dG8gdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7CisJCWlmICh2bS0+YnVuZGxlX3N0YXRlX21vbml0b3IuZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoCisJCQljb21waWxpbmdNZXRob2QtPmNsYXNzRGVmLT5jbGFzc0xvYWRlciwgaW5mb19pdGVyYXRvcikpCisJCXsKKwkJCWF1dG8mIGFjY291bnRpbmdDb25maWcgPSB2bS0+dGllcl9tYW5hZ2VyLmdldEFjY291bnRpbmdDb25maWcoKTsKKworCQkJY2FsbGVkX2J1bmRsZV9uYW1lID0gaW5mb19pdGVyYXRvci0+c2Vjb25kLm5hbWU7CisJCQljYWxsZWRfdGllcl9pZCA9CisJCQkJYWNjb3VudGluZ0NvbmZpZy5nZXRUaWVyT2ZCdW5kbGVOYW1lKGNhbGxlZF9idW5kbGVfbmFtZSk7CisJCX0KKwl9CisKKwljYWxjdWxhdGVDaGFyZ2VkVGllcklERm9ySW52b2tlKE9TR2k6OkNhbGxDb25maWd1cmF0aW9uKAorCQljb21waWxpbmdDbGFzc1RpZXJJRCwgY2FsbGVkX3RpZXJfaWQsCisJCWNhbGxlZF9idW5kbGVfbmFtZSwgY2FsbGVkX2NsYXNzX25hbWUsIGNhbGxlZF9tZXRob2RfbmFtZSkpOworfQorCit2b2lkIEphdmFKSVQ6OmNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JOZXcodWludDE2X3QgaW5kZXgpCit7CisJLy8gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWxsIGRlc3RpbmF0aW9uLgorCWF1dG8gY2FsbGVkX21ldGhvZF9uYW1lID0gdXBjYWxscy0+SW5pdE9iamVjdC0+bmFtZTsKKwljb25zdCBVVEY4ICpjYWxsZWRfY2xhc3NfbmFtZSA9IG51bGxwdHIsICpjYWxsZWRfYnVuZGxlX25hbWUgPSBudWxscHRyOworCisJYXV0byBjYWxsZWRfdGllcl9pZCA9IE9TR2k6OnJ1bnRpbWVUaWVySUQ7CisJQ2xhc3MqIGNsID0gbnVsbHB0cjsKKwlnZXRSZXNvbHZlZENsYXNzKGluZGV4LCBmYWxzZSwgZmFsc2UsICZjbCk7CisJaWYgKGNsICE9IG51bGxwdHIpIHsKKwkJY2FsbGVkX2NsYXNzX25hbWUgPSBjbC0+bmFtZTsKKworCQlhdXRvIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOworCQlPU0dpOjpCdW5kbGVTdGF0ZU1vbml0b3I6OkJ1bmRsZUluZm9UeXBlOjpjb25zdF9pdGVyYXRvciBpbmZvX2l0ZXJhdG9yOworCQlpZiAodm0tPmJ1bmRsZV9zdGF0ZV9tb25pdG9yLmdldEJ1bmRsZUluZm9CeUNsYXNzTG9hZGVyKAorCQkJY2wtPmNsYXNzTG9hZGVyLCBpbmZvX2l0ZXJhdG9yKSkKKwkJeworCQkJYXV0byYgYWNjb3VudGluZ0NvbmZpZyA9IHZtLT50aWVyX21hbmFnZXIuZ2V0QWNjb3VudGluZ0NvbmZpZygpOworCisJCQljYWxsZWRfYnVuZGxlX25hbWUgPSBpbmZvX2l0ZXJhdG9yLT5zZWNvbmQubmFtZTsKKwkJCWNhbGxlZF90aWVyX2lkID0KKwkJCQlhY2NvdW50aW5nQ29uZmlnLmdldFRpZXJPZkJ1bmRsZU5hbWUoY2FsbGVkX2J1bmRsZV9uYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWNhbGxlZF9jbGFzc19uYW1lID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPnJlc29sdmVDbGFzc05hbWUoaW5kZXgpOworCX0KKworCWNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2UoT1NHaTo6Q2FsbENvbmZpZ3VyYXRpb24oCisJCWNvbXBpbGluZ0NsYXNzVGllcklELCBjYWxsZWRfdGllcl9pZCwKKwkJY2FsbGVkX2J1bmRsZV9uYW1lLCBjYWxsZWRfY2xhc3NfbmFtZSwgY2FsbGVkX21ldGhvZF9uYW1lKSk7Cit9CisKK3ZvaWQgSmF2YUpJVDo6Y2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZShjb25zdCBPU0dpOjpDYWxsQ29uZmlndXJhdGlvbiYgY2MpCit7CisJLy8gRGVjaWRlIHdobyBzaG91bGQgYmUgY2hhcmdlZCBmb3IgdGhpcyBjYWxsLgorCWF1dG8mIGFjY291bnRpbmdDb25maWcgPQorCQlKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCktPnRpZXJfbWFuYWdlci5nZXRBY2NvdW50aW5nQ29uZmlnKCk7CisJYXV0byBjaGFyZ2VUb0NhbGxlciA9IGFjY291bnRpbmdDb25maWcuaXNBY2NvdW50aW5nQ2hhcmdlZFRvQ2FsbGVyKGNjKTsKKworCS8vIElmIHRoZSBjYWxsZXIgaXMgY2hhcmdlZCB0aGVuIHBhc3MgdGhlIGN1cnJlbnRseSBjaGFyZ2VkIHRpZXIgaWQsIHdoaWNoCisJLy8gaXMgZWl0aGVyIG91ciBvd24gdGllciBpZCwgb3IgdGhlIHRpZXIgaXMgdGhhdCB3YXMgcGFzc2VkIGJ5IG91ciBjYWxsZXIuCisJLy8gSWYgdGhlIGNhbGxlZCBpcyBjaGFyZ2VkIHRoZW4gcGFzcyAiaW52YWxpZFRpZXJJRCIsIGFuZCB0aGUgY2FsbGVkCisJLy8gbWV0aG9kIHdpbGwgY2hhbmdlIHRoZSBjdXJyZW50bHkgY2hhcmdlZCB0aWVyIGlkIHRvIGl0cyBvd24KKwkvLyBpbXBsZW1lbnRhdGlvbiB0aWVyIGlkLgorCW5ld0NoYXJnZWRUaWVySUQgPSAoY2hhcmdlVG9DYWxsZXIgPworCQlzdGF0aWNfY2FzdDxWYWx1ZSo+KGNoYXJnZWRUaWVySUQpIDoKKwkJc3RhdGljX2Nhc3Q8VmFsdWUqPihpbnRyaW5zaWNzLT5JbnZhbGlkVGllcklEQ29uc3RhbnQpKTsKK30KKwordm9pZCBKYXZhSklUOjpzZXRDaGFyZ2VkVGllcklEKCkKK3sKKyNpZiBFTUJFRERFRF9MSVNUX1VQREFURQorCWlmICghY2hhcmdlZFRpZXJJRCkgcmV0dXJuOworCisJbmV3IFN0b3JlSW5zdChuZXdDaGFyZ2VkVGllcklELCB0aHJlYWRDaGFyZ2VkVGllcklEUHRyLCBjdXJyZW50QmxvY2spOworCisJcHVzaENoYXJnZWRUaWVyKCk7CisjZW5kaWYKK30KKwordm9pZCBKYXZhSklUOjpyZXNldENoYXJnZWRUaWVySUQoKQoreworCWlmICghY2hhcmdlZFRpZXJJRCkgcmV0dXJuOworCisJbmV3Q2hhcmdlZFRpZXJJRCA9IHRocmVhZENoYXJnZWRUaWVySURPbGRWYWx1ZTsKK30KKwordm9pZCBKYXZhSklUOjpyZXN0b3JlQ2hhcmdlZFRpZXJJRCgpCit7CisjaWYgRU1CRURERURfTElTVF9VUERBVEUKKwlpZiAoIWNoYXJnZWRUaWVySUQpIHJldHVybjsKKworCW5ldyBTdG9yZUluc3QodGhyZWFkQ2hhcmdlZFRpZXJJRE9sZFZhbHVlLCB0aHJlYWRDaGFyZ2VkVGllcklEUHRyLCBjdXJyZW50QmxvY2spOworCisJcG9wQ2hhcmdlZFRpZXIoKTsKKyNlbmRpZgorfQorCisjZW5kaWYKIAogdm9pZCBKYXZhSklUOjppbnZva2VJbnRlcmZhY2UodWludDE2IGluZGV4KSB7CiAgIApAQCAtMjMyMSw2ICsyODcyLDEwIEBACiAgIG5vZGUgPSBuZXcgQml0Q2FzdEluc3Qobm9kZSwgdmlydHVhbFB0clR5cGUsICIiLCBjdXJyZW50QmxvY2spOwogI2VuZGlmCiAKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZUludGVyZmFjZShpbmRleCk7CisjZW5kaWYKKwogICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7IC8vIHNpemUgPSBbc2lnbmF0dXJlLT5uYkluICsgM107CiAgIEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgaXQgID0gdmlydHVhbFR5cGUtPnBhcmFtX2VuZCgpOwogICBtYWtlQXJncyhpdCwgaW5kZXgsIGFyZ3MsIHNpZ25hdHVyZS0+bmJBcmd1bWVudHMgKyAxKTsKQEAgLTIzMzcsNiArMjg5MiwxMCBAQAogICAgICAgfQogICAgIH0KICAgfQorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIHJlc2V0Q2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCiB9CiAKIERlYnVnTG9jIEphdmFKSVQ6OkNyZWF0ZUxvY2F0aW9uKCkgewpAQCAtMjM0NSwxNCArMjkwNCwxMyBAQAogfQogCiBJbnN0cnVjdGlvbiogSmF2YUpJVDo6aW52b2tlKFZhbHVlICpGLCBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+JiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBjb25zdCBjaGFyKiBOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewogICBhc3NlcnQoIWlubGluaW5nKTsKICAKICAgQmFzaWNCbG9jayogaWZFeGNlcHRpb24gPSBOVUxMOwogICBpZiAoam1wQnVmZmVyICE9IE5VTEwpIHsKLSAgICBCYXNpY0Jsb2NrKiBkb0NhbGwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJQZXJmb3JtIGNhbGwiKTsKLSAgICBpZkV4Y2VwdGlvbiA9IGNyZWF0ZUJhc2ljQmxvY2soIkV4Y2VwdGlvbiB0aHJvd24iKTsKKyAgICBCYXNpY0Jsb2NrKiBkb0NhbGwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJwZXJmb3JtQ2FsbCIpOworICAgIGlmRXhjZXB0aW9uID0gY3JlYXRlQmFzaWNCbG9jaygiZXhjZXB0aW9uVGhyb3duIik7CiAgICAgSW5zdHJ1Y3Rpb24qIGNoZWNrID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5TZXRqbXBGdW5jdGlvbiwgam1wQnVmZmVyLCAiIiwgY3VycmVudEJsb2NrKTsKICAgICBjaGVjayA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgY2hlY2ssIGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgIiIpOwogICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShkb0NhbGwsIGlmRXhjZXB0aW9uLCBjaGVjaywgY3VycmVudEJsb2NrKTsKQEAgLTIzNjAsMTcgKzI5MTgsMzEgQEAKICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPlJlZ2lzdGVyU2V0am1wRnVuY3Rpb24sIGptcEJ1ZmZlciwgIiIsIGN1cnJlbnRCbG9jayk7CiAgIH0KIAorI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICBzZXRDaGFyZ2VkVGllcklEKCk7CisjZW5kaWYKKwogICBJbnN0cnVjdGlvbiogcmVzID0gQ2FsbEluc3Q6OkNyZWF0ZShGLCBhcmdzLCBOYW1lLCAgY3VycmVudEJsb2NrKTsKICAgRGVidWdMb2MgREwgPSBDcmVhdGVMb2NhdGlvbigpOwogICByZXMtPnNldERlYnVnTG9jKERMKTsKLSAgCisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgcmVzdG9yZUNoYXJnZWRUaWVySUQoKTsKKyNlbmRpZgorCiAgIGlmIChqbXBCdWZmZXIgIT0gTlVMTCkgewogICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+VW5yZWdpc3RlclNldGptcEZ1bmN0aW9uLCBqbXBCdWZmZXIsICIiLCBjdXJyZW50QmxvY2spOwotICAgIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygibm8gZXhjZXB0aW9uIGJsb2NrIik7CisgICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub0V4Y2VwdGlvbkJsb2NrIik7CiAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGlmTm9ybWFsLCBjdXJyZW50QmxvY2spOwogCiAgICAgY3VycmVudEJsb2NrID0gaWZFeGNlcHRpb247CisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgICByZXN0b3JlQ2hhcmdlZFRpZXJJRCgpOworI2VuZGlmCisKICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPlVucmVnaXN0ZXJTZXRqbXBGdW5jdGlvbiwgam1wQnVmZmVyLCAiIiwgY3VycmVudEJsb2NrKTsKKwogICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGN1cnJlbnRCbG9jayk7CiAgICAgY3VycmVudEJsb2NrID0gaWZOb3JtYWw7IAogICB9CkBAIC0yMzc5LDE0ICsyOTUxLDE0IEBACiB9CiAKIEluc3RydWN0aW9uKiBKYXZhSklUOjppbnZva2UoVmFsdWUgKkYsIFZhbHVlKiBhcmcxLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewogICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7CiAgIGFyZ3MucHVzaF9iYWNrKGFyZzEpOwogICByZXR1cm4gaW52b2tlKEYsIGFyZ3MsIE5hbWUsIEluc2VydEF0RW5kKTsKIH0KIAogSW5zdHJ1Y3Rpb24qIEphdmFKSVQ6Omludm9rZShWYWx1ZSAqRiwgVmFsdWUqIGFyZzEsIFZhbHVlKiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBjb25zdCBjaGFyKiBOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewogICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7CiAgIGFyZ3MucHVzaF9iYWNrKGFyZzEpOwogICBhcmdzLnB1c2hfYmFjayhhcmcyKTsKQEAgLTIzOTQsNyArMjk2Niw3IEBACiB9CiAKIEluc3RydWN0aW9uKiBKYXZhSklUOjppbnZva2UoVmFsdWUgKkYsIGNvbnN0IGNoYXIqIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CiAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKICAgcmV0dXJuIGludm9rZShGLCBhcmdzLCBOYW1lLCBJbnNlcnRBdEVuZCk7CiB9CkBAIC0yNDA1LDcgKzI5NzcsNyBAQAogICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+VGhyb3dFeGNlcHRpb25GdW5jdGlvbiwgb2JqLCAiIiwgY3VycmVudEJsb2NrKTsKICAgICBuZXcgVW5yZWFjaGFibGVJbnN0KCpsbHZtQ29udGV4dCwgY3VycmVudEJsb2NrKTsKICAgfSBlbHNlIHsKLSAgICBWYWx1ZSogamF2YUV4Y2VwdGlvblB0ciA9IGdldEphdmFFeGNlcHRpb25QdHIoZ2V0SmF2YVRocmVhZFB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpKTsKKyAgICBWYWx1ZSogamF2YUV4Y2VwdGlvblB0ciA9IGdldEphdmFFeGNlcHRpb25QdHIoZ2V0SmF2YVRocmVhZFB0cigpKTsKICAgICBpZiAodm1raXQ6OkNvbGxlY3Rvcjo6bmVlZHNOb25IZWFwV3JpdGVCYXJyaWVyKCkpIHsKICAgICAgIEluc3RydWN0aW9uKiBwdHIgPSBuZXcgQml0Q2FzdEluc3QoamF2YUV4Y2VwdGlvblB0ciwgaW50cmluc2ljcy0+cHRyUHRyVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7CiAgICAgICBJbnN0cnVjdGlvbiogdmFsID0gbmV3IEJpdENhc3RJbnN0KG9iaiwgaW50cmluc2ljcy0+cHRyVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7CkBAIC0yNTU3LDcgKzMxMjksNyBAQAogICAgIFZhbHVlKiBWVFZhciA9IFRoZUNvbXBpbGVyLT5nZXRWaXJ0dWFsVGFibGUoY3VyLT5jYXRjaENsYXNzLT52aXJ0dWFsVlQpOwogCiAgICAgLy8gR2V0IHRoZSBKYXZhIGV4Y2VwdGlvbi4KLSAgICBWYWx1ZSogamF2YUV4Y2VwdGlvblB0ciA9IGdldEphdmFFeGNlcHRpb25QdHIoZ2V0SmF2YVRocmVhZFB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpKTsKKyAgICBWYWx1ZSogamF2YUV4Y2VwdGlvblB0ciA9IGdldEphdmFFeGNlcHRpb25QdHIoZ2V0SmF2YVRocmVhZFB0cigpKTsKICAgICBWYWx1ZSogb2JqID0gbmV3IExvYWRJbnN0KGphdmFFeGNlcHRpb25QdHIsICJwZW5kaW5nRXhjZXB0aW9uIiwgY3VycmVudEJsb2NrKTsKICAgICAKICAgICBWYWx1ZSogb2JqVlQgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldFZURnVuY3Rpb24sIG9iaiwgIm9iamVjdFZUIiwKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhSklULmggYi92bWtpdC9saWIvajMvQ29tcGlsZXIvSmF2YUpJVC5oCmluZGV4IGU4NjJkNzAuLjU1YzJhNTEgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhSklULmgKKysrIGIvdm1raXQvbGliL2ozL0NvbXBpbGVyL0phdmFKSVQuaApAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgIkphdmFDbGFzcy5oIgogI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCiAKKyNpbmNsdWRlICJBY2NvdW50aW5nQ29uZmlndXJhdGlvbi5oIgorCiBuYW1lc3BhY2UgajMgewogCiBjbGFzcyBDbGFzczsKQEAgLTEwNyw2ICsxMDksMjUgQEAKICAgICBvdmVycmlkZXNUaGlzID0gZmFsc2U7CiAgICAgbmJIYW5kbGVycyA9IDA7CiAgICAgam1wQnVmZmVyID0gTlVMTDsKKyAgICBjdXJyZW50VGhyZWFkUHRyID0gbnVsbHB0cjsKKworI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKyAgICBjaGFyZ2VkVGllcklECQkJCT0gbnVsbHB0cjsKKyAgICBzdGFja0VtYmVkZGVkTGlzdEhlYWRDaGFyZ2VkVGllclB0cgk9IG51bGxwdHI7CisjZW5kaWYKKworI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICAgIHRocmVhZENoYXJnZWRUaWVySURQdHIJCT0gbnVsbHB0cjsKKyAgICB0aHJlYWRDaGFyZ2VkVGllcklET2xkVmFsdWUJPSBudWxscHRyOworICAgIG5ld0NoYXJnZWRUaWVySUQJCQk9IG51bGxwdHI7CisgICAgY29tcGlsaW5nQ2xhc3NUaWVySUQJCT0gT1NHaTo6cnVudGltZVRpZXJJRDsKKyNlbmRpZgorCisjaWYgRU1CRURERURfTElTVF9JTl9DQUxMX1NUQUNLCisgICAgc3RhY2tFbWJlZGRlZExpc3ROb2RlCQkJCT0gbnVsbHB0cjsKKyAgICB0aHJlYWRTdGFja0VtYmVkZGVkTGlzdEhlYWRQdHJQdHIJPSBudWxscHRyOworICAgIHN0YWNrRW1iZWRkZWRMaXN0SGVhZENhbGxlck5vZGVQdHIJPSBudWxscHRyOworI2VuZGlmCiAgIH0KIAogICAvLy8gamF2YUNvbXBpbGUgLSBDb21waWxlIHRoZSBKYXZhIG1ldGhvZC4KQEAgLTE2OCw2ICsxODksOCBAQAogCiAgIGxsdm06OlZhbHVlKiBqbXBCdWZmZXI7CiAKKyAgbGx2bTo6VmFsdWUqIGN1cnJlbnRUaHJlYWRQdHI7CisKICAgLy8vIHJldHVybiB0aGUgaGVhZGVyIG9mIGFuIG9iamVjdAogICBsbHZtOjpWYWx1ZSogb2JqZWN0VG9IZWFkZXIobGx2bTo6VmFsdWUqIG9iaik7CiAgIApAQCAtMTgyLDYgKzIwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sqIGN1cnJlbnRCbG9jaywgYm9vbCB1c2lnbik7CiAgCiAgIC8vLyBnZXRNdXRhdG9yVGhyZWFkUHRyIC0gRW1pdCBjb2RlIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgTXV0YXRvclRocmVhZC4KKwlsbHZtOjpWYWx1ZSogZ2V0VGhyZWFkUHRyKCk7CisJbGx2bTo6VmFsdWUqIGdldEphdmFUaHJlYWRQdHIoKTsKIAlsbHZtOjpWYWx1ZSogZ2V0TXV0YXRvclRocmVhZFB0cigpOwogCiAgIC8vLyBnZXRJc29sYXRlSURQdHIgLSBFbWl0IGNvZGUgdG8gZ2V0IGEgcG9pbnRlciB0byBJc29sYXRlSUQuCkBAIC01NzAsNiArNTk1LDQ5IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBZaWVsZCBwb2ludCBzdXBwb3J0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAgIHZvaWQgY2hlY2tZaWVsZFBvaW50KCk7CisKKyAgbGx2bTo6VmFsdWUqIGdldEVsZW1lbnRQdHIoCisgICAgY29uc3QgY2hhciAqbmFtZSwgbGx2bTo6VmFsdWUqIGVsZW1lbnQsIGxsdm06OlZhbHVlKiBmaXJzdEluZGV4LCAuLi4pOworICBsbHZtOjpWYWx1ZSogYWxsb2NhdGVPblN0YWNrKAorICAgIGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBieXRlQ291bnQsIGxsdm06OlR5cGUqIHJlYWxUeXBlKTsKKworI2lmIEpBVkFfQ0hBUkdFRF9USUVSX0NBTExfU1RBQ0sKKyAgdm9pZCBhbGxvY2F0ZUNoYXJnZWRUaWVySUQoKTsKKyAgdm9pZCBwdXNoQ2hhcmdlZFRpZXIoKTsKKyAgdm9pZCBwb3BDaGFyZ2VkVGllcigpOworCisgIGxsdm06OlBISU5vZGUqIGNoYXJnZWRUaWVySUQ7CisgIGxsdm06OlZhbHVlKiBzdGFja0VtYmVkZGVkTGlzdEhlYWRDaGFyZ2VkVGllclB0cjsKKyNlbmRpZgorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIHZvaWQgaW5pdGlhbGl6ZUNoYXJnZWRUaWVySUQoKTsKKyAgdm9pZCBzZXRDaGFyZ2VkVGllcklEKCk7CisgIHZvaWQgcmVzZXRDaGFyZ2VkVGllcklEKCk7CisgIHZvaWQgcmVzdG9yZUNoYXJnZWRUaWVySUQoKTsKKyAgdm9pZCBjYWxjdWxhdGVDaGFyZ2VkVGllcklERm9ySW52b2tlKGNvbnN0IE9TR2k6OkNhbGxDb25maWd1cmF0aW9uJik7CisgIHZvaWQgY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZVN0YXRpYyh1aW50MTZfdCBpbmRleCk7CisgIHZvaWQgY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvckludm9rZVNwZWNpYWwodWludDE2X3QgaW5kZXgpOworICB2b2lkIGNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VJbnRlcmZhY2UodWludDE2X3QgaW5kZXgpOworICB2b2lkIGNhbGN1bGF0ZUNoYXJnZWRUaWVySURGb3JJbnZva2VWaXJ0dWFsKHVpbnQxNl90IGluZGV4KTsKKyAgdm9pZCBjYWxjdWxhdGVDaGFyZ2VkVGllcklERm9ySW52b2tlTmF0aXZlKCk7CisgIHZvaWQgY2FsY3VsYXRlQ2hhcmdlZFRpZXJJREZvck5ldyh1aW50MTZfdCBpbmRleCk7CisKKyAgT1NHaTo6dGllcl9pZF90IGNvbXBpbGluZ0NsYXNzVGllcklEOworICBsbHZtOjpWYWx1ZSogdGhyZWFkQ2hhcmdlZFRpZXJJRFB0cjsKKyAgbGx2bTo6VmFsdWUqIHRocmVhZENoYXJnZWRUaWVySURPbGRWYWx1ZTsKKyAgbGx2bTo6VmFsdWUqIG5ld0NoYXJnZWRUaWVySUQ7CisjZW5kaWYKKworI2lmIEVNQkVEREVEX0xJU1RfSU5fQ0FMTF9TVEFDSworICBsbHZtOjpWYWx1ZSogc3RhY2tFbWJlZGRlZExpc3ROb2RlOworICBsbHZtOjpWYWx1ZSogdGhyZWFkU3RhY2tFbWJlZGRlZExpc3RIZWFkUHRyUHRyOworICBsbHZtOjpWYWx1ZSogc3RhY2tFbWJlZGRlZExpc3RIZWFkQ2FsbGVyTm9kZVB0cjsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgdm9pZCBpbmNyZW1lbnRUb3RhbENhbGxlZE1ldGhvZHNDb3VudGVyKCk7CisjZW5kaWYKIH07CiAKIGVudW0gT3Bjb2RlIHsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhSklUT3Bjb2Rlcy5jcHAgYi92bWtpdC9saWIvajMvQ29tcGlsZXIvSmF2YUpJVE9wY29kZXMuY3BwCmluZGV4IDY2YTZjNzAuLmUyNmYyNjggMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9Db21waWxlci9KYXZhSklUT3Bjb2Rlcy5jcHAKKysrIGIvdm1raXQvbGliL2ozL0NvbXBpbGVyL0phdmFKSVRPcGNvZGVzLmNwcApAQCAtMzc2LDcgKzM3Niw3IEBACiAgICAgICBzdGFjay5jbGVhcigpOwogICAgICAgaWYgKG9waW5mby0+aGFuZGxlcikgewogICAgICAgICAvLyBJZiBpdCdzIGEgaGFuZGxlciwgcHV0IHRoZSBleGNlcHRpb24gb2JqZWN0IGluIHRoZSBzdGFjay4KLSAgICAgICAgVmFsdWUqIGphdmFFeGNlcHRpb25QdHIgPSBnZXRKYXZhRXhjZXB0aW9uUHRyKGdldEphdmFUaHJlYWRQdHIoZ2V0TXV0YXRvclRocmVhZFB0cigpKSk7CisgICAgICAgIFZhbHVlKiBqYXZhRXhjZXB0aW9uUHRyID0gZ2V0SmF2YUV4Y2VwdGlvblB0cihnZXRKYXZhVGhyZWFkUHRyKCkpOwogICAgICAgICBWYWx1ZSogb2JqID0gbmV3IExvYWRJbnN0KGphdmFFeGNlcHRpb25QdHIsICJwZW5kaW5nRXhjZXB0aW9uIiwgY3VycmVudEJsb2NrKTsKICAgICAgICAgbmV3IFN0b3JlSW5zdChvYmosIG9iamVjdFN0YWNrWzBdLCAiIiwgY3VycmVudEJsb2NrKTsKICAgICAgICAgLy8gQW5kIGNsZWFyIHRoZSBleGNlcHRpb24uCkBAIC05NDAsMTAgKzk0MCwxMCBAQAogCiAgICAgICAgICAgVmFsdWUqIHJlcyA9IDA7CiAgICAgICAgICAgaWYgKFRoZUNvbXBpbGVyLT5pc1N0YXRpY0NvbXBpbGluZygpKSB7Ci0gICAgICAgIAkgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIGFycmF5IHN0b3JlIGNoZWNrIik7Ci0gICAgICAgIAkgIEJhc2ljQmxvY2sqIGNoZWNrQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJhcnJheSBzdG9yZSBjaGVjayIpOworICAgICAgICAJICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZEFycmF5U3RvcmVDaGVjayIpOworICAgICAgICAJICBCYXNpY0Jsb2NrKiBjaGVja0Jsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiYXJyYXlTdG9yZUNoZWNrIik7CiAgICAgICAgIAkgIEJhc2ljQmxvY2sqIGV4Y2VwdGlvbkJsb2NrID0KLSAgICAgICAgCSAgICAgICAgICAJCSAgY3JlYXRlQmFzaWNCbG9jaygiYXJyYXkgc3RvcmUgZXhjZXB0aW9uIik7CisgICAgICAgIAkgICAgICAgICAgCQkgIGNyZWF0ZUJhc2ljQmxvY2soImFycmF5U3RvcmVFeGNlcHRpb24iKTsKICAgICAgICAgCSAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YU9iamVjdE51bGxDb25zdGFudCwgIiIpOwogCkBAIC0xMjYyLDggKzEyNjIsOCBAQAogICAgICAgICBpZiAoVGhlQ29tcGlsZXItPmhhc0V4Y2VwdGlvbnNFbmFibGVkKCkpIHsKICAgICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCB2YWwyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCAiIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiBudWxsIGRpdiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGwgZGl2Iik7CisgICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbk51bGxEaXYiKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJudWxsRGl2Iik7CiAKICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7CiAgICAgICAgICAgY3VycmVudEJsb2NrID0gaWZUcnVlOwpAQCAtMTI3Miw5ICsxMjcyLDkgQEAKICAgICAgICAgfQogICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCB2YWwyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TWludXNPbmUsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiAtMSBkaXYiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gY3JlYXRlQmFzaWNCbG9jaygiLTEgZGl2Iik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiRW5kIGRpdmlzaW9uIik7CisgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub25NaW51c09uZURpdiIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJtaW51c09uZURpdiIpOworICAgICAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZERpdmlzaW9uIik7CiAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUodmFsMS0+Z2V0VHlwZSgpLCAyLCAiIiwgZW5kQmxvY2spOwogICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmVHJ1ZTsKQEAgLTEzMDAsOCArMTMwMCw4IEBACiAgICAgICAgIGlmIChUaGVDb21waWxlci0+aGFzRXhjZXB0aW9uc0VuYWJsZWQoKSkgewogICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudExvbmdaZXJvLCAiIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiBudWxsIGRpdiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGwgZGl2Iik7CisgICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbk51bGxEaXYiKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJudWxsRGl2Iik7CiAKICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7CiAgICAgICAgICAgY3VycmVudEJsb2NrID0gaWZUcnVlOwpAQCAtMTMzOSw4ICsxMzM5LDggQEAKICAgICAgICAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7CiAgICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgIiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub24gbnVsbCByZW0iKTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJudWxsIHJlbSIpOworICAgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub25OdWxsUmVtIik7CisgICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gY3JlYXRlQmFzaWNCbG9jaygibnVsbFJlbSIpOwogCiAgICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGlmVHJ1ZSwgaWZGYWxzZSwgY21wLCBjdXJyZW50QmxvY2spOwogICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmVHJ1ZTsKQEAgLTEzNDksOCArMTM0OSw4IEBACiAgICAgICAgIH0KICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudE1pbnVzT25lLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub24gLTEgcmVtIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIGJsb2NrIik7CisgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub25NaW51c09uZVJlbSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZEJsb2NrIik7CiAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUodmFsMS0+Z2V0VHlwZSgpLCAyLCAiIiwgZW5kQmxvY2spOwogICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGN1cnJlbnRCbG9jayk7CiAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgaWZGYWxzZSwgY21wLCBjdXJyZW50QmxvY2spOwpAQCAtMTM3Miw4ICsxMzcyLDggQEAKICAgICAgICAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7CiAgICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TG9uZ1plcm8sICIiKTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygibm9uIG51bGwgZGl2Iik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gY3JlYXRlQmFzaWNCbG9jaygibnVsbCBkaXYiKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygibm9uTnVsbERpdiIpOworICAgICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGxEaXYiKTsKIAogICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpZlRydWUsIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKICAgICAgICAgICBjdXJyZW50QmxvY2sgPSBpZlRydWU7CkBAIC0xOTExLDcgKzE5MTEsNyBAQAogICAgICAgICBDb25zdGFudCogdmFsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh0eXBlKTsKICAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGRVEiKTsKKyAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlSUZFUSIpOwogICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwogICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwogICAgICAgICBicmVhazsKQEAgLTE5MjgsNyArMTkyOCw3IEBACiAgICAgICAgIENvbnN0YW50KiB2YWwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHR5cGUpOwogICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZORSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRk5FIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMTk0NCw3ICsxOTQ0LDcgQEAKICAgICAgICAgQ29uc3RhbnQqIHZhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodHlwZSk7CiAgICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NMVCwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZMVCIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRkxUIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMTk2MCw3ICsxOTYwLDcgQEAKICAgICAgICAgQ29uc3RhbnQqIHZhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodHlwZSk7CiAgICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHRSwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZHRSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRkdFIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMTk3Niw3ICsxOTc2LDcgQEAKICAgICAgICAgQ29uc3RhbnQqIHZhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodHlwZSk7CiAgICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHVCwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZHVCIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRkdUIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMTk5Miw3ICsxOTkyLDcgQEAKICAgICAgICAgQ29uc3RhbnQqIHZhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodHlwZSk7CiAgICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NMRSwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZMRSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRkxFIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMjAwNyw3ICsyMDA3LDcgQEAKICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKICAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDIsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGX0lDTVBFUSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRl9JQ01QRVEiKTsKICAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKICAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKICAgICAgICAgYnJlYWs7CkBAIC0yMDIyLDcgKzIwMjIsNyBAQAogICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwogICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgdmFsMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUNNUE5FIik7CisgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZUlGX0lDTVBORSIpOwogICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwogICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwogICAgICAgICBicmVhazsKQEAgLTIwMzcsNyArMjAzNyw3IEBACiAgICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7CiAgICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUZDTVBMVCIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRl9JRkNNUExUIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMjA1Miw3ICsyMDUyLDcgQEAKICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKICAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfU0dFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBJRl9JQ01QR0UiKTsKKyAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlSUZfSUNNUEdFIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMjA2Nyw3ICsyMDY3LDcgQEAKICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKICAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfU0dULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBJRl9JQ01QR1QiKTsKKyAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlSUZfSUNNUEdUIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMjA4Miw3ICsyMDgyLDcgQEAKICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKICAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfU0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBJRl9JQ01QTEUiKTsKKyAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlSUZfSUNNUExFIik7CiAgICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7CiAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtMjA5Nyw3ICsyMDk3LDcgQEAKICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKICAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGX0FDTVBFUSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRl9BQ01QRVEiKTsKICAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKICAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKICAgICAgICAgYnJlYWs7CkBAIC0yMTEyLDcgKzIxMTIsNyBAQAogICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwogICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfQUNNUE5FIik7CisgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZUlGX0FDTVBORSIpOwogICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwogICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwogICAgICAgICBicmVhazsKQEAgLTIxNzgsNyArMjE3OCw3IEBACiAgICAgICAgIGZvciAoc2ludDMyIGN1ciA9IGxvdzsgY3VyIDwgaGlnaDsgKytjdXIpIHsKICAgICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldCh0eXBlLCBjdXIpLCBpbmRleCwgIiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGZhbHNlQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb250aW51ZSB0YWJsZXN3aXRjaCIpOworICAgICAgICAgIEJhc2ljQmxvY2sqIGZhbHNlQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb250aW51ZVRhYmxlc3dpdGNoIik7CiAgICAgICAgICAgT3BpbmZvJiBpbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRVNCgpXTsKICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgYnJhbmNoKGNtcCwgaW5mby5uZXdCbG9jaywgZmFsc2VCbG9jaywgY3VycmVudEJsb2NrLCBpbmZvKTsKQEAgLTIyMDgsNyArMjIwOCw3IEBACiAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbCwga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGZhbHNlQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb250aW51ZSBsb29rdXBzd2l0Y2giKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBmYWxzZUJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiY29udGludWVMb29rdXBzd2l0Y2giKTsKICAgICAgICAgICBPcGluZm8mIGluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFU0KCldOwogICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICBicmFuY2goY21wLCBpbmZvLm5ld0Jsb2NrLCBmYWxzZUJsb2NrLCBjdXJyZW50QmxvY2ssIGluZm8pOwpAQCAtMjQyMCw3ICsyNDIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwogICAgICAgICBUaGVWVCA9IG5ldyBCaXRDYXN0SW5zdChUaGVWVCwgaW50cmluc2ljcy0+cHRyVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7CiAgICAgICAgIEluc3RydWN0aW9uKiByZXMgPSBpbnZva2UoaW50cmluc2ljcy0+VlRBbGxvY2F0ZUZ1bmN0aW9uLCBzaXplLCBUaGVWVCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKKyAgICAgICAgICBjdXJyZW50QmxvY2spOwogICAgICAgICBWYWx1ZSogY2FzdCA9IG5ldyBCaXRDYXN0SW5zdChyZXMsIGludHJpbnNpY3MtPkphdmFBcnJheVR5cGUsICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwogCkBAIC0yNDc0LDIyICsyNDc0LDIyIEBACiAgICAgICAgIFZhbHVlKiBhcmdzWzJdID0geyBvYmosIGNsVmFyIH07CiAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIHR5cGUgY29tcGFyZSIpOworICAgICAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZFR5cGVDb21wYXJlIik7CiAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoVHlwZTo6Z2V0SW50MVR5KCpsbHZtQ29udGV4dCksIDIsICIiLCBlbmRCbG9jayk7CiAgICAgICAgIAogICAgICAgICBpZiAoY2hlY2tjYXN0KSB7Ci0gICAgICAgICAgZXhjZXB0aW9uQ2hlY2tjYXN0ID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgY2hlY2tjYXN0Iik7CisgICAgICAgICAgZXhjZXB0aW9uQ2hlY2tjYXN0ID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VDaGVja2Nhc3QiKTsKIAogICAgICAgICAKLSAgICAgICAgICBlbmRDaGVja2Nhc3QgPSBjcmVhdGVCYXNpY0Jsb2NrKCJudWxsIGNoZWNrY2FzdCIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub24gbnVsbCBjaGVja2Nhc3QiKTsKKyAgICAgICAgICBlbmRDaGVja2Nhc3QgPSBjcmVhdGVCYXNpY0Jsb2NrKCJudWxsQ2hlY2tjYXN0Iik7CisgICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbk51bGxDaGVja2Nhc3QiKTsKIAogICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRDaGVja2Nhc3QsIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKICAgICAgICAgICBjdXJyZW50QmxvY2sgPSBleGNlcHRpb25DaGVja2Nhc3Q7CiAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uKGludHJpbnNpY3MtPkNsYXNzQ2FzdEV4Y2VwdGlvbkZ1bmN0aW9uLCBhcmdzLCAyKTsKICAgICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSB0eXBlIGNvbXBhcmUiKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VUeXBlQ29tcGFyZSIpOwogICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgaWZGYWxzZSwgY21wLCBjdXJyZW50QmxvY2spOwogICAgICAgICAgIG5vZGUtPmFkZEluY29taW5nKENvbnN0YW50SW50OjpnZXRGYWxzZSgqbGx2bUNvbnRleHQpLCBjdXJyZW50QmxvY2spOwogICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7CkBAIC0yNjA3LDcgKzI2MDcsNyBAQAogICAgICAgICBDb25zdGFudCogbmlsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh2YWwtPmdldFR5cGUoKSk7CiAgICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygidHJ1ZSBJRk5VTEwiKTsKKyAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soInRydWVJRk5VTEwiKTsKICAgICAgICAgT3BpbmZvJiBpZlRydWVJbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRTMigpXTsKICAgICAgICAgaSArPSAyOwogICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwpAQCAtMjYyMiw3ICsyNjIyLDcgQEAKICAgICAgICAgQ29uc3RhbnQqIG5pbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodmFsLT5nZXRUeXBlKCkpOwogICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGTk9OTlVMTCIpOworICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2VJRk5PTk5VTEwiKTsKICAgICAgICAgT3BpbmZvJiBpZlRydWVJbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRTMigpXTsKICAgICAgICAgaSArPSAyOwogICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL0NvbXBpbGVyL0xvd2VyQ29uc3RhbnRDYWxscy5jcHAgYi92bWtpdC9saWIvajMvQ29tcGlsZXIvTG93ZXJDb25zdGFudENhbGxzLmNwcAppbmRleCA5M2VkYWFjLi5iZGFiZGVjIDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvQ29tcGlsZXIvTG93ZXJDb25zdGFudENhbGxzLmNwcAorKysgYi92bWtpdC9saWIvajMvQ29tcGlsZXIvTG93ZXJDb25zdGFudENhbGxzLmNwcApAQCAtMjg3LDggKzI4Nyw4IEBACiAgICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIERlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCAiIik7CiAgICAgICAgICAgCi0gICAgICAgICAgQmFzaWNCbG9jayogTm9EZWxlZ2F0ZWUgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJObyBkZWxlZ2F0ZWUiLCAmRik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogRGVsZWdhdGVlT0sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJEZWxlZ2F0ZWUgT0siLCAmRik7CisgICAgICAgICAgQmFzaWNCbG9jayogTm9EZWxlZ2F0ZWUgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJub0RlbGVnYXRlZSIsICZGKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBEZWxlZ2F0ZWVPSyA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgImRlbGVnYXRlZU9LIiwgJkYpOwogICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShOb0RlbGVnYXRlZSwgRGVsZWdhdGVlT0ssIGNtcCwgQ0kpOwogICAgICAgICAgIFBISU5vZGUqIHBoaSA9IFBISU5vZGU6OkNyZWF0ZShpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgMiwgIiIsIERlbGVnYXRlZU9LKTsKICAgICAgICAgICBwaGktPmFkZEluY29taW5nKERlbCwgQ0ktPmdldFBhcmVudCgpKTsKQEAgLTM5OCw4ICszOTgsOCBAQAogICAgICAgICAgIFZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9FUSwgYXJnMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFB0ck51bGwsICIiKTsKICAKLSAgICAgICAgICBCYXNpY0Jsb2NrKiB0cnVlQ2wgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJDdHAgT0siLCAmRik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogZmFsc2VDbCA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIkN0cCBOb3QgT0siLCAmRik7CisgICAgICAgICAgQmFzaWNCbG9jayogdHJ1ZUNsID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiQ3RwT0siLCAmRik7CisgICAgICAgICAgQmFzaWNCbG9jayogZmFsc2VDbCA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIkN0cE5vdE9LIiwgJkYpOwogICAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBsbHZtOjpQSElOb2RlOjpDcmVhdGUocmV0dXJuVHlwZSwgMiwgIiIsIHRydWVDbCk7CiAgICAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoYXJnMSwgQ0ktPmdldFBhcmVudCgpKTsKICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZmFsc2VDbCwgdHJ1ZUNsLCB0ZXN0LCBDSSk7CkBAIC00NjUsOCArNDY1LDggQEAKICAgICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX0VRLCBMb2FkZWRHViwgaW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwogCi0gICAgICAgICAgICBCYXNpY0Jsb2NrKiBPS0Jsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiIiwgJkYpOwotICAgICAgICAgICAgQmFzaWNCbG9jayogTm90T0tCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIiIsICZGKTsKKyAgICAgICAgICAgIEJhc2ljQmxvY2sqIE9LQmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJPSyIsICZGKTsKKyAgICAgICAgICAgIEJhc2ljQmxvY2sqIE5vdE9LQmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJOb3RPSyIsICZGKTsKICAgICAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoaW50cmluc2ljcy0+VlRUeXBlLCAyLCAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0tCbG9jayk7CiAgICAgICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhMb2FkZWRHViwgQ0ktPmdldFBhcmVudCgpKTsKQEAgLTUwOSw4ICs1MDksOCBAQAogICAgICAgICAgIEJhc2ljQmxvY2sqIEVuZEJsb2NrID0gSUktPmdldFBhcmVudCgpLT5zcGxpdEJhc2ljQmxvY2soSUkpOwogICAgICAgICAgIEktPmdldFBhcmVudCgpLT5nZXRUZXJtaW5hdG9yKCktPmVyYXNlRnJvbVBhcmVudCgpOwogICAgICAgICAgIAotICAgICAgICAgIEJhc2ljQmxvY2sqIEN1ckVuZEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiIiwgJkYpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIEZhaWxlZEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiIiwgJkYpOworICAgICAgICAgIEJhc2ljQmxvY2sqIEN1ckVuZEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiY3VycmVudEVuZCIsICZGKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrKiBGYWlsZWRCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgImZhaWxlZCIsICZGKTsKICAgICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKFR5cGU6OmdldEludDFUeSgqQ29udGV4dCksIDIsICIiLCBDdXJFbmRCbG9jayk7CiAKICAgICAgICAgICBDb25zdGFudEludCogQ0MgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKkNvbnRleHQpLApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL0xMVk1SdW50aW1lL3J1bnRpbWUtZGVmYXVsdC5sbCBiL3Zta2l0L2xpYi9qMy9MTFZNUnVudGltZS9ydW50aW1lLWRlZmF1bHQubGwKaW5kZXggZjlmZjRjYS4uMTY5OGMxYiAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL0xMVk1SdW50aW1lL3J1bnRpbWUtZGVmYXVsdC5sbAorKysgYi92bWtpdC9saWIvajMvTExWTVJ1bnRpbWUvcnVudGltZS1kZWZhdWx0LmxsCkBAIC0yNyw2ICsyNywxMCBAQAogOzs7IEZpZWxkIDI6IFRoZSBzdGF0aWMgaW5zdGFuY2UKICVUYXNrQ2xhc3NNaXJyb3IgPSB0eXBlIHsgaTgsIGkxLCBpOCogfQogCis7OzsgRmllbGQgMDogY2FsbGVyTm9kZQorOzs7IEZpZWxkIDE6IGRhdGEKKyVTdGFja0VtYmVkZGVkTGlzdE5vZGUgPSB0eXBlIHsgJVN0YWNrRW1iZWRkZWRMaXN0Tm9kZSosIFsxIHggaTgqXSB9CisKICVDaXJjdWxhckJhc2UgPSB0eXBlIHsgJVZUKiwgJUNpcmN1bGFyQmFzZSosICVDaXJjdWxhckJhc2UqIH0KIAogOzs7IEZpZWxkIDA6ICB0aGUgcGFyZW50IChjaXJjdWxhciBiYXNlKQpAQCAtNDEsNyArNDUsMTMgQEAKIDs7OyBmaWVsZCA5OiAgdm9pZCogIHJvdXRpbmUKIDs7OyBmaWVsZCAxMDogdm9pZCogIGxhc3RLbm93bkZyYW1lCiA7OzsgZmllbGQgMTE6IHZvaWQqICBsYXN0RXhjZXB0aW9uQnVmZmVyCi0lVGhyZWFkID0gdHlwZSB7ICVDaXJjdWxhckJhc2UsIGkzMiwgaTgqLCBpOCosIGkxLCBpMSwgaTEsIGk4KiwgaTgqLCBpOCosIGk4KiwgaTgqIH0KKzs7OyBmaWVsZCAxMjogdWludDMyX3QgY2hhcmdlZFRpZXJJRAorOzs7IGZpZWxkIDEzOiB2b2lkKiAgc3RhY2tFbWJlZGRlZExpc3RIZWFkICggMSA9IHZta2l0OjpTdGFja0VtYmVkZGVkTGlzdE5vZGVDb3VudFBlclRocmVhZCApCis7OzsgZmllbGQgMTQ6IHVpbnQ2NF90IHRvdGFsX2NhbGxlZF9tZXRob2RzX2NvdW50CislVGhyZWFkID0gdHlwZSB7CisJJUNpcmN1bGFyQmFzZSwgaTMyLCBpOCosIGk4KiwgaTEsIGkxLCBpMSwgaTgqLCBpOCosIGk4KiwgaTgqLCBpOCosIGkzMiwKKwlbMSB4ICVTdGFja0VtYmVkZGVkTGlzdE5vZGUqXSwgaTY0Cit9CiAKICVKYXZhVGhyZWFkID0gdHlwZSB7ICVNdXRhdG9yVGhyZWFkLCBpOCosICVKYXZhT2JqZWN0KiB9CiAKQEAgLTE4NCw3ICsxOTQsNyBAQAogCiA7OzsgajNWaXJ0dWFsVGFibGVMb29rdXAgLSBMb29rIHVwIHRoZSBvZmZzZXQgaW4gYSB2aXJ0dWFsIHRhYmxlIG9mIGEKIDs7OyBzcGVjaWZpYyBmdW5jdGlvbi4KLWRlY2xhcmUgaTMyIEBqM1ZpcnR1YWxUYWJsZUxvb2t1cCglSmF2YUNsYXNzKiwgaTMyLCBpMzIqLCAlSmF2YU9iamVjdCopCitkZWNsYXJlICVKYXZhTWV0aG9kKiBAajNWaXJ0dWFsVGFibGVMb29rdXAoJUphdmFDbGFzcyosIGkzMiwgJUphdmFNZXRob2QqKiwgJUphdmFPYmplY3QqKQogCiA7OzsgajNDbGFzc0xvb2t1cCAtIExvb2sgdXAgYSBzcGVjaWZpYyBjbGFzcy4gVGhlIGZ1bmN0aW9uIHRha2VzIGEgY2xhc3MgYW5kCiA7OzsgYW4gaW5kZXggdG8gbG9va3VwIGluIHRoZSBjb25zdGFudCBwb29sIGFuZCByZXR1cm5zIGFuZCBzdG9yZXMgaXQgaW4gdGhlCkBAIC0yNzYsMyArMjg2LDUgQEAKIGRlY2xhcmUgdm9pZCBAajNQcmludEV4ZWN1dGlvbihpMzIsIGkzMiwgJUphdmFNZXRob2QqKQogZGVjbGFyZSB2b2lkIEBqM1ByaW50TWV0aG9kU3RhcnQoJUphdmFNZXRob2QqKQogZGVjbGFyZSB2b2lkIEBqM1ByaW50TWV0aG9kRW5kKCVKYXZhTWV0aG9kKikKKworZGVjbGFyZSB2b2lkIEBKbmp2bV9pbmNyZW1lbnRUb3RhbENhbGxlZE1ldGhvZHNDb3VudGVyKCkKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvQWNjb3VudGluZ0NvbmZpZ3VyYXRpb24uY3BwIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9BY2NvdW50aW5nQ29uZmlndXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhOTE2YQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvQWNjb3VudGluZ0NvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsNTc4IEBACisKKyNpbmNsdWRlICJBY2NvdW50aW5nQ29uZmlndXJhdGlvbi5oIgorCisjaWYgSkFWQV9DSEFSR0VEX1RJRVJfQ0FMTF9TVEFDSworCisKK25hbWVzcGFjZSBqMyB7CituYW1lc3BhY2UgT1NHaSB7CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbENvbmZpZ3VyYXRpb24KKy8vCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQ2FsbENvbmZpZ3VyYXRpb246OkNhbGxDb25maWd1cmF0aW9uKAorCXRpZXJfaWRfdCBjYWxsZXJUaWVySUQsIHRpZXJfaWRfdCBjYWxsZWRUaWVySUQsCisJY29uc3Qgdm1raXQ6OlVURjgqIGNhbGxlZEJ1bmRsZU5hbWUsIGNvbnN0IHZta2l0OjpVVEY4KiBjYWxsZWRJbnRlcmZhY2VOYW1lLAorCWNvbnN0IHZta2l0OjpVVEY4KiBjYWxsZWRNZXRob2ROYW1lKQoreworCXNldChjYWxsZXJUaWVySUQsIGNhbGxlZFRpZXJJRCwKKwkJY2FsbGVkQnVuZGxlTmFtZSwgY2FsbGVkSW50ZXJmYWNlTmFtZSwgY2FsbGVkTWV0aG9kTmFtZSk7Cit9CisKK3ZvaWQgQ2FsbENvbmZpZ3VyYXRpb246OnNldCgKKwl0aWVyX2lkX3QgY2FsbGVyVGllcklELCB0aWVyX2lkX3QgY2FsbGVkVGllcklELAorCWNvbnN0IHZta2l0OjpVVEY4KiBjYWxsZWRCdW5kbGVOYW1lLCBjb25zdCB2bWtpdDo6VVRGOCogY2FsbGVkSW50ZXJmYWNlTmFtZSwKKwljb25zdCB2bWtpdDo6VVRGOCogY2FsbGVkTWV0aG9kTmFtZSkKK3sKKwlfY2FsbGVyX3RpZXJfaWQgPSBjYWxsZXJUaWVySUQ7CisJX2NhbGxlZF90aWVyX2lkID0gY2FsbGVkVGllcklEOworCV9jYWxsZWRfaW50ZXJmYWNlX25hbWUgPSBjYWxsZWRJbnRlcmZhY2VOYW1lOworCV9jYWxsZWRfbWV0aG9kX25hbWUgPSBjYWxsZWRNZXRob2ROYW1lOworCisJLy8gVGhlIHJ1bnRpbWUgZG9lcyBub3QgaG9sZCBhIGJ1bmRsZSBuYW1lLgorCV9jYWxsZWRfYnVuZGxlX25hbWUgPQorCQkoKGNhbGxlZEJ1bmRsZU5hbWUgIT0gbnVsbHB0cikgJiYgKGNhbGxlZFRpZXJJRCAhPSBydW50aW1lVGllcklEKSkgPworCQljYWxsZWRCdW5kbGVOYW1lIDoKKwkJbnVsbHB0cjsKK30KKworaW50IENhbGxDb25maWd1cmF0aW9uOjpjb21wYXJlKGNvbnN0IENhbGxDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QKK3sKKwkvLyBDb21wYXJlIGJhc2VkIG9uIGNhbGxlciB0aWVycywgaWYgdGhleSBhcmUgbm90IGVxdWFsIGFuZCBub3QgZ2VuZXJpYworCWludCBkaWZmID0gMDsKKworCWlmIChfY2FsbGVyX3RpZXJfaWQgIT0gaW52YWxpZFRpZXJJRCAmJgorCQlvdGhlci5fY2FsbGVyX3RpZXJfaWQgIT0gaW52YWxpZFRpZXJJRCkKKwl7CisJCWRpZmYgPSAoaW50KShfY2FsbGVyX3RpZXJfaWQgLSBvdGhlci5fY2FsbGVyX3RpZXJfaWQpOworCQlpZiAoZGlmZiAhPSAwKSByZXR1cm4gZGlmZjsKKwl9CisKKwkvLyBDb21wYXJlIGJhc2VkIG9uIGNhbGxlZCB0aWVycywgaWYgdGhleSBhcmUgbm90IGVxdWFsIG5vdCBnZW5lcmljCisJaWYgKF9jYWxsZWRfdGllcl9pZCAhPSBpbnZhbGlkVGllcklEICYmCisJCW90aGVyLl9jYWxsZWRfdGllcl9pZCAhPSBpbnZhbGlkVGllcklEKQorCXsKKwkJZGlmZiA9IChpbnQpKF9jYWxsZWRfdGllcl9pZCAtIG90aGVyLl9jYWxsZWRfdGllcl9pZCk7CisJCWlmIChkaWZmICE9IDApIHJldHVybiBkaWZmOworCX0KKworCS8vIENvbXBhcmUgYmFzZWQgb24gYnVuZGxlTmFtZSwgaWYgdGhleSBhcmUgbm90IGVxdWFsCisJZGlmZiA9IFVURjg6OmNvbXBhcmUoX2NhbGxlZF9idW5kbGVfbmFtZSwgb3RoZXIuX2NhbGxlZF9idW5kbGVfbmFtZSk7CisJaWYgKGRpZmYgIT0gMCkgcmV0dXJuIGRpZmY7CisKKwkvLyBDb21wYXJlIGJhc2VkIG9uIGludGVyZmFjZU5hbWUKKwlkaWZmID0gVVRGODo6Y29tcGFyZShfY2FsbGVkX2ludGVyZmFjZV9uYW1lLCBvdGhlci5fY2FsbGVkX2ludGVyZmFjZV9uYW1lKTsKKwlpZiAoZGlmZiAhPSAwKSByZXR1cm4gZGlmZjsKKworCXJldHVybiBVVEY4Ojpjb21wYXJlKF9jYWxsZWRfbWV0aG9kX25hbWUsIG90aGVyLl9jYWxsZWRfbWV0aG9kX25hbWUpOworfQorCitib29sIENhbGxDb25maWd1cmF0aW9uOjpnZW5lcmljaXplKCkKK3sKKwlpZiAoX2NhbGxlZF9tZXRob2RfbmFtZSAhPSBudWxscHRyKSB7CisJCV9jYWxsZWRfbWV0aG9kX25hbWUgPSBudWxscHRyOyByZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKF9jYWxsZWRfaW50ZXJmYWNlX25hbWUgIT0gbnVsbHB0cikgeworCQlfY2FsbGVkX2ludGVyZmFjZV9uYW1lID0gbnVsbHB0cjsgcmV0dXJuIHRydWU7CisJfQorCWlmIChfY2FsbGVkX2J1bmRsZV9uYW1lICE9IG51bGxwdHIpIHsKKwkJX2NhbGxlZF9idW5kbGVfbmFtZSA9IG51bGxwdHI7IHJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENhbGxDb25maWd1cmF0aW9uJiBvYmopCit7CisJaWYgKG9iai5fY2FsbGVyX3RpZXJfaWQgPT0gaW52YWxpZFRpZXJJRCkKKwkJb3MgPDwgJyonOworCWVsc2UKKwkJb3MgPDwgKGludClvYmouX2NhbGxlcl90aWVyX2lkOworCisJb3MgPDwgIiA9PiAiOworCisJaWYgKG9iai5fY2FsbGVkX3RpZXJfaWQgPT0gaW52YWxpZFRpZXJJRCkKKwkJb3MgPDwgJyonOworCWVsc2UKKwkJb3MgPDwgKGludClvYmouX2NhbGxlZF90aWVyX2lkOworCisJaWYgKG9iai5fY2FsbGVkX2J1bmRsZV9uYW1lICE9IG51bGxwdHIpCisJCW9zIDw8ICIgYnVuZGxlPSIgPDwgKm9iai5fY2FsbGVkX2J1bmRsZV9uYW1lOworCisJaWYgKG9iai5fY2FsbGVkX2ludGVyZmFjZV9uYW1lICE9IG51bGxwdHIpCisJCW9zIDw8ICIgaW50ZXJmYWNlPSIgPDwgKm9iai5fY2FsbGVkX2ludGVyZmFjZV9uYW1lOworCisJaWYgKG9iai5fY2FsbGVkX21ldGhvZF9uYW1lICE9IG51bGxwdHIpCisJCW9zIDw8ICIgbWV0aG9kPSIgPDwgKm9iai5fY2FsbGVkX21ldGhvZF9uYW1lOworCXJldHVybiBvczsKK30KKwordm9pZCBDYWxsQ29uZmlndXJhdGlvbjo6ZHVtcCgpIGNvbnN0Cit7CisJc3RkOjpjb3V0IDw8ICp0aGlzIDw8IHN0ZDo6ZW5kbDsKK30KKworfQorfQorCisjZW5kaWYKKworI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJKbmp2bUNsYXNzTG9hZGVyLmgiCisjaW5jbHVkZSAiSmF2YVRocmVhZC5oIgorI2luY2x1ZGUgIkpuanZtLmgiCisjaW5jbHVkZSAiSmF2YUNsYXNzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIENvbnRhaW5lclR5cGUsIGNsYXNzIENvbnN0SXRlcmF0b3JUeXBlLCBjbGFzcyBJdGVyYXRvclR5cGU+CitJdGVyYXRvclR5cGUmIGNvbnN0X2Nhc3RfaXRlcmF0b3IoCisJQ29udGFpbmVyVHlwZSYgY29udCwgQ29uc3RJdGVyYXRvclR5cGUmIGNvbnN0X2l0ZXIsIEl0ZXJhdG9yVHlwZSYgaXRlcikKK3sKKwlpdGVyID0gY29udC5iZWdpbigpOworCXN0ZDo6YWR2YW5jZShpdGVyLCBzdGQ6OmRpc3RhbmNlPENvbnN0SXRlcmF0b3JUeXBlPihpdGVyLCBjb25zdF9pdGVyKSk7CisJcmV0dXJuIGl0ZXI7Cit9CisKK25hbWVzcGFjZSBqMyB7CituYW1lc3BhY2UgT1NHaSB7CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgQWNjb3VudGluZ0NvbmZpZ3VyYXRpb25QYXJzZXIKKy8vCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFjY291bnRpbmdDb25maWd1cmF0aW9uUGFyc2VyOjpfdG9rZW5fbmFtZSB7CisJImVycm9yIiwKKwkiKiIsCisJImludGVnZXIiLAorCSJpZGVudGlmaWVyIiwKKwkidGllciIsCisJImFjY291bnQiLAorCSJjYWxsZXIiLAorCSJjYWxsZWQiCit9OworCitBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlcjo6QWNjb3VudGluZ0NvbmZpZ3VyYXRpb25QYXJzZXIoCisJQWNjb3VudGluZ0NvbmZpZ3VyYXRpb24mIGNvbmZpZywgVVRGOE1hcCogaGFzaE1hcCkgOgorCV9pbnB1dChudWxscHRyKSwgX3Rva2VuX3N0YXJ0KG51bGxwdHIpLCBfdG9rZW4oMCksIF9pbnRlZ2VyX3Rva2VuKDApLAorCV9oYXNoX21hcChoYXNoTWFwKSwgX2Vycm9yRGVzY3JpcHRpb24oIlN1Y2Nlc3MiKSwgX2NvbmZpZyhjb25maWcpCit7Cit9CisKK2ludCBBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlcjo6bG9hZCgKKwlBY2NvdW50aW5nQ29uZmlndXJhdGlvbiYgY29uZmlnLAorCWNvbnN0IGNoYXIqIGNvbmZpZ19maWxlLCBzdGQ6OnN0cmluZyYgZXJyb3JEZXNjcmlwdGlvbiwgVVRGOE1hcCogaGFzaE1hcCkKK3sKKwlhdXRvIHIgPSAwOworCWlmc3RyZWFtIGY7CisJZi5vcGVuKGNvbmZpZ19maWxlKTsKKwlpZiAoIWYuaXNfb3BlbigpKSB7CisJCXIgPSBlcnJubzsKKwkJZXJyb3JEZXNjcmlwdGlvbiA9IHN0cmVycm9yKHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlmLnNlZWtnKDAsIGZzdHJlYW06OmVuZCk7CisJc2l6ZV90IGZzaXplID0gZi50ZWxsZygpOworCWYuc2Vla2coMCwgZnN0cmVhbTo6YmVnKTsKKwlpZiAoZnNpemUgPT0gMCkgcmV0dXJuIDA7CisKKwl1bmlxdWVfcHRyPGNoYXJbXT4gYnVmZmVyKG5ldyBjaGFyW2ZzaXplKzFdKTsKKwlmLnJlYWQoYnVmZmVyLmdldCgpLCBmc2l6ZSk7CisJZi5jbG9zZSgpOworCisJYnVmZmVyW2ZzaXplXSA9ICdcMCc7CisKKwlBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlciBwYXJzZXIoY29uZmlnLCBoYXNoTWFwKTsKKwlyID0gcGFyc2VyLnBhcnNlKGJ1ZmZlci5nZXQoKSk7CisKKwllcnJvckRlc2NyaXB0aW9uID0gcGFyc2VyLmdldEVycm9yRGVzY3JpcHRpb24oKTsKKwlyZXR1cm4gcjsKK30KKworaW50IEFjY291bnRpbmdDb25maWd1cmF0aW9uUGFyc2VyOjpwYXJzZUVycm9yKGludCByLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKK3sKKwlfZXJyb3JEZXNjcmlwdGlvbiA9IG1lc3NhZ2UgKyAiLiBBdDogJyI7CisJX2Vycm9yRGVzY3JpcHRpb24uYXBwZW5kKF90b2tlbl9zdGFydCwgMzIpOworCV9lcnJvckRlc2NyaXB0aW9uICs9ICInLi4uIjsKKwlyZXR1cm4gcjsKK30KKworaW50IEFjY291bnRpbmdDb25maWd1cmF0aW9uUGFyc2VyOjp1bmV4cGVjdGVkVG9rZW4oaW50IHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZCkKK3sKKwlyZXR1cm4gcGFyc2VFcnJvcigKKwkJciwgIkV4cGVjdGluZyAiICsgZXhwZWN0ZWQgKyAiLiBHb3QgJyIgKyB0b2tlbk5hbWUoX3Rva2VuKSArICInIik7Cit9CisKK2ludCBBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlcjo6cGFyc2VUaWVyKCkKK3sKKwlpZiAoX3Rva2VuICE9IHRva2VuX3RpZXIpIHJldHVybiBFTk9FTlQ7CisKKwlpZiAoKF90b2tlbiA9IG5leHRUb2tlbigpKSAhPSB0b2tlbl9pbnRlZ2VyKQorCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAidGllciBpZGVudGlmaWVyIChpbnRlZ2VyKSIpOworCisJdGllcl9pZF90IHRpZXJfaWQgPSBfaW50ZWdlcl90b2tlbjsKKworCWlmICh0aWVyX2lkID09IHVuc3BlY2lmaWVkVGllcklEIHx8IHRpZXJfaWQgPT0gcnVudGltZVRpZXJJRCkKKwkJcmV0dXJuIHVuZXhwZWN0ZWRUb2tlbihFQkFERiwgIm5vbi1yZXNlcnZlZCB0aWVyIGlkZW50aWZpZXIiKTsKKworCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpICE9ICd7JykKKwkJcmV0dXJuIHVuZXhwZWN0ZWRUb2tlbihFQkFERiwgIid7JyIpOworCisJYXV0byYgYnVuZGxlcyA9IF9jb25maWcuX3RpZXJfbGlzdC5pbnNlcnQoCisJCUFjY291bnRpbmdDb25maWd1cmF0aW9uOjpUaWVyTGlzdFR5cGU6OnZhbHVlX3R5cGUoCisJCQl0aWVyX2lkLCBBY2NvdW50aW5nQ29uZmlndXJhdGlvbjo6VGllckluZm9ybWF0aW9uKCkpKQorCQkuZmlyc3QtPnNlY29uZDsKKworCV90b2tlbiA9IG5leHRUb2tlbigpOworCXdoaWxlIChfdG9rZW4gIT0gJ30nKSB7CisJCWlmIChfdG9rZW4gIT0gdG9rZW5faWRlbnRpZmllcikKKwkJCXJldHVybiB1bmV4cGVjdGVkVG9rZW4oRUJBREYsICJidW5kbGUgbmFtZSAoaWRlbnRpZmllcikgb3IgJ30nIik7CisKKwkJYnVuZGxlcy5pbnNlcnQoZ2V0VVRGOChfaWRlbnRpZmllcl90b2tlbi5jX3N0cigpKSk7CisKKwkJaWYgKChfdG9rZW4gPSBuZXh0VG9rZW4oKSkgPT0gJywnKQorCQkJX3Rva2VuID0gbmV4dFRva2VuKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlcjo6cGFyc2VBY2NvdW50KCkKK3sKKwlpZiAoX3Rva2VuICE9IHRva2VuX2FjY291bnQpIHJldHVybiBFTk9FTlQ7CisKKwlpZiAoKF90b2tlbiA9IG5leHRUb2tlbigpKSAhPSAneycpCisJCXJldHVybiB1bmV4cGVjdGVkVG9rZW4oRUJBREYsICIneyciKTsKKworCXRpZXJfaWRfdCBjYWxsZXJfdGllcl9pZCwgY2FsbGVkX3RpZXJfaWQ7CisKKwlfdG9rZW4gPSBuZXh0VG9rZW4oKTsKKwlpZiAoX3Rva2VuID09IHRva2VuX2FueV90aWVyKQorCQljYWxsZXJfdGllcl9pZCA9IGludmFsaWRUaWVySUQ7CisJZWxzZSBpZiAoX3Rva2VuID09IHRva2VuX2ludGVnZXIpCisJCWNhbGxlcl90aWVyX2lkID0gX2ludGVnZXJfdG9rZW47CisJZWxzZQorCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAiY2FsbGVyIHRpZXIgaWRlbnRpZmllciAoaW50ZWdlcikiKTsKKworCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpICE9ICcsJykKKwkJcmV0dXJuIHVuZXhwZWN0ZWRUb2tlbihFQkFERiwgIicsJyIpOworCisJX3Rva2VuID0gbmV4dFRva2VuKCk7CisJaWYgKF90b2tlbiA9PSB0b2tlbl9hbnlfdGllcikKKwkJY2FsbGVkX3RpZXJfaWQgPSBpbnZhbGlkVGllcklEOworCWVsc2UgaWYgKF90b2tlbiA9PSB0b2tlbl9pbnRlZ2VyKQorCQljYWxsZWRfdGllcl9pZCA9IF9pbnRlZ2VyX3Rva2VuOworCWVsc2UKKwkJcmV0dXJuIHVuZXhwZWN0ZWRUb2tlbihFQkFERiwgImNhbGxlZCB0aWVyIGlkZW50aWZpZXIgKGludGVnZXIpIik7CisKKwljb25zdCBVVEY4ICpidW5kbGVfbmFtZSA9IG51bGxwdHIsICppbnRlcmZhY2VfbmFtZSA9IG51bGxwdHI7CisJY29uc3QgVVRGOCAqbWV0aG9kX25hbWUgPSBudWxscHRyOworCisJaWYgKChfdG9rZW4gPSBuZXh0VG9rZW4oKSkgPT0gJy8nKSB7CisJCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpICE9IHRva2VuX2lkZW50aWZpZXIpCisJCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAiYnVuZGxlIG5hbWUgKGlkZW50aWZpZXIpIik7CisKKwkJaWYgKF9pZGVudGlmaWVyX3Rva2VuLmxlbmd0aCgpID4gMCAmJgorCQkJX2lkZW50aWZpZXJfdG9rZW4uY29tcGFyZSgiXyIpICE9IDApCisJCXsKKwkJCWJ1bmRsZV9uYW1lID0gZ2V0VVRGOChfaWRlbnRpZmllcl90b2tlbi5jX3N0cigpKTsKKwkJfQorCisJCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpID09ICcvJykgeworCQkJaWYgKChfdG9rZW4gPSBuZXh0VG9rZW4oKSkgIT0gdG9rZW5faWRlbnRpZmllcikKKwkJCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAiaW50ZXJmYWNlIG5hbWUgKGlkZW50aWZpZXIpIik7CisKKwkJCWlmIChfaWRlbnRpZmllcl90b2tlbi5sZW5ndGgoKSA+IDApIHsKKwkJCQkvLyBDb252ZXJ0IGludGVyZmFjZSBuYW1lIHRvIGludGVybmFsIG5hbWUKKwkJCQlzdGQ6OnJlcGxhY2UoX2lkZW50aWZpZXJfdG9rZW4uYmVnaW4oKSwgX2lkZW50aWZpZXJfdG9rZW4uZW5kKCksICcuJywgJy8nKTsKKwkJCQlpbnRlcmZhY2VfbmFtZSA9IGdldFVURjgoX2lkZW50aWZpZXJfdG9rZW4uY19zdHIoKSk7CisJCQl9CisKKwkJCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpID09ICcvJykgeworCQkJCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpICE9IHRva2VuX2lkZW50aWZpZXIpCisJCQkJCXJldHVybiB1bmV4cGVjdGVkVG9rZW4oRUJBREYsICJtZXRob2QgbmFtZSAoaWRlbnRpZmllcikiKTsKKworCQkJCWlmIChfaWRlbnRpZmllcl90b2tlbi5sZW5ndGgoKSA+IDApCisJCQkJCW1ldGhvZF9uYW1lID0gZ2V0VVRGOChfaWRlbnRpZmllcl90b2tlbi5jX3N0cigpKTsKKwkJCQlfdG9rZW4gPSBuZXh0VG9rZW4oKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChfdG9rZW4gIT0gJywnKQorCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAiJy8nIG9yICcsJyIpOworCisJYm9vbCBjaGFyZ2VfY2FsbGVkOworCisJX3Rva2VuID0gbmV4dFRva2VuKCk7CisJaWYgKF90b2tlbiA9PSB0b2tlbl9jYWxsZWQpCisJCWNoYXJnZV9jYWxsZWQgPSB0cnVlOworCWVsc2UgaWYgKF90b2tlbiA9PSB0b2tlbl9jYWxsZXIpCisJCWNoYXJnZV9jYWxsZWQgPSBmYWxzZTsKKwllbHNlCisJCXJldHVybiB1bmV4cGVjdGVkVG9rZW4oRUJBREYsICInY2FsbGVyJyBvciAnY2FsbGVkJyIpOworCisJaWYgKChfdG9rZW4gPSBuZXh0VG9rZW4oKSkgIT0gJ30nKQorCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAiJ30nIik7CisKKwlfY29uZmlnLl9hY2NvdW50aW5nX3J1bGVfbGlzdC5pbnNlcnQoCisJCUFjY291bnRpbmdDb25maWd1cmF0aW9uOjpBY2NvdW50aW5nUnVsZUxpc3RUeXBlOjp2YWx1ZV90eXBlKAorCQkJQ2FsbENvbmZpZ3VyYXRpb24oY2FsbGVyX3RpZXJfaWQsIGNhbGxlZF90aWVyX2lkLAorCQkJCWJ1bmRsZV9uYW1lLCBpbnRlcmZhY2VfbmFtZSwgbWV0aG9kX25hbWUpLAorCQkJY2hhcmdlX2NhbGxlZCkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlcjo6cGFyc2UoY29uc3QgY2hhciogc291cmNlVGV4dCkKK3sKKwlpZiAoIXNvdXJjZVRleHQgfHwgISgqc291cmNlVGV4dCkpIHJldHVybiAwOworCisJX2lucHV0ID0gc291cmNlVGV4dDsKKworCWF1dG8gciA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWlmICgoX3Rva2VuID0gbmV4dFRva2VuKCkpID09IDApIHJldHVybiAwOwkvLyBEb25lCisJCWlmIChfdG9rZW4gPT0gdG9rZW5fZXJyb3IpCisJCQlyZXR1cm4gdW5leHBlY3RlZFRva2VuKEVCQURGLCAiJ3RpZXInIG9yICdhY2NvdW50JyIpOworCisJCWlmICgociA9IHBhcnNlVGllcigpKSA9PSAwKSBjb250aW51ZTsKKwkJaWYgKHIgIT0gRU5PRU5UKSByZXR1cm4gcjsKKworCQlpZiAoKHIgPSBwYXJzZUFjY291bnQoKSkgPT0gMCkgY29udGludWU7CisJCWlmIChyICE9IEVOT0VOVCkgcmV0dXJuIHI7CisKKwkJcmV0dXJuIHVuZXhwZWN0ZWRUb2tlbihFQkFERiwgIid0aWVyJyBvciAnYWNjb3VudCciKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IEFjY291bnRpbmdDb25maWd1cmF0aW9uUGFyc2VyOjpuZXh0VG9rZW4oKQoreworCXdoaWxlICgqX2lucHV0ICE9ICdcMCcpIHsKKwkJZm9yICg7IGlzc3BhY2UoKl9pbnB1dCk7ICsrX2lucHV0KTsJLy8gU2tpcCBzcGFjZXMgYW5kIHRhYnMKKworCQlpZiAoKl9pbnB1dCA9PSAnIycpIHsJLy8gQ29tbWVudAorCQkJZm9yICg7ICgqX2lucHV0ICE9ICdcbicpICYmICgqX2lucHV0ICE9ICdcMCcpOyArK19pbnB1dCk7CisJCQlmb3IgKDsgKCpfaW5wdXQgPT0gJ1xuJykgfHwgKCpfaW5wdXQgPT0gJ1xyJyk7ICsrX2lucHV0KTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghKCpfaW5wdXQpKSByZXR1cm4gMDsKKworCV90b2tlbl9zdGFydCA9IF9pbnB1dDsKKwlpZiAoKl9pbnB1dCA9PSAnKicpIHsrK19pbnB1dDsgcmV0dXJuIHRva2VuX2FueV90aWVyO30KKworCWlmIChpc2RpZ2l0KCpfaW5wdXQpKSB7CisJCWNoYXIgKmVuZHAgPSBudWxscHRyOworCisJCV9pbnRlZ2VyX3Rva2VuID0gKGludClzdHJ0b2woX2lucHV0LCAmZW5kcCwgMTApOworCQlpZiAoZXJybm8gPT0gRVJBTkdFKQorCQkJcmV0dXJuIHBhcnNlRXJyb3IodG9rZW5fZXJyb3IsICJJbnRlZ2VyIGlzIG91dCBvZiByYW5nZSIpOworCisJCV9pbnB1dCA9IGVuZHA7CisJCXJldHVybiB0b2tlbl9pbnRlZ2VyOworCX0KKworCWlmICgoKl9pbnB1dCA9PSAnXycpIHx8ICgqX2lucHV0ID09ICctJykgfHwgaXNhbHBoYSgqX2lucHV0KSkgeworCQljb25zdCBjaGFyKiBzdGFydCA9IF9pbnB1dDsKKwkJZm9yICgrK19pbnB1dDsgKCpfaW5wdXQgPT0gJ18nKSB8fCAoKl9pbnB1dCA9PSAnLScpIHx8CisJCQkoKl9pbnB1dCA9PSAnLicpIHx8IGlzYWxudW0oKl9pbnB1dCk7CisJCQkrK19pbnB1dCk7CisKKwkJc2l6ZV90IGNvdW50ID0gX2lucHV0IC0gc3RhcnQ7CisJCWlmIChjb3VudCA9PSA0ICYmICFzdHJuY21wKHN0YXJ0LCAidGllciIsIGNvdW50KSkKKwkJCXJldHVybiB0b2tlbl90aWVyOworCQlpZiAoY291bnQgPT0gNyAmJiAhc3RybmNtcChzdGFydCwgImFjY291bnQiLCBjb3VudCkpCisJCQlyZXR1cm4gdG9rZW5fYWNjb3VudDsKKwkJaWYgKGNvdW50ID09IDYgJiYgIXN0cm5jbXAoc3RhcnQsICJjYWxsZXIiLCBjb3VudCkpCisJCQlyZXR1cm4gdG9rZW5fY2FsbGVyOworCQlpZiAoY291bnQgPT0gNiAmJiAhc3RybmNtcChzdGFydCwgImNhbGxlZCIsIGNvdW50KSkKKwkJCXJldHVybiB0b2tlbl9jYWxsZWQ7CisKKwkJX2lkZW50aWZpZXJfdG9rZW4uYXNzaWduKHN0YXJ0LCBjb3VudCk7CisJCXJldHVybiB0b2tlbl9pZGVudGlmaWVyOworCX0KKworCXJldHVybiAqKF9pbnB1dCsrKTsKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50aW5nQ29uZmlndXJhdGlvbgorLy8KKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitib29sIFJ1bnRpbWVBY2NvdW50aW5nQ29uZmlndXJhdGlvbjo6c2V0RnJhbWV3b3JrQnVuZGxlTmFtZSgpCit7CisJQnVuZGxlU3RhdGVNb25pdG9yOjpCdW5kbGVJbmZvcm1hdGlvbiBiaTsKKwlpZiAoIV9idW5kbGVfc3RhdGVfbW9uaXRvci5nZXRCdW5kbGVJbmZvQnlJRCgwLCBiaSkpIHJldHVybiBmYWxzZTsKKworCVRpZXJJbmZvcm1hdGlvbiB0aSB7IGJpLm5hbWUgfTsKKwlfdGllcl9saXN0W2ZyYW1ld29ya1RpZXJJRF0gPSB0aTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwordGllcl9pZF90IEFjY291bnRpbmdDb25maWd1cmF0aW9uOjpnZXRUaWVyT2ZCdW5kbGVOYW1lKAorCWNvbnN0IHZta2l0OjpVVEY4KiBidW5kbGVOYW1lKSBjb25zdAoreworCWF1dG8gZSA9IF90aWVyX2xpc3QuZW5kKCk7CisJYXV0byBmID0gc3RkOjpmaW5kX2lmKF90aWVyX2xpc3QuYmVnaW4oKSwgZSwKKwkJW2J1bmRsZU5hbWVdIChjb25zdCBUaWVyTGlzdFR5cGU6OnZhbHVlX3R5cGUmIGVsZW1lbnQpIHsKKwkJCWFzc2VydChlbGVtZW50LmZpcnN0ICE9IHVuc3BlY2lmaWVkVGllcklEICYmCisJCQkJZWxlbWVudC5maXJzdCAhPSBydW50aW1lVGllcklEKTsKKwkJCXJldHVybiBlbGVtZW50LnNlY29uZC5maW5kKGJ1bmRsZU5hbWUpICE9IGVsZW1lbnQuc2Vjb25kLmVuZCgpOworCQl9KTsKKworCS8vIFNvbWUgYnVuZGxlcyBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgdGllcnMKKwlyZXR1cm4gKGYgPT0gZSkgPyB1bnNwZWNpZmllZFRpZXJJRCA6IGYtPmZpcnN0OworfQorCitib29sIEFjY291bnRpbmdDb25maWd1cmF0aW9uOjpmaW5kTmVhcmVzdENhbGxDb25maWd1cmF0aW9uKAorCWNvbnN0IENhbGxDb25maWd1cmF0aW9uJiBjYWxsX2NvbmZpZywKKwlBY2NvdW50aW5nUnVsZUxpc3RUeXBlOjpjb25zdF9pdGVyYXRvciYgZm91bmQpIGNvbnN0Cit7CisJaWYgKGNhbGxfY29uZmlnLl9jYWxsZWRfdGllcl9pZCA9PSBpbnZhbGlkVGllcklEKSByZXR1cm4gZmFsc2U7CisKKwkvLyBMb29rIGZvciB0aGUgcnVsZSwgZnJvbSBleGFjdCBmb3JtIHRvIGFsbCBwb3NzaWJsZSBnZW5lcmljIGZvcm1zLgorCWF1dG8gZSA9IF9hY2NvdW50aW5nX3J1bGVfbGlzdC5lbmQoKTsKKwlhdXRvIGYgPSBlOworCWF1dG8gbm90Rm91bmQgPSBmYWxzZTsKKwlhdXRvIGNhbGxlZChjYWxsX2NvbmZpZyk7CisKKwlkbyB7CisJCWYgPSBzdGQ6OmZpbmRfaWYoX2FjY291bnRpbmdfcnVsZV9saXN0LmJlZ2luKCksIGUsCisJCQlbJmNhbGxlZF0gKGNvbnN0IEFjY291bnRpbmdSdWxlTGlzdFR5cGU6OnZhbHVlX3R5cGUmIGVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gZWxlbWVudC5maXJzdCA9PSBjYWxsZWQ7CisJCX0pOworCQlub3RGb3VuZCA9IChmID09IGUpOworCX0gd2hpbGUgKG5vdEZvdW5kICYmIGNhbGxlZC5nZW5lcmljaXplKCkpOworCisJaWYgKCFub3RGb3VuZCkgZm91bmQgPSBmOworCXJldHVybiAhbm90Rm91bmQ7Cit9CisKK2Jvb2wgQWNjb3VudGluZ0NvbmZpZ3VyYXRpb246OmZpbmROZWFyZXN0Q2FsbENvbmZpZ3VyYXRpb24oCisJY29uc3QgQ2FsbENvbmZpZ3VyYXRpb24mIGNhbGxfY29uZmlnLAorCUFjY291bnRpbmdSdWxlTGlzdFR5cGU6Oml0ZXJhdG9yJiBmb3VuZCkKK3sKKwlBY2NvdW50aW5nUnVsZUxpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBpOworCWF1dG8gciA9IHRoaXMtPmZpbmROZWFyZXN0Q2FsbENvbmZpZ3VyYXRpb24oY2FsbF9jb25maWcsIGkpOworCWlmIChyKSBjb25zdF9jYXN0X2l0ZXJhdG9yKF9hY2NvdW50aW5nX3J1bGVfbGlzdCwgaSwgZm91bmQpOworCXJldHVybiByOworfQorCitib29sIEFjY291bnRpbmdDb25maWd1cmF0aW9uOjpnZXREZWZhdWx0QWNjb3VudGluZ0NoYXJnZWRUb0NhbGxlcigKKwljb25zdCBDYWxsQ29uZmlndXJhdGlvbiYgY2FsbF9jb25maWcpIGNvbnN0Cit7CisJLy8gQnkgZGVmYXVsdCwgdGhlIHJ1bnRpbWUgaXMgbm90IGNoYXJnZWQgZm9yIHJlc291cmNlcyBhbGxvY2F0ZWQKKwkvLyBpbiBvcmRlciB0byBzZXJ2ZSByZXF1ZXN0cy4gSG93ZXZlciwgaXQgaXMgY2hhcmdlZCBmb3IgaW5kZXBlbmRlbnQKKwkvLyB0aHJlYWRzIChydW5uaW5nIG9ubHkgcnVudGltZSBjb2RlKS4KKworCWlmIChjYWxsX2NvbmZpZy5fY2FsbGVyX3RpZXJfaWQgPT0gcnVudGltZVRpZXJJRCAmJgorCQljYWxsX2NvbmZpZy5fY2FsbGVkX3RpZXJfaWQgPT0gcnVudGltZVRpZXJJRCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoY2FsbF9jb25maWcuX2NhbGxlcl90aWVyX2lkID09IHJ1bnRpbWVUaWVySUQpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChjYWxsX2NvbmZpZy5fY2FsbGVkX3RpZXJfaWQgPT0gcnVudGltZVRpZXJJRCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gdHJ1ZTsJLy8gRGVmYXVsdCBiZWhhdmlvcjogY2hhcmdlIHRvIHRoZSBjYWxsZXIKK30KKworYm9vbCBBY2NvdW50aW5nQ29uZmlndXJhdGlvbjo6aXNBY2NvdW50aW5nQ2hhcmdlZFRvQ2FsbGVyKAorCWNvbnN0IENhbGxDb25maWd1cmF0aW9uJiBjYWxsX2NvbmZpZykgY29uc3QKK3sKKwlhc3NlcnQoKChjYWxsX2NvbmZpZy5fY2FsbGVyX3RpZXJfaWQgIT0gaW52YWxpZFRpZXJJRCkKKwkJJiYgKGNhbGxfY29uZmlnLl9jYWxsZWRfdGllcl9pZCAhPSBpbnZhbGlkVGllcklEKSkKKwkJJiYgIkludmFsaWQgdGllcklEIGZvciBjYWxsZXIgYW5kIGNhbGxlZCIpOworCisJaWYgKChjYWxsX2NvbmZpZy5fY2FsbGVyX3RpZXJfaWQgIT0gY2FsbF9jb25maWcuX2NhbGxlZF90aWVyX2lkKSB8fAorCQkoY2FsbF9jb25maWcuX2NhbGxlZF9idW5kbGVfbmFtZSAhPSBudWxscHRyKSB8fAorCQkoY2FsbF9jb25maWcuX2NhbGxlZF9pbnRlcmZhY2VfbmFtZSAhPSBudWxscHRyKSB8fAorCQkoY2FsbF9jb25maWcuX2NhbGxlZF9tZXRob2RfbmFtZSAhPSBudWxscHRyKSkKKwl7CisJCUFjY291bnRpbmdSdWxlTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yIGk7CisJCWlmICh0aGlzLT5maW5kTmVhcmVzdENhbGxDb25maWd1cmF0aW9uKGNhbGxfY29uZmlnLCBpKSkKKwkJCXJldHVybiAhaS0+c2Vjb25kOworCX0KKworCXJldHVybiBnZXREZWZhdWx0QWNjb3VudGluZ0NoYXJnZWRUb0NhbGxlcihjYWxsX2NvbmZpZyk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKAorCXN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEFjY291bnRpbmdDb25maWd1cmF0aW9uOjpUaWVySW5mb3JtYXRpb24mIG9iaikKK3sKKwlvcyA8PCAneyc7CisJZm9yIChjb25zdCBhdXRvJiBpIDogb2JqKQorCQlvcyA8PCAqaSA8PCAnICc7CisJcmV0dXJuIG9zIDw8ICd9JzsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywKKwljb25zdCBBY2NvdW50aW5nQ29uZmlndXJhdGlvbjo6QWNjb3VudGluZ1J1bGVMaXN0VHlwZSYgb2JqKQoreworCW9zIDw8ICd7JzsKKwlmb3IgKGNvbnN0IGF1dG8mIGkgOiBvYmopIHsKKwkJb3MgPDwgaS5maXJzdCA8PCAoaS5zZWNvbmQgPyAiOmNhbGxlZCAiIDogIjpjYWxsZXIgIik7CisJfQorCXJldHVybiBvcyA8PCAnfSc7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEFjY291bnRpbmdDb25maWd1cmF0aW9uJiBvYmopCit7CisJb3MgPDwgIkFjY291bnRpbmdDb25maWd1cmF0aW9uPXRpZXJzeyI7CisKKwlmb3IgKGNvbnN0IGF1dG8mIGkgOiBvYmouZ2V0VGllckxpc3QoKSkKKwkJb3MgPDwgKGludClpLmZpcnN0IDw8ICc9JyA8PCBpLnNlY29uZCA8PCAnLCc7CisKKwlyZXR1cm4gb3MgPDwgIn0scnVsZXM9IiA8PCBvYmouZ2V0QWNjb3VudGluZ1J1bGVMaXN0KCkgPDwgZW5kbDsKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLworLy8gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVBY2NvdW50aW5nQ29uZmlndXJhdGlvbgorLy8KKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit0aWVyX2lkX3QgUnVudGltZUFjY291bnRpbmdDb25maWd1cmF0aW9uOjpnZXRUaWVyT2ZCdW5kbGVJRCgKKwlidW5kbGVfaWRfdCBidW5kbGVJRCkgY29uc3QKK3sKKwlCdW5kbGVTdGF0ZU1vbml0b3I6OkJ1bmRsZUluZm9ybWF0aW9uIGJpOworCWlmICghX2J1bmRsZV9zdGF0ZV9tb25pdG9yLmdldEJ1bmRsZUluZm9CeUlEKGJ1bmRsZUlELCBiaSkpCisJCXJldHVybiBpbnZhbGlkVGllcklEOwkvLyBJbnZhbGlkIGJ1bmRsZSBJRAorCisJcmV0dXJuIGdldFRpZXJPZkJ1bmRsZU5hbWUoYmkubmFtZSk7Cit9CisKK3RpZXJfaWRfdCBSdW50aW1lQWNjb3VudGluZ0NvbmZpZ3VyYXRpb246OmdldFRpZXJPZkNvbW1vbkNsYXNzKAorCWNvbnN0IGozOjpDb21tb25DbGFzcyogY2NsKSBjb25zdAoreworCUJ1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGk7CisJaWYgKCFfYnVuZGxlX3N0YXRlX21vbml0b3IuZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoY2NsLT5jbGFzc0xvYWRlciwgaSkpeworCQkvLyBDbGFzcyBsb2FkZXIgd2l0aG91dCBhIGJ1bmRsZSBJRDogTm90IGEgYnVuZGxlIGNsYXNzIGxvYWRlci4KKwkJcmV0dXJuIHJ1bnRpbWVUaWVySUQ7CisJfQorCisJcmV0dXJuIGdldFRpZXJPZkJ1bmRsZU5hbWUoaS0+c2Vjb25kLm5hbWUpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL1ZNQ29yZS9BY2NvdW50aW5nQ29uZmlndXJhdGlvbi5oIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9BY2NvdW50aW5nQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWM0NGUKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL0FjY291bnRpbmdDb25maWd1cmF0aW9uLmgKQEAgLTAsMCArMSwxOTcgQEAKKworI2lmbmRlZiBBQ0NPVU5USU5HX0NPTkZJR1VSQVRJT05fSF8KKyNkZWZpbmUgQUNDT1VOVElOR19DT05GSUdVUkFUSU9OX0hfCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSAidm1raXQvY29uZmlnLmgiCisjaW5jbHVkZSAiVVRGOC5oIgorCisjaWYgSkFWQV9DSEFSR0VEX1RJRVJfQ0FMTF9TVEFDSworCituYW1lc3BhY2UgajMgeworbmFtZXNwYWNlIE9TR2kgeworCit0eXBlZGVmIHVpbnQxNl90CQl0aWVyX2lkX3Q7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgdGllckNvdW50Qml0cyA9IDE2Oworc3RhdGljIGNvbnN0IHRpZXJfaWRfdCBpbnZhbGlkVGllcklEID0gKDEgPDwgdGllckNvdW50Qml0cykgLSAxOworc3RhdGljIGNvbnN0IHRpZXJfaWRfdCB1bnNwZWNpZmllZFRpZXJJRCA9IGludmFsaWRUaWVySUQgLSAxOworc3RhdGljIGNvbnN0IHRpZXJfaWRfdCBydW50aW1lVGllcklEID0gMDsKK3N0YXRpYyBjb25zdCB0aWVyX2lkX3QgZnJhbWV3b3JrVGllcklEID0gMTsKKworCitjbGFzcyBDYWxsQ29uZmlndXJhdGlvbgoreworcHVibGljOgorCXRpZXJfaWRfdAkJCV9jYWxsZXJfdGllcl9pZCwgX2NhbGxlZF90aWVyX2lkOworCWNvbnN0IHZta2l0OjpVVEY4KglfY2FsbGVkX2J1bmRsZV9uYW1lOworCWNvbnN0IHZta2l0OjpVVEY4KglfY2FsbGVkX2ludGVyZmFjZV9uYW1lOworCWNvbnN0IHZta2l0OjpVVEY4KglfY2FsbGVkX21ldGhvZF9uYW1lOworCisJQ2FsbENvbmZpZ3VyYXRpb24oCisJCXRpZXJfaWRfdCBjYWxsZXJUaWVySUQgPSBpbnZhbGlkVGllcklELAorCQl0aWVyX2lkX3QgY2FsbGVkVGllcklEID0gaW52YWxpZFRpZXJJRCwKKwkJY29uc3Qgdm1raXQ6OlVURjgqIGNhbGxlZEJ1bmRsZU5hbWUgPSBudWxscHRyLAorCQljb25zdCB2bWtpdDo6VVRGOCogY2FsbGVkSW50ZXJmYWNlTmFtZSA9IG51bGxwdHIsCisJCWNvbnN0IHZta2l0OjpVVEY4KiBjYWxsZWRNZXRob2ROYW1lID0gbnVsbHB0cik7CisKKwl2b2lkIHJlc2V0KCkge3NldChpbnZhbGlkVGllcklELCBpbnZhbGlkVGllcklELCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTt9CisJdm9pZCBzZXQoCisJCXRpZXJfaWRfdCBjYWxsZXJUaWVySUQsIHRpZXJfaWRfdCBjYWxsZWRUaWVySUQsCisJCWNvbnN0IHZta2l0OjpVVEY4KiBjYWxsZWRCdW5kbGVOYW1lLAorCQljb25zdCB2bWtpdDo6VVRGOCogY2FsbGVkSW50ZXJmYWNlTmFtZSwKKwkJY29uc3Qgdm1raXQ6OlVURjgqIGNhbGxlZE1ldGhvZE5hbWUpOworCisJaW50IGNvbXBhcmUoY29uc3QgQ2FsbENvbmZpZ3VyYXRpb24mKSBjb25zdDsKKwlib29sIGdlbmVyaWNpemUoKTsKKworCXZvaWQgZHVtcCgpIGNvbnN0IF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7CisKKwlib29sIG9wZXJhdG9yID09IChjb25zdCBDYWxsQ29uZmlndXJhdGlvbiYgbykgY29uc3QKKwkJe3JldHVybiB0aGlzLT5jb21wYXJlKG8pID09IDA7fQorCWJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbENvbmZpZ3VyYXRpb24mIG8pIGNvbnN0CisJCXtyZXR1cm4gdGhpcy0+Y29tcGFyZShvKSA8IDA7fQorCisJZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYsIGNvbnN0IENhbGxDb25maWd1cmF0aW9uJik7Cit9OworCit9Cit9CisKKyNlbmRpZgorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIk9TR2lCdW5kbGVTdGF0ZU1vbml0b3IuaCIKKworbmFtZXNwYWNlIGozIHsKK25hbWVzcGFjZSBPU0dpIHsKKworY2xhc3MgQWNjb3VudGluZ0NvbmZpZ3VyYXRpb25QYXJzZXIKK3sKK3Byb3RlY3RlZDoKKwllbnVtIFRva2VuSUQgeworCQl0b2tlbl9lcnJvciA9IC0xLAorCQl0b2tlbl9hbnlfdGllciA9IC0xMDAsCisJCXRva2VuX2ludGVnZXIsCisJCXRva2VuX2lkZW50aWZpZXIsCisJCXRva2VuX3RpZXIsCisJCXRva2VuX2FjY291bnQsCisJCXRva2VuX2NhbGxlciwKKwkJdG9rZW5fY2FsbGVkCisJfTsKKworCWNvbnN0IGNoYXIJKl9pbnB1dCwgKl90b2tlbl9zdGFydDsKKwlzdGQ6OnN0cmluZwlfaWRlbnRpZmllcl90b2tlbjsKKwlpbnQJCQlfdG9rZW4sIF9pbnRlZ2VyX3Rva2VuOworCXN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gX3Rva2VuX25hbWU7CisJVVRGOE1hcCoJX2hhc2hfbWFwOworCXN0ZDo6c3RyaW5nCV9lcnJvckRlc2NyaXB0aW9uOworCWNsYXNzIEFjY291bnRpbmdDb25maWd1cmF0aW9uJiBfY29uZmlnOworCitwdWJsaWM6CisJQWNjb3VudGluZ0NvbmZpZ3VyYXRpb25QYXJzZXIoCisJCUFjY291bnRpbmdDb25maWd1cmF0aW9uJiBjb25maWcsIFVURjhNYXAqIGhhc2hNYXApOworCXZpcnR1YWwgfkFjY291bnRpbmdDb25maWd1cmF0aW9uUGFyc2VyKCkge30KKworCXN0YXRpYyBpbnQgbG9hZChBY2NvdW50aW5nQ29uZmlndXJhdGlvbiYgY29uZmlnLAorCQljb25zdCBjaGFyKiBjb25maWdfZmlsZSwgc3RkOjpzdHJpbmcmIGVycm9yRGVzY3JpcHRpb24sCisJCVVURjhNYXAqIGhhc2hNYXApOworCisJY29uc3Qgc3RkOjpzdHJpbmcmIGdldEVycm9yRGVzY3JpcHRpb24oKSBjb25zdCB7cmV0dXJuIF9lcnJvckRlc2NyaXB0aW9uO30KKworcHJvdGVjdGVkOgorCWludCBwYXJzZShjb25zdCBjaGFyKiBzb3VyY2VUZXh0KTsKKwlpbnQgcGFyc2VUaWVyKCk7CisJaW50IHBhcnNlQWNjb3VudCgpOworCisJaW50IHVuZXhwZWN0ZWRUb2tlbihpbnQgciwgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkKTsKKwlpbnQgcGFyc2VFcnJvcihpbnQgciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCWludCBuZXh0VG9rZW4oKTsKKworCWNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbk5hbWUoaW50IHRva2VuKSBjb25zdAorCQl7cmV0dXJuIF90b2tlbl9uYW1lW3Rva2VuIC0gdG9rZW5fZXJyb3JdO30KKworCWNvbnN0IFVURjgqIGdldFVURjgoY29uc3QgY2hhciogc3RyKQorCQl7cmV0dXJuIF9oYXNoX21hcC0+bG9va3VwT3JDcmVhdGVBc2NpaXooc3RyKTt9Cit9OworCisvLyBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgaW1tdXRhYmxlIGJlZm9yZSBhbnkgSmF2YSBjb2RlCisvLyBzdGFydHMgcnVubmluZy4KK2NsYXNzIEFjY291bnRpbmdDb25maWd1cmF0aW9uCit7CitwdWJsaWM6CisJdHlwZWRlZiBzdGQ6OnNldDwKKwkJY29uc3Qgdm1raXQ6OlVURjgqIC8qIGJ1bmRsZSBuYW1lICovLAorCQl2bWtpdDo6VVRGOF9Db21wYXJhdG9yPgkJCQkJCVRpZXJJbmZvcm1hdGlvbjsKKwl0eXBlZGVmIHN0ZDo6bWFwPHRpZXJfaWRfdCwgVGllckluZm9ybWF0aW9uPglUaWVyTGlzdFR5cGU7CisJdHlwZWRlZiBzdGQ6Om1hcDwKKwkJY29uc3QgQ2FsbENvbmZpZ3VyYXRpb24sCisJCWJvb2wgLyogY2hhcmdlIGNhbGxlZD8gKi8+CQkJCQlBY2NvdW50aW5nUnVsZUxpc3RUeXBlOworCitwcm90ZWN0ZWQ6CisJVGllckxpc3RUeXBlCQkJX3RpZXJfbGlzdDsKKwlBY2NvdW50aW5nUnVsZUxpc3RUeXBlCV9hY2NvdW50aW5nX3J1bGVfbGlzdDsKKworcHVibGljOgorCXZpcnR1YWwgfkFjY291bnRpbmdDb25maWd1cmF0aW9uKCkge30KKworCWNvbnN0IFRpZXJMaXN0VHlwZSYgZ2V0VGllckxpc3QoKSBjb25zdCB7cmV0dXJuIF90aWVyX2xpc3Q7fQorCWNvbnN0IEFjY291bnRpbmdSdWxlTGlzdFR5cGUmIGdldEFjY291bnRpbmdSdWxlTGlzdCgpIGNvbnN0CisJCXtyZXR1cm4gX2FjY291bnRpbmdfcnVsZV9saXN0O30KKworCWJvb2wgaXNWYWxpZFRpZXIodGllcl9pZF90IHRpZXJJRCkgY29uc3QKKwkJe3JldHVybiAoX3RpZXJfbGlzdC5maW5kKHRpZXJJRCkgIT0gX3RpZXJfbGlzdC5lbmQoKSk7fQorCisJdGllcl9pZF90IGdldFRpZXJPZkJ1bmRsZU5hbWUoY29uc3Qgdm1raXQ6OlVURjgqIGJ1bmRsZU5hbWUpIGNvbnN0OworCisJYm9vbCBmaW5kTmVhcmVzdENhbGxDb25maWd1cmF0aW9uKGNvbnN0IENhbGxDb25maWd1cmF0aW9uJiwKKwkJQWNjb3VudGluZ1J1bGVMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3ImKSBjb25zdDsKKwlib29sIGZpbmROZWFyZXN0Q2FsbENvbmZpZ3VyYXRpb24oY29uc3QgQ2FsbENvbmZpZ3VyYXRpb24mLAorCQlBY2NvdW50aW5nUnVsZUxpc3RUeXBlOjppdGVyYXRvciYpOworCisJYm9vbCBnZXREZWZhdWx0QWNjb3VudGluZ0NoYXJnZWRUb0NhbGxlcigKKwkJY29uc3QgQ2FsbENvbmZpZ3VyYXRpb24mIGNhbGxfY29uZmlnKSBjb25zdDsKKworCWJvb2wgaXNBY2NvdW50aW5nQ2hhcmdlZFRvQ2FsbGVyKAorCQljb25zdCBDYWxsQ29uZmlndXJhdGlvbiYgY2FsbF9jb25maWcpIGNvbnN0OworCisJZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKAorCQlzdGQ6Om9zdHJlYW0mLCBjb25zdCBBY2NvdW50aW5nQ29uZmlndXJhdGlvbiYpOworCWZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICgKKwkJc3RkOjpvc3RyZWFtJiwgY29uc3QgVGllckluZm9ybWF0aW9uJik7CisJZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKAorCQlzdGQ6Om9zdHJlYW0mLCBjb25zdCBBY2NvdW50aW5nUnVsZUxpc3RUeXBlJik7CisKKwlmcmllbmQgY2xhc3MgQWNjb3VudGluZ0NvbmZpZ3VyYXRpb25QYXJzZXI7Cit9OworCisvLyBUaGlzIGNsYXNzIGFkZHMgdGhlIHZhcmlhYmxlIGluZm9ybWF0aW9uIHRvIHRoZSBhY2NvdW50aW5nIGNvbmZpZ3VyYXRpb24uCitjbGFzcyBSdW50aW1lQWNjb3VudGluZ0NvbmZpZ3VyYXRpb24gOgorCXB1YmxpYyBBY2NvdW50aW5nQ29uZmlndXJhdGlvbgoreworcHJvdGVjdGVkOgorCWNvbnN0IEJ1bmRsZVN0YXRlTW9uaXRvciYgX2J1bmRsZV9zdGF0ZV9tb25pdG9yOworCitwdWJsaWM6CisJUnVudGltZUFjY291bnRpbmdDb25maWd1cmF0aW9uKGNvbnN0IEJ1bmRsZVN0YXRlTW9uaXRvciYgYnNtKSA6CisJCV9idW5kbGVfc3RhdGVfbW9uaXRvcihic20pIHt9CisKK3B1YmxpYzoKKwl0aWVyX2lkX3QgZ2V0VGllck9mQnVuZGxlSUQoYnVuZGxlX2lkX3QgYnVuZGxlSUQpIGNvbnN0OworCXRpZXJfaWRfdCBnZXRUaWVyT2ZDb21tb25DbGFzcyhjb25zdCBqMzo6Q29tbW9uQ2xhc3MqIGNjbCkgY29uc3Q7CisKKwlib29sIHNldEZyYW1ld29ya0J1bmRsZU5hbWUoKTsKK307CisKK30KK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YUNsYXNzLmNwcCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YUNsYXNzLmNwcAppbmRleCA3ODM1Yzg0Li4xNzI4NzMyIDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvVk1Db3JlL0phdmFDbGFzcy5jcHAKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhQ2xhc3MuY3BwCkBAIC0yMzQ5LDggKzIzNDksOCBAQAogCiBzdGQ6Om9zdHJlYW0mIGozOjpvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQ29tbW9uQ2xhc3MmIGNjbCkKIHsKLQlvcyA8PCAqY2NsLm5hbWU7Ci0JcmV0dXJuICghY2NsLnN1cGVyKSA/IChvcyA8PCAnOycpIDogKG9zIDw8ICc6JyA8PCAqY2NsLnN1cGVyKTsKKwlyZXR1cm4gb3MgPDwgKmNjbC5uYW1lIDw8ICc7JzsKKy8vCXJldHVybiAoIWNjbC5zdXBlcikgPyAob3MgPDwgJzsnKSA6IChvcyA8PCAnOicgPDwgKmNjbC5zdXBlcik7CiB9CiAKIHZvaWQgQ29tbW9uQ2xhc3M6OmR1bXAoKSBjb25zdApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhQ2xhc3MuaCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YUNsYXNzLmgKaW5kZXggNmI1ZTZiNy4uYTMzNTk3MCAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhQ2xhc3MuaAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL0phdmFDbGFzcy5oCkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogLy8gVXBjYWxscyBmcm9tIEpuSlZNIGNvZGUgdG8gSmF2YSBjb2RlLiAKIC8vCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotICAKKwogI2RlZmluZSBET19UUlkKICNkZWZpbmUgRE9fQ0FUQ0ggaWYgKHRoLT5wZW5kaW5nRXhjZXB0aW9uKSB7IHRoLT50aHJvd0Zyb21KYXZhKCk7IH0KIApAQCAtMTAyMywxMiArMTAyMywxNSBAQAogCWp2YWx1ZSogbWFyc2hhbEFyZ3VtZW50cyh2bWtpdDo6VGhyZWFkQWxsb2NhdG9yJiBhbGxvY2F0b3IsIHZhX2xpc3QgYXApOwogCiAJdGVtcGxhdGU8Y2xhc3MgVFlQRSwgY2xhc3MgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGPgotCVRZUEUgaW52b2tlU3BlY2lhbEJ1ZihKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdm9pZCogYnVmKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIHsKKwlUWVBFIGludm9rZVNwZWNpYWxCdWYoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZvaWQqIGJ1ZikKKwkJX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorCXsKIAkJbGx2bV9nY3Jvb3Qob2JqLCAwKTsKIAkJdmVyaWZ5TnVsbChvYmopOwogCiAJCXZvaWQqIGZ1bmMgPSB0aGlzLT5jb21waWxlZFB0cigpOwotCQlGVU5DX1RZUEVfVklSVFVBTF9CVUYgY2FsbCA9IChGVU5DX1RZUEVfVklSVFVBTF9CVUYpZ2V0U2lnbmF0dXJlKCktPmdldFZpcnR1YWxDYWxsQnVmKCk7CisJCUZVTkNfVFlQRV9WSVJUVUFMX0JVRiBjYWxsID0KKwkJCShGVU5DX1RZUEVfVklSVFVBTF9CVUYpZ2V0U2lnbmF0dXJlKCktPmdldFZpcnR1YWxDYWxsQnVmKCk7CiAKIAkJSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKIAkJdGgtPnN0YXJ0SmF2YSgpOwpAQCAtMTA0MywxMSArMTA0NiwxNCBAQAogCX0KIAogCXRlbXBsYXRlPGNsYXNzIFRZUEUsIGNsYXNzIEZVTkNfVFlQRV9WSVJUVUFMX0JVRj4KLQlUWVBFIGludm9rZVZpcnR1YWxCdWYoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZvaWQqIGJ1ZikgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSB7CisJVFlQRSBpbnZva2VWaXJ0dWFsQnVmKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpCisJCV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKwl7CiAJCWxsdm1fZ2Nyb290KG9iaiwgMCk7CiAKIAkJVXNlckNvbW1vbkNsYXNzKiB0aGVDbGFzcyA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaik7Ci0JCVVzZXJDbGFzcyogb2JqQ2wgPSB0aGVDbGFzcy0+aXNBcnJheSgpID8gdGhlQ2xhc3MtPnN1cGVyIDogdGhlQ2xhc3MtPmFzQ2xhc3MoKTsKKwkJVXNlckNsYXNzKiBvYmpDbCA9CisJCQl0aGVDbGFzcy0+aXNBcnJheSgpID8gdGhlQ2xhc3MtPnN1cGVyIDogdGhlQ2xhc3MtPmFzQ2xhc3MoKTsKIAogCQlKYXZhTWV0aG9kKiBtZXRoID0gdGhpczsKIAkJaWYgKChvYmpDbCAhPSBjbGFzc0RlZikgJiYgIWlzRmluYWwoYWNjZXNzKSkgewpAQCAtMTA1NywxOCArMTA2MywyMiBAQAogCiAJCWFzc2VydChvYmpDbC0+aXNTdWJjbGFzc09mKG1ldGgtPmNsYXNzRGVmKSAmJiAiV3JvbmcgdHlwZSIpOwogCi0JCXJldHVybiBtZXRoLT5pbnZva2VTcGVjaWFsQnVmPFRZUEUsIEZVTkNfVFlQRV9WSVJUVUFMX0JVRj4odm0sIGNsLCBvYmosIGJ1Zik7CisJCXJldHVybiBtZXRoLT5pbnZva2VTcGVjaWFsQnVmPFRZUEUsIEZVTkNfVFlQRV9WSVJUVUFMX0JVRj4oCisJCQl2bSwgY2wsIG9iaiwgYnVmKTsKIAl9CiAKIAl0ZW1wbGF0ZTxjbGFzcyBUWVBFLCBjbGFzcyBGVU5DX1RZUEVfU1RBVElDX0JVRj4KLQlUWVBFIGludm9rZVN0YXRpY0J1ZihKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIHZvaWQqIGJ1ZikgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSB7CisJVFlQRSBpbnZva2VTdGF0aWNCdWYoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCB2b2lkKiBidWYpCisJCV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKwl7CiAJCWlmICghY2wtPmlzUmVhZHkoKSkgewogCQkJY2wtPnJlc29sdmVDbGFzcygpOwogCQkJY2wtPmluaXRpYWxpc2VDbGFzcyh2bSk7CiAJCX0KIAogCQl2b2lkKiBmdW5jID0gdGhpcy0+Y29tcGlsZWRQdHIoKTsKLQkJRlVOQ19UWVBFX1NUQVRJQ19CVUYgY2FsbCA9IChGVU5DX1RZUEVfU1RBVElDX0JVRilnZXRTaWduYXR1cmUoKS0+Z2V0U3RhdGljQ2FsbEJ1ZigpOworCQlGVU5DX1RZUEVfU1RBVElDX0JVRiBjYWxsID0KKwkJCShGVU5DX1RZUEVfU1RBVElDX0JVRilnZXRTaWduYXR1cmUoKS0+Z2V0U3RhdGljQ2FsbEJ1ZigpOwogCiAJCUphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7CiAJCXRoLT5zdGFydEphdmEoKTsKQEAgLTEwODMsNDQgKzEwOTMsNjQgQEAKIAl9CiAKIAl0ZW1wbGF0ZTxjbGFzcyBUWVBFLCBjbGFzcyBGVU5DX1RZUEVfVklSVFVBTF9CVUY+Ci0JVFlQRSBpbnZva2VWaXJ0dWFsQVAoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXApIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgeworCVRZUEUgaW52b2tlVmlydHVhbEFQKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2YV9saXN0IGFwKQorCQlfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisJewogCQlsbHZtX2djcm9vdChvYmosIDApOwogCQlhc3NlcnQoY2wgJiYgIkNsYXNzIGlzIE5VTEwiKTsKIAkJdm1raXQ6OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7CiAJCWp2YWx1ZSogYnVmZmVyID0gbWFyc2hhbEFyZ3VtZW50cyhhbGxvY2F0b3IsIGFwKTsKLQkJcmV0dXJuIGludm9rZVZpcnR1YWxCdWY8VFlQRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGPih2bSwgY2wsIG9iaiwgYnVmZmVyKTsKKwkJcmV0dXJuIGludm9rZVZpcnR1YWxCdWY8VFlQRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGPigKKwkJCXZtLCBjbCwgb2JqLCBidWZmZXIpOwogCX0KIAogCXRlbXBsYXRlPGNsYXNzIFRZUEUsIGNsYXNzIEZVTkNfVFlQRV9WSVJUVUFMX0JVRj4KLQlUWVBFIGludm9rZVNwZWNpYWxBUChKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSB7CisJVFlQRSBpbnZva2VTcGVjaWFsQVAoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXApCisJCV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKwl7CiAJCWxsdm1fZ2Nyb290KG9iaiwgMCk7CiAJCWFzc2VydChjbCAmJiAiQ2xhc3MgaXMgTlVMTCIpOwogCQl2bWtpdDo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKIAkJanZhbHVlKiBidWZmZXIgPSBtYXJzaGFsQXJndW1lbnRzKGFsbG9jYXRvciwgYXApOwotCQlyZXR1cm4gaW52b2tlU3BlY2lhbEJ1ZjxUWVBFLCBGVU5DX1RZUEVfVklSVFVBTF9CVUY+KHZtLCBjbCwgb2JqLCBidWZmZXIpOworCQlyZXR1cm4gaW52b2tlU3BlY2lhbEJ1ZjxUWVBFLCBGVU5DX1RZUEVfVklSVFVBTF9CVUY+KAorCQkJdm0sIGNsLCBvYmosIGJ1ZmZlcik7CiAJfQogCiAJdGVtcGxhdGU8Y2xhc3MgVFlQRSwgY2xhc3MgRlVOQ19UWVBFX1NUQVRJQ19CVUY+Ci0JVFlQRSBpbnZva2VTdGF0aWNBUChKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIHZhX2xpc3QgYXApIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgeworCVRZUEUgaW52b2tlU3RhdGljQVAoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCB2YV9saXN0IGFwKQorCQlfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisJewogCQlhc3NlcnQoY2wgJiYgIkNsYXNzIGlzIE5VTEwiKTsKIAkJdm1raXQ6OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7CiAJCWp2YWx1ZSogYnVmZmVyID0gbWFyc2hhbEFyZ3VtZW50cyhhbGxvY2F0b3IsIGFwKTsKIAkJcmV0dXJuIGludm9rZVN0YXRpY0J1ZjxUWVBFLCBGVU5DX1RZUEVfU1RBVElDX0JVRj4odm0sIGNsLCBidWZmZXIpOwogCX0KIAorI3VuZGVmIERPX1RSWQorI3VuZGVmIERPX0NBVENICisKICNkZWZpbmUgSmF2YU1ldGhvZF9ERUNMX0lOVk9LRV9WQShUWVBFLCBUWVBFX05BTUUpIFwKKwlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNWaXJ0dWFsKEpuanZtKiB2bSwgSmF2YU1ldGhvZCogaW50ZW5kZWRNZXRob2RUb0NhbGwsIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsJXAogCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1ZpcnR1YWwoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CVwKKwlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNTcGVjaWFsKEpuanZtKiB2bSwgSmF2YU1ldGhvZCogaW50ZW5kZWRNZXRob2RUb0NhbGwsIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsJXAogCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1NwZWNpYWwoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CVwKKwlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNTdGF0aWMoSm5qdm0qIHZtLCBKYXZhTWV0aG9kKiBpbnRlbmRlZE1ldGhvZFRvQ2FsbCwgVXNlckNsYXNzKiBjbCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsJXAogCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1N0YXRpYyhKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CiAKICNkZWZpbmUgSmF2YU1ldGhvZF9ERUNMX0lOVk9LRV9BUChUWVBFLCBUWVBFX05BTUUpCVwKKwlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNWaXJ0dWFsQVAoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXAsIEphdmFNZXRob2QqIGludGVuZGVkTWV0aG9kVG9DYWxsKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsJXAogCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1ZpcnR1YWxBUChKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CVwKKwlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNTcGVjaWFsQVAoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXAsIEphdmFNZXRob2QqIGludGVuZGVkTWV0aG9kVG9DYWxsKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsJXAogCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1NwZWNpYWxBUChKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CVwKKwlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNTdGF0aWNBUChKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIHZhX2xpc3QgYXAsIEphdmFNZXRob2QqIGludGVuZGVkTWV0aG9kVG9DYWxsKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsJXAogCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1N0YXRpY0FQKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CiAKICNkZWZpbmUgSmF2YU1ldGhvZF9ERUNMX0lOVk9LRV9CVUYoVFlQRSwgVFlQRV9OQU1FKQlcCisJVFlQRSBpbnZva2UjI1RZUEVfTkFNRSMjVmlydHVhbEJ1ZihKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdm9pZCogYnVmLCBKYXZhTWV0aG9kKiBpbnRlbmRlZE1ldGhvZFRvQ2FsbCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CVwKIAlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNWaXJ0dWFsQnVmKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwlcCisJVFlQRSBpbnZva2UjI1RZUEVfTkFNRSMjU3BlY2lhbEJ1ZihKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdm9pZCogYnVmLCBKYXZhTWV0aG9kKiBpbnRlbmRlZE1ldGhvZFRvQ2FsbCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7CVwKIAlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNTcGVjaWFsQnVmKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwlcCisgCVRZUEUgaW52b2tlIyNUWVBFX05BTUUjI1N0YXRpY0J1ZihKbmp2bSogdm0sIFVzZXJDbGFzcyogY2wsIHZvaWQqIGJ1ZiwgSmF2YU1ldGhvZCogaW50ZW5kZWRNZXRob2RUb0NhbGwpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwkJCQkJXAogIAlUWVBFIGludm9rZSMjVFlQRV9OQU1FIyNTdGF0aWNCdWYoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCB2b2lkKiBidWYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwogCiAjZGVmaW5lIEphdmFNZXRob2RfREVDTF9JTlZPS0UoVFlQRSwgVFlQRV9OQU1FKSBcCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL0phdmFNZXRhSklULmNwcCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YU1ldGFKSVQuY3BwCmluZGV4IDY2OGZmNTUuLjU1MGFhYmYgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YU1ldGFKSVQuY3BwCisrKyBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YU1ldGFKSVQuY3BwCkBAIC02OSwxOSArNjksMTkgQEAKIAkJcmV0dXJuIHJlczsJXAogCX0JXAogCVRZUEUgSmF2YU1ldGhvZDo6aW52b2tlIyNUWVBFX05BTUUjI1NwZWNpYWwoSm5qdm0qIHZtLCBVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIC4uLikgewlcCi0JICBsbHZtX2djcm9vdChvYmosIDApOwlcCi0JICB2YV9saXN0IGFwOwlcCi0JICB2YV9zdGFydChhcCwgb2JqKTsJXAotCSAgVFlQRSByZXMgPSBpbnZva2VTcGVjaWFsQVA8VFlQRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGPih2bSwgY2wsIG9iaiwgYXApOwlcCi0JICB2YV9lbmQoYXApOwlcCi0JICByZXR1cm4gcmVzOwlcCisJCWxsdm1fZ2Nyb290KG9iaiwgMCk7CVwKKwkJdmFfbGlzdCBhcDsJXAorCQl2YV9zdGFydChhcCwgb2JqKTsJXAorCQlUWVBFIHJlcyA9IGludm9rZVNwZWNpYWxBUDxUWVBFLCBGVU5DX1RZUEVfVklSVFVBTF9CVUY+KHZtLCBjbCwgb2JqLCBhcCk7CVwKKwkJdmFfZW5kKGFwKTsJXAorCQlyZXR1cm4gcmVzOwlcCiAJfQlcCiAJVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3RhdGljKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgLi4uKSB7CVwKLQkgIHZhX2xpc3QgYXA7CVwKLQkgIHZhX3N0YXJ0KGFwLCBjbCk7CVwKLQkgIFRZUEUgcmVzID0gaW52b2tlU3RhdGljQVA8VFlQRSwgRlVOQ19UWVBFX1NUQVRJQ19CVUY+KHZtLCBjbCwgYXApOwlcCi0JICB2YV9lbmQoYXApOwlcCi0JICByZXR1cm4gcmVzOwlcCisJCXZhX2xpc3QgYXA7CVwKKwkJdmFfc3RhcnQoYXAsIGNsKTsJXAorCQlUWVBFIHJlcyA9IGludm9rZVN0YXRpY0FQPFRZUEUsIEZVTkNfVFlQRV9TVEFUSUNfQlVGPih2bSwgY2wsIGFwKTsJXAorCQl2YV9lbmQoYXApOwlcCisJCXJldHVybiByZXM7CVwKIAl9CiAKICNkZWZpbmUgSmF2YU1ldGhvZF9JTlZPS0VfQVAoVFlQRSwgVFlQRV9OQU1FLCBGVU5DX1RZUEVfVklSVFVBTF9BUCwgRlVOQ19UWVBFX1NUQVRJQ19BUCwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGLCBGVU5DX1RZUEVfU1RBVElDX0JVRikJXApAQCAtMTA0LDcgKzEwNCw3IEBACiAJfSAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAlUWVBFIEphdmFNZXRob2Q6Omludm9rZSMjVFlQRV9OQU1FIyNTcGVjaWFsQnVmKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpIHsJXAogCQlsbHZtX2djcm9vdChvYmosIDApOyAJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJcmV0dXJuIGludm9rZVNwZWNpYWxCdWY8VFlQRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGPih2bSwgY2wsIG9iaiwgYnVmKTsgCQkJCQkJCVwKKwkJcmV0dXJuIGludm9rZVNwZWNpYWxCdWY8VFlQRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGPih2bSwgY2wsIG9iaiwgYnVmKTsJCQkJCQkJCVwKIAl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3RhdGljQnVmKEpuanZtKiB2bSwgVXNlckNsYXNzKiBjbCwgdm9pZCogYnVmKSB7CQkJCQlcCiAJCXJldHVybiBpbnZva2VTdGF0aWNCdWY8VFlQRSwgRlVOQ19UWVBFX1NUQVRJQ19CVUY+KHZtLCBjbCwgYnVmKTsgCQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhT2JqZWN0LmNwcCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YU9iamVjdC5jcHAKaW5kZXggYzg1NDJkMS4uYTkxYmM3NiAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhT2JqZWN0LmNwcAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL0phdmFPYmplY3QuY3BwCkBAIC0zODcsOSArMzg3LDExIEBACiBzdGQ6Om9zdHJlYW0mIGozOjpvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSmF2YU9iamVjdCYgb2JqKQogewogCUphdmFPYmplY3QqIGphdmFMb2FkZXIgPSBOVUxMOwotCWNvbnN0IEphdmFTdHJpbmcqIHRocmVhZE5hbWVPYmogPSBOVUxMOworCWNvbnN0IEphdmFTdHJpbmcqIGpzdHIgPSBOVUxMOworCWNvbnN0IEphdmFPYmplY3RWTVRocmVhZCogdm10aE9iaiA9IE5VTEw7CiAJbGx2bV9nY3Jvb3QoamF2YUxvYWRlciwgMCk7Ci0JbGx2bV9nY3Jvb3QodGhyZWFkTmFtZU9iaiwgMCk7CisJbGx2bV9nY3Jvb3QoanN0ciwgMCk7CisJbGx2bV9nY3Jvb3Qodm10aE9iaiwgMCk7CiAKIAlpZiAoVk1DbGFzc0xvYWRlcjo6aXNWTUNsYXNzTG9hZGVyKCZvYmopKSB7CiAJCUpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciA9ICgoY29uc3QgVk1DbGFzc0xvYWRlciYpb2JqKS5nZXRDbGFzc0xvYWRlcigpOwpAQCAtNDE2LDI0ICs0MTgsMzEgQEAKIAkJb3MgPDwgJm9iaiA8PCAiKGNsYXNzPSIgPDwgKmNjbDsKIAogCQlpZiAoY2NsID09IHZtLT51cGNhbGxzLT5uZXdUaHJlYWQpIHsKLQkJCXRocmVhZE5hbWVPYmogPSBzdGF0aWNfY2FzdDxjb25zdCBKYXZhU3RyaW5nKj4oCisJCQlqc3RyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSmF2YVN0cmluZyo+KAogCQkJCXZtLT51cGNhbGxzLT50aHJlYWROYW1lLT5nZXRJbnN0YW5jZU9iamVjdEZpZWxkKAogCQkJCQljb25zdF9jYXN0PEphdmFPYmplY3QqPigmb2JqKSkpOwogCi0JCQljaGFyICp0aHJlYWROYW1lID0gSmF2YVN0cmluZzo6c3RyVG9Bc2NpaXoodGhyZWFkTmFtZU9iaik7Ci0JCQlvcyA8PCAiLG5hbWU9XCIiIDw8IHRocmVhZE5hbWUgPDwgJ1wiJzsKLQkJCWRlbGV0ZSBbXSB0aHJlYWROYW1lOworCQkJb3MgPDwgIixuYW1lPSIgPDwgKmpzdHI7CiAJCX0KICNpZm5kZWYJIE9wZW5KREtQYXRoCiAJCWVsc2UgaWYgKGNjbCA9PSB2bS0+dXBjYWxscy0+bmV3Vk1UaHJlYWQpIHsKLQkJCWNvbnN0IEphdmFPYmplY3RWTVRocmVhZCYgdm10aE9iaiA9IChjb25zdCBKYXZhT2JqZWN0Vk1UaHJlYWQmKW9iajsKLQkJCWZvciAoaW50IHJldHJpZXMgPSAxMDsgKCF2bXRoT2JqLnZtZGF0YSkgJiYgKHJldHJpZXMgPj0gMCk7IC0tcmV0cmllcykKKwkJCXZtdGhPYmogPSBzdGF0aWNfY2FzdDxjb25zdCBKYXZhT2JqZWN0Vk1UaHJlYWQqPigmb2JqKTsKKwkJCWZvciAoaW50IHJldHJpZXMgPSAxMDsgKCF2bXRoT2JqLT52bWRhdGEpICYmIChyZXRyaWVzID49IDApOyAtLXJldHJpZXMpCiAJCQkJdXNsZWVwKDEwMCk7CiAKLQkJCWlmIChjb25zdCBKYXZhT2JqZWN0KiB0aE9iaiA9IHZtdGhPYmoudm1kYXRhLT5jdXJyZW50VGhyZWFkKCkpCisJCQlpZiAoY29uc3QgSmF2YU9iamVjdCogdGhPYmogPSB2bXRoT2JqLT52bWRhdGEtPmN1cnJlbnRUaHJlYWQoKSkKIAkJCQlvcyA8PCAiLHRocmVhZD0iIDw8ICp0aE9iajsKIAkJfQogI2VuZGlmCisJCWVsc2UgaWYgKGNjbCA9PSB2bS0+dXBjYWxscy0+bmV3Q2xhc3MpIHsKKwkJCWNjbCA9IEphdmFPYmplY3RDbGFzczo6Z2V0Q2xhc3MoCisJCQkJY29uc3RfY2FzdDxKYXZhT2JqZWN0Q2xhc3MqPigKKwkJCQkJc3RhdGljX2Nhc3Q8Y29uc3QgSmF2YU9iamVjdENsYXNzKj4oJm9iaikpKTsKKworCQkJb3MgPDwgIixuYW1lPVwiIiA8PCAqY2NsLT5hc0NsYXNzKCkgPDwgJ1wiJzsKKwkJfSBlbHNlIGlmIChjY2wgPT0gdm0tPnVwY2FsbHMtPm5ld1N0cmluZykgeworCQkJb3MgPDwgJywnIDw8IHN0YXRpY19jYXN0PGNvbnN0IEphdmFTdHJpbmcmPihvYmopOworCQl9CiAKIAkJb3MgPDwgJyknOwogCX0KQEAgLTQ1MCwzICs0NTksMjIgQEAKIHsKIAlKYXZhT2JqZWN0OjpnZXRDbGFzcyh0aGlzKS0+ZHVtcCgpOwogfQorCit2b2lkIEphdmFPYmplY3Q6OmR1bXBUb1N0cmluZygpIGNvbnN0Cit7CisJSmF2YVN0cmluZyoganN0ciA9IE5VTEw7CisJbGx2bV9nY3Jvb3QoanN0ciwgMCk7CisKKwlpZiAoVk1DbGFzc0xvYWRlcjo6aXNWTUNsYXNzTG9hZGVyKHRoaXMpIHx8IFZNU3RhdGljSW5zdGFuY2U6OmlzVk1TdGF0aWNJbnN0YW5jZSh0aGlzKSkKKwl7Y2VyciA8PCAiPGludmFsaWQ+IiA8PCBlbmRsOyByZXR1cm47fQorCisJQ2xhc3MqIGNsID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3ModGhpcyktPmFzQ2xhc3MoKTsKKwlpZiAoIWNsKSB7Y2VyciA8PCAiPGludmFsaWQ+IiA8PCBlbmRsOyByZXR1cm47fQorCisJSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT5nZXRKVk0oKTsKKwlqc3RyID0gc3RhdGljX2Nhc3Q8SmF2YVN0cmluZyo+KAorCQl2bS0+dXBjYWxscy0+dG9TdHJpbmctPmludm9rZUphdmFPYmplY3RWaXJ0dWFsKAorCQkJdm0sIGNsLCBjb25zdF9jYXN0PEphdmFPYmplY3QqPih0aGlzKSkpOworCisJY2VyciA8PCAqanN0ciA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhT2JqZWN0LmggYi92bWtpdC9saWIvajMvVk1Db3JlL0phdmFPYmplY3QuaAppbmRleCBhZmUxYzk1Li44ODE1MjgzIDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvVk1Db3JlL0phdmFPYmplY3QuaAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL0phdmFPYmplY3QuaApAQCAtMzM0LDYgKzMzNCw3IEBACiAgIHZvaWQgZHVtcENsYXNzKCkgY29uc3QgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKICAgdm9pZCBkdW1wKCkgY29uc3QgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYsIGNvbnN0IEphdmFPYmplY3QmKTsKKyAgdm9pZCBkdW1wVG9TdHJpbmcoKSBjb25zdCBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOwogfTsKIAogCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL0phdmFSdW50aW1lSklULmNwcCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVJ1bnRpbWVKSVQuY3BwCmluZGV4IDQ5MjEzNDguLmFhNDE5MjQgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVJ1bnRpbWVKSVQuY3BwCisrKyBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVJ1bnRpbWVKSVQuY3BwCkBAIC0xMTAsMTAgKzExMCw5IEBACiB9CiAKIC8vIFRocm93cyBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLWV4dGVybiAiQyIgdWludDMyIGozVmlydHVhbFRhYmxlTG9va3VwKFVzZXJDbGFzcyogY2FsbGVyLCB1aW50MzIgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqIG9mZnNldCwgSmF2YU9iamVjdCogb2JqKSB7CitleHRlcm4gIkMiIHZvaWQqIGozVmlydHVhbFRhYmxlTG9va3VwKFVzZXJDbGFzcyogY2FsbGVyLCB1aW50MzIgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogamF2YU1ldGhvZCwgSmF2YU9iamVjdCogb2JqKSB7CiAgIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIHVpbnQzMiByZXMgPSAwOwogICAKICAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IDA7CiAgIGNvbnN0IFVURjgqIHV0ZjggPSAwOwpAQCAtMTM0LDE1ICsxMzMsMTMgQEAKICAgICAgIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmFzQ2xhc3MoKTsKICAgICBkbWV0aCA9IGxvb2t1cC0+bG9va3VwTWV0aG9kKHV0ZjgsIHNpZ24tPmtleU5hbWUsIGZhbHNlLCB0cnVlLCAwKTsKICAgfSBlbHNlIHsKLSAgICAqb2Zmc2V0ID0gZG1ldGgtPm9mZnNldDsKKyAgICAqamF2YU1ldGhvZCA9IGRtZXRoOwogICB9CiAKICAgYXNzZXJ0KGRtZXRoLT5jbGFzc0RlZi0+aXNJbml0aWFsaXppbmcoKSAmJiAKICAgICAgICAgICJDbGFzcyBub3QgcmVhZHkgaW4gYSB2aXJ0dWFsIGxvb2t1cC4iKTsKIAotICByZXMgPSBkbWV0aC0+b2Zmc2V0OwotCi0gIHJldHVybiByZXM7CisgIHJldHVybiBkbWV0aDsKIH0KIAogLy8gVGhyb3dzIGlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQuCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL0phdmFTdHJpbmcuY3BwIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhU3RyaW5nLmNwcAppbmRleCBlMGU0N2I5Li41MTViMDk1IDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvVk1Db3JlL0phdmFTdHJpbmcuY3BwCisrKyBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVN0cmluZy5jcHAKQEAgLTEyMCw0ICsxMjAsMjggQEAKICAgcmV0dXJuIHJlczsKIH0KIAorc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSmF2YVN0cmluZyYganN0cikKK3sKKwljaGFyICpzdHIgPSBKYXZhU3RyaW5nOjpzdHJUb0FzY2lpeigmanN0cik7CisJb3MgPDwgJ1wiJyA8PCBzdHIgPDwgJ1wiJzsKKwlkZWxldGUgW10gc3RyOworCXJldHVybiBvczsKK30KKworY29uc3QgVVRGOCogSmF2YVN0cmluZzo6dG9VVEY4KGNvbnN0IEphdmFTdHJpbmcqIHNlbGYsIFVURjhNYXAqIGhhc2hNYXApCit7CisJaWYgKCFzZWxmKSByZXR1cm4gTlVMTDsKKwlpZiAoIWhhc2hNYXApIHsKKwkJSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOworCQloYXNoTWFwID0gdm0tPmJvb3RzdHJhcExvYWRlci0+aGFzaFVURjg7CisJfQorCisJY29uc3QgajM6OkFycmF5VUludDE2ICphcnJheSA9IGozOjpKYXZhU3RyaW5nOjpnZXRWYWx1ZShzZWxmKTsKKwljb25zdCBqMzo6QXJyYXlVSW50MTY6OkVsZW1lbnRUeXBlICplbHRzID0KKwkJajM6OkFycmF5VUludDE2OjpnZXRFbGVtZW50cyhhcnJheSk7CisJc2l6ZV90IGNvdW50ID0gajM6OkFycmF5VUludDE2OjpnZXRTaXplKGFycmF5KTsKKworCXJldHVybiBoYXNoTWFwLT5sb29rdXBPckNyZWF0ZVJlYWRlcihlbHRzLCBjb3VudCk7Cit9CisKIH0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVN0cmluZy5oIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhU3RyaW5nLmgKaW5kZXggNjVhNWY1OS4uYjc3ODBmMSAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhU3RyaW5nLmgKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhU3RyaW5nLmgKQEAgLTU5LDkgKzU5LDEyIEBACiAgIHN0YXRpYyBjaGFyKiBzdHJUb0FzY2lpeihjb25zdCBKYXZhU3RyaW5nKiBzZWxmKTsKICAgc3RhdGljIGNoYXIqIHN0clRvQXNjaWl6KGNvbnN0IEphdmFTdHJpbmcqIHNlbGYsIHZta2l0OjpUaHJlYWRBbGxvY2F0b3IqIGFsbG9jYXRvcik7CiAgIHN0YXRpYyBjb25zdCBBcnJheVVJbnQxNiogc3RyVG9BcnJheShKYXZhU3RyaW5nKiBzZWxmLCBKbmp2bSogdm0pOworICBzdGF0aWMgY29uc3QgVVRGOCogdG9VVEY4KGNvbnN0IEphdmFTdHJpbmcqIHNlbGYsIFVURjhNYXAqIGhhc2hNYXApOwogCiAgIC8vLyBqYXZhVG9JbnRlcm5hbCAtIFJlcGxhY2VzIGFsbCAnLycgaW50byAnLicuCiAgIHN0YXRpYyBjb25zdCBVVEY4KiBqYXZhVG9JbnRlcm5hbChjb25zdCBKYXZhU3RyaW5nKiBzZWxmLCBVVEY4TWFwKiBtYXApOworCisgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mLCBjb25zdCBKYXZhU3RyaW5nJik7CiB9OwogCiB9IC8vIGVuZCBuYW1lc3BhY2UgajMKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVRocmVhZC5jcHAgYi92bWtpdC9saWIvajMvVk1Db3JlL0phdmFUaHJlYWQuY3BwCmluZGV4IDgyM2FmNTMuLmFkYjlkMWEgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVRocmVhZC5jcHAKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhVGhyZWFkLmNwcApAQCAtOCw2ICs4LDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGVycm5vLmg+CiAKICNpbmNsdWRlICJ2bWtpdC9Mb2Nrcy5oIgogI2luY2x1ZGUgInZta2l0L1RocmVhZC5oIgpAQCAtMTMyLDcgKzEzMyw3IEBACiAKICAgd2hpbGUgKHZta2l0OjpGcmFtZUluZm8qIEZJID0gV2Fsa2VyLmdldCgpKSB7CiAgICAgaWYgKEZJLT5NZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICBNeVZNLT5wcmludE1ldGhvZChGSSwgV2Fsa2VyLmlwLCBXYWxrZXIuYWRkcik7CisgICAgICBNeVZNLT5wcmludE1ldGhvZChGSSwgV2Fsa2VyLnJldHVybkFkZHJlc3MsIFdhbGtlci5jYWxsRnJhbWVBZGRyZXNzKTsKICAgICB9CiAgICAgKytXYWxrZXI7CiAgIH0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSmF2YVRocmVhZC5oIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhVGhyZWFkLmgKaW5kZXggOTk4MTM4NS4uOTU3NDBlYSAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhVGhyZWFkLmgKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9KYXZhVGhyZWFkLmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgSk5KVk1fSkFWQV9USFJFQURfSAogCiAjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJ2bWtpdC9Db25kLmgiCiAjaW5jbHVkZSAidm1raXQvTG9ja3MuaCIKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvSm5qdm0uY3BwIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9Kbmp2bS5jcHAKaW5kZXggNGY3ZmRmZC4uMTMyMzg0YyAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9Kbmp2bS5jcHAKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9Kbmp2bS5jcHAKQEAgLTQ0LDYgKzQ0LDcgQEAKIGNvbnN0IGNoYXIqIEpuanZtOjplbnZTZXBhcmF0b3IgPSAiOiI7CiBjb25zdCB1bnNpZ25lZCBpbnQgSm5qdm06Ok1hZ2ljID0gMHhjYWZlYmFiZTsKIAorCiAvKioKICAqIEluIEpWTSBzcGVjaWZpY2F0aW9uLCB0aGUgdmlydHVhbCBtYWNoaW5lIHNob3VsZCBleGVjdXRlIHNvbWUgY29kZSB3aGVuCiAgKiAgdGhlIGFwcGxpY2F0aW9uIGZpbmlzaC4KQEAgLTEwNzksMTggKzEwODAsNDIgQEAKICAgSmF2YU9iamVjdCogbG9hZGVyID0gMDsKICAgbGx2bV9nY3Jvb3QobG9hZGVyLCAwKTsKICAgCi0gIGlmIChhcHBDbGFzc0xvYWRlciA9PSBOVUxMKSB7Ci0gICAgVXNlckNsYXNzKiBjbCA9IHVwY2FsbHMtPm5ld0NsYXNzTG9hZGVyOwotICAgIGxvYWRlciA9IHVwY2FsbHMtPmdldFN5c3RlbUNsYXNzTG9hZGVyLT5pbnZva2VKYXZhT2JqZWN0U3RhdGljKHRoaXMsIGNsKTsKLSAgICBhcHBDbGFzc0xvYWRlciA9IEpuanZtQ2xhc3NMb2FkZXI6OmdldEpuanZtTG9hZGVyRnJvbUphdmFPYmplY3QobG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICBpZiAoYXJndW1lbnRzSW5mby5qYXJGaWxlKSB7Ci0gICAgICBhcHBDbGFzc0xvYWRlci0+bG9hZExpYkZyb21KYXIodGhpcywgYXJndW1lbnRzSW5mby5qYXJGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0luZm8uY2xhc3NOYW1lKTsKLSAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c0luZm8uY2xhc3NOYW1lKSB7Ci0gICAgICBhcHBDbGFzc0xvYWRlci0+bG9hZExpYkZyb21GaWxlKHRoaXMsIGFyZ3VtZW50c0luZm8uY2xhc3NOYW1lKTsKKyAgaWYgKGFwcENsYXNzTG9hZGVyICE9IG51bGxwdHIpIHJldHVybiBhcHBDbGFzc0xvYWRlcjsKKworICBVc2VyQ2xhc3MqIGNsID0gdXBjYWxscy0+bmV3Q2xhc3NMb2FkZXI7CisgIGxvYWRlciA9IHVwY2FsbHMtPmdldFN5c3RlbUNsYXNzTG9hZGVyLT5pbnZva2VKYXZhT2JqZWN0U3RhdGljKHRoaXMsIGNsKTsKKyAgYXBwQ2xhc3NMb2FkZXIgPSBKbmp2bUNsYXNzTG9hZGVyOjpnZXRKbmp2bUxvYWRlckZyb21KYXZhT2JqZWN0KGxvYWRlciwgdGhpcyk7CisKKyNpZiBPU0dJX0JVTkRMRV9TVEFURV9JTkZPCisgIGlmIChhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSAhPSBudWxscHRyKSB7CisgICAgYnVuZGxlX3N0YXRlX21vbml0b3Iuc2V0RnJhbWV3b3JrRnJvbU1haW5DbGFzcygKKyAgICAgIGFyZ3VtZW50c0luZm8uY2xhc3NOYW1lLCBhcHBDbGFzc0xvYWRlcik7CisgIH0KKyNlbmRpZgorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisgIGlmIChhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSAhPSBudWxscHRyKSB7CisgICAgY29uc3QgY2hhciogZmlsZW5hbWUgPSAiLi90ZXN0cy9tb25pdG9yaW5nLnJ1bGVzIjsKKyAgICBzdGQ6OnN0cmluZyBlcnJvckRlc2NyaXB0aW9uOworICAgIGF1dG8gciA9IHRpZXJfbWFuYWdlci5sb2FkQWNjb3VudGluZ1J1bGVzKGZpbGVuYW1lLCBlcnJvckRlc2NyaXB0aW9uKTsKKworICAgIGlmICghcikgeworICAgICAgc3RkOjpjb3V0IDw8ICJBY2NvdW50aW5nIGNvbmZpZ3VyYXRpb24gcnVsZXMgbG9hZGVkIGZyb20gJyIgPDwgZmlsZW5hbWUKKyAgICAgICAgPDwgIicuIFN0YXR1czogIiA8PCBlcnJvckRlc2NyaXB0aW9uIDw8ICIuIiA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGxvYWQgYWNjb3VudGluZyBjb25maWd1cmF0aW9uIHJ1bGVzIGZyb20gJyIKKyAgICAgICAgPDwgZmlsZW5hbWUgPDwgIicuIEVycm9yOiAiIDw8IGVycm9yRGVzY3JpcHRpb24gPDwgIi4iIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAgIH0KKyNlbmRpZgorCisgIGlmIChhcmd1bWVudHNJbmZvLmphckZpbGUpIHsKKyAgICBhcHBDbGFzc0xvYWRlci0+bG9hZExpYkZyb21KYXIodGhpcywgYXJndW1lbnRzSW5mby5qYXJGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSk7CisgIH0gZWxzZSBpZiAoYXJndW1lbnRzSW5mby5jbGFzc05hbWUpIHsKKyAgICBhcHBDbGFzc0xvYWRlci0+bG9hZExpYkZyb21GaWxlKHRoaXMsIGFyZ3VtZW50c0luZm8uY2xhc3NOYW1lKTsKKyAgfQorCiAgIHJldHVybiBhcHBDbGFzc0xvYWRlcjsKIH0KIApAQCAtMTMyMCw2ICsxMzQ1LDcgQEAKIAogICAgIHZtLT5leGVjdXRlQ2xhc3MoaW5mby5jbGFzc05hbWUsIGFyZ3MpOwogICB9CisKICAgdm0tPnRocmVhZFN5c3RlbS5sZWF2ZSgpOwogfQogCkBAIC0xMzUwLDYgKzEzNzYsMTAgQEAKICAgICAgICAgICAgICB2bWtpdDo6Q29tcGlsZWRGcmFtZXMqKiBmcmFtZXMsCiAgICAgICAgICAgICAgSm5qdm1Cb290c3RyYXBMb2FkZXIqIGxvYWRlcikgOiAKICAgVmlydHVhbE1hY2hpbmUoQWxsb2MsIGZyYW1lcyksIGxvY2tTeXN0ZW0oQWxsb2MpCisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyAgLCB0aWVyX21hbmFnZXIoYnVuZGxlX3N0YXRlX21vbml0b3IsIGxvYWRlci0+aGFzaFVURjgpCisjZW5kaWYKIHsKICAgY2xhc3NwYXRoID0gZ2V0ZW52KCJDTEFTU1BBVEgiKTsKICAgaWYgKGNsYXNzcGF0aCA9PSBOVUxMKSBjbGFzc3BhdGggPSAiLiI7CkBAIC0xNTUzLDMgKzE1ODMsMzcgQEAKIAlzdGQ6OmNlcnIgPDwgIkJhY2sgdHJhY2U6IiA8PCBzdGQ6OmVuZGw7CiAJSmF2YVRocmVhZDo6Z2V0KCktPnByaW50SmF2YUJhY2t0cmFjZSgpOwogfQorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKworc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90Pgl0b3RhbF9jcmVhdGVkX29iamVjdHMoMCk7CitzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+CXRvdGFsX2NhbGxlZF9tZXRob2RzX2NvdW50KDApOworCitleHRlcm4gIkMiIHZvaWQgSm5qdm1fbmV3bHlDcmVhdGVkT2JqZWN0KCkKK3sKKwkrK3RvdGFsX2NyZWF0ZWRfb2JqZWN0czsKK30KKworZXh0ZXJuICJDIiB2b2lkIEpuanZtX2luY3JlbWVudFRvdGFsQ2FsbGVkTWV0aG9kc0NvdW50ZXIodm1raXQ6OlRocmVhZCogdGhyZWFkKQoreworCXRvdGFsX2NhbGxlZF9tZXRob2RzX2NvdW50ICs9IHRocmVhZC0+dG90YWxfY2FsbGVkX21ldGhvZHNfY291bnQ7CisJdGhyZWFkLT50b3RhbF9jYWxsZWRfbWV0aG9kc19jb3VudCA9IDA7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBKbmp2bV9kdW1wR2xvYmFsU3RhdHMoKQoreworCWF1dG8gdGggPSB2bWtpdDo6VGhyZWFkOjpnZXQoKTsKKwlhdXRvIHRjdXIgPSB0aDsKKworCWRvIHsKKwkJSm5qdm1faW5jcmVtZW50VG90YWxDYWxsZWRNZXRob2RzQ291bnRlcih0Y3VyKTsKKwkJdGN1ciA9ICh2bWtpdDo6VGhyZWFkKil0Y3VyLT5uZXh0KCk7CisJfSB3aGlsZSAodGN1ciAhPSB0aCk7CisKKwlzdGQ6OmNvdXQgPDwgIj09PT0gU1RBVFMgPT09PSIgPDwgc3RkOjplbmRsCisJCTw8ICJUb3RhbENyZWF0ZWRPYmplY3RzQ291bnQ9IiA8PCB0b3RhbF9jcmVhdGVkX29iamVjdHMKKwkJPDwgIixUb3RhbENhbGxlZE1ldGhvZHNDb3VudD0iIDw8IHRvdGFsX2NhbGxlZF9tZXRob2RzX2NvdW50CisJCTw8IHN0ZDo6ZW5kbDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL0puanZtLmggYi92bWtpdC9saWIvajMvVk1Db3JlL0puanZtLmgKaW5kZXggMzQxMWZmYy4uNjYwNGZjMSAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9Kbmp2bS5oCisrKyBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSm5qdm0uaApAQCAtMjcsNiArMjcsMTQgQEAKICNpbmNsdWRlICJKTklSZWZlcmVuY2VzLmgiCiAjaW5jbHVkZSAiTG9ja2VkTWFwLmgiCiAKKyNpZiBPU0dJX0JVTkRMRV9TVEFURV9JTkZPCisjaW5jbHVkZSAiT1NHaUJ1bmRsZVN0YXRlTW9uaXRvci5oIgorI2VuZGlmCisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKyNpbmNsdWRlICJPU0dpVGllck1hbmFnZXIuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgajMgewogCiBjbGFzcyBBcnJheVVJbnQxNjsKQEAgLTM2NSw2ICszNzMsMTQgQEAKICAgdm9pZCBsb2FkQm9vdHN0cmFwKCk7CiAKICAgc3RhdGljIHZvaWQgcHJpbnRCYWNrdHJhY2UoKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOworCisjaWYgT1NHSV9CVU5ETEVfU1RBVEVfSU5GTworICBPU0dpOjpCdW5kbGVTdGF0ZU1vbml0b3IgYnVuZGxlX3N0YXRlX21vbml0b3I7CisjZW5kaWYKKworI2lmIE9TR0lfQlVORExFX1RJRVJfVEFHR0lORworICBPU0dpOjpUaWVyTWFuYWdlciB0aWVyX21hbmFnZXI7CisjZW5kaWYKIH07CiAKIH0gLy8gZW5kIG5hbWVzcGFjZSBqMwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL1ZNQ29yZS9Kbmp2bUNsYXNzTG9hZGVyLmNwcCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvSm5qdm1DbGFzc0xvYWRlci5jcHAKaW5kZXggMzg0ZWVkOS4uNGEzMzYyNyAxMDA2NDQKLS0tIGEvdm1raXQvbGliL2ozL1ZNQ29yZS9Kbmp2bUNsYXNzTG9hZGVyLmNwcAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL0puanZtQ2xhc3NMb2FkZXIuY3BwCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSAiUmVhZGVyLmgiCiAjaW5jbHVkZSAiWmlwLmgiCiAKLQogdXNpbmcgbmFtZXNwYWNlIGozOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAtODgzLDYgKzg4MiwxMCBAQAogCiBKbmp2bUNsYXNzTG9hZGVyOjp+Sm5qdm1DbGFzc0xvYWRlcigpIHsKIAorI2lmIE9TR0lfQlVORExFX1NUQVRFX0lORk8KKyAgT1NHaTo6QnVuZGxlU3RhdGVNb25pdG9yOjpnZXQoKS0+b25DbGFzc0xvYWRlclVubG9hZGVkKHRoaXMpOworI2VuZGlmCisKICAgaWYgKHZtKSB7CiAgICAgdm0tPnJlbW92ZUZyYW1lSW5mb3MoVGhlQ29tcGlsZXIpOwogICB9CmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL09TR2lCdW5kbGVTdGF0ZU1vbml0b3IuY3BwIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9PU0dpQnVuZGxlU3RhdGVNb25pdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU4MThmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9PU0dpQnVuZGxlU3RhdGVNb25pdG9yLmNwcApAQCAtMCwwICsxLDM0MCBAQAorCisjaW5jbHVkZSAiT1NHaUJ1bmRsZVN0YXRlTW9uaXRvci5oIgorCisjaWYgT1NHSV9CVU5ETEVfU1RBVEVfSU5GTworCisjaW5jbHVkZSAiQ2xhc3NwYXRoUmVmbGVjdC5oIgorI2luY2x1ZGUgIkpuanZtLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNkZWZpbmUgREVCVUdfVkVSQk9TRV9PU0dJX1NUQVRFX0NIQU5HRQkwCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBqMyB7CituYW1lc3BhY2UgT1NHaSB7CisKK3ZvaWQgQnVuZGxlU3RhdGVNb25pdG9yOjpCdW5kbGVJbmZvcm1hdGlvbjo6cmVzZXQoKQoreworCWxvYWRlciA9IE5VTEw7CisJbmFtZSA9IE5VTEw7CisJcHJldmlvdXNMb2FkZXJzLmNsZWFyKCk7Cit9CisKK0J1bmRsZVN0YXRlTW9uaXRvcjo6QnVuZGxlU3RhdGVNb25pdG9yKCkgOgorCXN0YXRlRUwoTlVMTCksIHN0YXRlRUxfdXNlcl9wYXJhbShOVUxMKSwgZnJhbWV3b3JrRnJvbU1haW5DbGFzc1NldChmYWxzZSkKK3sKKwlzdGF0ZUVMID0gbmV3IEJ1bmRsZVN0YXRlRXZlbnRMaXN0ZW5lcjsKK30KKworQnVuZGxlU3RhdGVNb25pdG9yKiBCdW5kbGVTdGF0ZU1vbml0b3I6OmdldCgpCit7CisJdm1raXQ6OlRocmVhZCogdGggPSB2bWtpdDo6VGhyZWFkOjpnZXQoKTsKKwlhc3NlcnQodGggJiYgIkludmFsaWQgY3VycmVudCB0aHJlYWQuIik7CisJaWYgKCF0aCkgcmV0dXJuIE5VTEw7CisKKwlKbmp2bSogdm0gPSBzdGF0aWNfY2FzdDxKbmp2bSo+KHRoLT5NeVZNKTsKKwlpZiAoIXZtKSByZXR1cm4gTlVMTDsKKworCXJldHVybiAmdm0tPmJ1bmRsZV9zdGF0ZV9tb25pdG9yOworfQorCit2b2lkIEJ1bmRsZVN0YXRlTW9uaXRvcjo6c2V0U3RhdGVFdmVudExpc3RlbmVyKAorCXZvaWQgKnVzZXJfcGFyYW0sIEJ1bmRsZVN0YXRlRXZlbnRMaXN0ZW5lciYgbCkKK3sKKwlzdGF0ZUVMX3VzZXJfcGFyYW0gPSB1c2VyX3BhcmFtOworCXN0YXRlRUwgPSAmbDsKK30KKworYm9vbCBCdW5kbGVTdGF0ZU1vbml0b3I6OmdldEJ1bmRsZUluZm9CeUlEKAorCWJ1bmRsZV9pZF90IGlkLCBCdW5kbGVJbmZvcm1hdGlvbiYgaW5mbykgY29uc3QKK3sKKwl2bWtpdDo6TG9ja0d1YXJkIGxnKGxvY2spOworCUJ1bmRsZUluZm9UeXBlOjpjb25zdF9pdGVyYXRvciBpID0gYnVuZGxlSW5mby5maW5kKGlkKSwgZT1idW5kbGVJbmZvLmVuZCgpOworCWlmIChpID09IGUpIHJldHVybiBmYWxzZTsKKworCWluZm8gPSBpLT5zZWNvbmQ7CisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQnVuZGxlU3RhdGVNb25pdG9yOjpnZXRCdW5kbGVJbmZvQnlJRCgKKwlidW5kbGVfaWRfdCBpZCwgQnVuZGxlSW5mb1R5cGU6Oml0ZXJhdG9yJiBpdGVyYXRvcikKK3sKKwl2bWtpdDo6TG9ja0d1YXJkIGxnKGxvY2spOworCWl0ZXJhdG9yID0gYnVuZGxlSW5mby5maW5kKGlkKTsKKwlyZXR1cm4gKGl0ZXJhdG9yICE9IGJ1bmRsZUluZm8uZW5kKCkpOworfQorCitib29sIEJ1bmRsZVN0YXRlTW9uaXRvcjo6Z2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoCisJY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwKKwlCdW5kbGVJbmZvVHlwZTo6Y29uc3RfaXRlcmF0b3ImIGl0ZXJhdG9yKSBjb25zdAoreworCXZta2l0OjpMb2NrR3VhcmQgbGcobG9jayk7CisJQnVuZGxlSW5mb1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGkgPSBidW5kbGVJbmZvLmJlZ2luKCksIGUgPSBidW5kbGVJbmZvLmVuZCgpOworCWZvciAoOyBpICE9IGU7ICsraSkgeworCQlpZiAoaS0+c2Vjb25kLmxvYWRlciAhPSBsb2FkZXIpIHsKKwkJCUNsYXNzTG9hZGVyUXVldWU6OmNvbnN0X2l0ZXJhdG9yCisJCQkJcGxiID0gaS0+c2Vjb25kLnByZXZpb3VzTG9hZGVycy5iZWdpbigpLAorCQkJCXBsZSA9IGktPnNlY29uZC5wcmV2aW91c0xvYWRlcnMuZW5kKCk7CisKKwkJCWlmIChzdGQ6OmZpbmQocGxiLCBwbGUsIGxvYWRlcikgPT0gcGxlKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaXRlcmF0b3IgPSBpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVuZGxlU3RhdGVNb25pdG9yOjpnZXRCdW5kbGVJbmZvQnlDbGFzc0xvYWRlcigKKwljb25zdCBqMzo6Sm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLCBCdW5kbGVJbmZvVHlwZTo6aXRlcmF0b3ImIGl0ZXJhdG9yKQoreworCXZta2l0OjpMb2NrR3VhcmQgbGcobG9jayk7CisJQnVuZGxlSW5mb1R5cGU6Oml0ZXJhdG9yIGkgPSBidW5kbGVJbmZvLmJlZ2luKCksIGUgPSBidW5kbGVJbmZvLmVuZCgpOworCWZvciAoOyBpICE9IGU7ICsraSkgeworCQlpZiAoaS0+c2Vjb25kLmxvYWRlciAhPSBsb2FkZXIpIHsKKwkJCUNsYXNzTG9hZGVyUXVldWU6OmNvbnN0X2l0ZXJhdG9yCisJCQkJcGxiID0gaS0+c2Vjb25kLnByZXZpb3VzTG9hZGVycy5iZWdpbigpLAorCQkJCXBsZSA9IGktPnNlY29uZC5wcmV2aW91c0xvYWRlcnMuZW5kKCk7CisKKwkJCWlmIChzdGQ6OmZpbmQocGxiLCBwbGUsIGxvYWRlcikgPT0gcGxlKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaXRlcmF0b3IgPSBpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVuZGxlU3RhdGVNb25pdG9yOjpnZXRCdW5kbGVJbmZvQnlDbGFzc0xvYWRlcigKKwljb25zdCBqMzo6Sm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLAorCWJ1bmRsZV9pZF90ICZpZCwgQnVuZGxlSW5mb3JtYXRpb24mIGluZm8pIGNvbnN0Cit7CisJdm1raXQ6OkxvY2tHdWFyZCBsZyhsb2NrKTsKKwlCdW5kbGVJbmZvVHlwZTo6Y29uc3RfaXRlcmF0b3IgaTsKKwlib29sIGZvdW5kID0gY29uc3RfY2FzdDxCdW5kbGVTdGF0ZU1vbml0b3IqPih0aGlzKS0+CisJCWdldEJ1bmRsZUluZm9CeUNsYXNzTG9hZGVyKGxvYWRlciwgaSk7CisKKwlpZiAoZm91bmQpIHsKKwkJaWQgPSBpLT5maXJzdDsKKwkJaW5mbyA9IGktPnNlY29uZDsKKwl9IGVsc2UgeworCQlpZCA9IGludmFsaWRCdW5kbGVJRDsKKwkJaW5mby5yZXNldCgpOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3NpemVfdCBCdW5kbGVTdGF0ZU1vbml0b3I6OmdldEJ1bmRsZUluZm9CeU5hbWUoCisJY29uc3Qgdm1raXQ6OlVURjgqIG5hbWUsIEJ1bmRsZUluZm9UeXBlJiBpbmZvKSBjb25zdAoreworCWluZm8uY2xlYXIoKTsKKwlzaXplX3QgY291bnQgPSAwOworCisJdm1raXQ6OkxvY2tHdWFyZCBsZyhsb2NrKTsKKwlCdW5kbGVJbmZvVHlwZTo6Y29uc3RfaXRlcmF0b3IgaSA9IGJ1bmRsZUluZm8uYmVnaW4oKSwgZSA9IGJ1bmRsZUluZm8uZW5kKCk7CisJZm9yICg7IGkgIT0gZTsgKytpKSB7CisJCWlmIChpLT5zZWNvbmQubmFtZS0+ZXF1YWxzKG5hbWUpKSB7CisJCQlpbmZvLmluc2VydChCdW5kbGVJbmZvVHlwZTo6dmFsdWVfdHlwZShpLT5maXJzdCwgaS0+c2Vjb25kKSk7CisJCQkrK2NvdW50OworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCit2b2lkIEJ1bmRsZVN0YXRlTW9uaXRvcjo6b25CdW5kbGVSZXNvbHZlZCgKKwljb25zdCBqMzo6SmF2YVN0cmluZyogYnVuZGxlTmFtZU9iaiwKKwlqbG9uZyBidW5kbGVJRCwgajM6OkphdmFPYmplY3QqIGxvYWRlck9iamVjdCkKK3sKKwlsbHZtX2djcm9vdChidW5kbGVOYW1lT2JqLCAwKTsKKwlsbHZtX2djcm9vdChsb2FkZXJPYmplY3QsIDApOworCisJSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOworCWozOjpKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPQorCQlqMzo6Sm5qdm1DbGFzc0xvYWRlcjo6Z2V0Sm5qdm1Mb2FkZXJGcm9tSmF2YU9iamVjdChsb2FkZXJPYmplY3QsIHZtKTsKKwlhc3NlcnQoKGxvYWRlciAhPSBOVUxMKSAmJiAiSW52YWxpZCBjbGFzcyBsb2FkZXIiKTsKKworCWNvbnN0IHZta2l0OjpVVEY4KiBidW5kbGVOYW1lID0KKwkJajM6OkphdmFTdHJpbmc6OnRvVVRGOChidW5kbGVOYW1lT2JqLCBsb2FkZXItPmhhc2hVVEY4KTsKKworCXZta2l0OjpMb2NrR3VhcmQgbGcobG9jayk7CisKKwlCdW5kbGVJbmZvVHlwZTo6aXRlcmF0b3IgaW5mb19pdGVyYXRvcjsKKwlpZiAoZ2V0QnVuZGxlSW5mb0J5SUQoYnVuZGxlSUQsIGluZm9faXRlcmF0b3IpID09IGZhbHNlKSB7CisJCS8vIEJ1bmRsZSBpbnN0YWxsZWQgYW5kIHJlc29sdmVkCisJCUJ1bmRsZUluZm9ybWF0aW9uIGluZm87CisJCWluZm8ubG9hZGVyID0gbG9hZGVyOworCQlpbmZvLm5hbWUgPSBidW5kbGVOYW1lOworCQlidW5kbGVJbmZvLmluc2VydChCdW5kbGVJbmZvVHlwZTo6dmFsdWVfdHlwZShidW5kbGVJRCwgaW5mbykpOworCisJCXN0YXRlRUwtPm9uQnVuZGxlQ2xhc3NMb2FkZXJTZXQoCisJCQlzdGF0ZUVMX3VzZXJfcGFyYW0sIGJ1bmRsZU5hbWUsIGJ1bmRsZUlELCAqbG9hZGVyKTsKKworI2lmIERFQlVHX1ZFUkJPU0VfT1NHSV9TVEFURV9DSEFOR0UKKwkJY2VyciA8PCAiQnVuZGxlIHJlc29sdmVkOiBJRD0iIDw8IGJ1bmRsZUlECisJCQk8PCAiXHRjbGFzc0xvYWRlcj0iIDw8IGxvYWRlciA8PCAiXHRuYW1lPSIgPDwgKmJ1bmRsZU5hbWUgPDwgZW5kbDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUJ1bmRsZUluZm9ybWF0aW9uJiBpbmZvID0gaW5mb19pdGVyYXRvci0+c2Vjb25kOworCQlpZiAoaW5mby5sb2FkZXIgPT0gbG9hZGVyKQorCQkJcmV0dXJuOwkvLyBTYW1lIGNsYXNzIGxvYWRlciBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVuZGxlCisKKwkJLy8gQnVuZGxlIHVwZGF0ZWQKKwkJY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXIqIHByZXZpb3VzX2xvYWRlciA9IGluZm8ubG9hZGVyOworCQlpZiAoaW5mby5sb2FkZXIgPT0gTlVMTCkgeworCQkJaWYgKCFpbmZvLnByZXZpb3VzTG9hZGVycy5lbXB0eSgpKQorCQkJCXByZXZpb3VzX2xvYWRlciA9IGluZm8ucHJldmlvdXNMb2FkZXJzLmZyb250KCk7CisJCX0gZWxzZSB7CisJCQlpbmZvLnByZXZpb3VzTG9hZGVycy5wdXNoX2Zyb250KGluZm8ubG9hZGVyKTsKKwkJfQorCQlpbmZvLmxvYWRlciA9IGxvYWRlcjsKKwkJaW5mby5uYW1lID0gYnVuZGxlTmFtZTsKKworCQlzdGF0ZUVMLT5vbkJ1bmRsZUNsYXNzTG9hZGVyVXBkYXRlZCgKKwkJCXN0YXRlRUxfdXNlcl9wYXJhbSwgYnVuZGxlTmFtZSwgYnVuZGxlSUQsCisJCQkqcHJldmlvdXNfbG9hZGVyLCAqbG9hZGVyKTsKKworI2lmIERFQlVHX1ZFUkJPU0VfT1NHSV9TVEFURV9DSEFOR0UKKwljZXJyIDw8ICJCdW5kbGUgdXBkYXRlZC9yZXNvbHZlZDogSUQ9IiA8PCBidW5kbGVJRAorCQk8PCAiXHRjbGFzc0xvYWRlcj0iIDw8IGxvYWRlcgorCQk8PCAiXHRwcmV2aW91c0NsYXNzTG9hZGVyPSIgPDwgcHJldmlvdXNfbG9hZGVyCisJCTw8ICJcdG5hbWU9IiA8PCAqYnVuZGxlTmFtZSA8PCBlbmRsOworI2VuZGlmCisJfQorfQorCit2b2lkIEJ1bmRsZVN0YXRlTW9uaXRvcjo6b25CdW5kbGVVbnJlc29sdmVkKAorCWNvbnN0IGozOjpKYXZhU3RyaW5nKiBidW5kbGVOYW1lT2JqLCBqbG9uZyBidW5kbGVJRCkKK3sKKwlsbHZtX2djcm9vdChidW5kbGVOYW1lT2JqLCAwKTsKKworCXZta2l0OjpMb2NrR3VhcmQgbGcobG9jayk7CisKKwkvLyBVbmluc3RhbGxlZCBidW5kbGUKKwlCdW5kbGVJbmZvVHlwZTo6aXRlcmF0b3IgaW5mb19pdGVyYXRvcjsKKwlib29sIGdvdF9zdGF0ZSA9IGdldEJ1bmRsZUluZm9CeUlEKGJ1bmRsZUlELCBpbmZvX2l0ZXJhdG9yKTsKKwlhc3NlcnQoZ290X3N0YXRlICYmICJCdW5kbGUgdW5yZXNvbHZlZCBidXQgbmV2ZXIgc2Vlbi4iKTsKKworCUJ1bmRsZUluZm9ybWF0aW9uJiBpbmZvID0gaW5mb19pdGVyYXRvci0+c2Vjb25kOworCWNvbnN0IHZta2l0OjpVVEY4KiBidW5kbGVOYW1lID0KKwkJajM6OkphdmFTdHJpbmc6OnRvVVRGOChidW5kbGVOYW1lT2JqLAorCQkJKGluZm8ubG9hZGVyID09IE5VTEwpID8gTlVMTCA6IGluZm8ubG9hZGVyLT5oYXNoVVRGOCk7CisKKwljb25zdCBqMzo6Sm5qdm1DbGFzc0xvYWRlciogcHJldmlvdXNfbG9hZGVyID0gaW5mby5sb2FkZXI7CisJaW5mby5wcmV2aW91c0xvYWRlcnMucHVzaF9mcm9udChpbmZvLmxvYWRlcik7CisJaW5mby5sb2FkZXIgPSBOVUxMOworCisJc3RhdGVFTC0+b25CdW5kbGVDbGFzc0xvYWRlckNsZWFyZWQoCisJCXN0YXRlRUxfdXNlcl9wYXJhbSwgYnVuZGxlTmFtZSwgYnVuZGxlSUQsICpwcmV2aW91c19sb2FkZXIpOworCisjaWYgREVCVUdfVkVSQk9TRV9PU0dJX1NUQVRFX0NIQU5HRQorCWNlcnIgPDwgIkJ1bmRsZSB1bnJlc29sdmVkOiBJRD0iIDw8IGJ1bmRsZUlECisJCTw8ICJcdGNsYXNzTG9hZGVyPSIgPDwgcHJldmlvdXNfbG9hZGVyCisJCTw8ICJcdG5hbWU9IiA8PCAqYnVuZGxlTmFtZSA8PCBlbmRsOworI2VuZGlmCit9CisKK3ZvaWQgQnVuZGxlU3RhdGVNb25pdG9yOjpvbkNsYXNzTG9hZGVyVW5sb2FkZWQoCisJY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikKK3sKKwl2bWtpdDo6TG9ja0d1YXJkIGxnKGxvY2spOworCUJ1bmRsZUluZm9UeXBlOjppdGVyYXRvciBpbmZvX2l0ZXJhdG9yOworCWlmICghZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIobG9hZGVyLCBpbmZvX2l0ZXJhdG9yKSkgcmV0dXJuOworCisJQnVuZGxlSW5mb3JtYXRpb24mIGluZm8gPSBpbmZvX2l0ZXJhdG9yLT5zZWNvbmQ7CisJYXNzZXJ0KChpbmZvLmxvYWRlciAhPSBsb2FkZXIpICYmICJCdW5kbGUgYmVpbmcgdW5sb2FkZWQgd2hpbGUgcmVzb2x2ZWQuIik7CisKKwlpbmZvLnByZXZpb3VzTG9hZGVycy5yZW1vdmUobG9hZGVyKTsKKworI2lmIERFQlVHX1ZFUkJPU0VfT1NHSV9TVEFURV9DSEFOR0UKKwljZXJyIDw8ICJCdW5kbGUgY2xhc3MgbG9hZGVyIHVubG9hZGVkOiBJRD0iIDw8IGluZm9faXRlcmF0b3ItPmZpcnN0CisJCTw8ICJcdGNsYXNzTG9hZGVyPSIgPDwgbG9hZGVyCisJCTw8ICJcdG5hbWU9IiA8PCAqaW5mby5uYW1lIDw8IGVuZGw7CisjZW5kaWYKKworCWlmICgoaW5mby5sb2FkZXIgPT0gTlVMTCkgJiYgaW5mby5wcmV2aW91c0xvYWRlcnMuZW1wdHkoKSkgeworI2lmIERFQlVHX1ZFUkJPU0VfT1NHSV9TVEFURV9DSEFOR0UKKwljZXJyIDw8ICJCdW5kbGUgdW5sb2FkZWQ6IElEPSIgPDwgaW5mb19pdGVyYXRvci0+Zmlyc3QKKwkJPDwgIlx0bmFtZT0iIDw8ICppbmZvLm5hbWUgPDwgZW5kbDsKKyNlbmRpZgorCisJCWJ1bmRsZUluZm8uZXJhc2UoaW5mb19pdGVyYXRvcik7CisJfQorfQorCit2b2lkIEJ1bmRsZVN0YXRlTW9uaXRvcjo6ZHVtcCgpIGNvbnN0Cit7CisJdm1raXQ6OkxvY2tHdWFyZCBsZyhsb2NrKTsKKwlCdW5kbGVJbmZvVHlwZTo6Y29uc3RfaXRlcmF0b3IgaSA9IGJ1bmRsZUluZm8uYmVnaW4oKSwgZSA9IGJ1bmRsZUluZm8uZW5kKCk7CisJQ2xhc3NMb2FkZXJRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgY2xpLCBjbGU7CisKKwlmb3IgKDsgaSAhPSBlOyArK2kpIHsKKwkJY2VyciA8PCAiQnVuZGxlIElEPSIgPDwgaS0+Zmlyc3QKKwkJCTw8ICJcdG5hbWU9IiA8PCAqaS0+c2Vjb25kLm5hbWUKKwkJCTw8ICJcdGNsYXNzTG9hZGVyPSIgPDwgaS0+c2Vjb25kLmxvYWRlcgorCQkJPDwgIlx0cHJldmlvdXNDbGFzc0xvYWRlcnM9eyI7CisKKwkJY2xpID0gaS0+c2Vjb25kLnByZXZpb3VzTG9hZGVycy5iZWdpbigpOworCQljbGUgPSBpLT5zZWNvbmQucHJldmlvdXNMb2FkZXJzLmVuZCgpOworCQlmb3IgKDsgY2xpICE9IGNsZTsgKytjbGkpCisJCQljZXJyIDw8ICpjbGkgPDwgJywnOworCisJCWNlcnIgPDwgJ30nIDw8IGVuZGw7CisJfQorfQorCit2b2lkIEJ1bmRsZVN0YXRlTW9uaXRvcjo6c2V0RnJhbWV3b3JrRnJvbU1haW5DbGFzcygKKwljb25zdCBjaGFyKiBtYWluQ2xhc3NOYW1lLCBjb25zdCBqMzo6Sm5qdm1DbGFzc0xvYWRlciogbG9hZGVyKQoreworCS8vIFdlIHN1cHBvc2UgdGhlIGZyYW1ld29yayBidW5kbGUgaXMgdGhlIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIG1haW4gY2xhc3MuCisKKwljb25zdCBhdXRvIGxhc3RPY2N1cmVuY2UgPSBzdHJyY2hyKG1haW5DbGFzc05hbWUsICcuJyk7CisJaWYgKCFsYXN0T2NjdXJlbmNlKQorCQlyZXR1cm47CisJc3RyaW5nIHBhY2thZ2VOYW1lKG1haW5DbGFzc05hbWUsIGxhc3RPY2N1cmVuY2UgLSBtYWluQ2xhc3NOYW1lKTsKKworCUJ1bmRsZUluZm9ybWF0aW9uIGluZm87CisJaW5mby5sb2FkZXIgPSBsb2FkZXI7CisJaW5mby5uYW1lID0gbG9hZGVyLT5oYXNoVVRGOC0+bG9va3VwT3JDcmVhdGVBc2NpaXoocGFja2FnZU5hbWUuY19zdHIoKSk7CisKKwl2bWtpdDo6TG9ja0d1YXJkIGxnKGxvY2spOworCWJ1bmRsZUluZm8uaW5zZXJ0KEJ1bmRsZUluZm9UeXBlOjp2YWx1ZV90eXBlKDAsIGluZm8pKTsKKworCWZyYW1ld29ya0Zyb21NYWluQ2xhc3NTZXQgPSB0cnVlOworfQorCit9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBKYXZhX2ozX3ZtX09TR2lfYnVuZGxlUmVzb2x2ZWQoCisJajM6OkphdmFTdHJpbmcqIGJ1bmRsZU5hbWUsIGpsb25nIGJ1bmRsZUlELCBqMzo6SmF2YU9iamVjdCogbG9hZGVyT2JqZWN0KQoreworCWxsdm1fZ2Nyb290KGJ1bmRsZU5hbWUsIDApOworCWxsdm1fZ2Nyb290KGxvYWRlck9iamVjdCwgMCk7CisKKwlqMzo6T1NHaTo6QnVuZGxlU3RhdGVNb25pdG9yOjpnZXQoKS0+CisJCW9uQnVuZGxlUmVzb2x2ZWQoYnVuZGxlTmFtZSwgYnVuZGxlSUQsIGxvYWRlck9iamVjdCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBKYXZhX2ozX3ZtX09TR2lfYnVuZGxlVW5yZXNvbHZlZCgKKwlqMzo6SmF2YVN0cmluZyogYnVuZGxlTmFtZSwgamxvbmcgYnVuZGxlSUQpCit7CisJbGx2bV9nY3Jvb3QoYnVuZGxlTmFtZSwgMCk7CisKKwlqMzo6T1NHaTo6QnVuZGxlU3RhdGVNb25pdG9yOjpnZXQoKS0+CisJCW9uQnVuZGxlVW5yZXNvbHZlZChidW5kbGVOYW1lLCBidW5kbGVJRCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBKYXZhX2ozX3ZtX09TR2lfZHVtcENsYXNzTG9hZGVyQnVuZGxlcygpCit7CisJajM6Ok9TR2k6OkJ1bmRsZVN0YXRlTW9uaXRvcjo6Z2V0KCktPmR1bXAoKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL09TR2lCdW5kbGVTdGF0ZU1vbml0b3IuaCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvT1NHaUJ1bmRsZVN0YXRlTW9uaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDZlODAKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL09TR2lCdW5kbGVTdGF0ZU1vbml0b3IuaApAQCAtMCwwICsxLDExOSBAQAorCisjaWZuZGVmIE9TR0lHQVRFV0FZX0hfCisjZGVmaW5lIE9TR0lHQVRFV0FZX0hfCisKKyNpbmNsdWRlIDx2bWtpdC9jb25maWcuaD4KKworI2lmIE9TR0lfQlVORExFX1NUQVRFX0lORk8KKworI2luY2x1ZGUgInZta2l0L0xvY2tzLmgiCisjaW5jbHVkZSAidm1raXQvVVRGOC5oIgorI2luY2x1ZGUgImozL2puaS5oIgorI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBqMyB7CisKK2NsYXNzIEpuanZtQ2xhc3NMb2FkZXI7CitjbGFzcyBKYXZhT2JqZWN0Q2xhc3M7CitjbGFzcyBKYXZhT2JqZWN0OworCituYW1lc3BhY2UgT1NHaSB7CisKK3R5cGVkZWYgaW50NjRfdAlidW5kbGVfaWRfdDsKK3N0YXRpYyBjb25zdCBidW5kbGVfaWRfdCBpbnZhbGlkQnVuZGxlSUQgPSAoYnVuZGxlX2lkX3QpLTE7CisKKworY2xhc3MgQnVuZGxlU3RhdGVFdmVudExpc3RlbmVyCit7CitwdWJsaWM6CisJdmlydHVhbCB+QnVuZGxlU3RhdGVFdmVudExpc3RlbmVyKCkge30KKworCXZpcnR1YWwgdm9pZCBvbkJ1bmRsZUNsYXNzTG9hZGVyU2V0KHZvaWQgKnVzZXJfcGFyYW0sCisJCWNvbnN0IHZta2l0OjpVVEY4KiBidW5kbGVOYW1lLCBidW5kbGVfaWRfdCBidW5kbGVJRCwKKwkJY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXImIGxvYWRlcikge30KKworCXZpcnR1YWwgdm9pZCBvbkJ1bmRsZUNsYXNzTG9hZGVyVXBkYXRlZCh2b2lkICp1c2VyX3BhcmFtLAorCQljb25zdCB2bWtpdDo6VVRGOCogYnVuZGxlTmFtZSwgYnVuZGxlX2lkX3QgYnVuZGxlSUQsCisJCWNvbnN0IGozOjpKbmp2bUNsYXNzTG9hZGVyJiBwcmV2aW91c19sb2FkZXIsCisJCWNvbnN0IGozOjpKbmp2bUNsYXNzTG9hZGVyJiBuZXdfbG9hZGVyKSB7fQorCisJdmlydHVhbCB2b2lkIG9uQnVuZGxlQ2xhc3NMb2FkZXJDbGVhcmVkKHZvaWQgKnVzZXJfcGFyYW0sCisJCWNvbnN0IHZta2l0OjpVVEY4KiBidW5kbGVOYW1lLCBidW5kbGVfaWRfdCBidW5kbGVJRCwKKwkJY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXImIHByZXZpb3VzX2xvYWRlcikge30KK307CisKKworY2xhc3MgQnVuZGxlU3RhdGVNb25pdG9yCit7CitwdWJsaWM6CisJdHlwZWRlZiBzdGQ6Omxpc3Q8Y29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXIqPglDbGFzc0xvYWRlclF1ZXVlOworCisJc3RydWN0IEJ1bmRsZUluZm9ybWF0aW9uIHsKKwkJY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXIqCWxvYWRlcjsKKwkJY29uc3Qgdm1raXQ6OlVURjgqCQkJbmFtZTsKKwkJQ2xhc3NMb2FkZXJRdWV1ZQkJCXByZXZpb3VzTG9hZGVyczsKKworCQlCdW5kbGVJbmZvcm1hdGlvbigpIDogbG9hZGVyKG51bGxwdHIpLCBuYW1lKG51bGxwdHIpIHt9CisJCXZvaWQgcmVzZXQoKTsKKwl9OworCisJdHlwZWRlZiBzdGQ6Om1hcDxidW5kbGVfaWRfdCwgQnVuZGxlSW5mb3JtYXRpb24+IEJ1bmRsZUluZm9UeXBlOworCitwcm90ZWN0ZWQ6CisKKwltdXRhYmxlIHZta2l0OjpMb2NrUmVjdXJzaXZlIGxvY2s7CisJQnVuZGxlSW5mb1R5cGUgYnVuZGxlSW5mbzsKKwlCdW5kbGVTdGF0ZUV2ZW50TGlzdGVuZXIgKnN0YXRlRUw7CisJdm9pZCAqc3RhdGVFTF91c2VyX3BhcmFtOworCWJvb2wgZnJhbWV3b3JrRnJvbU1haW5DbGFzc1NldDsKKworcHVibGljOgorCUJ1bmRsZVN0YXRlTW9uaXRvcigpOworCXZpcnR1YWwgfkJ1bmRsZVN0YXRlTW9uaXRvcigpIHt9CisKKwlzdGF0aWMgQnVuZGxlU3RhdGVNb25pdG9yKiBnZXQoKTsKKworCWJvb2wgZ2V0QnVuZGxlSW5mb0J5SUQoCisJCWJ1bmRsZV9pZF90IGlkLCBCdW5kbGVJbmZvcm1hdGlvbiYgaW5mbykgY29uc3Q7CisJYm9vbCBnZXRCdW5kbGVJbmZvQnlJRCgKKwkJYnVuZGxlX2lkX3QgaWQsIEJ1bmRsZUluZm9UeXBlOjppdGVyYXRvciYgaXRlcmF0b3IpOworCWJvb2wgZ2V0QnVuZGxlSW5mb0J5Q2xhc3NMb2FkZXIoY29uc3QgajM6OkpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwKKwkJYnVuZGxlX2lkX3QgJmlkLCBCdW5kbGVJbmZvcm1hdGlvbiYgaW5mbykgY29uc3Q7CisJYm9vbCBnZXRCdW5kbGVJbmZvQnlDbGFzc0xvYWRlcihjb25zdCBqMzo6Sm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLAorCQlCdW5kbGVJbmZvVHlwZTo6aXRlcmF0b3ImIGl0ZXJhdG9yKTsKKwlib29sIGdldEJ1bmRsZUluZm9CeUNsYXNzTG9hZGVyKGNvbnN0IGozOjpKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIsCisJCUJ1bmRsZUluZm9UeXBlOjpjb25zdF9pdGVyYXRvciYgaXRlcmF0b3IpIGNvbnN0OworCXNpemVfdCBnZXRCdW5kbGVJbmZvQnlOYW1lKAorCQljb25zdCB2bWtpdDo6VVRGOCogbmFtZSwgQnVuZGxlSW5mb1R5cGUmIGluZm8pIGNvbnN0OworCisJdm9pZCBkdW1wKCkgY29uc3Q7CisKKwl2b2lkIHNldEZyYW1ld29ya0Zyb21NYWluQ2xhc3MoCisJCWNvbnN0IGNoYXIqIG1haW5DbGFzc05hbWUsIGNvbnN0IGozOjpKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpOworCWJvb2wgaXNGcmFtZXdvcmtGcm9tTWFpbkNsYXNzU2V0KCkge3JldHVybiBmcmFtZXdvcmtGcm9tTWFpbkNsYXNzU2V0O30KKworCXZvaWQgc2V0U3RhdGVFdmVudExpc3RlbmVyKAorCQl2b2lkICp1c2VyX3BhcmFtLCBCdW5kbGVTdGF0ZUV2ZW50TGlzdGVuZXImIGwpOworCisJdm9pZCBvbkJ1bmRsZVJlc29sdmVkKGNvbnN0IGozOjpKYXZhU3RyaW5nKiBidW5kbGVOYW1lLCBqbG9uZyBidW5kbGVJRCwKKwkJajM6OkphdmFPYmplY3QqIGxvYWRlck9iamVjdCk7CisJdm9pZCBvbkJ1bmRsZVVucmVzb2x2ZWQoY29uc3QgajM6OkphdmFTdHJpbmcqIGJ1bmRsZU5hbWUsIGpsb25nIGJ1bmRsZUlEKTsKKwl2b2lkIG9uQ2xhc3NMb2FkZXJVbmxvYWRlZChjb25zdCBqMzo6Sm5qdm1DbGFzc0xvYWRlciogbG9hZGVyKTsKK307CisKK30KK30KKworZXh0ZXJuICJDIiB2b2lkIEphdmFfajNfdm1fT1NHaV9idW5kbGVSZXNvbHZlZCgKKwlqMzo6SmF2YVN0cmluZyogYnVuZGxlTmFtZSwgamxvbmcgYnVuZGxlSUQsIGozOjpKYXZhT2JqZWN0KiBsb2FkZXJPYmplY3QpOworZXh0ZXJuICJDIiB2b2lkIEphdmFfajNfdm1fT1NHaV9idW5kbGVVbnJlc29sdmVkKAorCWozOjpKYXZhU3RyaW5nKiBidW5kbGVOYW1lLCBqbG9uZyBidW5kbGVJRCk7CitleHRlcm4gIkMiIHZvaWQgSmF2YV9qM192bV9PU0dpX2R1bXBDbGFzc0xvYWRlckJ1bmRsZXMoKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9qMy9WTUNvcmUvT1NHaVRpZXJNYW5hZ2VyLmNwcCBiL3Zta2l0L2xpYi9qMy9WTUNvcmUvT1NHaVRpZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThlNTQwCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9PU0dpVGllck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMzI4IEBACisKKyNpbmNsdWRlICJPU0dpVGllck1hbmFnZXIuaCIKKyNpbmNsdWRlICJ2bWtpdC9TdGFja0VtYmVkZGVkTGlzdC5oIgorCisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisKKyNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCisjaW5jbHVkZSAiSm5qdm0uaCIKKyNpbmNsdWRlICJWTVN0YXRpY0luc3RhbmNlLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGFjaz4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNkZWZpbmUgREVCVUdfVkVSQk9TRV9BQ0NPVU5USU5HX09CSkVDVFMJMAorI2RlZmluZSBERUJVR19WRVJCT1NFX0FDQ09VTlRJTkdfU1RBQ0sJCTEKKworbmFtZXNwYWNlIGozIHsKK25hbWVzcGFjZSBPU0dpIHsKKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudGluZ1N0YXRzRGF0YUJhc2UKKy8vCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQWNjb3VudGluZ1N0YXRzRGF0YUJhc2U6OkFjY291bnRpbmdTdGF0c0RhdGFCYXNlKCkgOgorCV9ub3dfY29sbGVjdGluZ19zdGF0cyhmYWxzZSkKKworI2lmIE9TR0lfT0JKRUNUX1RJRVJfVEFHR0lORworCSwgX21hcmtfc3RhdGUoZmFsc2UpCisjZW5kaWYKK3sKK30KKwordm9pZCBBY2NvdW50aW5nU3RhdHNEYXRhQmFzZTo6Y29sbGVjdFN0YXRzKCkKK3sKKwkvLyBJbml0aWFsaXplIGNvdW50ZXJzCisJX2RiLmNsZWFyKCk7CisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKwlfbWFya19zdGF0ZSA9ICFfbWFya19zdGF0ZTsKKyNlbmRpZgorCisJLy8gUGVyZm9ybSBhIGdhcmJhZ2UgY29sbGVjdGlvbiB0byBzdG9wIGFsbCB0aHJlYWRzIGFuZCBjb3VudCBtZW1vcnkgdXNhZ2UKKwlfbm93X2NvbGxlY3Rpbmdfc3RhdHMuc3RvcmUodHJ1ZSwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCisJdm1raXQ6OkNvbGxlY3Rvcjo6Y29sbGVjdCgpOworCisJX25vd19jb2xsZWN0aW5nX3N0YXRzLnN0b3JlKGZhbHNlLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEFjY291bnRpbmdTdGF0c0RhdGFCYXNlJiBkYikKK3sKKwlvcyA8PCAiVGllciBtZW1vcnkgZHVtcDoiIDw8IGVuZGw7CisKKwlmb3IgKGNvbnN0IGF1dG8mIGkgOiBkYi5fZGIpIHsKKwkJb3MgPDwgIlRpZXIgIiA8PCAoaW50KWkuZmlyc3Q7CisjaWYgT1NHSV9TVEFDS19TUEFDRV9USUVSX1RBR0dJTkcKKwkJb3MgPDwgIlx0c3RhY2tTaXplPSIgPDwgaS5zZWNvbmQuc3RhY2tfc2l6ZTsKKyNlbmRpZgorCisjaWYgT1NHSV9PQkpFQ1RfVElFUl9UQUdHSU5HCisJCW9zIDw8ICJcdG9iamVjdENvdW50PSIgPDwgaS5zZWNvbmQub2JqZWN0X2NvdW50IDw8CisJCQkiXHRjbGFzc0NvdW50PSIgPDwgaS5zZWNvbmQuY2xhc3Nlcy5zaXplKCkgPDwKKwkJCSJcdGhlYXBTdGF0aWNTaXplPSIgPDwgaS5zZWNvbmQuaGVhcF9zdGF0aWNfc2l6ZSA8PAorCQkJIlx0aGVhcFZpcnR1YWxTaXplPSIgPDwgaS5zZWNvbmQuaGVhcF92aXJ0dWFsX3NpemU7CisjZW5kaWYKKwkJb3MgPDwgZW5kbDsKKwl9CisJcmV0dXJuIG9zIDw8ICJUaWVyIG1lbW9yeSBkdW1wIFtkb25lXS4iIDw8IGVuZGw7Cit9CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpZXJNYW5hZ2VyCisvLworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1RpZXJNYW5hZ2VyOjpUaWVyTWFuYWdlcihjb25zdCBCdW5kbGVTdGF0ZU1vbml0b3ImIGJzbSwgVVRGOE1hcCogaGFzaE1hcCkgOgorCV9idW5kbGVfc3RhdGVfbW9uaXRvcihic20pLCBfYWNjb3VudGluZ19jb25maWcoYnNtKSwgX2hhc2hfbWFwKGhhc2hNYXApCit7Cit9CisKK2ludCBUaWVyTWFuYWdlcjo6bG9hZEFjY291bnRpbmdSdWxlcygKKwljb25zdCBjaGFyKiBjb25maWdfZmlsZSwgc3RkOjpzdHJpbmcmIGVycm9yRGVzY3JpcHRpb24pCit7CisJX2FjY291bnRpbmdfY29uZmlnLnNldEZyYW1ld29ya0J1bmRsZU5hbWUoKTsKKworCXJldHVybiBBY2NvdW50aW5nQ29uZmlndXJhdGlvblBhcnNlcjo6bG9hZCgKKwkJX2FjY291bnRpbmdfY29uZmlnLCBjb25maWdfZmlsZSwgZXJyb3JEZXNjcmlwdGlvbiwgX2hhc2hfbWFwKTsKK30KKwordm9pZCBUaWVyTWFuYWdlcjo6ZHVtcFN0YXRzKCkKK3sKKwlfc3RhdHNfZGF0YV9iYXNlLmNvbGxlY3RTdGF0cygpOworCWNvdXQgPDwgX3N0YXRzX2RhdGFfYmFzZSA8PCBlbmRsOworfQorCisjaWYgT1NHSV9PQkpFQ1RfVElFUl9UQUdHSU5HCisKK3ZvaWQgVGllck1hbmFnZXI6OnVwZGF0ZVRpZXJDaGFyZ2VkVG9OZXdseUNyZWF0ZWRPYmplY3QoajM6OkphdmFPYmplY3QqIG9iaikKK3sKKwlsbHZtX2djcm9vdChvYmosIDApOworCisJYXV0byB0aHJlYWQgPSBqMzo6SmF2YVRocmVhZDo6Z2V0KCk7CisKKwlvYmotPnNldFRpZXJJRCgKKwkJKHRocmVhZC0+Y2hhcmdlZFRpZXJJRCA9PSAodWludDMyX3QpLTEpID8KKwkJCXJ1bnRpbWVUaWVySUQgOgorCQkJKHRpZXJfaWRfdCl0aHJlYWQtPmNoYXJnZWRUaWVySUQpOworCisJb2JqLT5zZXRUaWVyT2JqZWN0TWFya1N0YXRlKAorCQl0aHJlYWQtPmdldEpWTSgpLT50aWVyX21hbmFnZXIuX3N0YXRzX2RhdGFfYmFzZS5fbWFya19zdGF0ZSk7Cit9CisKK3ZvaWQgVGllck1hbmFnZXI6OmFjY291bnRGb3JMaXZlT2JqZWN0KGozOjpKYXZhT2JqZWN0KiBvYmopCit7CisJbGx2bV9nY3Jvb3Qob2JqLCAwKTsKKworCWF1dG8mIHRtID0gajM6OkphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKS0+dGllcl9tYW5hZ2VyOworCWlmICghdG0uaXNDb2xsZWN0aW5nU3RhdHMoKSkgcmV0dXJuOworCisJaWYgKGozOjpWTUNsYXNzTG9hZGVyOjppc1ZNQ2xhc3NMb2FkZXIob2JqKSB8fAorCQlqMzo6Vk1TdGF0aWNJbnN0YW5jZTo6aXNWTVN0YXRpY0luc3RhbmNlKG9iaikpCisJCXJldHVybjsKKworCWlmIChvYmotPmdldFRpZXJPYmplY3RNYXJrU3RhdGUoKSA9PSB0bS5fc3RhdHNfZGF0YV9iYXNlLl9tYXJrX3N0YXRlKQorCQlyZXR1cm47CS8vIEFscmVhZHkgYWNjb3VudGVkIGZvcgorCisJb2JqLT5zZXRUaWVyT2JqZWN0TWFya1N0YXRlKHRtLl9zdGF0c19kYXRhX2Jhc2UuX21hcmtfc3RhdGUpOworCisJY29uc3QgYXV0byBjbCA9IGozOjpKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5hc0NsYXNzKCk7CisJaWYgKCFjbCkgcmV0dXJuOworCisJdGllcl9pZF90IHRpZXJJRCA9ICh0aWVyX2lkX3Qpb2JqLT5nZXRUaWVySUQoKTsKKwlhdXRvJiB0aWVyX2l0ZXIgPSB0bS5fc3RhdHNfZGF0YV9iYXNlLl9kYlt0aWVySURdOworCisjaWYgREVCVUdfVkVSQk9TRV9BQ0NPVU5USU5HX09CSkVDVFMKKwlpZiAodGllcklEICE9IDApCisJCXN0ZDo6Y2VyciA8PCAiVGllciAiIDw8IChpbnQpdGllcklEIDw8ICIgb2JqZWN0ICIgPDwgKm9iaiA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKKworCSsrdGllcl9pdGVyLm9iamVjdF9jb3VudDsKKwl0aWVyX2l0ZXIuaGVhcF92aXJ0dWFsX3NpemUgKz0gY2wtPmdldFZpcnR1YWxTaXplKCk7CisKKwlpZiAodGllcl9pdGVyLmNsYXNzZXMuaW5zZXJ0KGNsKS5zZWNvbmQpCisJCXRpZXJfaXRlci5oZWFwX3N0YXRpY19zaXplICs9IGNsLT5nZXRTdGF0aWNTaXplKCk7Cit9CisKKyNlbmRpZgorCisjaWYgT1NHSV9TVEFDS19TUEFDRV9USUVSX1RBR0dJTkcKKwordm9pZCBUaWVyTWFuYWdlcjo6YWNjb3VudEZvclRocmVhZFN0YWNrKHZta2l0OjpUaHJlYWQqIHRocmVhZCkKK3sKKwkvKiB4ODYgc3RhY2sgZnJhbWU6CisKK3wtfCAobGFzdCBtZXRob2QgY2FsbGVkKQorfCB8ICAgICAuLi4KK3wgfCBCUChpLTIpCit8IHwgIHwgIHJldCBhZGRyKGktMikKK3wgfCAgfCAgYXJncyhpLTIpCit8YXwgIHwgIHNhdmVkIHJlZ3MoaS0xKQorfGR8ICBWICBsb2NhbHMoaS0xKQorfGR8IEJQKGktMSkKK3xyfCAgfCAgcmV0IGFkZHIoaS0xKQorfGV8ICB8ICBhcmdzKGktMSkKK3xzfCAgfCAgc2F2ZWQgcmVncyhpKQorfHN8ICBWICBsb2NhbHMoaSkKK3wgfCBCUChpICApCit8IHwgICAgcmV0IGFkZHIoaSkKK3wgfCAgICBhcmdzKGkpCit8IHwgICAgLi4uCit8K3wgKGZpcnN0IGNhbGxlciBtZXRob2QpCisKKyAgICBCUCA6PSBjYWxsIGZyYW1lIGFkZHJlc3MgKGJhc2UgcG9pbnRlcikuCisqLworCisJYXV0byYgdG0gPSBqMzo6SmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpLT50aWVyX21hbmFnZXI7CisJaWYgKCF0bS5pc0NvbGxlY3RpbmdTdGF0cygpKSByZXR1cm47CisKKwlhdXRvJiBkYiA9IHRtLl9zdGF0c19kYXRhX2Jhc2UuX2RiOworCXZta2l0OjpTdGFja1dhbGtlciBzdGFja1dhbGtlcih0aHJlYWQpOworCXN0ZDo6c3RhY2s8dm1raXQ6OlN0YWNrV2Fsa2VyPiBzdGFja0ZyYW1lczsKKwlhdXRvIGxhc3RGcmFtZUFkZHJlc3MgPSBzdGFja1dhbGtlci5jYWxsRnJhbWVBZGRyZXNzOworCXNpemVfdCBmcmFtZVNpemU7CisKKwl2bWtpdDo6U3RhY2tFbWJlZGRlZExpc3ROb2RlICpjdXJyZW50X25vZGUgPQorCQl0aHJlYWQtPnN0YWNrRW1iZWRkZWRMaXN0SGVhZFt2bWtpdDo6U3RhY2tFbWJlZGRlZExpc3RDaGFyZ2VkVGllcl07CisKKwlmb3IgKDsgY3VycmVudF9ub2RlICE9IG51bGxwdHI7IGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS0+Y2FsbGVyTm9kZSkgeworCQkvLyBMb29rIGZvciB0aGUgbWV0aG9kIGZyYW1lIGhvbGRpbmcgdGhlIG5vZGUKKwkJYXV0byBub2RlU3RhcnQgPSByZWludGVycHJldF9jYXN0PHdvcmRfdD4oY3VycmVudF9ub2RlKTsKKwkJYXV0byBub2RlRW5kID0gbm9kZVN0YXJ0ICsgc2l6ZW9mKCpjdXJyZW50X25vZGUpOworCQlhdXRvIGNhbGxGcmFtZVN0YXJ0ID0gc3RhY2tXYWxrZXIuY2FsbEZyYW1lQWRkcmVzczsKKwkJYXV0byBjYWxsRnJhbWVFbmQgPSBjYWxsRnJhbWVTdGFydDsKKwkJYXV0byBjaGVja1BvaW50RnJhbWVBZGRyZXNzID0gc3RhY2tXYWxrZXIuY2FsbEZyYW1lQWRkcmVzczsKKwkJYXV0byBmb3VuZCA9IGZhbHNlOworCisJCWZvciAoOworCQkJIWZvdW5kICYmIHN0YWNrV2Fsa2VyLmdldCgpICE9IG51bGxwdHI7CisJCQlzdGFja0ZyYW1lcy5wdXNoKHN0YWNrV2Fsa2VyKSwgKytzdGFja1dhbGtlcikKKwkJeworCQkJY2FsbEZyYW1lRW5kID0gc3RhY2tXYWxrZXIuY2FsbEZyYW1lQWRkcmVzczsKKwkJCWZvdW5kID0gKG5vZGVTdGFydCA+PSBjYWxsRnJhbWVTdGFydCkgJiYgKG5vZGVFbmQgPD0gY2FsbEZyYW1lRW5kKTsKKwkJCWNhbGxGcmFtZVN0YXJ0ID0gY2FsbEZyYW1lRW5kOworCQl9CisKKwkJaWYgKCFmb3VuZCkgeworCQkJLy8gSW5jb21wbGV0ZSBzdGFjayA6LSgKKwkJCXdoaWxlIChzdGFja0ZyYW1lcy5zaXplKCkgIT0gMCAmJgorCQkJCXN0YWNrRnJhbWVzLnRvcCgpLmNhbGxGcmFtZUFkZHJlc3MgIT0gY2hlY2tQb2ludEZyYW1lQWRkcmVzcykKKwkJCXsKKwkJCQlzdGFja0ZyYW1lcy5wb3AoKTsKKwkJCX0KKworCQkJc3RhY2tXYWxrZXIgPSBzdGFja0ZyYW1lcy50b3AoKTsKKwkJCXN0YWNrRnJhbWVzLnBvcCgpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhY2tGcmFtZXMuc2l6ZSgpIDwgMikgeworCQkJLy8gSW5jb21wbGV0ZSBzdGFjayA6LSgKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gTWV0aG9kIGZyYW1lIGZvdW5kCisJCWNhbGxGcmFtZUVuZCA9IHN0YWNrRnJhbWVzLnRvcCgpLmNhbGxGcmFtZUFkZHJlc3M7CisJCWZyYW1lU2l6ZSA9IGNhbGxGcmFtZUVuZCAtIGxhc3RGcmFtZUFkZHJlc3M7CisKKwkJc3RhY2tGcmFtZXMucG9wKCk7CisJCXN0YWNrV2Fsa2VyID0gc3RhY2tGcmFtZXMudG9wKCk7CisJCXN0YWNrRnJhbWVzLnBvcCgpOworCisjaWYgREVCVUdfVkVSQk9TRV9BQ0NPVU5USU5HX1NUQUNLCisJCWNvdXQgPDwgIiMgWyIgPDwgY3VycmVudF9ub2RlLT5kYXRhWzBdIDw8ICIgKz0gIgorCQkJPDwgZnJhbWVTaXplIDw8ICJdXHQiOworCisJCWlmIChjb25zdCBhdXRvIEZJID0gc3RhY2tXYWxrZXIuZ2V0KCkpIHsKKwkJCWlmICghRkktPk1ldGFkYXRhKSB7CisJCQkJRGxfaW5mbyBzaSA9IHt9OworCQkJCWF1dG8gcmEgPXJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YWNrV2Fsa2VyLnJldHVybkFkZHJlc3MpOworCQkJCWlmIChkbGFkZHIocmEsICZzaSkgIT0gMCAmJiBzaS5kbGlfc25hbWUgIT0gbnVsbHB0cikKKwkJCQkJY291dCA8PCBzaS5kbGlfc25hbWUgPDwgZW5kbDsKKwkJCQllbHNlCisJCQkJCWNvdXQgPDwgIjxuYXRpdmU+IiA8PCBlbmRsOworCQkJfSBlbHNlIHsKKwkJCQljb3V0IDw8ICpyZWludGVycHJldF9jYXN0PGNvbnN0IEphdmFNZXRob2QqPihGSS0+TWV0YWRhdGEpCisJCQkJCTw8IGVuZGw7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWRiW2N1cnJlbnRfbm9kZS0+ZGF0YVswXV0uc3RhY2tfc2l6ZSArPSBmcmFtZVNpemU7CisJCWxhc3RGcmFtZUFkZHJlc3MgPSBjYWxsRnJhbWVFbmQ7CisJfQorCisJZnJhbWVTaXplID0gdGhyZWFkLT5iYXNlU1AgLSBsYXN0RnJhbWVBZGRyZXNzOworCWRiW3J1bnRpbWVUaWVySURdLnN0YWNrX3NpemUgKz0gZnJhbWVTaXplOworCisjaWYgREVCVUdfVkVSQk9TRV9BQ0NPVU5USU5HX1NUQUNLCisJY291dCA8PCAiIyBbMCArPSAiIDw8IGZyYW1lU2l6ZSA8PCAiXVx0PG5hdGl2ZT4iIDw8IGVuZGwgPDwgZW5kbDsKKyNlbmRpZgorfQorCisjZW5kaWYKKworfQorfQorCisjaWYgT1NHSV9TVEFDS19TUEFDRV9USUVSX1RBR0dJTkcKKworZXh0ZXJuICJDIiB2b2lkIE9TR2lfVGllck1hbmFnZXJfYWNjb3VudEZvclRocmVhZFN0YWNrKHZta2l0OjpUaHJlYWQqIHRocmVhZCkKK3sKKwlpZiAoIXRocmVhZCkgcmV0dXJuOworCWozOjpPU0dpOjpUaWVyTWFuYWdlcjo6YWNjb3VudEZvclRocmVhZFN0YWNrKHRocmVhZCk7Cit9CisKKyNlbmRpZgorCitleHRlcm4gIkMiIHZvaWQgSmF2YV9qM192bV9UaWVyX2R1bXBUaWVyU3RhdHMoKQoreworCWF1dG8mIHRtID0gajM6OkphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKS0+dGllcl9tYW5hZ2VyOworCXRtLmR1bXBTdGF0cygpOworfQorCisjZW5kaWYKKworI2lmIE9TR0lfT0JKRUNUX1RJRVJfVEFHR0lORworCitleHRlcm4gIkMiIHZvaWQgT1NHaV9UaWVyTWFuYWdlcl91cGRhdGVUaWVyQ2hhcmdlZFRvTmV3bHlDcmVhdGVkT2JqZWN0KGdjKiBvYmopCit7CisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisJbGx2bV9nY3Jvb3Qob2JqLCAwKTsKKworCWlmICghb2JqKSByZXR1cm47CisJajM6Ok9TR2k6OlRpZXJNYW5hZ2VyOjp1cGRhdGVUaWVyQ2hhcmdlZFRvTmV3bHlDcmVhdGVkT2JqZWN0KAorCQlzdGF0aWNfY2FzdDxqMzo6SmF2YU9iamVjdCo+KG9iaikpOworI2VuZGlmCit9CisKK2V4dGVybiAiQyIgdm9pZCBPU0dpX1RpZXJNYW5hZ2VyX2FjY291bnRGb3JMaXZlT2JqZWN0KHZvaWQqIG9iaikKK3sKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKwlsbHZtX2djcm9vdChvYmosIDApOworCisJaWYgKCFvYmopIHJldHVybjsKKwlqMzo6T1NHaTo6VGllck1hbmFnZXI6OmFjY291bnRGb3JMaXZlT2JqZWN0KAorCQlzdGF0aWNfY2FzdDxqMzo6SmF2YU9iamVjdCo+KG9iaikpOworI2VuZGlmCit9CisKK2V4dGVybiAiQyIgamxvbmcgSmF2YV9qM192bV9UaWVyX2dldFRpZXJDaGFyZ2VkRm9yT2JqZWN0KAorCWNvbnN0IGozOjpKYXZhT2JqZWN0KiBvYmopCit7CisjaWYgT1NHSV9CVU5ETEVfVElFUl9UQUdHSU5HCisJbGx2bV9nY3Jvb3Qob2JqLCAwKTsKKwlyZXR1cm4gb2JqLT5nZXRUaWVySUQoKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvajMvVk1Db3JlL09TR2lUaWVyTWFuYWdlci5oIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9PU0dpVGllck1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTIwNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvbGliL2ozL1ZNQ29yZS9PU0dpVGllck1hbmFnZXIuaApAQCAtMCwwICsxLDEyNSBAQAorCisjaWZuZGVmIE9TR0lUSUVSX0hfCisjZGVmaW5lIE9TR0lUSUVSX0hfCisKKyNpbmNsdWRlICJ2bWtpdC9jb25maWcuaCIKKyNpbmNsdWRlICJqMy9qbmkuaCIKKworY2xhc3MgZ2M7CisKKworbmFtZXNwYWNlIHZta2l0IHsKKworY2xhc3MgVVRGOE1hcDsKK2NsYXNzIFRocmVhZDsKKworfQorCituYW1lc3BhY2UgajMgeworCitjbGFzcyBKbmp2bUNsYXNzTG9hZGVyOworY2xhc3MgQ29tbW9uQ2xhc3M7CitjbGFzcyBKYXZhT2JqZWN0OworCit9CisKKyNpZiBPU0dJX0JVTkRMRV9USUVSX1RBR0dJTkcKKworI2luY2x1ZGUgIkFjY291bnRpbmdDb25maWd1cmF0aW9uLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGF0b21pYz4KKworbmFtZXNwYWNlIGozIHsKK25hbWVzcGFjZSBPU0dpIHsKKworY2xhc3MgQWNjb3VudGluZ1N0YXRzRGF0YUJhc2UKK3sKK3B1YmxpYzoKKwlzdHJ1Y3QgUmVjb3JkIHsKKwkJc2l6ZV90CW9iamVjdF9jb3VudDsKKworI2lmIE9TR0lfU1RBQ0tfU1BBQ0VfVElFUl9UQUdHSU5HCisJCXNpemVfdCBzdGFja19zaXplOworI2VuZGlmCisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKwkJc2l6ZV90IGhlYXBfdmlydHVhbF9zaXplLCBoZWFwX3N0YXRpY19zaXplOworCQlzdGQ6OnNldDxjb25zdCBqMzo6Q29tbW9uQ2xhc3MqPiBjbGFzc2VzOworI2VuZGlmCisJfTsKKworCXN0ZDo6YXRvbWljPGJvb2w+CQkJX25vd19jb2xsZWN0aW5nX3N0YXRzOworCXN0ZDo6bWFwPHRpZXJfaWRfdCwgUmVjb3JkPglfZGI7CisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKwlib29sIF9tYXJrX3N0YXRlOworI2VuZGlmCisKKwlBY2NvdW50aW5nU3RhdHNEYXRhQmFzZSgpOworCXZpcnR1YWwgfkFjY291bnRpbmdTdGF0c0RhdGFCYXNlKCkge30KKworCWJvb2wgaXNDb2xsZWN0aW5nU3RhdHMoKSBjb25zdAorCQl7cmV0dXJuIF9ub3dfY29sbGVjdGluZ19zdGF0cy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpO30KKwl2b2lkIGNvbGxlY3RTdGF0cygpOworCisJZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKAorCQlzdGQ6Om9zdHJlYW0mLCBjb25zdCBBY2NvdW50aW5nU3RhdHNEYXRhQmFzZSYpOworfTsKKworCitjbGFzcyBUaWVyTWFuYWdlcgoreworcHJvdGVjdGVkOgorCWNvbnN0IEJ1bmRsZVN0YXRlTW9uaXRvciYJCV9idW5kbGVfc3RhdGVfbW9uaXRvcjsKKwlBY2NvdW50aW5nU3RhdHNEYXRhQmFzZQkJCV9zdGF0c19kYXRhX2Jhc2U7CisJUnVudGltZUFjY291bnRpbmdDb25maWd1cmF0aW9uCV9hY2NvdW50aW5nX2NvbmZpZzsKKwl2bWtpdDo6VVRGOE1hcCoJCQkJCV9oYXNoX21hcDsKKworcHVibGljOgorCVRpZXJNYW5hZ2VyKGNvbnN0IEJ1bmRsZVN0YXRlTW9uaXRvciYgYnNtLCBVVEY4TWFwKiBoYXNoTWFwKTsKKwl2aXJ0dWFsIH5UaWVyTWFuYWdlcigpIHt9CisKKwlpbnQgbG9hZEFjY291bnRpbmdSdWxlcygKKwkJY29uc3QgY2hhciogY29uZmlnX2ZpbGUsIHN0ZDo6c3RyaW5nJiBlcnJvckRlc2NyaXB0aW9uKTsKKworCWNvbnN0IFJ1bnRpbWVBY2NvdW50aW5nQ29uZmlndXJhdGlvbiYgZ2V0QWNjb3VudGluZ0NvbmZpZygpIGNvbnN0CisJCXtyZXR1cm4gX2FjY291bnRpbmdfY29uZmlnO30KKworCWJvb2wgaXNDb2xsZWN0aW5nU3RhdHMoKSBjb25zdAorCQl7cmV0dXJuIF9zdGF0c19kYXRhX2Jhc2UuaXNDb2xsZWN0aW5nU3RhdHMoKTt9CisJdm9pZCBkdW1wU3RhdHMoKTsKKworI2lmIE9TR0lfT0JKRUNUX1RJRVJfVEFHR0lORworCXN0YXRpYyB2b2lkIHVwZGF0ZVRpZXJDaGFyZ2VkVG9OZXdseUNyZWF0ZWRPYmplY3QoajM6OkphdmFPYmplY3QqIG9iaik7CisJc3RhdGljIHZvaWQgYWNjb3VudEZvckxpdmVPYmplY3QoajM6OkphdmFPYmplY3QqIG9iaik7CisjZW5kaWYKKworI2lmIE9TR0lfU1RBQ0tfU1BBQ0VfVElFUl9UQUdHSU5HCisJc3RhdGljIHZvaWQgYWNjb3VudEZvclRocmVhZFN0YWNrKHZta2l0OjpUaHJlYWQqIHRocmVhZCk7CisjZW5kaWYKK307CisKK30KK30KKworI2lmIE9TR0lfU1RBQ0tfU1BBQ0VfVElFUl9UQUdHSU5HCisKK2V4dGVybiAiQyIgdm9pZCBPU0dpX1RpZXJNYW5hZ2VyX2FjY291bnRGb3JUaHJlYWRTdGFjayh2bWtpdDo6VGhyZWFkKiB0aCk7CisKKyNlbmRpZgorCitleHRlcm4gIkMiIHZvaWQgSmF2YV9qM192bV9UaWVyX2R1bXBUaWVyU3RhdHMoKTsKKworI2VuZGlmCisjZW5kaWYKKworI2lmIE9TR0lfT0JKRUNUX1RJRVJfVEFHR0lORworCitleHRlcm4gIkMiIHZvaWQgT1NHaV9UaWVyTWFuYWdlcl91cGRhdGVUaWVyQ2hhcmdlZFRvTmV3bHlDcmVhdGVkT2JqZWN0KGdjKik7CitleHRlcm4gIkMiIHZvaWQgT1NHaV9UaWVyTWFuYWdlcl9hY2NvdW50Rm9yTGl2ZU9iamVjdCh2b2lkKiBvYmopOworZXh0ZXJuICJDIiBqbG9uZyBKYXZhX2ozX3ZtX1RpZXJfZ2V0VGllckNoYXJnZWRGb3JPYmplY3QoCisJY29uc3QgajM6OkphdmFPYmplY3QqIG9iaik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL2ozL1ZNQ29yZS9QcmVjb21waWxlZC5jcHAgYi92bWtpdC9saWIvajMvVk1Db3JlL1ByZWNvbXBpbGVkLmNwcAppbmRleCBmZTJlZmE3Li42ZTMzMzU1IDEwMDY0NAotLS0gYS92bWtpdC9saWIvajMvVk1Db3JlL1ByZWNvbXBpbGVkLmNwcAorKysgYi92bWtpdC9saWIvajMvVk1Db3JlL1ByZWNvbXBpbGVkLmNwcApAQCAtMTE5LDcgKzExOSw3IEBACiAgIENsYXNzKiBqYXZhTGFuZ09iamVjdCA9IChDbGFzcyopZGxzeW0oU0VMRl9IQU5ETEUsICJqYXZhX2xhbmdfT2JqZWN0Iik7CiAgIHZvaWQqIG5hdGl2ZUhhbmRsZSA9IHZta2l0OjpTeXN0ZW06OkdldFNlbGZIYW5kbGUoKTsKICAgaWYgKGphdmFMYW5nT2JqZWN0ID09IE5VTEwpIHsKLSAgICB2b2lkKiBoYW5kbGUgPSBkbG9wZW4oImxpYnZtamMiRFlMRF9FWFRFTlNJT04sIFJUTERfTEFaWSB8IFJUTERfR0xPQkFMKTsKKyAgICB2b2lkKiBoYW5kbGUgPSBkbG9wZW4oImxpYnZtamMiIERZTERfRVhURU5TSU9OLCBSVExEX0xBWlkgfCBSVExEX0dMT0JBTCk7CiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICBuYXRpdmVIYW5kbGUgPSBoYW5kbGU7CiAgICAgICBqYXZhTGFuZ09iamVjdCA9IChDbGFzcyopZGxzeW0obmF0aXZlSGFuZGxlLCAiamF2YV9sYW5nX09iamVjdCIpOwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9Db2xsZWN0aW9uUlYuY3BwIGIvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9Db2xsZWN0aW9uUlYuY3BwCmluZGV4IGE1MWJlMmEuLjUyMDg5MWUgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvQ29sbGVjdGlvblJWLmNwcAorKysgYi92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL0NvbGxlY3Rpb25SVi5jcHAKQEAgLTEwMyw3ICsxMDMsNyBAQAogICB0aC0+aW5SViA9IHRydWU7CiAgIAogICBsb2NrUlYoKTsKLSAgdGgtPnNldExhc3RTUChTeXN0ZW06OkdldENhbGxlckFkZHJlc3MoKSk7CisgIHRoLT5zZXRMYXN0U1AoU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCkpOwogICB0aC0+am9pbmVkUlYgPSB0cnVlOwogICBhbm90aGVyX21hcmsoKTsKICAgd2FpdEVuZE9mUlYoKTsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvT2JqZWN0TG9ja3MuY3BwIGIvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9PYmplY3RMb2Nrcy5jcHAKaW5kZXggYjc4Y2JiOC4uY2M1Mjg4ZSAxMDA2NDQKLS0tIGEvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9PYmplY3RMb2Nrcy5jcHAKKysrIGIvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9PYmplY3RMb2Nrcy5jcHAKQEAgLTcsMjEgKzcsOSBAQAogLy8KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSAidm1raXQvQ29uZC5oIgotI2luY2x1ZGUgInZta2l0L0xvY2tzLmgiCiAjaW5jbHVkZSAidm1raXQvT2JqZWN0TG9ja3MuaCIKLSNpbmNsdWRlICJ2bWtpdC9UaHJlYWQuaCIKLSNpbmNsdWRlICJ2bWtpdC9WaXJ0dWFsTWFjaGluZS5oIgogI2luY2x1ZGUgIlZta2l0R0MuaCIKLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICIuLi8uLi9qMy9WTUNvcmUvSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIi4uLy4uL2ozL1ZNQ29yZS9KYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICIuLi8uLi9qMy9WTUNvcmUvVVRGOC5oIgorI2luY2x1ZGUgInZta2l0L1ZpcnR1YWxNYWNoaW5lLmgiCiAKIG5hbWVzcGFjZSB2bWtpdCB7CiAKQEAgLTMzNiw4ICszMjQsOCBAQAogLy8JaWYgKGxvY2tpbmdUaHJlYWRzID09IDApCiAvLyAgICAgIHRhYmxlLmRlYWxsb2NhdGUodGhpcyk7CiAKLQl3b3JkX3QgbWV0aG9kSVAgPSBTeXN0ZW06OkdldENhbGxlckFkZHJlc3MoKTsKLQltZXRob2RJUCA9IFN5c3RlbTo6R2V0SVBGcm9tQ2FsbGVyQWRkcmVzcyhtZXRob2RJUCk7CisJd29yZF90IG1ldGhvZElQID0gU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCk7CisJbWV0aG9kSVAgPSBTeXN0ZW06OkdldFJldHVybkFkZHJlc3NPZkNhbGxGcmFtZShtZXRob2RJUCk7CiAgICAgVGhyZWFkOjpnZXQoKS0+dGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihtZXRob2RJUCk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9TaWdzZWd2LWxpbnV4LXg2NC5pbmMgYi92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL1NpZ3NlZ3YtbGludXgteDY0LmluYwppbmRleCA3OGJiNTBkLi5iYjczYmZhIDEwMDY0NAotLS0gYS92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL1NpZ3NlZ3YtbGludXgteDY0LmluYworKysgYi92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL1NpZ3NlZ3YtbGludXgteDY0LmluYwpAQCAtMzgsNyArMzgsNyBAQAogCiB2b2lkIEhhbmRsZXI6OlVwZGF0ZVJlZ2lzdGVyc0ZvclN0YWNrT3ZlcmZsb3coKSB7CiAgIHdvcmRfdCBhbHRfc3RhY2sgPSB2bWtpdDo6VGhyZWFkOjpnZXQoKS0+R2V0QWx0ZXJuYXRpdmVTdGFja1N0YXJ0KCk7Ci0gICgodWNvbnRleHRfdCopY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19SREldID0gU3lzdGVtOjpHZXRJUEZyb21DYWxsZXJBZGRyZXNzKCgodWNvbnRleHRfdCopY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19SQlBdKTsKKyAgKCh1Y29udGV4dF90Kiljb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX1JESV0gPSBTeXN0ZW06OkdldFJldHVybkFkZHJlc3NPZkNhbGxGcmFtZSgoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfUkJQXSk7CiAgICgodWNvbnRleHRfdCopY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19SU0ldID0gKCh1Y29udGV4dF90Kiljb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX1JCUF07CiAgICgodWNvbnRleHRfdCopY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19SU1BdID0gYWx0X3N0YWNrOwogICAoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfUklQXSA9ICh3b3JkX3QpSGFuZGxlU3RhY2tPdmVyZmxvdzsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvU2lnc2Vndi1saW51eC14ODYuaW5jIGIvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9TaWdzZWd2LWxpbnV4LXg4Ni5pbmMKaW5kZXggZThhN2MxOS4uNDA3ODQwMCAxMDA2NDQKLS0tIGEvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9TaWdzZWd2LWxpbnV4LXg4Ni5pbmMKKysrIGIvdm1raXQvbGliL3Zta2l0L0NvbW1vblRocmVhZC9TaWdzZWd2LWxpbnV4LXg4Ni5pbmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogdm9pZCBIYW5kbGVyOjpVcGRhdGVSZWdpc3RlcnNGb3JTdGFja092ZXJmbG93KCkgewogICB3b3JkX3QgYWx0X3N0YWNrID0gdm1raXQ6OlRocmVhZDo6Z2V0KCktPkdldEFsdGVybmF0aXZlU3RhY2tTdGFydCgpOwotICAoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfRUJYXSA9IFN5c3RlbTo6R2V0SVBGcm9tQ2FsbGVyQWRkcmVzcygoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfRUJQXSk7CisgICgodWNvbnRleHRfdCopY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19FQlhdID0gU3lzdGVtOjpHZXRSZXR1cm5BZGRyZXNzT2ZDYWxsRnJhbWUoKCh1Y29udGV4dF90Kiljb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0VCUF0pOwogICAoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfRUFYXSA9ICgodWNvbnRleHRfdCopY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19FQlBdOwogICAoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfRVNQXSA9IGFsdF9zdGFjazsKICAgKCh1Y29udGV4dF90Kiljb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0VJUF0gPSAod29yZF90KUhhbmRsZVN0YWNrT3ZlcmZsb3c7CmRpZmYgLS1naXQgYS92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL1N0YWNrRW1iZWRkZWRMaXN0LmNwcCBiL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvU3RhY2tFbWJlZGRlZExpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTI4NzEKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL1N0YWNrRW1iZWRkZWRMaXN0LmNwcApAQCAtMCwwICsxLDEzNCBAQAorCisjaW5jbHVkZSAidm1raXQvU3RhY2tFbWJlZGRlZExpc3QuaCIKKyNpbmNsdWRlICJ2bWtpdC9NZXRob2RJbmZvLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2lmIDAKKy8vICNpZiBFTUJFRERFRF9MSVNUX0lOX0NBTExfU1RBQ0sKKworbmFtZXNwYWNlIHZta2l0IHsKKworYm9vbCBTdGFja0VtYmVkZGVkTGlzdFdhbGtlcjo6ZmluZFN0YWNrRnJhbWVPZkVtYmVkZGVkTm9kZSgpCit7CisJLyogQ29uc2lkZXIgdGhlIGZvbGxvd2luZyB4ODYgc3RhY2sgZnJhbWU6CisKK3wtfCAobGFzdCBtZXRob2QgY2FsbGVkKQorfCB8ICAgICAuLi4KK3wgfCBCUChpLTIpCit8IHwgIHwgIHJldCBhZGRyKGktMikKK3wgfCAgfCAgYXJncyhpLTIpCit8YXwgIHwgIHNhdmVkIHJlZ3MoaS0xKQorfGR8ICBWICBsb2NhbHMoaS0xKQorfGR8IEJQKGktMSkKK3xyfCAgfCAgcmV0IGFkZHIoaS0xKQorfGV8ICB8ICBhcmdzKGktMSkKK3xzfCAgfCAgc2F2ZWQgcmVncyhpKQorfHN8ICBWICBsb2NhbHMoaSkKK3wgfCBCUChpICApCit8IHwgICAgcmV0IGFkZHIoaSkKK3wgfCAgICBhcmdzKGkpCit8IHwgICAgLi4uCit8K3wgKGZpcnN0IGNhbGxlciBtZXRob2QpCisKKyAgICBCUCA6PSBjYWxsIGZyYW1lIGFkZHJlc3MgKGJhc2UgcG9pbnRlcikuCisgICAgVGhlIGludGVuZGVkIGNhbGxlciBsaW5rZWQgbGlzdCBub2RlcyBhcmUgZ2VuZXJhdGVkIGluIHRoZSBsb2NhbHMgYXJlYSBvZgorICAgIHRoZSBjYWxsZXIgbWV0aG9kIGZyYW1lLgorCisgICAgSW4gb3JkZXIgdG8gZmluZCB0aGUgZ2l2ZW4gbm9kZSBpbiAibG9jYWxzKGkpIiwgd2UgbmVlZCB0byBrbm93IHdoZXJlCisgICAgImxvY2FscyhpKSIgaXMgbG9jYXRlZCA9IFtCUChpLTEpLCBCUChpKV0uCisgICAgSWYgdGhlIG5vZGUgaXMgZm91bmQgaW4gImxvY2FscyhpKSIsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZnJhbWUgImktMSIgaXMgdGhlCisgICAgY2FsbGVyIG9mIHRoZSBpbnRlbmRlZCBtZXRob2QsIHNvIHRoZSBpbnRlbmRlZCBtZXRob2QgZnJhbWUgaXRzZWxmIGlzICJpLTIiLgorICAgIFRoaXMgaXMgd2h5IHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCB0d28gc3RhY2sgZnJhbWVzIHdoZW4gd2Fsa2luZworICAgIHRoZSBzdGFjay4KKyAgICBCZWNhdXNlIHNvbWUgZnJhbWVzIGFyZSBKYXZhIG1ldGhvZCBzdHViIGZyYW1lcywgd2UgbmVlZCB0byBrbm93IHdoaWNoCisgICAgZnJhbWUgdGhleSBjYWxsICh0aGUgYWN0dWFsIGNhbGxlZCBKYXZhIG1ldGhvZCkuIFRodXMgd2UgbmVlZCB0byBrZWVwIHRoZQorICAgIGxhc3QgdGhyZWUgc3RhY2sgZnJhbWVzLgorICAgIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aG9zZSA0IHN0YWNrIGZyYW1lcywgYW5kIGJlY2F1c2Ugd2UgbWlnaHQgZ28KKyAgICBiYWNrd2FyZCBpbiB0aGUgc3RhY2sgcXVldWUgYnkgYXQgbW9zdCAzIGVsZW1lbnRzLCB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZQorICAgIHN0YWNrIHF1ZXVlLiBUaGlzIGlzIHRoZSBwdXJwb3NlIG9mIHdhbGtlZFN0YWNrLgorCSovCisKKwl3b3JkX3Qgbm9kZVN0YXJ0ID0gKHdvcmRfdClfY3VycmVudF9ub2RlOworCXdvcmRfdCBub2RlRW5kID0gbm9kZVN0YXJ0ICsgc2l6ZW9mKCpfY3VycmVudF9ub2RlKTsKKworCWF1dG8gY2FsbEZyYW1lU3RhcnQgPSBfd2Fsa2VkX3N0YWNrLmVtcHR5KCkgPworCQlfc3RhY2tfd2Fsa2VyLmNhbGxGcmFtZUFkZHJlc3MgOgorCQlfd2Fsa2VkX3N0YWNrLmZyb250KCkuY2FsbEZyYW1lQWRkcmVzczsKKworCWZvciAoOyBfc3RhY2tfd2Fsa2VyLmdldCgpICE9IG51bGxwdHI7CisJCV93YWxrZWRfc3RhY2sucHVzaF9mcm9udChfc3RhY2tfd2Fsa2VyKSwgKytfc3RhY2tfd2Fsa2VyKQorCXsKKwkJYXV0byBjYWxsRnJhbWVFbmQgPSBfc3RhY2tfd2Fsa2VyLmNhbGxGcmFtZUFkZHJlc3M7CisKKwkJaWYgKChub2RlU3RhcnQgPj0gY2FsbEZyYW1lU3RhcnQpICYmIChub2RlRW5kIDw9IGNhbGxGcmFtZUVuZCkpIHsKKwkJCS8vIEZvdW5kIHRoZSBub2RlLCBnbyBiYWNrd2FyZCB0d28gZnJhbWVzLCBpZiBwb3NzaWJsZS4KKwkJCXN3aXRjaCAoX3dhbGtlZF9zdGFjay5zaXplKCkpIHsKKwkJCWNhc2UgMDoKKwkJCQkvLyBXZSBhY3R1YWxseSBoYXZlIGFuIGluY29tcGxldGUgc3RhY2sgZnJhbWUgKFZNS2l0IGJ1ZykuCisJCQkJLy8gV2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgbmVpdGhlciB0byB0aGUgY2FsbGVkIGZyYW1lIG5vciB0aGUKKwkJCQkvLyBjYWxsZWQgZnJhbWUuCisJCQkJLy8gUmVwb3J0IHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlciBmcmFtZSAoYmFzaWNhbGx5IG5vIG9wKS4KKwkJCQlicmVhazsKKworCQkJY2FzZSAxOgorCQkJCS8vIFdlIGFjdHVhbGx5IGhhdmUgYW4gaW5jb21wbGV0ZSBzdGFjayBmcmFtZSAoVk1LaXQgYnVnKS4KKwkJCQkvLyBXZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgY2FsbGVkIGZyYW1lLgorCQkJCS8vIFJlcG9ydCB0aGUgY2FsbGVyIGZyYW1lLgorCQkJCV9zdGFja193YWxrZXIgPSBfd2Fsa2VkX3N0YWNrLmZyb250KCk7CisJCQkJX3dhbGtlZF9zdGFjay5wb3BfZnJvbnQoKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoJLy8gX3dhbGtlZF9zdGFjay5zaXplKCkgPj0gMgorCQkJCV93YWxrZWRfc3RhY2sucG9wX2Zyb250KCk7CQkJLy8gUmVtb3ZlIHRoZSBmcmFtZSAtMS4KKwkJCQlfc3RhY2tfd2Fsa2VyID0gX3dhbGtlZF9zdGFjay5mcm9udCgpOwkvLyBHZXQgdGhlIGZyYW1lIC0yLgorCQkJCV93YWxrZWRfc3RhY2sucG9wX2Zyb250KCk7CQkJLy8gUmVtb3ZlIHRoZSBmcmFtZSAtMi4KKworCQkJCS8vIElmIHRoZSBmcmFtZSBpcyBhIHN0dWIsIHRoZW4gcmV0dXJuIHRoZSBhY3R1YWwgSmF2YSBtZXRob2QuCisJCQkJYXV0byBGSSA9IF9zdGFja193YWxrZXIuZ2V0KCk7CisJCQkJaWYgKCFGSS0+TWV0YWRhdGEgJiYgKEZJLT5GcmFtZVNpemUgPiAwKSAmJgorCQkJCQkhX3dhbGtlZF9zdGFjay5lbXB0eSgpKQorCQkJCXsKKwkJCQkJX3N0YWNrX3dhbGtlciA9IF93YWxrZWRfc3RhY2suZnJvbnQoKTsJLy8gR2V0IHRoZSBmcmFtZSAtMy4KKwkJCQkJX3dhbGtlZF9zdGFjay5wb3BfZnJvbnQoKTsJCQkvLyBSZW1vdmUgdGhlIGZyYW1lIC0zLgorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQljYWxsRnJhbWVTdGFydCA9IGNhbGxGcmFtZUVuZDsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CS8vIE5vZGUgbm90IGZvdW5kCit9CisKK2Jvb2wgU3RhY2tFbWJlZGRlZExpc3RXYWxrZXI6Om5leHQoKQoreworCWlmICghX2N1cnJlbnRfbm9kZSkgewkvLyBJbml0aWFsIF9jdXJyZW50X25vZGUKKwkJX2N1cnJlbnRfbm9kZSA9IF9zdGFja193YWxrZXIudGhyZWFkLT4KKwkJCXN0YWNrRW1iZWRkZWRMaXN0SGVhZFtTdGFja0VtYmVkZGVkTGlzdENoYXJnZWRUaWVyXTsKKwl9IGVsc2UgeworCQlfY3VycmVudF9ub2RlID0gX2N1cnJlbnRfbm9kZS0+Y2FsbGVyTm9kZTsJLy8gR2V0IHRoZSBuZXh0IG5vZGUKKwl9CisKKwl3aGlsZSAoX2N1cnJlbnRfbm9kZSAhPSBudWxscHRyKSB7CS8vIEZpbmQgdGhlIGNhbGxlciBKYXZhIG1ldGhvZCBmcmFtZS4KKwkJaWYgKGZpbmRTdGFja0ZyYW1lT2ZFbWJlZGRlZE5vZGUoKSkKKwkJCWJyZWFrOworCisJCV9jdXJyZW50X25vZGUgPSBfY3VycmVudF9ub2RlLT5jYWxsZXJOb2RlOworCX0KKworCXJldHVybiBfY3VycmVudF9ub2RlICE9IG51bGxwdHI7Cit9CisKK3ZvaWQgU3RhY2tFbWJlZGRlZExpc3ROb2RlOjpkdW1wKCkgY29uc3QKK3sKKwlzdGQ6OmNvdXQgPDwgInRpZXJJRD0iIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3Q+KGRhdGFbMF0pIDw8IHN0ZDo6ZW5kbDsKKwlpZiAoIWNhbGxlck5vZGUpIHJldHVybjsKKwljYWxsZXJOb2RlLT5kdW1wKCk7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvdm1raXQvQ29tbW9uVGhyZWFkL2N0dGhyZWFkLmNwcCBiL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvY3R0aHJlYWQuY3BwCmluZGV4IDMxZGZjNjkuLjlhNWU1NmIgMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvY3R0aHJlYWQuY3BwCisrKyBiL3Zta2l0L2xpYi92bWtpdC9Db21tb25UaHJlYWQvY3R0aHJlYWQuY3BwCkBAIC0yNiw2ICsyNiwxMCBAQAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKK2V4dGVybiAiQyIgdm9pZCBKbmp2bV9pbmNyZW1lbnRUb3RhbENhbGxlZE1ldGhvZHNDb3VudGVyKHZta2l0OjpUaHJlYWQqKTsKKyNlbmRpZgorCiB1c2luZyBuYW1lc3BhY2Ugdm1raXQ7CiAKIGludCBUaHJlYWQ6OmtpbGwodm9pZCogdGlkLCBpbnQgc2lnbm8pIHsKQEAgLTYwLDcgKzY0LDcgQEAKIAogdm9pZCBUaHJlYWQ6OnN0YXJ0S25vd25GcmFtZShLbm93bkZyYW1lJiBGKSB7CiAgIC8vIEdldCB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KLSAgd29yZF90IGN1ciA9IFN5c3RlbTo6R2V0Q2FsbGVyQWRkcmVzcygpOworICB3b3JkX3QgY3VyID0gU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCk7CiAgIEYucHJldmlvdXNGcmFtZSA9IGxhc3RLbm93bkZyYW1lOwogICBGLmN1cnJlbnRGUCA9IGN1cjsKICAgLy8gVGhpcyBpcyB1c2VkIGFzIGEgbWFya2VyLgpAQCAtNzUsMTIgKzc5LDEyIEBACiAKIHZvaWQgVGhyZWFkOjpzdGFydFVua25vd25GcmFtZShLbm93bkZyYW1lJiBGKSB7CiAgIC8vIEdldCB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KLSAgd29yZF90IGN1ciA9IFN5c3RlbTo6R2V0Q2FsbGVyQWRkcmVzcygpOworICB3b3JkX3QgY3VyID0gU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCk7CiAgIC8vIEdldCB0aGUgY2FsbGVyIG9mIHRoZSBjYWxsZXIuCi0gIGN1ciA9IFN5c3RlbTo6R2V0Q2FsbGVyT2ZBZGRyZXNzKGN1cik7CisgIGN1ciA9IFN5c3RlbTo6R2V0Q2FsbGVyQ2FsbEZyYW1lKGN1cik7CiAgIEYucHJldmlvdXNGcmFtZSA9IGxhc3RLbm93bkZyYW1lOwogICBGLmN1cnJlbnRGUCA9IGN1cjsKLSAgRi5jdXJyZW50SVAgPSBTeXN0ZW06OkdldElQRnJvbUNhbGxlckFkZHJlc3MoY3VyKTsKKyAgRi5jdXJyZW50SVAgPSBTeXN0ZW06OkdldFJldHVybkFkZHJlc3NPZkNhbGxGcmFtZShjdXIpOwogICBsYXN0S25vd25GcmFtZSA9ICZGOwogfQogCkBAIC05Nyw3ICsxMDEsNyBAQAogICBTdGFja1dhbGtlciBXYWxrZXIodGhpcyk7CiAKICAgd2hpbGUgKEZyYW1lSW5mbyogRkkgPSBXYWxrZXIuZ2V0KCkpIHsKLSAgICBNeVZNLT5wcmludE1ldGhvZChGSSwgV2Fsa2VyLmlwLCBXYWxrZXIuYWRkcik7CisgICAgTXlWTS0+cHJpbnRNZXRob2QoRkksIFdhbGtlci5yZXR1cm5BZGRyZXNzLCBXYWxrZXIuY2FsbEZyYW1lQWRkcmVzcyk7CiAgICAgKytXYWxrZXI7CiAgIH0KIH0KQEAgLTEyNCw0MiArMTI4LDg5IEBACiB9CiAKIEZyYW1lSW5mbyogU3RhY2tXYWxrZXI6OmdldCgpIHsKLSAgaWYgKGFkZHIgPT0gdGhyZWFkLT5iYXNlU1ApIHJldHVybiAwOwotICBpcCA9IFN5c3RlbTo6R2V0SVBGcm9tQ2FsbGVyQWRkcmVzcyhhZGRyKTsKLSAgcmV0dXJuIHRocmVhZC0+TXlWTS0+SVBUb0ZyYW1lSW5mbyhpcCk7CisgIGlmIChjYWxsRnJhbWVBZGRyZXNzID09IHRocmVhZC0+YmFzZVNQKSByZXR1cm4gMDsKKyAgcmV0dXJuQWRkcmVzcyA9IFN5c3RlbTo6R2V0UmV0dXJuQWRkcmVzc09mQ2FsbEZyYW1lKGNhbGxGcmFtZUFkZHJlc3MpOworICByZXR1cm4gdGhyZWFkLT5NeVZNLT5JUFRvRnJhbWVJbmZvKHJldHVybkFkZHJlc3MpOworfQorCitGcmFtZUluZm8qIFN0YWNrV2Fsa2VyOjpnZXROZXh0RnJhbWVXaXRoTWV0YWRhdGEoKQoreworCUZyYW1lSW5mbyogRkk7CisJZm9yICh2b2lkICptZXRhZGF0YSA9IE5VTEw7CQkJCQkJCS8vICgxKQorCQkoIW1ldGFkYXRhKSAmJiAoKEZJID0gdGhpcy0+Z2V0KCkpICE9IE5VTEwpOwkvLyAoMikrCisJCW1ldGFkYXRhID0gRkktPk1ldGFkYXRhLCArKygqdGhpcykpOwkJCS8vICgzKSoKKwlyZXR1cm4gRkk7Cit9CisKK0ZyYW1lSW5mbyogU3RhY2tXYWxrZXI6OmdldE5leHRGcmFtZVdpdGhNZXRhZGF0YSgKKwlzaXplX3QmIHRvdGFsRnJhbWVTaXplV2l0aG91dE1ldGFkYXRhKQoreworCXNpemVfdCBmcmFtZVNpemUgPSAwOworCUZyYW1lSW5mbyogRkkgPSBOVUxMOworCWZvciAodm9pZCAqbWV0YWRhdGEgPSBOVUxMOwkJCQkJCQkvLyAoMSkKKwkJKCFtZXRhZGF0YSkgJiYgKChGSSA9IHRoaXMtPmdldCgpKSAhPSBOVUxMKTsJLy8gKDIpKworCisJCWZyYW1lU2l6ZSArPSBGSS0+RnJhbWVTaXplLAkJCQkJCS8vICgzKSoKKwkJbWV0YWRhdGEgPSBGSS0+TWV0YWRhdGEsCisJCSsrKCp0aGlzKSk7CisKKwlpZiAoRkkgIT0gTlVMTCkgZnJhbWVTaXplIC09IEZJLT5GcmFtZVNpemU7CisJdG90YWxGcmFtZVNpemVXaXRob3V0TWV0YWRhdGEgPSBmcmFtZVNpemU7CisJcmV0dXJuIEZJOworfQorCitGcmFtZUluZm8qIFN0YWNrV2Fsa2VyOjpnZXROZXh0RnJhbWVXaXRoTWV0YWRhdGEoCisJd29yZF90JiBjYWxsRnJhbWVBZGRyZXNzXywgd29yZF90JiByZXR1cm5BZGRyZXNzXywgS25vd25GcmFtZSomIGZyYW1lXykKK3sKKwlGcmFtZUluZm8qIEZJOworCXdvcmRfdCBfY2FsbEZyYW1lQWRkcmVzcywgX3JldHVybkFkZHJlc3M7CisJS25vd25GcmFtZSogX2ZyYW1lOworCXZvaWQgKm1ldGFkYXRhID0gTlVMTDsKKworCWZvciAoOyAoIW1ldGFkYXRhKSAmJiAoKEZJID0gdGhpcy0+Z2V0KCkpICE9IE5VTEwpOwkvLyAoMSkrCisJCW1ldGFkYXRhID0gRkktPk1ldGFkYXRhLAkJCQkJCS8vICgyKSoKKwkJX2NhbGxGcmFtZUFkZHJlc3MgPSBjYWxsRnJhbWVBZGRyZXNzLCBfcmV0dXJuQWRkcmVzcyA9IHJldHVybkFkZHJlc3MsIF9mcmFtZSA9IGZyYW1lLAorCQkrKygqdGhpcykpOworCisJY2FsbEZyYW1lQWRkcmVzc18gPSBfY2FsbEZyYW1lQWRkcmVzczsKKwlyZXR1cm5BZGRyZXNzXyA9IF9yZXR1cm5BZGRyZXNzOworCWZyYW1lXyA9IF9mcmFtZTsKKwlyZXR1cm4gRkk7CiB9CiAKIHdvcmRfdCBTdGFja1dhbGtlcjo6b3BlcmF0b3IqKCkgewotICBpZiAoYWRkciA9PSB0aHJlYWQtPmJhc2VTUCkgcmV0dXJuIDA7Ci0gIGlwID0gU3lzdGVtOjpHZXRJUEZyb21DYWxsZXJBZGRyZXNzKGFkZHIpOwotICByZXR1cm4gaXA7CisgIGlmIChjYWxsRnJhbWVBZGRyZXNzID09IHRocmVhZC0+YmFzZVNQKSByZXR1cm4gMDsKKyAgcmV0dXJuQWRkcmVzcyA9IFN5c3RlbTo6R2V0UmV0dXJuQWRkcmVzc09mQ2FsbEZyYW1lKGNhbGxGcmFtZUFkZHJlc3MpOworICByZXR1cm4gcmV0dXJuQWRkcmVzczsKIH0KIAogdm9pZCBTdGFja1dhbGtlcjo6b3BlcmF0b3IrKygpIHsKLSAgaWYgKGFkZHIgIT0gdGhyZWFkLT5iYXNlU1ApIHsKLSAgICAvL2Fzc2VydCgoYWRkciA8IHRocmVhZC0+YmFzZVNQKSAmJiAiQ29ycnVwdGVkIHN0YWNrIik7Ci0gICAgLy9hc3NlcnQoKGFkZHIgPCBTeXN0ZW06OkdldENhbGxlck9mQWRkcmVzcyhhZGRyKSkgJiYgIkNvcnJ1cHRlZCBzdGFjayIpOwotICAgIGlmICgoZnJhbWUgIT0gTlVMTCkgJiYgKGFkZHIgPT0gZnJhbWUtPmN1cnJlbnRGUCkpIHsKKyAgaWYgKGNhbGxGcmFtZUFkZHJlc3MgIT0gdGhyZWFkLT5iYXNlU1ApIHsKKyAgICBhc3NlcnQoKGNhbGxGcmFtZUFkZHJlc3MgPCB0aHJlYWQtPmJhc2VTUCkgJiYgIkNvcnJ1cHRlZCBzdGFjayIpOworICAgIGFzc2VydCgoY2FsbEZyYW1lQWRkcmVzcyA8IFN5c3RlbTo6R2V0Q2FsbGVyQ2FsbEZyYW1lKGNhbGxGcmFtZUFkZHJlc3MpKSAmJiAiQ29ycnVwdGVkIHN0YWNrIik7CisgICAgaWYgKChmcmFtZSAhPSBOVUxMKSAmJiAoY2FsbEZyYW1lQWRkcmVzcyA9PSBmcmFtZS0+Y3VycmVudEZQKSkgewogICAgICAgYXNzZXJ0KGZyYW1lLT5jdXJyZW50SVAgPT0gMCk7CiAgICAgICBmcmFtZSA9IGZyYW1lLT5wcmV2aW91c0ZyYW1lOwogICAgICAgYXNzZXJ0KGZyYW1lICE9IE5VTEwpOwogICAgICAgYXNzZXJ0KGZyYW1lLT5jdXJyZW50SVAgIT0gMCk7Ci0gICAgICBhZGRyID0gZnJhbWUtPmN1cnJlbnRGUDsKKyAgICAgIGNhbGxGcmFtZUFkZHJlc3MgPSBmcmFtZS0+Y3VycmVudEZQOwogICAgICAgZnJhbWUgPSBmcmFtZS0+cHJldmlvdXNGcmFtZTsKICAgICB9IGVsc2UgewotICAgICAgYWRkciA9IFN5c3RlbTo6R2V0Q2FsbGVyT2ZBZGRyZXNzKGFkZHIpOworICAgICAgY2FsbEZyYW1lQWRkcmVzcyA9IFN5c3RlbTo6R2V0Q2FsbGVyQ2FsbEZyYW1lKGNhbGxGcmFtZUFkZHJlc3MpOwogICAgIH0KICAgfQogfQogCi1TdGFja1dhbGtlcjo6U3RhY2tXYWxrZXIodm1raXQ6OlRocmVhZCogdGgpIHsKK1N0YWNrV2Fsa2VyOjpTdGFja1dhbGtlcih2bWtpdDo6VGhyZWFkKiB0aCkgOgorCXJldHVybkFkZHJlc3MoMCkKK3sKICAgdGhyZWFkID0gdGg7CiAgIGZyYW1lID0gdGgtPmxhc3RLbm93bkZyYW1lOwogICBpZiAodm1raXQ6OlRocmVhZDo6Z2V0KCkgPT0gdGgpIHsKLSAgICBhZGRyID0gU3lzdGVtOjpHZXRDYWxsZXJBZGRyZXNzKCk7Ci0gICAgYWRkciA9IFN5c3RlbTo6R2V0Q2FsbGVyT2ZBZGRyZXNzKGFkZHIpOworICAgIGNhbGxGcmFtZUFkZHJlc3MgPSBTeXN0ZW06OkdldENhbGxGcmFtZUFkZHJlc3MoKTsKKyAgICBjYWxsRnJhbWVBZGRyZXNzID0gU3lzdGVtOjpHZXRDYWxsZXJDYWxsRnJhbWUoY2FsbEZyYW1lQWRkcmVzcyk7CiAgIH0gZWxzZSB7Ci0gICAgYWRkciA9IHRoLT53YWl0T25TUCgpOworICAgIGNhbGxGcmFtZUFkZHJlc3MgPSB0aC0+d2FpdE9uU1AoKTsKICAgICBpZiAoZnJhbWUpIHsKIC8vICAgIAlpZiAoZnJhbWUtPmN1cnJlbnRGUCA8IGFkZHIpIHsKIC8vICAgIAkJZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiB0aHJlYWQgd2l0aCBwb2ludGVyICVwIGJlY2F1c2UgJXggPCAleFxuIiwgdGgsIGZyYW1lLT5jdXJyZW50RlAsIGFkZHIpOwpAQCAtMTY3LDkgKzIxOCw5IEBACiAvLyAgICAJfQogCiAKLSAgICAJYXNzZXJ0KGZyYW1lLT5jdXJyZW50RlAgPj0gYWRkcik7CisgICAgCWFzc2VydChmcmFtZS0+Y3VycmVudEZQID49IGNhbGxGcmFtZUFkZHJlc3MpOwogICAgIH0KLSAgICBpZiAoZnJhbWUgJiYgKGFkZHIgPT0gZnJhbWUtPmN1cnJlbnRGUCkpIHsKKyAgICBpZiAoZnJhbWUgJiYgKGNhbGxGcmFtZUFkZHJlc3MgPT0gZnJhbWUtPmN1cnJlbnRGUCkpIHsKICAgICAgIGZyYW1lID0gZnJhbWUtPnByZXZpb3VzRnJhbWU7CiAgICAgICAvLyBMZXQgdGhpcyBiZSBjYWxsZWQgZnJvbSBKTkksIGFzIGluCiAgICAgICAvLyBPcGVuSkRLJ3MgSlZNX0ZpbGxJblN0YWNrVHJhY2U6CkBAIC0xNzgsMTQgKzIyOSwzMiBAQAogICAgICAgYXNzZXJ0KChmcmFtZSA9PSBOVUxMKSB8fCAoZnJhbWUtPmN1cnJlbnRJUCA9PSAwKSk7CiAgICAgfQogICB9Ci0gIGFzc2VydChhZGRyICYmICJObyBhZGRyZXNzIHRvIHN0YXJ0IHdpdGgiKTsKKyAgYXNzZXJ0KGNhbGxGcmFtZUFkZHJlc3MgJiYgIk5vIGFkZHJlc3MgdG8gc3RhcnQgd2l0aCIpOwogfQogCitTdGFja1dhbGtlcjo6U3RhY2tXYWxrZXIoKSA6CisJcmV0dXJuQWRkcmVzcygwKQoreworICB0aHJlYWQgPSB2bWtpdDo6VGhyZWFkOjpnZXQoKTsKKyAgZnJhbWUgPSB0aHJlYWQtPmxhc3RLbm93bkZyYW1lOworICBjYWxsRnJhbWVBZGRyZXNzID0gU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCk7CisgIGNhbGxGcmFtZUFkZHJlc3MgPSBTeXN0ZW06OkdldENhbGxlckNhbGxGcmFtZShjYWxsRnJhbWVBZGRyZXNzKTsKKyAgYXNzZXJ0KGNhbGxGcmFtZUFkZHJlc3MgJiYgIk5vIGFkZHJlc3MgdG8gc3RhcnQgd2l0aCIpOworfQorCisjaWYgT1NHSV9TVEFDS19TUEFDRV9USUVSX1RBR0dJTkcKK2V4dGVybiAiQyIgdm9pZCBPU0dpX1RpZXJNYW5hZ2VyX2FjY291bnRGb3JUaHJlYWRTdGFjayh2bWtpdDo6VGhyZWFkKiB0aHJlYWQpOworI2VuZGlmCiAKIHZvaWQgVGhyZWFkOjpzY2FuU3RhY2sod29yZF90IGNsb3N1cmUpIHsKKworI2lmIE9TR0lfU1RBQ0tfU1BBQ0VfVElFUl9UQUdHSU5HCisgIE9TR2lfVGllck1hbmFnZXJfYWNjb3VudEZvclRocmVhZFN0YWNrKHRoaXMpOworI2VuZGlmCisKICAgU3RhY2tXYWxrZXIgV2Fsa2VyKHRoaXMpOwogICB3aGlsZSAoRnJhbWVJbmZvKiBNSSA9IFdhbGtlci5nZXQoKSkgewotICAgIE1ldGhvZEluZm9IZWxwZXI6OnNjYW4oY2xvc3VyZSwgTUksIFdhbGtlci5pcCwgV2Fsa2VyLmFkZHIpOworICAgIE1ldGhvZEluZm9IZWxwZXI6OnNjYW4oY2xvc3VyZSwgTUksIFdhbGtlci5yZXR1cm5BZGRyZXNzLCBXYWxrZXIuY2FsbEZyYW1lQWRkcmVzcyk7CiAgICAgKytXYWxrZXI7CiAgIH0KIH0KQEAgLTE5NSwxMSArMjY0LDExIEBACiAgIAlpZiAoIWluUlYpIHsKICAgCQlhc3NlcnQoIWxhc3RTUCAmJiAiU1AgYWxyZWFkeSBzZXQgd2hlbiBlbnRlcmluZyB1bmNvb3BlcmF0aXZlIGNvZGUiKTsKICAgICAgIC8vIEdldCB0aGUgY2FsbGVyLgotICAgICAgd29yZF90IHRlbXAgPSBTeXN0ZW06OkdldENhbGxlckFkZHJlc3MoKTsKKyAgICAgIHdvcmRfdCB0ZW1wID0gU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCk7CiAgICAgICAvLyBNYWtlIHN1cmUgdG8gYXQgbGVhc3QgZ2V0IHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlci4KICAgICAgICsrbGV2ZWw7CiAgICAgICB3aGlsZSAobGV2ZWwtLSkKLSAgICAJICB0ZW1wID0gU3lzdGVtOjpHZXRDYWxsZXJPZkFkZHJlc3ModGVtcCk7CisgICAgCSAgdGVtcCA9IFN5c3RlbTo6R2V0Q2FsbGVyQ2FsbEZyYW1lKHRlbXApOwogICAgICAgLy8gVGhlIGNhcyBpcyBub3QgbmVjZXNzYXJ5LCBidXQgaXQgZG9lcyBhIG1lbW9yeSBiYXJyaWVyLgogICAgICAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgmbGFzdFNQLCAwLCB0ZW1wKTsKICAgICAgIGlmIChkb1lpZWxkKSBqb2luUlZCZWZvcmVFbnRlcigpOwpAQCAtMzM3LDcgKzQwNiwyMCBAQAogLy8vIGdpdmVuIHJvdXRpbmUgb2YgdGguCiAvLy8KIHZvaWQgVGhyZWFkOjppbnRlcm5hbFRocmVhZFN0YXJ0KHZta2l0OjpUaHJlYWQqIHRoKSB7Ci0gIHRoLT5iYXNlU1AgID0gU3lzdGVtOjpHZXRDYWxsZXJBZGRyZXNzKCk7CisgIHRoLT5iYXNlU1AgID0gU3lzdGVtOjpHZXRDYWxsRnJhbWVBZGRyZXNzKCk7CisKKyNpZiBKQVZBX0NIQVJHRURfVElFUl9DQUxMX1NUQUNLCisgIHRoLT5jaGFyZ2VkVGllcklEID0gKHVpbnQzMl90KS0xOworI2VuZGlmCisKKyNpZiBFTUJFRERFRF9MSVNUX0lOX0NBTExfU1RBQ0sKKyAgbWVtc2V0KHRoLT5zdGFja0VtYmVkZGVkTGlzdEhlYWQsIDAsCisgICAgc2l6ZW9mKCp0aC0+c3RhY2tFbWJlZGRlZExpc3RIZWFkKSAqIFN0YWNrRW1iZWRkZWRMaXN0Tm9kZUNvdW50UGVyVGhyZWFkKTsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKyAgdGgtPnRvdGFsX2NhbGxlZF9tZXRob2RzX2NvdW50ID0gMDsKKyNlbmRpZgogCiAgIC8vIFNldCB0aGUgYWx0ZXJuYXRlIHN0YWNrIGFzIHRoZSBzZWNvbmQgcGFnZSBvZiB0aGUgdGhyZWFkJ3MKICAgLy8gc3RhY2suCkBAIC0zNzQsNiArNDU2LDEwIEBACiAgIHRoLT5NeVZNLT5yZW5kZXp2b3VzLmFkZFRocmVhZCh0aCk7CiAgIHRoLT5yb3V0aW5lKHRoKTsKICAgdGgtPk15Vk0tPnJlbW92ZVRocmVhZCh0aCk7CisKKyNpZiBNT05JVE9SX0NSRUFURURfT0JKRUNUU19DT1VOVAorICBKbmp2bV9pbmNyZW1lbnRUb3RhbENhbGxlZE1ldGhvZHNDb3VudGVyKHRoKTsKKyNlbmRpZgogfQogCiAKQEAgLTQyMCw2ICs1MDYsMTAgQEAKICAgd29yZF90IGluZGV4ID0gKCh3b3JkX3QpdGggJiBTeXN0ZW06OkdldFRocmVhZElETWFzaygpKTsKICAgaW5kZXggPSAoaW5kZXggJiB+VGhlU3RhY2tNYW5hZ2VyLmJhc2VBZGRyKSA+PiAyMDsKICAgVGhlU3RhY2tNYW5hZ2VyLnVzZWRbaW5kZXhdID0gMDsKKworI2lmIE1PTklUT1JfQ1JFQVRFRF9PQkpFQ1RTX0NPVU5UCisgIEpuanZtX2luY3JlbWVudFRvdGFsQ2FsbGVkTWV0aG9kc0NvdW50ZXIodGgpOworI2VuZGlmCiB9CiAKIHZvaWQgVGhyZWFkOjp0aHJvd051bGxQb2ludGVyRXhjZXB0aW9uKHdvcmRfdCBtZXRob2RJUCkKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi92bWtpdC9SdW50aW1lL01ldGhvZEluZm8uY3BwIGIvdm1raXQvbGliL3Zta2l0L1J1bnRpbWUvTWV0aG9kSW5mby5jcHAKaW5kZXggNzdhMmNiMy4uZTM1NjExOCAxMDA2NDQKLS0tIGEvdm1raXQvbGliL3Zta2l0L1J1bnRpbWUvTWV0aG9kSW5mby5jcHAKKysrIGIvdm1raXQvbGliL3Zta2l0L1J1bnRpbWUvTWV0aG9kSW5mby5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogdm9pZCBNZXRob2RJbmZvSGVscGVyOjpzY2FuKHdvcmRfdCBjbG9zdXJlLCBGcmFtZUluZm8qIEZJLCB3b3JkX3QgaXAsIHdvcmRfdCBhZGRyKSB7CiAgIC8vd29yZF90IHNwYWRkciA9ICh3b3JkX3QpYWRkciArIEZJLT5GcmFtZVNpemUgKyBzaXplb2Yodm9pZCopOwotICB3b3JkX3Qgc3BhZGRyID0gU3lzdGVtOjpHZXRDYWxsZXJPZkFkZHJlc3MoYWRkcik7CisgIHdvcmRfdCBzcGFkZHIgPSBTeXN0ZW06OkdldENhbGxlckNhbGxGcmFtZShhZGRyKTsKICAgZm9yICh1aW50MTYgaSA9IDA7IGkgPCBGSS0+TnVtTGl2ZU9mZnNldHM7ICsraSkgewogICAgIHdvcmRfdCBvYmogPSAqKHdvcmRfdCopKHNwYWRkciArIEZJLT5MaXZlT2Zmc2V0c1tpXSk7ICAgIAogICAgIC8vIFZlcmlmeSB0aGF0IG9iaiBkb2VzIG5vdCBjb21lIGZyb20gYSBKU1IgYnl0ZWNvZGUuCmRpZmYgLS1naXQgYS92bWtpdC9saWIvdm1raXQvUnVudGltZS9VVEY4LmNwcCBiL3Zta2l0L2xpYi92bWtpdC9SdW50aW1lL1VURjguY3BwCmluZGV4IDg5ZDM3NTcuLjA3ZDJjYTggMTAwNjQ0Ci0tLSBhL3Zta2l0L2xpYi92bWtpdC9SdW50aW1lL1VURjguY3BwCisrKyBiL3Zta2l0L2xpYi92bWtpdC9SdW50aW1lL1VURjguY3BwCkBAIC00MSwxNyArNDEsNiBAQAogICByZXR1cm4gKHIxICYgMjU1KSArICgocjAgJiAyNTUpIDw8IDgpOwogfQogCi1pbnQgVVRGODo6Y29tcGFyZShjb25zdCBjaGFyICpzKSBjb25zdAotewotCWludCBsZW4gPSBzdHJsZW4ocyk7Ci0JaW50IGRpZmYgPSBzaXplIC0gbGVuOwotCWlmIChkaWZmICE9IDApIHJldHVybiBkaWZmOwotCi0JZm9yIChpbnQgaSA9IDA7IChpIDwgc2l6ZSkgJiYgKGRpZmYgPT0gMCk7ICsraSkKLQkJZGlmZiA9IChjaGFyKShlbGVtZW50c1tpXSkgLSBzW2ldOwotCXJldHVybiBkaWZmOwotfQotCiBzdGQ6OnN0cmluZyYgVVRGODo6dG9TdHJpbmcoc3RkOjpzdHJpbmcmIGJ1ZmZlcikgY29uc3QKIHsKIAlidWZmZXIucmVzaXplKHNpemUpOwpAQCAtNjQsNyArNTMsNyBAQAogCiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBVVEY4JiB1dGY4KQogewotCWZvciAoc3NpemVfdCBpID0gMDsgaSA8IHV0Zjguc2l6ZTsgKytpKQorCWZvciAoc3NpemVfdCBpID0gMDsgKGkgPCB1dGY4LnNpemUpICYmICh1dGY4LmVsZW1lbnRzW2ldICE9IDApOyArK2kpCiAJCW9zIDw8IChzdGQ6OnN0cmluZzo6dmFsdWVfdHlwZSkodXRmOC5lbGVtZW50c1tpXSk7CiAJcmV0dXJuIG9zOwogfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWFsbG9jL1NlbGVjdGVkLmNwcCBiL3Zta2l0L21tdGsvbW10ay1hbGxvYy9TZWxlY3RlZC5jcHAKaW5kZXggNzVhOTIyZC4uN2Y0OTVmMSAxMDA2NDQKLS0tIGEvdm1raXQvbW10ay9tbXRrLWFsbG9jL1NlbGVjdGVkLmNwcAorKysgYi92bWtpdC9tbXRrL21tdGstYWxsb2MvU2VsZWN0ZWQuY3BwCkBAIC05OCwxMiArOTgsMjkgQEAKIAlKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfcG9zdGFsbG9jX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8ySShvYmosIHR5cGUsIHNpemUpOwogfQogCisjaWYgT1NHSV9PQkpFQ1RfVElFUl9UQUdHSU5HCitleHRlcm4gIkMiIHZvaWQgT1NHaV9UaWVyTWFuYWdlcl91cGRhdGVUaWVyQ2hhcmdlZFRvTmV3bHlDcmVhdGVkT2JqZWN0KGdjKik7CisjZW5kaWYKKworI2lmIE1PTklUT1JfQ1JFQVRFRF9PQkpFQ1RTX0NPVU5UCitleHRlcm4gIkMiIHZvaWQgSm5qdm1fbmV3bHlDcmVhdGVkT2JqZWN0KCk7CisjZW5kaWYKKwogZXh0ZXJuICJDIiB2b2lkKiB2bWtpdGdjbWFsbG9jKHVpbnQzMl90IHN6LCB2b2lkKiB0eXBlKSB7CiAJZ2MqIHJlcyA9IDA7CiAJbGx2bV9nY3Jvb3QocmVzLCAwKTsKIAlzeiArPSBnY0hlYWRlcjo6aGlkZGVuSGVhZGVyU2l6ZSgpOwogCXN6ID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KHN6LCBzaXplb2Yodm9pZCopKTsKIAlyZXMgPSAoKGdjSGVhZGVyKilKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3Nfdm1raXRnY21hbGxvY19fSUxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKHN6LCB0eXBlKSktPnRvUmVmZXJlbmNlKCk7CisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKwlPU0dpX1RpZXJNYW5hZ2VyX3VwZGF0ZVRpZXJDaGFyZ2VkVG9OZXdseUNyZWF0ZWRPYmplY3QocmVzKTsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKwlKbmp2bV9uZXdseUNyZWF0ZWRPYmplY3QoKTsKKyNlbmRpZgorCiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTI1LDYgKzE0MiwxNSBAQAogCXN6ICs9IGdjSGVhZGVyOjpoaWRkZW5IZWFkZXJTaXplKCk7CiAJc3ogPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoc3osIHNpemVvZih2b2lkKikpOwogCXJlcyA9ICgoZ2NIZWFkZXIqKUpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19WVGdjbWFsbG9jX19JTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoc3osIFZUKSktPnRvUmVmZXJlbmNlKCk7CisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKwlPU0dpX1RpZXJNYW5hZ2VyX3VwZGF0ZVRpZXJDaGFyZ2VkVG9OZXdseUNyZWF0ZWRPYmplY3QocmVzKTsKKyNlbmRpZgorCisjaWYgTU9OSVRPUl9DUkVBVEVEX09CSkVDVFNfQ09VTlQKKwlKbmp2bV9uZXdseUNyZWF0ZWRPYmplY3QoKTsKKyNlbmRpZgorCiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTgwLDEwICsyMDYsMTkgQEAKICAgcmV0dXJuIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19pc0xpdmVfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKGNsb3N1cmUsIHB0cik7CiB9CiAKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKK2V4dGVybiAiQyIgdm9pZCBPU0dpX1RpZXJNYW5hZ2VyX2FjY291bnRGb3JMaXZlT2JqZWN0KHZvaWQqIG9iaik7CisjZW5kaWYKKwogdm9pZCBDb2xsZWN0b3I6OnNjYW5PYmplY3QoRnJhbWVJbmZvKiBGSSwgdm9pZCoqIHB0ciwgd29yZF90IGNsb3N1cmUpIHsKICAgaWYgKCgqcHRyKSAhPSBOVUxMKSB7CiAgICAgYXNzZXJ0KHZta2l0OjpUaHJlYWQ6OmdldCgpLT5NeVZNLT5pc0NvcnJ1cHRlZFR5cGUoKGdjKikoKnB0cikpKTsKICAgfQorCisjaWYgT1NHSV9PQkpFQ1RfVElFUl9UQUdHSU5HCisgIE9TR2lfVGllck1hbmFnZXJfYWNjb3VudEZvckxpdmVPYmplY3QoKnB0cik7CisjZW5kaWYKKwogICBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfcmVwb3J0RGVsYXllZFJvb3RFZGdlX19Mb3JnX21tdGtfcGxhbl9UcmFjZUxvY2FsXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIoY2xvc3VyZSwgcHRyKTsKIH0KICAKQEAgLTE5NCw2ICsyMjksMTEgQEAKIAkJYXNzZXJ0KHZta2l0OjpUaHJlYWQ6OmdldCgpLT5NeVZNLT5pc0NvcnJ1cHRlZFR5cGUoKGdjKikoKnB0cl8pKSk7CiAJfQogCWlmICgoKih2b2lkKiopcHRyKSAhPSBOVUxMKSBhc3NlcnQodm1raXQ6OlRocmVhZDo6Z2V0KCktPk15Vk0tPmlzQ29ycnVwdGVkVHlwZSgoZ2MqKSgqKHZvaWQqKilwdHIpKSk7CisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKwlPU0dpX1RpZXJNYW5hZ2VyX2FjY291bnRGb3JMaXZlT2JqZWN0KCpwdHJfKTsKKyNlbmRpZgorCiAJSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX3Byb2Nlc3NFZGdlX19Mb3JnX21tdGtfcGxhbl9UcmFuc2l0aXZlQ2xvc3VyZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIoY2xvc3VyZSwgc291cmNlLCBwdHIpOwogfQogICAKQEAgLTIwMyw2ICsyNDMsMTEgQEAKICAgaWYgKCgqcHRyXykgIT0gTlVMTCkgewogICAgIGFzc2VydCh2bWtpdDo6VGhyZWFkOjpnZXQoKS0+TXlWTS0+aXNDb3JydXB0ZWRUeXBlKChnYyopKCpwdHJfKSkpOwogICB9CisKKyNpZiBPU0dJX09CSkVDVF9USUVSX1RBR0dJTkcKKyAgT1NHaV9UaWVyTWFuYWdlcl9hY2NvdW50Rm9yTGl2ZU9iamVjdCgqcHRyXyk7CisjZW5kaWYKKwogICBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfcHJvY2Vzc1Jvb3RFZGdlX19Mb3JnX21tdGtfcGxhbl9UcmFjZUxvY2FsXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzJaKGNsb3N1cmUsIHB0ciwgdHJ1ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvajNtZ3IvYnVuZGxlLm1hbmlmZXN0IGIvdm1raXQvb3NnaS9qM21nci9idW5kbGUubWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiYzJkYwotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvajNtZ3IvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsOSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLU5hbWU6IEozIE1hbmFnZXINCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLUFjdGl2YXRvcjogajNtZ3IuQWN0aXZhdG9yDQorQnVuZGxlLVN5bWJvbGljTmFtZTogajNtZ3INCitCdW5kbGUtVmVuZG9yOiBLb3V0aGVpciBBdHRvdWNoaQ0KK0V4cG9ydC1QYWNrYWdlOiBqMw0KK0ltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcmsNCmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL2ozbWdyL3NyYy9qMy9KM01nci5qYXZhIGIvdm1raXQvb3NnaS9qM21nci9zcmMvajMvSjNNZ3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ4M2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS9qM21nci9zcmMvajMvSjNNZ3IuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGozOworCitwdWJsaWMgaW50ZXJmYWNlIEozTWdyCit7CisJLy8gVEhFIEZPTExPV0lORyBNRVRIT0RTIEFSRSBERUJVR0dJTkcgSEVMUEVSUworCS8vIFRIRVkgU0hPVUxEIEJFIFJFTU9WRUQgSU4gUFJPRFVDVElPTgorCQorCXB1YmxpYyB2b2lkIGR1bXBDbGFzc0xvYWRlckJ1bmRsZXMoKSB0aHJvd3MgVGhyb3dhYmxlOworCXB1YmxpYyB2b2lkIGR1bXBUaWVyU3RhdHMoU3RyaW5nIGRlbGF5ZWRTZWMpIHRocm93cyBUaHJvd2FibGU7Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL2ozbWdyL3NyYy9qMy92bS9PU0dpLmphdmEgYi92bWtpdC9vc2dpL2ozbWdyL3NyYy9qMy92bS9PU0dpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0OThiOQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvajNtZ3Ivc3JjL2ozL3ZtL09TR2kuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGozLnZtOworCitwdWJsaWMgY2xhc3MgT1NHaQoreworCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgYnVuZGxlUmVzb2x2ZWQoCisJCVN0cmluZyBidW5kbGVOYW1lLCBsb25nIGJ1bmRsZUlELCBDbGFzc0xvYWRlciBsb2FkZXJPYmplY3QpOworCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgYnVuZGxlVW5yZXNvbHZlZCgKKwkJU3RyaW5nIGJ1bmRsZU5hbWUsIGxvbmcgYnVuZGxlSUQpOworCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZHVtcENsYXNzTG9hZGVyQnVuZGxlcygpOworfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS9qM21nci9zcmMvajMvdm0vVGllci5qYXZhIGIvdm1raXQvb3NnaS9qM21nci9zcmMvajMvdm0vVGllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTgyMDMKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL2ozbWdyL3NyYy9qMy92bS9UaWVyLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGozLnZtOworCitwdWJsaWMgY2xhc3MgVGllcgoreworCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0VGllckNoYXJnZWRGb3JPYmplY3QoT2JqZWN0IG9iaik7CisJcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBkdW1wVGllclN0YXRzKCk7Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL2ozbWdyL3NyYy9qM21nci9BY3RpdmF0b3IuamF2YSBiL3Zta2l0L29zZ2kvajNtZ3Ivc3JjL2ozbWdyL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTVkOWMKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL2ozbWdyL3NyYy9qM21nci9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDI4IEBACisNCitwYWNrYWdlIGozbWdyOw0KKw0KK2ltcG9ydCBqMy5KM01ncjsNCisNCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsNCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQorDQorcHVibGljIGNsYXNzIEFjdGl2YXRvcg0KKwlpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvcg0KK3sNCisJSjNNZ3JJbXBsIGozbWdyOw0KKwkNCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uDQorCXsNCisJCWozbWdyID0gbmV3IEozTWdySW1wbCgpOw0KKwkJdHJ5IHsNCisJCQlqM21nci5vcGVuKGNvbnRleHQpOw0KKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt0aHJvdyBuZXcgRXhjZXB0aW9uKGUpO30NCisJCQ0KKwkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSjNNZ3IuY2xhc3MsIGozbWdyLCBudWxsKTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24NCisJew0KKwkJajNtZ3IuY2xvc2UoKTsNCisJfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL2ozbWdyL3NyYy9qM21nci9KM01nckltcGwuamF2YSBiL3Zta2l0L29zZ2kvajNtZ3Ivc3JjL2ozbWdyL0ozTWdySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWUyNGIKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL2ozbWdyL3NyYy9qM21nci9KM01nckltcGwuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIGozbWdyOworCitpbXBvcnQgajMuSjNNZ3I7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCitwdWJsaWMgY2xhc3MgSjNNZ3JJbXBsCisJaW1wbGVtZW50cyBKM01ncgoreworCWNsYXNzIGR1bXBUaWVyU3RhdHNSdW5uZXIgaW1wbGVtZW50cyBSdW5uYWJsZQorCXsKKwkJZmluYWwgbG9uZyBkZWxheWVkTWlsbGlzZWM7CisJCQorCQlwdWJsaWMgZHVtcFRpZXJTdGF0c1J1bm5lcihsb25nIGRlbGF5ZWRNaWxsaXNlYykKKwkJeworCQkJdGhpcy5kZWxheWVkTWlsbGlzZWMgPSBkZWxheWVkTWlsbGlzZWM7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKGRlbGF5ZWRNaWxsaXNlYyk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCQorCQkJajMudm0uVGllci5kdW1wVGllclN0YXRzKCk7CisJCX0KKwl9CisKKwlCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisJCisJcHVibGljIHZvaWQgb3BlbihCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBUaHJvd2FibGUKKwl7CisJCWNvbnRleHQgPSBidW5kbGVDb250ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIGNsb3NlKCkKKwl7CisJCWNvbnRleHQgPSBudWxsOworCX0KKwkJCisJLy8gVEhFIEZPTExPV0lORyBNRVRIT0RTIEFSRSBERUJVR0dJTkcgSEVMUEVSUworCS8vIFRIRVkgU0hPVUxEIEJFIFJFTU9WRUQgSU4gUFJPRFVDVElPTgorCisJbG9uZyBnZXRCdW5kbGVJRChTdHJpbmcgc3ltYm9saWNOYW1lT3JJRCkKKwl7CisJCXRyeSB7CisJCQlsb25nIGJ1bmRsZUlEID0gTG9uZy5wYXJzZUxvbmcoc3ltYm9saWNOYW1lT3JJRCk7CisJCQkKKwkJCWlmIChjb250ZXh0LmdldEJ1bmRsZShidW5kbGVJRCkgPT0gbnVsbCkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJIldBUk5JTkc6IGJ1bmRsZUlEPSIgKyBidW5kbGVJRCArCisJCQkJCSIgaXMgaW52YWxpZCwgcHJvYmFibHkgYWxyZWFkeSB1bmluc3RhbGxlZC4iKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIChidW5kbGVJRCA8IDApID8gLTEgOiBidW5kbGVJRDsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRoaXMgaXMgbm90IGEgYnVuZGxlIElELCBpdCBtdXN0IGJlIGEgc3ltYm9saWMgbmFtZQorCQl9CisJCQorCQlCdW5kbGVbXSBidW5kbGVzID0gY29udGV4dC5nZXRCdW5kbGVzKCk7CisJCWZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyArK2kpIHsKKwkJCWlmIChzeW1ib2xpY05hbWVPcklELmVxdWFscyhidW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpKSkKKwkJCQlyZXR1cm4gYnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkdW1wQ2xhc3NMb2FkZXJCdW5kbGVzKCkgdGhyb3dzIFRocm93YWJsZQorCXsKKwkJajMudm0uT1NHaS5kdW1wQ2xhc3NMb2FkZXJCdW5kbGVzKCk7CisJfQorCQkJCisJcHVibGljIHZvaWQgZHVtcFRpZXJTdGF0cyhTdHJpbmcgZGVsYXllZFNlYykgdGhyb3dzIFRocm93YWJsZQorCXsKKwkJbG9uZyBkZWxheSA9IExvbmcucGFyc2VMb25nKGRlbGF5ZWRTZWMpOworCQlSdW5uYWJsZSBydW5uZXIgPSBuZXcgZHVtcFRpZXJTdGF0c1J1bm5lcihkZWxheSAqIDEwMDApOworCQkKKwkJaWYgKGRlbGF5IDw9IDApIHsKKwkJCXJ1bm5lci5ydW4oKTsKKwkJfSBlbHNlIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZHVtcFRpZXJTdGF0cyBydW5zIGluIGRlbGF5ZWQgbW9kZS4uLiIpOworCQkJbmV3IFRocmVhZChydW5uZXIsICJkdW1wVGllclN0YXRzIikuc3RhcnQoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kva25vcGZsZXJmaXNoLnBhdGNoIGIvdm1raXQvb3NnaS9rbm9wZmxlcmZpc2gucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzOWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kva25vcGZsZXJmaXNoLnBhdGNoCkBAIC0wLDAgKzEsNDYgQEAKK2RpZmYgLVUgNCAtSCAtZCAtcCAtciAtTiAtLSBhL29zZ2kvZnJhbWV3b3JrL3NyYy9qMy92bS9PU0dpLmphdmEgYi9vc2dpL2ZyYW1ld29yay9zcmMvajMvdm0vT1NHaS5qYXZhCistLS0gYS9vc2dpL2ZyYW1ld29yay9zcmMvajMvdm0vT1NHaS5qYXZhCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKysgYi9vc2dpL2ZyYW1ld29yay9zcmMvajMvdm0vT1NHaS5qYXZhCTIwMTMtMTItMDkgMTc6MjY6NDYuNzM4NTQyMTA4ICswMTAwCitAQCAtMCwwICsxLDkgQEAKKytwYWNrYWdlIGozLnZtOworKworK3B1YmxpYyBjbGFzcyBPU0dpCisreworKwlwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGJ1bmRsZVJlc29sdmVkKAorKwkJU3RyaW5nIGJ1bmRsZU5hbWUsIGxvbmcgYnVuZGxlSUQsIENsYXNzTG9hZGVyIGxvYWRlck9iamVjdCk7CisrCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgYnVuZGxlVW5yZXNvbHZlZCgKKysJCVN0cmluZyBidW5kbGVOYW1lLCBsb25nIGJ1bmRsZUlEKTsKKyt9CitkaWZmIC1VIDQgLUggLWQgLXAgLXIgLU4gLS0gYS9vc2dpL2ZyYW1ld29yay9zcmMvb3JnL2tub3BmbGVyZmlzaC9mcmFtZXdvcmsvQnVuZGxlR2VuZXJhdGlvbi5qYXZhIGIvb3NnaS9mcmFtZXdvcmsvc3JjL29yZy9rbm9wZmxlcmZpc2gvZnJhbWV3b3JrL0J1bmRsZUdlbmVyYXRpb24uamF2YQorLS0tIGEvb3NnaS9mcmFtZXdvcmsvc3JjL29yZy9rbm9wZmxlcmZpc2gvZnJhbWV3b3JrL0J1bmRsZUdlbmVyYXRpb24uamF2YQkyMDEzLTEyLTA2IDExOjQ3OjE1Ljc0NTc4MzMwMyArMDEwMAorKysrIGIvb3NnaS9mcmFtZXdvcmsvc3JjL29yZy9rbm9wZmxlcmZpc2gvZnJhbWV3b3JrL0J1bmRsZUdlbmVyYXRpb24uamF2YQkyMDEzLTEyLTA5IDE3OjU1OjM5LjcwNTE5ODQyMiArMDEwMAorQEAgLTIxMiw4ICsyMTIsOSBAQCBwdWJsaWMgY2xhc3MgQnVuZGxlR2VuZXJhdGlvbiBpbXBsZW1lbnRzCisgICAgIHRpbWVTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICBicGtncyA9IG5ldyBCdW5kbGVQYWNrYWdlcyh0aGlzLCBleHBvcnRTdHIpOworICAgICBidW5kbGVSZXZpc2lvbiA9IG5ldyBCdW5kbGVSZXZpc2lvbkltcGwodGhpcyk7CisgICAgIGNsYXNzTG9hZGVyID0gYi5nZXRDbGFzc0xvYWRlcigpOworKwlqMy52bS5PU0dpLmJ1bmRsZVJlc29sdmVkKHN5bWJvbGljTmFtZSwgYnVuZGxlLmdldEJ1bmRsZUlkKCksIGNsYXNzTG9hZGVyKTsKKyAgICAgcHJvY2Vzc0NhcGFiaWxpdGllcyhjYXBhYmlsaXR5U3RyKTsKKyAgICAgaWRlbnRpdHkgPSBuZXcgQnVuZGxlQ2FwYWJpbGl0eUltcGwodGhpcyk7CisgICB9CisgCitAQCAtNTQ2LDggKzU0Nyw5IEBAIHB1YmxpYyBjbGFzcyBCdW5kbGVHZW5lcmF0aW9uIGltcGxlbWVudHMKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGNsYXNzTG9hZGVyID0gYnVuZGxlLnNlY3VyZS5uZXdCdW5kbGVDbGFzc0xvYWRlcih0aGlzKTsKKysJCWozLnZtLk9TR2kuYnVuZGxlUmVzb2x2ZWQoc3ltYm9saWNOYW1lLCBidW5kbGUuZ2V0QnVuZGxlSWQoKSwgY2xhc3NMb2FkZXIpOworIAorICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgfQorICAgICAgIGlmIChpc0ZyYWdtZW50SG9zdCgpKSB7CitAQCAtOTIwLDggKzkyMiw5IEBAIHB1YmxpYyBjbGFzcyBCdW5kbGVHZW5lcmF0aW9uIGltcGxlbWVudHMKKyAgICAgZmluYWwgQnVuZGxlQ2xhc3NMb2FkZXIgdG1wID0gKEJ1bmRsZUNsYXNzTG9hZGVyKWNsYXNzTG9hZGVyOworICAgICBpZiAodG1wICE9IG51bGwpIHsKKyAgICAgICBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgdG1wLmNsb3NlKCk7CisrCSAgajMudm0uT1NHaS5idW5kbGVVbnJlc29sdmVkKHN5bWJvbGljTmFtZSwgYnVuZGxlLmdldEJ1bmRsZUlkKCkpOworICAgICB9CisgICB9CisgCisgCmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL1RpZXJDb25maWdQYXJzZXIvc3JjL2ozbWdyL01haW4uamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvVGllckNvbmZpZ1BhcnNlci9zcmMvajNtZ3IvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTA4NTYKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL1RpZXJDb25maWdQYXJzZXIvc3JjL2ozbWdyL01haW4uamF2YQpAQCAtMCwwICsxLDEzIEBACisKK3BhY2thZ2UgajNtZ3I7CisKK3B1YmxpYyBjbGFzcyBNYWluIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUKKwl7CisJCVRpZXJDb25maWdQYXJzZXIgcGFyc2VyID0gbmV3IFRpZXJDb25maWdQYXJzZXIoKTsKKwkJCisJCXBhcnNlci5wYXJzZSgKKwkJCSIvaG9tZS9rb3V0aGVpci9QaEQvVk1LaXQvdm1raXQtbW9uaXRvci90ZXN0cy90aWVyLmRlc2NyaXB0aW9uIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy9UaWVyQ29uZmlnUGFyc2VyL3NyYy9qM21nci9UaWVyQ29uZmlnUGFyc2VyLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL1RpZXJDb25maWdQYXJzZXIvc3JjL2ozbWdyL1RpZXJDb25maWdQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTU3NDM4Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9UaWVyQ29uZmlnUGFyc2VyL3NyYy9qM21nci9UaWVyQ29uZmlnUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKK3BhY2thZ2UgajNtZ3I7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworCitwdWJsaWMgY2xhc3MgVGllckNvbmZpZ1BhcnNlcgoreworCVN0cmluZyB0b2tlbl9pZGVudGlmaWVyOworCWludCB0b2tlbl9pbnRlZ2VyOworCWludCBsYXN0Q2hhcjsKKwlJbnB1dFN0cmVhbSBzb3VyY2U7CisJCisJcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgVGhyb3dhYmxlCisJeworCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOworCQlwYXJzZShpcyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKwl7CisJCXNvdXJjZSA9IGlzOworCQlsYXN0Q2hhciA9IHNvdXJjZS5yZWFkKCk7CisJCXRva2VuX2lkZW50aWZpZXIgPSAiIjsKKwkJCisJCWZvciAoOzspIHsKKwkJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJCWlmIChsYXN0Q2hhciA9PSAtMSkgYnJlYWs7CisJCQkKKwkJCWlmICghcGFyc2VJZGVudGlmaWVyKCkpIHsKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigKKwkJCQkJIid0aWVyJyBvciAnYWNjb3VudCcgZXhwZWN0ZWQuIik7CisJCQl9CisJCQkKKwkJCWlmIChwYXJzZVRpZXIoKSkge30KKwkJCWVsc2UgaWYgKHBhcnNlQWNjb3VudCgpKSB7fQorCQkJZWxzZSB7CisJCQkJaWYgKGxhc3RDaGFyID09IC0xKQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigKKwkJCQkJIid0aWVyJyBvciAnYWNjb3VudCcgZXhwZWN0ZWQuIik7CisJCQl9CisJCX0KKwl9CisJCisJdm9pZCBza2lwV2hpdGVTcGFjZUFuZENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlmb3IgKDs7KSB7CisJCQkvLyBTa2lwIHdoaXRlIHNwYWNlCisJCQlmb3IgKDsgKGxhc3RDaGFyICE9IC0xKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGFyKTsKKwkJCQlsYXN0Q2hhciA9IHNvdXJjZS5yZWFkKCkpOworCQkJCisJCQlpZiAobGFzdENoYXIgIT0gJyMnKSBicmVhazsKKwkJCQorCQkJLy8gU2tpcCBhIGNvbW1lbnQgbGluZQorCQkJbGFzdENoYXIgPSBzb3VyY2UucmVhZCgpOworCQkJd2hpbGUgKGxhc3RDaGFyICE9ICdcbicpCisJCQkJbGFzdENoYXIgPSBzb3VyY2UucmVhZCgpOworCQkJbGFzdENoYXIgPSBzb3VyY2UucmVhZCgpOworCQl9CisJfQorCQorCWJvb2xlYW4gcGFyc2VJZGVudGlmaWVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlza2lwV2hpdGVTcGFjZUFuZENvbW1lbnRzKCk7CisJCQorCQlpZiAoIUNoYXJhY3Rlci5pc0xldHRlcihsYXN0Q2hhcikgJiYgbGFzdENoYXIgIT0gJ18nKSByZXR1cm4gZmFsc2U7CisJCQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kQ29kZVBvaW50KGxhc3RDaGFyKTsKKwkJbGFzdENoYXIgPSBzb3VyY2UucmVhZCgpOworCQkKKwkJd2hpbGUgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQobGFzdENoYXIpIHx8IGxhc3RDaGFyID09ICdfJykgeworCQkJc2IuYXBwZW5kQ29kZVBvaW50KGxhc3RDaGFyKTsKKwkJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKwkJfQorCQkKKwkJdG9rZW5faWRlbnRpZmllciA9IHNiLnRvU3RyaW5nKCk7CisJCXJldHVybiB0cnVlOworCX0KKworCWJvb2xlYW4gcGFyc2VJbnRlZ2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlza2lwV2hpdGVTcGFjZUFuZENvbW1lbnRzKCk7CisJCQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCisJCWlmIChsYXN0Q2hhciA9PSAnKycgfHwgbGFzdENoYXIgPT0gJy0nKSB7CisJCQlzYi5hcHBlbmRDb2RlUG9pbnQobGFzdENoYXIpOworCQkJbGFzdENoYXIgPSBzb3VyY2UucmVhZCgpOworCQkJCisJCQlpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGxhc3RDaGFyKSkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiRGlnaXQgZXhwZWN0ZWQuIik7CisJCX0gZWxzZSBpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGxhc3RDaGFyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWRvIHsKKwkJCXNiLmFwcGVuZENvZGVQb2ludChsYXN0Q2hhcik7CisJCQlsYXN0Q2hhciA9IHNvdXJjZS5yZWFkKCk7CisJCX0gd2hpbGUgKENoYXJhY3Rlci5pc0RpZ2l0KGxhc3RDaGFyKSk7CisKKwkJdG9rZW5faWRlbnRpZmllciA9IHNiLnRvU3RyaW5nKCk7CisJCXRva2VuX2ludGVnZXIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuX2lkZW50aWZpZXIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJYm9vbGVhbiBwYXJzZVRpZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWlmICh0b2tlbl9pZGVudGlmaWVyLmNvbXBhcmVUbygidGllciIpICE9IDApIHJldHVybiBmYWxzZTsKKwkJCisJCWlmICghcGFyc2VJbnRlZ2VyKCkpCisJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiSW50ZWdlciBleHBlY3RlZC4iKTsKKwkJCisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICd7JykKKwkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCIneycgZXhwZWN0ZWQuIik7CisJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKwkJCisJCUFycmF5TGlzdDxTdHJpbmc+IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICd9JykgeworCQkJZm9yICg7OykgeworCQkJCWlmICghcGFyc2VJZGVudGlmaWVyKCkpCisJCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJidW5kbGUgbmFtZSBleHBlY3RlZC4iKTsKKwkJCQkKKwkJCQlidW5kbGVzLmFkZCh0b2tlbl9pZGVudGlmaWVyKTsKKwkJCQkKKwkJCQlza2lwV2hpdGVTcGFjZUFuZENvbW1lbnRzKCk7CisJCQkJaWYgKGxhc3RDaGFyID09ICd9JykgYnJlYWs7CisJCQkJCisJCQkJaWYgKGxhc3RDaGFyICE9ICcsJykKKwkJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIicsJyBleHBlY3RlZC4iKTsKKwkJCQlsYXN0Q2hhciA9IHNvdXJjZS5yZWFkKCk7CisJCQl9CisJCX0KKwkJCisJCWlmIChsYXN0Q2hhciAhPSAnfScpCisJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiJ30nIGV4cGVjdGVkLiIpOworCQlsYXN0Q2hhciA9IHNvdXJjZS5yZWFkKCk7CisJCQorCQlyZXR1cm4gY3JlYXRlVGllcih0b2tlbl9pbnRlZ2VyLCBidW5kbGVzKTsKKwl9CisKKwlib29sZWFuIHBhcnNlQWNjb3VudCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaWYgKHRva2VuX2lkZW50aWZpZXIuY29tcGFyZVRvKCJhY2NvdW50IikgIT0gMCkgcmV0dXJuIGZhbHNlOworCisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICd7JykKKwkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCIneycgZXhwZWN0ZWQuIik7CisJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKwkJCisJCWxvbmcgY2FsbGVyVGllcklEID0gLTE7CisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICcqJykgeworCQkJaWYgKCFwYXJzZUludGVnZXIoKSkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiSW50ZWdlciBvciAnKicgZXhwZWN0ZWQuIik7CisJCQljYWxsZXJUaWVySUQgPSB0b2tlbl9pbnRlZ2VyOworCQl9IGVsc2UKKwkJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKwkJCisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICcsJykKKwkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCInLCcgZXhwZWN0ZWQuIik7CisJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKwkJCisJCWxvbmcgY2FsbGVlVGllcklEID0gLTE7CisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICcqJykgeworCQkJaWYgKCFwYXJzZUludGVnZXIoKSkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiSW50ZWdlciBvciAnKicgZXhwZWN0ZWQuIik7CisJCQljYWxsZWVUaWVySUQgPSB0b2tlbl9pbnRlZ2VyOworCQl9IGVsc2UKKwkJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKwkJCisJCXNraXBXaGl0ZVNwYWNlQW5kQ29tbWVudHMoKTsKKwkJaWYgKGxhc3RDaGFyICE9ICcsJykKKwkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCInLCcgZXhwZWN0ZWQuIik7CisJCWxhc3RDaGFyID0gc291cmNlLnJlYWQoKTsKKworCQlpZiAoIXBhcnNlSWRlbnRpZmllcigpKQorCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIidjYWxsZXInIG9yICdjYWxsZWUnIGV4cGVjdGVkLiIpOworCQkKKwkJYm9vbGVhbiBjaGFyZ2VDYWxsZXIgPSAodG9rZW5faWRlbnRpZmllci5jb21wYXJlVG8oImNhbGxlciIpID09IDApOworCQlpZiAoIWNoYXJnZUNhbGxlciAmJiAodG9rZW5faWRlbnRpZmllci5jb21wYXJlVG8oImNhbGxlZSIpICE9IDApKQorCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIidjYWxsZXInIG9yICdjYWxsZWUnIGV4cGVjdGVkLiIpOworCQkKKwkJc2tpcFdoaXRlU3BhY2VBbmRDb21tZW50cygpOworCQlpZiAobGFzdENoYXIgIT0gJ30nKQorCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIid9JyBleHBlY3RlZC4iKTsKKwkJbGFzdENoYXIgPSBzb3VyY2UucmVhZCgpOworCQkKKwkJcmV0dXJuIGNyZWF0ZUFjY291bnQoY2FsbGVyVGllcklELCBjYWxsZWVUaWVySUQsIGNoYXJnZUNhbGxlcik7CisJfQorCQorCWJvb2xlYW4gY3JlYXRlVGllcihsb25nIHRpZXJJRCwgTGlzdDxTdHJpbmc+IGJ1bmRsZUxpc3QpCisJeworCQlTeXN0ZW0ub3V0LnByaW50KHRpZXJJRCArICI9Iik7CisJCWlmIChidW5kbGVMaXN0ICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIGJ1bmRsZUlEIDogYnVuZGxlTGlzdCkKKwkJCQlTeXN0ZW0ub3V0LnByaW50KGJ1bmRsZUlEICsgIiAiKTsKKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCWJvb2xlYW4gY3JlYXRlQWNjb3VudCgKKwkJbG9uZyBjYWxsZXJUaWVySUQsIGxvbmcgY2FsbGVlVGllcklELCBib29sZWFuIGNoYXJnZUNhbGxlcikKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCWNhbGxlclRpZXJJRCArICI9PiIgKyBjYWxsZWVUaWVySUQgKyAiOiIgKworCQkJKGNoYXJnZUNhbGxlciA/ICJjYWxsZXIiIDogImNhbGxlZSIpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkEvYnVuZGxlLm1hbmlmZXN0IGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkEvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDRjYTgKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQS9idW5kbGUubWFuaWZlc3QKQEAgLTAsMCArMSw3IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtVmVyc2lvbjogMS4wLjANCitCdW5kbGUtTmFtZTogQQ0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitCdW5kbGUtU3ltYm9saWNOYW1lOiBpanZtLnRlc3RzLkENCitFeHBvcnQtUGFja2FnZTogaWp2bS50ZXN0cy5BDQorDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkEvc3JjL2lqdm0vdGVzdHMvQS9BLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQS9zcmMvaWp2bS90ZXN0cy9BL0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RjYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkEvc3JjL2lqdm0vdGVzdHMvQS9BLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGlqdm0udGVzdHMuQTsKKworcHVibGljIGludGVyZmFjZSBBCit7CisJcHVibGljIHZvaWQgcGVyZm9ybUEoKTsKKwlwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oKTsKK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BL3NyYy9panZtL3Rlc3RzL0EvVG9rZW4uamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BL3NyYy9panZtL3Rlc3RzL0EvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZlYzJmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkEvc3JjL2lqdm0vdGVzdHMvQS9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsNiBAQAorcGFja2FnZSBpanZtLnRlc3RzLkE7CisKK3B1YmxpYyBpbnRlcmZhY2UgVG9rZW4KK3sKKwlwdWJsaWMgaW50IGdldFZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQUltcGwvYnVuZGxlLm1hbmlmZXN0IGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkFJbXBsL2J1bmRsZS5tYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY0ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkFJbXBsL2J1bmRsZS5tYW5pZmVzdApAQCAtMCwwICsxLDkgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMA0KK0J1bmRsZS1OYW1lOiBBSW1wbA0KK0J1bmRsZS1BY3RpdmF0b3I6IGlqdm0udGVzdHMuQUltcGwuQWN0aXZhdG9yDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0ltcG9ydC1QYWNrYWdlOiBpanZtLnRlc3RzLkEsIGlqdm0udGVzdHMuQywgb3JnLm9zZ2kudXRpbC50cmFja2VyLCBvcmcNCisgLm9zZ2kuZnJhbWV3b3JrDQorQnVuZGxlLVN5bWJvbGljTmFtZTogaWp2bS50ZXN0cy5BSW1wbA0KKw0KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BSW1wbC9zcmMvaWp2bS90ZXN0cy9BSW1wbC9BSW1wbC5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkFJbXBsL3NyYy9panZtL3Rlc3RzL0FJbXBsL0FJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1YTAxMQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BSW1wbC9zcmMvaWp2bS90ZXN0cy9BSW1wbC9BSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgaWp2bS50ZXN0cy5BSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBpanZtLnRlc3RzLkEuQTsKK2ltcG9ydCBpanZtLnRlc3RzLkEuVG9rZW47CitpbXBvcnQgaWp2bS50ZXN0cy5DLkM7CisKK3B1YmxpYyBjbGFzcyBBSW1wbAorCWltcGxlbWVudHMgQQoreworCXB1YmxpYyBBcnJheUxpc3Q8Qz4gYzsKKworCXB1YmxpYyBBSW1wbCgpCisJeworCQljID0gbmV3IEFycmF5TGlzdDxDPigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBwZXJmb3JtQSgpCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFJbXBsLnBlcmZvcm1BIik7CisJfQorCisJcHVibGljIFRva2VuIGdldFRva2VuKCkKKwl7CisJCXJldHVybiBuZXcgVG9rZW5JbXBsKChpbnQpKE1hdGgucmFuZG9tKCkgKiAxMDAuMCkpOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BSW1wbC9zcmMvaWp2bS90ZXN0cy9BSW1wbC9BY3RpdmF0b3IuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BSW1wbC9zcmMvaWp2bS90ZXN0cy9BSW1wbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNmY2YxCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkFJbXBsL3NyYy9panZtL3Rlc3RzL0FJbXBsL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2UgaWp2bS50ZXN0cy5BSW1wbDsKKworaW1wb3J0IGlqdm0udGVzdHMuQS5BOworaW1wb3J0IGlqdm0udGVzdHMuQy5DOworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZUV2ZW50OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOworCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IsIFNlcnZpY2VMaXN0ZW5lcgoreworCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgU2VydmljZVRyYWNrZXIgY1NUOworCXByaXZhdGUgQUltcGwgYTsKKwlwcml2YXRlIEMgYzsKKworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJBSW1wbCBwcm92aWRlcyBBIik7CisJCWNvbnRleHQgPSBidW5kbGVDb250ZXh0OworCisJCWEgPSBuZXcgQUltcGwoKTsKKworCQljU1QgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgQy5jbGFzcy5nZXROYW1lKCksIG51bGwpOworCQljU1Qub3BlbigpOworCQkJCQorCQlDIHNlcnZpY2UgPSAoQyljU1QuZ2V0U2VydmljZSgpOworCQlpZiAoc2VydmljZSAhPSBudWxsKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFJbXBsIGdvdCBDIEAgc3RhcnR1cCIpOworCQkJCisJCQlhLmMuYWRkKHNlcnZpY2UpOworCQkJdGhpcy5yZWdpc3Rlck15c2VsZigpOworCQl9CisJCQorCQlJbmZpbml0ZVJlc3VycmVjdGVyLmNsYXNzLmdldE5hbWUoKTsKKwkJCisJCWNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHRoaXMsICIob2JqZWN0Y2xhc3M9IiArIEMuY2xhc3MuZ2V0TmFtZSgpICsgIikiKTsKKwkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UoQS5jbGFzcy5nZXROYW1lKCksIGEsIG51bGwpOwkKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJBSW1wbCBubyBtb3JlIHByb3ZpZGVzIEEiKTsKKwkJCisJCWNvbnRleHQucmVtb3ZlU2VydmljZUxpc3RlbmVyKHRoaXMpOworCQljb250ZXh0ID0gbnVsbDsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFJbXBsIGxvc3QgQyBidXQga2VlcHMgYSBzdGFsZSByZWZlcmVuY2UgdG8gaXQiKTsKKwkJY1NULmNsb3NlKCk7CisJCWNTVCA9IG51bGw7CisJCQorCQkvL2EgPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNlcnZpY2VDaGFuZ2VkKFNlcnZpY2VFdmVudCBldmVudCkKKwl7CisJCU9iamVjdCBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKSk7CisJCQorCQlzd2l0Y2goZXZlbnQuZ2V0VHlwZSgpKSB7CisJCWNhc2UgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQ6CisJCQlpZiAoQy5jbGFzcy5pc0luc3RhbmNlKHNlcnZpY2UpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBSW1wbCBnb3QgQyIpOworCQkJCWEuYy5hZGQoKEMpc2VydmljZSk7CisJCQkJCisJCQkJdGhpcy5yZWdpc3Rlck15c2VsZigpOworCQkJfQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORzoKKwkJCWlmIChDLmNsYXNzLmlzSW5zdGFuY2Uoc2VydmljZSkpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFJbXBsIGxvc3QgQyBidXQga2VlcHMgYSBzdGFsZSByZWZlcmVuY2UgdG8gaXQiKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCByZWdpc3Rlck15c2VsZigpCisJeworCQlDIG9uZUMgPSBhLmMuZ2V0KGEuYy5zaXplKCkgLSAxKTsKKwkJYyA9IG9uZUM7CisJCQorCQlvbmVDLnJlZ2lzdGVyT2JqZWN0KHRoaXMpOworCX0KKy8qCQorCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKKwl7CisJCXRyeSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmFsaXplKCkiKTsKKwkJCW5ldyBJbmZpbml0ZVJlc3VycmVjdGVyKGMsIHRoaXMpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKyovCit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQUltcGwvc3JjL2lqdm0vdGVzdHMvQUltcGwvSW5maW5pdGVSZXN1cnJlY3Rlci5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkFJbXBsL3NyYy9panZtL3Rlc3RzL0FJbXBsL0luZmluaXRlUmVzdXJyZWN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGUyYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkFJbXBsL3NyYy9panZtL3Rlc3RzL0FJbXBsL0luZmluaXRlUmVzdXJyZWN0ZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGlqdm0udGVzdHMuQUltcGw7CisKK2ltcG9ydCBpanZtLnRlc3RzLkMuQzsKKworcHVibGljIGNsYXNzIEluZmluaXRlUmVzdXJyZWN0ZXIKK3sKKwlDIGM7CisJT2JqZWN0IHRhcmdldDsKKwkKKwlwdWJsaWMgSW5maW5pdGVSZXN1cnJlY3RlcihDIGMsIE9iamVjdCBvKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogcmVzdXJyZWN0aW5nICIgKyBvKTsKKwkJCisJCXRoaXMuYyA9IGM7CisJCXRoaXMudGFyZ2V0ID0gbzsKKwkJCisJCWMucmVnaXN0ZXJPYmplY3QodGhpcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKKwl7CisJCW5ldyBJbmZpbml0ZVJlc3VycmVjdGVyKHRoaXMuYywgdGFyZ2V0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQUltcGwvc3JjL2lqdm0vdGVzdHMvQUltcGwvVG9rZW5JbXBsLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQUltcGwvc3JjL2lqdm0vdGVzdHMvQUltcGwvVG9rZW5JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2YTgwOQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5BSW1wbC9zcmMvaWp2bS90ZXN0cy9BSW1wbC9Ub2tlbkltcGwuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGlqdm0udGVzdHMuQUltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgaWp2bS50ZXN0cy5BLlRva2VuOworCitwdWJsaWMgY2xhc3MgVG9rZW5JbXBsCisJaW1wbGVtZW50cyBUb2tlbgoreworCXN0YXRpYyBmaW5hbCBpbnQgQ2h1bmtTaXplID0gMiAqIDEwMjQ7CisJc3RhdGljIGZpbmFsIGludCBDaHVua0NvdW50ID0gNjQ7CisJCisJQXJyYXlMaXN0PGJ5dGVbXT4gQmlnRGF0YTsKKwkKKwlwdWJsaWMgVG9rZW5JbXBsKGludCB2YWx1ZSkKKwl7CisJCUJpZ0RhdGEgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKwkJCisJCWZvciAoaW50IGk9MDsgaTxDaHVua0NvdW50OyArK2kpIHsKKwkJCWJ5dGVbXSBjaHVuayA9IG5ldyBieXRlW0NodW5rU2l6ZV07CisJCQorCQkJZm9yIChpbnQgaj0wOyBqPENodW5rU2l6ZTsgKytqKQorCQkJCWNodW5rW2pdID0gKGJ5dGUpKGogJSAyNTYpOworCQkJCQorCQkJQmlnRGF0YS5hZGQoY2h1bmspOworCQl9CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkJYnl0ZVtdIGNodW5rID0gQmlnRGF0YS5nZXQoKGludCkoTWF0aC5yYW5kb20oKSAqIENodW5rQ291bnQpKTsKKwkJcmV0dXJuIGNodW5rWyhpbnQpKE1hdGgucmFuZG9tKCkgKiBDaHVua1NpemUpXTsKKwl9Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQkltcGwvYnVuZGxlLm1hbmlmZXN0IGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkJJbXBsL2J1bmRsZS5tYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M4YWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkJJbXBsL2J1bmRsZS5tYW5pZmVzdApAQCAtMCwwICsxLDEwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtVmVyc2lvbjogMS4wLjANCitCdW5kbGUtTmFtZTogQkltcGwNCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLVN5bWJvbGljTmFtZTogaWp2bS50ZXN0cy5CSW1wbA0KK0V4cG9ydC1QYWNrYWdlOiBpanZtLnRlc3RzLkINCitCdW5kbGUtQWN0aXZhdG9yOiBpanZtLnRlc3RzLkJJbXBsLkFjdGl2YXRvcg0KK0ltcG9ydC1QYWNrYWdlOiBpanZtLnRlc3RzLkEsIG9yZy5vc2dpLmZyYW1ld29yaywgb3JnLm9zZ2kudXRpbC50cmFja2UNCisgcg0KKw0KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5CSW1wbC9zcmMvaWp2bS90ZXN0cy9CL0IuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5CSW1wbC9zcmMvaWp2bS90ZXN0cy9CL0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjZlNGRlCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkJJbXBsL3NyYy9panZtL3Rlc3RzL0IvQi5qYXZhCkBAIC0wLDAgKzEsNiBAQAorcGFja2FnZSBpanZtLnRlc3RzLkI7CisKK3B1YmxpYyBpbnRlcmZhY2UgQgoreworCXB1YmxpYyB2b2lkIHBlcmZvcm1CKCk7Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQkltcGwvc3JjL2lqdm0vdGVzdHMvQkltcGwvQWN0aXZhdG9yLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQkltcGwvc3JjL2lqdm0vdGVzdHMvQkltcGwvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYTUzZQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5CSW1wbC9zcmMvaWp2bS90ZXN0cy9CSW1wbC9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDkwIEBACitwYWNrYWdlIGlqdm0udGVzdHMuQkltcGw7CisKK2ltcG9ydCBpanZtLnRlc3RzLkEuQTsKK2ltcG9ydCBpanZtLnRlc3RzLkEuVG9rZW47CitpbXBvcnQgaWp2bS50ZXN0cy5CLkI7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IKKwlpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciwgU2VydmljZUxpc3RlbmVyCit7CisJcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIGFTVDsKKwlwcml2YXRlIEJJbXBsIGI7CisJCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJJbXBsIGV4cG9ydHMgYW5kIHByb3ZpZGVzIEIiKTsKKwkJY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7CisKKwkJYiA9IG5ldyBCSW1wbCgpOworCQkKKwkJYVNUID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIEEuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKKwkJYVNULm9wZW4oKTsKKwkJCisJCUEgc2VydmljZSA9IChBKWFTVC5nZXRTZXJ2aWNlKCk7CisJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQkltcGwgZ290IEEgQCBzdGFydHVwIik7CisJCQkKKwkJCWIuYS5hZGQoc2VydmljZSk7CisJCQl0aGlzLnVzZUEoKTsKKwkJfQorCQkKKwkJY29udGV4dC5hZGRTZXJ2aWNlTGlzdGVuZXIodGhpcywgIihvYmplY3RjbGFzcz0iICsgQS5jbGFzcy5nZXROYW1lKCkgKyAiKSIpOworCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShCLmNsYXNzLmdldE5hbWUoKSwgYiwgbnVsbCk7CisJfQorCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQkltcGwgbm8gbW9yZSBwcm92aWRlcyBCIik7CisKKwkJY29udGV4dC5yZW1vdmVTZXJ2aWNlTGlzdGVuZXIodGhpcyk7CisJCWNvbnRleHQgPSBudWxsOworCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJCSW1wbCBsb3N0IEEgYnV0IGtlZXBzIGEgc3RhbGUgcmVmZXJlbmNlIHRvIGl0Iik7CisJCWFTVC5jbG9zZSgpOworCQlhU1QgPSBudWxsOworCQkvLyBhID0gbnVsbDsKKwkJCisJCWIgPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNlcnZpY2VDaGFuZ2VkKFNlcnZpY2VFdmVudCBldmVudCkKKwl7CisJCU9iamVjdCBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKSk7CisJCQorCQlzd2l0Y2goZXZlbnQuZ2V0VHlwZSgpKSB7CisJCWNhc2UgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQ6CisJCQlpZiAoQS5jbGFzcy5pc0luc3RhbmNlKHNlcnZpY2UpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJCSW1wbCBnb3QgQSIpOworCQkJCWIuYS5hZGQoKEEpc2VydmljZSk7CisJCQkJCisJCQkJdGhpcy51c2VBKCk7CisJCQl9CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HOgorCQkJaWYgKEEuY2xhc3MuaXNJbnN0YW5jZShzZXJ2aWNlKSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQkltcGwgbG9zdCBBIGJ1dCBrZWVwcyBhIHN0YWxlIHJlZmVyZW5jZSB0byBpdCIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVzZUEoKQorCXsKKwkJQSBvbmVBID0gYi5hLmdldChiLmEuc2l6ZSgpIC0gMSk7CisJCVRva2VuIHRva2VuID0gb25lQS5nZXRUb2tlbigpOworCQl0b2tlbi5nZXRWYWx1ZSgpOworCQkKKwkJYi50b2tlbnMuYWRkKHRva2VuKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbigiQkltcGwgZ290IFRva2VuIGZyb20gQSIpOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5CSW1wbC9zcmMvaWp2bS90ZXN0cy9CSW1wbC9CSW1wbC5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkJJbXBsL3NyYy9panZtL3Rlc3RzL0JJbXBsL0JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZTUwNQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5CSW1wbC9zcmMvaWp2bS90ZXN0cy9CSW1wbC9CSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgaWp2bS50ZXN0cy5CSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBpanZtLnRlc3RzLkEuQTsKK2ltcG9ydCBpanZtLnRlc3RzLkEuVG9rZW47CitpbXBvcnQgaWp2bS50ZXN0cy5CLkI7CisKK3B1YmxpYyBjbGFzcyBCSW1wbAorCWltcGxlbWVudHMgQgoreworCXB1YmxpYyBBcnJheUxpc3Q8QT4gYTsKKwlwdWJsaWMgQXJyYXlMaXN0PFRva2VuPiB0b2tlbnM7CisJCisJcHVibGljIEJJbXBsKCkKKwl7CisJCWEgPSBuZXcgQXJyYXlMaXN0PEE+KCk7CisJCXRva2VucyA9IG5ldyBBcnJheUxpc3Q8VG9rZW4+KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHBlcmZvcm1CKCkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQkltcGwucGVyZm9ybUIiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQy9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQy9idW5kbGUubWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzY2UyNgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5DL2J1bmRsZS5tYW5pZmVzdApAQCAtMCwwICsxLDcgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMA0KK0J1bmRsZS1OYW1lOiBDDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IGlqdm0udGVzdHMuQw0KK0V4cG9ydC1QYWNrYWdlOiBpanZtLnRlc3RzLkMNCisNCmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQy9zcmMvaWp2bS90ZXN0cy9DL0MuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5DL3NyYy9panZtL3Rlc3RzL0MvQy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTY1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQy9zcmMvaWp2bS90ZXN0cy9DL0MuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgaWp2bS50ZXN0cy5DOworCitwdWJsaWMgaW50ZXJmYWNlIEMKK3sKKwlwdWJsaWMgdm9pZCBwZXJmb3JtQygpOworCXB1YmxpYyB2b2lkIHJlZ2lzdGVyT2JqZWN0KE9iamVjdCBvKTsKK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5DSW1wbC9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQ0ltcGwvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2Y0MGUKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQ0ltcGwvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsOSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLU5hbWU6IENJbXBsDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IGlqdm0udGVzdHMuQ0ltcGwNCitCdW5kbGUtQWN0aXZhdG9yOiBpanZtLnRlc3RzLkNJbXBsLkFjdGl2YXRvcg0KK0ltcG9ydC1QYWNrYWdlOiBpanZtLnRlc3RzLkIsIGlqdm0udGVzdHMuQywgb3JnLm9zZ2kuZnJhbWV3b3JrLCBvcmcub3MNCisgZ2kudXRpbC50cmFja2VyDQorDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkNJbXBsL3NyYy9panZtL3Rlc3RzL0NJbXBsL0FjdGl2YXRvci5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkNJbXBsL3NyYy9panZtL3Rlc3RzL0NJbXBsL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmY2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQ0ltcGwvc3JjL2lqdm0vdGVzdHMvQ0ltcGwvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw3NSBAQAorcGFja2FnZSBpanZtLnRlc3RzLkNJbXBsOworCitpbXBvcnQgaWp2bS50ZXN0cy5CLkI7CitpbXBvcnQgaWp2bS50ZXN0cy5DLkM7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IKKwlpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciwgU2VydmljZUxpc3RlbmVyCit7CisJcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIGJTVDsKKwlwcml2YXRlIENJbXBsIGM7CisKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQ0ltcGwgZXhwb3J0cyBhbmQgcHJvdmlkZXMgQyIpOworCQljb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKKworCQljID0gbmV3IENJbXBsKCk7CisKKwkJYlNUID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIEIuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKKwkJYlNULm9wZW4oKTsKKwkJCisJCUIgc2VydmljZSA9IChCKWJTVC5nZXRTZXJ2aWNlKCk7CisJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ0ltcGwgZ290IEIgQCBzdGFydHVwIik7CisJCQkKKwkJCWMuYi5hZGQoc2VydmljZSk7CisJCX0KKwkJCisJCWNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHRoaXMsICIob2JqZWN0Y2xhc3M9IiArIEIuY2xhc3MuZ2V0TmFtZSgpICsgIikiKTsKKwkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UoQy5jbGFzcy5nZXROYW1lKCksIGMsIG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNJbXBsIG5vIG1vcmUgcHJvdmlkZXMgQyIpOworCisJCWNvbnRleHQucmVtb3ZlU2VydmljZUxpc3RlbmVyKHRoaXMpOworCQljb250ZXh0ID0gbnVsbDsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbigiQ0ltcGwgbG9zdCBCIGJ1dCBrZWVwcyBhIHN0YWxlIHJlZmVyZW5jZSB0byBpdCIpOworCQliU1QuY2xvc2UoKTsKKwkJYlNUID0gbnVsbDsKKwkJLy8gYiA9IG51bGw7CisJCQorCQljID0gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpCisJeworCQlPYmplY3Qgc2VydmljZSA9IGNvbnRleHQuZ2V0U2VydmljZShldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpOworCQkKKwkJc3dpdGNoKGV2ZW50LmdldFR5cGUoKSkgeworCQljYXNlIFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEOgorCQkJaWYgKEIuY2xhc3MuaXNJbnN0YW5jZShzZXJ2aWNlKSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ0ltcGwgZ290IEIiKTsKKwkJCQljLmIuYWRkKChCKXNlcnZpY2UpOworCQkJfQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORzoKKwkJCWlmIChCLmNsYXNzLmlzSW5zdGFuY2Uoc2VydmljZSkpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNJbXBsIGxvc3QgQiBidXQga2VlcHMgYSBzdGFsZSByZWZlcmVuY2UgdG8gaXQiKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkNJbXBsL3NyYy9panZtL3Rlc3RzL0NJbXBsL0NJbXBsLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuQ0ltcGwvc3JjL2lqdm0vdGVzdHMvQ0ltcGwvQ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzY1MmNmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkNJbXBsL3NyYy9panZtL3Rlc3RzL0NJbXBsL0NJbXBsLmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBpanZtLnRlc3RzLkNJbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGlqdm0udGVzdHMuQi5COworaW1wb3J0IGlqdm0udGVzdHMuQy5DOworCitwdWJsaWMgY2xhc3MgQ0ltcGwKKwlpbXBsZW1lbnRzIEMKK3sKKwlBcnJheUxpc3Q8T2JqZWN0PiByZWdpc3RlcmVkT2JqZWN0czsKKwlwdWJsaWMgQXJyYXlMaXN0PEI+IGI7CisJCisJQ0ltcGwoKQorCXsKKwkJYiA9IG5ldyBBcnJheUxpc3Q8Qj4oKTsKKwkJcmVnaXN0ZXJlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwl9CisJCisJcHVibGljIHZvaWQgcGVyZm9ybUMoKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDSW1wbC5wZXJmb3JtQyIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlZ2lzdGVyT2JqZWN0KE9iamVjdCBvKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDSW1wbC5yZWdpc3Rlck9iamVjdCIpOworCQkKKwkJT2JqZWN0IG9iaiA9IG5ldyBPYmplY3QoKTsKKwkJc3luY2hyb25pemVkIChvYmopIHsKKwkJCW9iai5ub3RpZnkoKTsJCQkKKwkJfQorCQkKKwkJcmVnaXN0ZXJlZE9iamVjdHMuYWRkKG8pOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5ESW1wbC9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuREltcGwvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzBkMGEKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuREltcGwvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsMTAgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMA0KK0J1bmRsZS1OYW1lOiBESW1wbA0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitCdW5kbGUtU3ltYm9saWNOYW1lOiBpanZtLnRlc3RzLkRJbXBsDQorRXhwb3J0LVBhY2thZ2U6IGlqdm0udGVzdHMuRA0KK0J1bmRsZS1BY3RpdmF0b3I6IGlqdm0udGVzdHMuREltcGwuQWN0aXZhdG9yDQorSW1wb3J0LVBhY2thZ2U6IGlqdm0udGVzdHMuQywgb3JnLm9zZ2kuZnJhbWV3b3JrLCBvcmcub3NnaS51dGlsLnRyYWNrZQ0KKyByDQorDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkRJbXBsL3NyYy9panZtL3Rlc3RzL0QvRC5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkRJbXBsL3NyYy9panZtL3Rlc3RzL0QvRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzlkMjkKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuREltcGwvc3JjL2lqdm0vdGVzdHMvRC9ELmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIGlqdm0udGVzdHMuRDsKKworcHVibGljIGludGVyZmFjZSBECit7CisJcHVibGljIHZvaWQgcGVyZm9ybUQoKTsKK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5ESW1wbC9zcmMvaWp2bS90ZXN0cy9ESW1wbC9BY3RpdmF0b3IuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5ESW1wbC9zcmMvaWp2bS90ZXN0cy9ESW1wbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njk2MTBmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy9panZtLnRlc3RzLkRJbXBsL3NyYy9panZtL3Rlc3RzL0RJbXBsL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2UgaWp2bS50ZXN0cy5ESW1wbDsKKworaW1wb3J0IGlqdm0udGVzdHMuQy5DOworaW1wb3J0IGlqdm0udGVzdHMuRC5EOworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZUV2ZW50OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOworCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IsIFNlcnZpY2VMaXN0ZW5lcgoreworCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OworCisJcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBjU1Q7CisJcHJpdmF0ZSBESW1wbCBkOworCQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJESW1wbCBleHBvcnRzIGFuZCBwcm92aWRlcyBEIik7CisJCWNvbnRleHQgPSBidW5kbGVDb250ZXh0OworCisJCWQgPSBuZXcgREltcGwoKTsKKworCQljU1QgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgQy5jbGFzcy5nZXROYW1lKCksIG51bGwpOworCQljU1Qub3BlbigpOworCQkKKwkJQyBzZXJ2aWNlID0gKEMpY1NULmdldFNlcnZpY2UoKTsKKwkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJESW1wbCBnb3QgQyBAIHN0YXJ0dXAiKTsKKwkJCQorCQkJZC5jLmFkZChzZXJ2aWNlKTsKKwkJfQorCQkKKwkJY29udGV4dC5hZGRTZXJ2aWNlTGlzdGVuZXIodGhpcywgIihvYmplY3RjbGFzcz0iICsgQy5jbGFzcy5nZXROYW1lKCkgKyAiKSIpOworCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShELmNsYXNzLmdldE5hbWUoKSwgZCwgbnVsbCk7CisJfQorCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiREltcGwgbm8gbW9yZSBwcm92aWRlcyBEIik7CisKKwkJY29udGV4dC5yZW1vdmVTZXJ2aWNlTGlzdGVuZXIodGhpcyk7CisJCWNvbnRleHQgPSBudWxsOworCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJESW1wbCBsb3N0IEMgYnV0IGtlZXBzIGEgc3RhbGUgcmVmZXJlbmNlIHRvIGl0Iik7CisJCWNTVC5jbG9zZSgpOworCQljU1QgPSBudWxsOworCQkvLyBjID0gbnVsbDsKKwkJCisJCWQgPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNlcnZpY2VDaGFuZ2VkKFNlcnZpY2VFdmVudCBldmVudCkKKwl7CisJCU9iamVjdCBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKSk7CisJCQorCQlzd2l0Y2goZXZlbnQuZ2V0VHlwZSgpKSB7CisJCWNhc2UgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQ6CisJCQlpZiAoQy5jbGFzcy5pc0luc3RhbmNlKHNlcnZpY2UpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJESW1wbCBnb3QgQyIpOworCQkJCWQuYy5hZGQoKEMpc2VydmljZSk7CisJCQl9CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HOgorCQkJaWYgKEMuY2xhc3MuaXNJbnN0YW5jZShzZXJ2aWNlKSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiREltcGwgbG9zdCBDIGJ1dCBrZWVwcyBhIHN0YWxlIHJlZmVyZW5jZSB0byBpdCIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuREltcGwvc3JjL2lqdm0vdGVzdHMvREltcGwvREltcGwuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvaWp2bS50ZXN0cy5ESW1wbC9zcmMvaWp2bS90ZXN0cy9ESW1wbC9ESW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODg1MDgKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL2lqdm0udGVzdHMuREltcGwvc3JjL2lqdm0vdGVzdHMvREltcGwvREltcGwuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGlqdm0udGVzdHMuREltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgaWp2bS50ZXN0cy5DLkM7CitpbXBvcnQgaWp2bS50ZXN0cy5ELkQ7CisKK3B1YmxpYyBjbGFzcyBESW1wbAorCWltcGxlbWVudHMgRAoreworCXB1YmxpYyBBcnJheUxpc3Q8Qz4gYzsKKwkKKwlwdWJsaWMgREltcGwoKQorCXsKKwkJYyA9IG5ldyBBcnJheUxpc3Q8Qz4oKTsKKwl9CisJCisJcHVibGljIHZvaWQgcGVyZm9ybUQoKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJESW1wbC5wZXJmb3JtQiIpOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQS9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkEvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjFmYjAKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkEvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLU5hbWU6IFRlc3RzIEENCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdHMuQQ0KK0V4cG9ydC1QYWNrYWdlOiB0ZXN0cy5BDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5BL3NyYy90ZXN0cy9BL0EuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQS9zcmMvdGVzdHMvQS9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkZWI4NgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQS9zcmMvdGVzdHMvQS9BLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIHRlc3RzLkE7CisKK3B1YmxpYyBpbnRlcmZhY2UgQQoreworCXB1YmxpYyB2b2lkIGEoKTsKKwlwdWJsaWMgaW50IGIobG9uZyB4LCBsb25nIHkpOworCXB1YmxpYyBsb25nW10gYyhpbnQgbik7Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkFJbXBsL2J1bmRsZS5tYW5pZmVzdCBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQUltcGwvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Y2QwZjgKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkFJbXBsL2J1bmRsZS5tYW5pZmVzdApAQCAtMCwwICsxLDggQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMA0KK0J1bmRsZS1OYW1lOiBUZXN0cyBBIEltcGwNCitCdW5kbGUtQWN0aXZhdG9yOiB0ZXN0cy5BSW1wbC5BY3RpdmF0b3INCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yaywgdGVzdHMuQSwgdGVzdHMuQiwgdGVzdHMuRQ0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3RzLkFJbXBsDQorDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5BSW1wbC9zcmMvdGVzdHMvQUltcGwvQUltcGwuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQUltcGwvc3JjL3Rlc3RzL0FJbXBsL0FJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQUltcGwvc3JjL3Rlc3RzL0FJbXBsL0FJbXBsLmphdmEKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSB0ZXN0cy5BSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCB0ZXN0cy5BLkE7CitpbXBvcnQgdGVzdHMuQi5CRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBBSW1wbAorCWltcGxlbWVudHMgQSwgQkV2ZW50Cit7CisJQXJyYXlMaXN0PEludGVnZXI+IGl0ZW1zOworCQorCXB1YmxpYyBBSW1wbCgpCisJeworCQlpdGVtcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwl9CisJCisJcHVibGljIHZvaWQgYSgpCisJeworCQlhbGxvY09iaigxMDApOworCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKEEuY2xhc3MuZ2V0TmFtZSgpICsgIi5hKCkgY2FsbGVkLiIpOworCQkKKwkJc2xlZXAoMSk7CisJfQorCQorCXZvaWQgYWxsb2NPYmooaW50IGNvdW50KQorCXsKKwkJdHJ5IHtwKGNvdW50KTt9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwl9CisJCisJdm9pZCBwKGludCBjb3VudCkKKwl7CisJCWZvciAoaW50IGk9MDsgaTxjb3VudDsgKytpKQorCQkJaXRlbXMuYWRkKG5ldyBJbnRlZ2VyKChpbnQpTWF0aC5yYW5kb20oKSkpOworCX0KKworCXB1YmxpYyBpbnQgYihsb25nIHgsIGxvbmcgeSkKKwl7CisJCXJldHVybiAwOworCX0KKworCXB1YmxpYyBsb25nW10gYyhpbnQgbikKKwl7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGhhbmRsZXIoKQorCXsKKy8vCQlhbGxvY09iaigxMDAwMCk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKEJFdmVudC5jbGFzcy5nZXROYW1lKCkgKyAiLmhhbmRsZXIoKSBjYWxsZWQuIik7CisKKwkJQXJyYXlMaXN0PERvdWJsZT4gVCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlmb3IgKGludCBpPTA7IGkgPCA0OTk5OTsgKytpKQorCQkJVC5hZGQobmV3IERvdWJsZShNYXRoLnJhbmRvbSgpKSk7CisJCQorCQlzbGVlcCg1KTsKKwl9CisJCisJdm9pZCBzbGVlcChsb25nIHNlYykKKwl7CisJCXRyeSB7CisJCQlUaHJlYWQuc2xlZXAoc2VjICogMTAwMCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7ZS5wcmludFN0YWNrVHJhY2UoKTt9CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5BSW1wbC9zcmMvdGVzdHMvQUltcGwvQWN0aXZhdG9yLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkFJbXBsL3NyYy90ZXN0cy9BSW1wbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdjODMyCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5BSW1wbC9zcmMvdGVzdHMvQUltcGwvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSB0ZXN0cy5BSW1wbDsKKworaW1wb3J0IHRlc3RzLkEuQTsKK2ltcG9ydCB0ZXN0cy5CLkJFdmVudDsKKworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IKKwlpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvcgoreworCUJ1bmRsZUNvbnRleHQgY29udGV4dDsKKwlBSW1wbCBhOworLy8JRUltcGwgZTsKKworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsJCisJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIgcHJvdmlkZXMgIiArIEEuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7CisKKwkJYSA9IG5ldyBBSW1wbCgpOworCQkKKwkJU3RyaW5nW10gY2xhc3NlcyA9IHtBLmNsYXNzLmdldE5hbWUoKSwgQkV2ZW50LmNsYXNzLmdldE5hbWUoKX07CisJCWNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNsYXNzZXMsIGEsIG51bGwpOworCisJCS8vIGUgPSBuZXcgRUltcGwoKTsKKwkJLy8gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoRS5jbGFzcywgZSwgbnVsbCk7CQorCX0KKworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiIG5vIG1vcmUgcHJvdmlkZXMgIiArIEEuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkFJbXBsL3NyYy90ZXN0cy9BSW1wbC9FSW1wbC5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5BSW1wbC9zcmMvdGVzdHMvQUltcGwvRUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRiZDMxCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5BSW1wbC9zcmMvdGVzdHMvQUltcGwvRUltcGwuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3RzLkFJbXBsOworCitpbXBvcnQgdGVzdHMuRS5FOworCitwdWJsaWMgY2xhc3MgRUltcGwKKwlpbXBsZW1lbnRzIEUKK3sKKwlwdWJsaWMgdm9pZCBlKCkKKwl7CisJCXRyeSB7CisJCQlzb21lUHJvY2Vzc2luZygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgeworCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNvbWVQcm9jZXNzaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQlUaHJlYWQuc2xlZXAoMTAwMDApOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQi9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkIvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTQ4YTUKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkIvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLU5hbWU6IFRlc3RzIEINCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdHMuQg0KK0V4cG9ydC1QYWNrYWdlOiB0ZXN0cy5CDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5CL3NyYy90ZXN0cy9CL0JFdmVudC5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5CL3NyYy90ZXN0cy9CL0JFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZWEyOTQKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkIvc3JjL3Rlc3RzL0IvQkV2ZW50LmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIHRlc3RzLkI7CisKK3B1YmxpYyBpbnRlcmZhY2UgQkV2ZW50Cit7CisJcHVibGljIHZvaWQgaGFuZGxlcigpOworfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5CSW1wbC9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkJJbXBsL2J1bmRsZS5tYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQyNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5CSW1wbC9idW5kbGUubWFuaWZlc3QKQEAgLTAsMCArMSw5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtVmVyc2lvbjogMS4wLjANCitCdW5kbGUtTmFtZTogVGVzdHMgQiBJbXBsDQorQnVuZGxlLUFjdGl2YXRvcjogdGVzdHMuQkltcGwuQWN0aXZhdG9yDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0ltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS51dGlsLnRyYWNrZXIsIHRlc3RzLkEsIHRlc3RzLkIsIG9yZy5vc2dpLmZyYW0NCisgZXdvcmsNCitCdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0cy5CSW1wbA0KKw0KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQkltcGwvc3JjL3Rlc3RzL0JJbXBsL0FjdGl2YXRvci5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5CSW1wbC9zcmMvdGVzdHMvQkltcGwvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0OGExYgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQkltcGwvc3JjL3Rlc3RzL0JJbXBsL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIHRlc3RzLkJJbXBsOworCitpbXBvcnQgdGVzdHMuQS5BOworaW1wb3J0IHRlc3RzLkIuQkV2ZW50OworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZUV2ZW50OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOworCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IsIFNlcnZpY2VMaXN0ZW5lcgoreworCUJ1bmRsZUNvbnRleHQgY29udGV4dDsKKwlCSW1wbCBiOworCVNlcnZpY2VUcmFja2VyPEEsIEE+IHNlcnZpY2VUcmFja2VyQTsKKwlTZXJ2aWNlVHJhY2tlcjxCRXZlbnQsIEJFdmVudD4gc2VydmljZVRyYWNrZXJCRXZlbnQ7CisKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KKwl7CQorCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKKwkJCSsgIiBjb25zdW1lcyAiICsgQS5jbGFzcy5nZXROYW1lKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKKwkJCSsgIiBjb25zdW1lcyAiICsgQkV2ZW50LmNsYXNzLmdldE5hbWUoKSk7CisJCWNvbnRleHQgPSBidW5kbGVDb250ZXh0OworCisJCWIgPSBuZXcgQkltcGwoKTsKKwkJYi5zdGFydCgpOworCQkKKwkJc2VydmljZVRyYWNrZXJBID0gbmV3IFNlcnZpY2VUcmFja2VyPEEsIEE+KGNvbnRleHQsIEEuY2xhc3MsIG51bGwpOworCQlzZXJ2aWNlVHJhY2tlckEub3BlbigpOworCQkKKwkJaWYgKHNlcnZpY2VUcmFja2VyQS5nZXRTZXJ2aWNlKCkgIT0gbnVsbCkgeworCQkJdGhpcy5zZXJ2aWNlQ2hhbmdlZChuZXcgU2VydmljZUV2ZW50KAorCQkJCVNlcnZpY2VFdmVudC5SRUdJU1RFUkVELAorCQkJCXNlcnZpY2VUcmFja2VyQS5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpKTsKKwkJfQorCQkKKwkJY29udGV4dC5hZGRTZXJ2aWNlTGlzdGVuZXIoCisJCQl0aGlzLCAiKG9iamVjdGNsYXNzPSIgKyBBLmNsYXNzLmdldE5hbWUoKSArICIpIik7CisJCQorCQlzZXJ2aWNlVHJhY2tlckJFdmVudCA9CisJCQluZXcgU2VydmljZVRyYWNrZXI8QkV2ZW50LCBCRXZlbnQ+KGNvbnRleHQsIEJFdmVudC5jbGFzcywgbnVsbCk7CisJCXNlcnZpY2VUcmFja2VyQkV2ZW50Lm9wZW4oKTsKKwkJCisJCWlmIChzZXJ2aWNlVHJhY2tlckJFdmVudC5nZXRTZXJ2aWNlKCkgIT0gbnVsbCkgeworCQkJdGhpcy5zZXJ2aWNlQ2hhbmdlZChuZXcgU2VydmljZUV2ZW50KAorCQkJCVNlcnZpY2VFdmVudC5SRUdJU1RFUkVELAorCQkJCXNlcnZpY2VUcmFja2VyQkV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKSkpOworCQl9CisJCQorCQljb250ZXh0LmFkZFNlcnZpY2VMaXN0ZW5lcigKKwkJCXRoaXMsICIob2JqZWN0Y2xhc3M9IiArIEJFdmVudC5jbGFzcy5nZXROYW1lKCkgKyAiKSIpOworCX0KKworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKKwkJCSsgIiBubyBtb3JlIGNvbnN1bWVzICIgKyBBLmNsYXNzLmdldE5hbWUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQorCQkJKyAiIG5vIG1vcmUgY29uc3VtZXMgIiArIEJFdmVudC5jbGFzcy5nZXROYW1lKCkpOworCQkKKwkJYi5zdG9wKCk7CisJCQorCQlzZXJ2aWNlVHJhY2tlckEuY2xvc2UoKTsKKwkJc2VydmljZVRyYWNrZXJCRXZlbnQuY2xvc2UoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpCisJeworCQlPYmplY3Qgc2VydmljZSA9IGNvbnRleHQuZ2V0U2VydmljZShldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpOworCQlTdHJpbmdbXSBvYmpDbGFzc0xpc3QgPQorCQkJKFN0cmluZ1tdKWV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKS5nZXRQcm9wZXJ0eSgib2JqZWN0Y2xhc3MiKTsKKwkJCisJCXN3aXRjaChldmVudC5nZXRUeXBlKCkpIHsKKwkJY2FzZSBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRDoKKwkJCWZvciAoU3RyaW5nIGNsIDogb2JqQ2xhc3NMaXN0KSB7CisJCQkJaWYgKGNsLmVxdWFscyhBLmNsYXNzLmdldE5hbWUoKSkpIHsKKwkJCQkJYi5zZXRBKChBKXNlcnZpY2UpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoY2wuZXF1YWxzKEJFdmVudC5jbGFzcy5nZXROYW1lKCkpKSB7CisJCQkJCWIuc2V0QkV2ZW50KChCRXZlbnQpc2VydmljZSk7CisJCQkJfQorCQkJfQorCQkJCQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORzoKKwkJCWZvciAoU3RyaW5nIGNsIDogb2JqQ2xhc3NMaXN0KSB7CisJCQkJaWYgKGNsLmVxdWFscyhBLmNsYXNzLmdldE5hbWUoKSkpIHsKKwkJCQkJYi5zZXRBKG51bGwpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoY2wuZXF1YWxzKEJFdmVudC5jbGFzcy5nZXROYW1lKCkpKSB7CisJCQkJCWIuc2V0QkV2ZW50KG51bGwpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5CSW1wbC9zcmMvdGVzdHMvQkltcGwvQkltcGwuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQkltcGwvc3JjL3Rlc3RzL0JJbXBsL0JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMDE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuQkltcGwvc3JjL3Rlc3RzL0JJbXBsL0JJbXBsLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKK3BhY2thZ2UgdGVzdHMuQkltcGw7CisKK2ltcG9ydCB0ZXN0cy5BLkE7CitpbXBvcnQgdGVzdHMuQi5CRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBCSW1wbAorCWltcGxlbWVudHMgUnVubmFibGUKK3sKKwlBIGE7CisJQkV2ZW50IGI7CisJYm9vbGVhbiB0ZXJtVGhyZWFkOworCVRocmVhZCB0aDsKKwkKKwlwdWJsaWMgQkltcGwoKQorCXsKKwkJdGggPSBuZXcgVGhyZWFkKHRoaXMsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzdGFydCgpCisJeworCQl0ZXJtVGhyZWFkID0gZmFsc2U7CisJCXRoLnN0YXJ0KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHN0b3AoKQorCXsKKwkJdGVybVRocmVhZCA9IHRydWU7CisJCQorCQl0cnkgeworCQkJdGguam9pbigpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge2UucHJpbnRTdGFja1RyYWNlKCk7fQorCX0KKworCXB1YmxpYyB2b2lkIHNldEEoQSBhKQorCXsKKwkJdGhpcy5hID0gYTsKKwkJCisJCWlmIChhID09IG51bGwpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiIG5vIG1vcmUgcmVmZXJlbmNlcyAiICsgQS5jbGFzcy5nZXROYW1lKCkpOworCQllbHNlCisJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiIHJlZmVyZW5jZXMgIiArIEEuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QkV2ZW50KEJFdmVudCBiKQorCXsKKwkJdGhpcy5iID0gYjsKKwkJCisJCWlmIChiID09IG51bGwpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiIG5vIG1vcmUgcmVmZXJlbmNlcyAiICsgQkV2ZW50LmNsYXNzLmdldE5hbWUoKSk7CisJCWVsc2UKKwkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIgcmVmZXJlbmNlcyAiICsgQkV2ZW50LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCQorCXZvaWQgZHVtbXkKKwkoCisJCWxvbmcgZDAwLCBsb25nIGQwMSwgbG9uZyBkMDIsIGxvbmcgZDAzLCBsb25nIGQwNCwgbG9uZyBkMDUsIGxvbmcgZDA2LCBsb25nIGQwNywgbG9uZyBkMDgsIGxvbmcgZDA5LAorCQlsb25nIGQxMCwgbG9uZyBkMTEsIGxvbmcgZDEyLCBsb25nIGQxMywgbG9uZyBkMTQsIGxvbmcgZDE1LCBsb25nIGQxNiwgbG9uZyBkMTcsIGxvbmcgZDE4LCBsb25nIGQxOSwKKwkJbG9uZyBkMjAsIGxvbmcgZDIxLCBsb25nIGQyMiwgbG9uZyBkMjMsIGxvbmcgZDI0LCBsb25nIGQyNSwgbG9uZyBkMjYsIGxvbmcgZDI3LCBsb25nIGQyOCwgbG9uZyBkMjksCisJCWxvbmcgZDMwLCBsb25nIGQzMSwgbG9uZyBkMzIsIGxvbmcgZDMzLCBsb25nIGQzNCwgbG9uZyBkMzUsIGxvbmcgZDM2LCBsb25nIGQzNywgbG9uZyBkMzgsIGxvbmcgZDM5LAorCQlsb25nIGQ0MCwgbG9uZyBkNDEsIGxvbmcgZDQyLCBsb25nIGQ0MywgbG9uZyBkNDQsIGxvbmcgZDQ1LCBsb25nIGQ0NiwgbG9uZyBkNDcsIGxvbmcgZDQ4LCBsb25nIGQ0OSwKKwkJbG9uZyBkNTAsIGxvbmcgZDUxLCBsb25nIGQ1MiwgbG9uZyBkNTMsIGxvbmcgZDU0LCBsb25nIGQ1NSwgbG9uZyBkNTYsIGxvbmcgZDU3LCBsb25nIGQ1OCwgbG9uZyBkNTksCisJCWxvbmcgZDYwLCBsb25nIGQ2MSwgbG9uZyBkNjIsIGxvbmcgZDYzLCBsb25nIGQ2NCwgbG9uZyBkNjUsIGxvbmcgZDY2LCBsb25nIGQ2NywgbG9uZyBkNjgsIGxvbmcgZDY5LAorCQlsb25nIGQ3MCwgbG9uZyBkNzEsIGxvbmcgZDcyLCBsb25nIGQ3MywgbG9uZyBkNzQsIGxvbmcgZDc1LCBsb25nIGQ3NiwgbG9uZyBkNzcsIGxvbmcgZDc4LCBsb25nIGQ3OSwKKwkJbG9uZyBkODAsIGxvbmcgZDgxLCBsb25nIGQ4MiwgbG9uZyBkODMsIGxvbmcgZDg0LCBsb25nIGQ4NSwgbG9uZyBkODYsIGxvbmcgZDg3LCBsb25nIGQ4OCwgbG9uZyBkODksCisJCWxvbmcgZDkwLCBsb25nIGQ5MSwgbG9uZyBkOTIsIGxvbmcgZDkzLCBsb25nIGQ5NCwgbG9uZyBkOTUsIGxvbmcgZDk2LCBsb25nIGQ5NywgbG9uZyBkOTgsIGxvbmcgZDk5KQorCXsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJfQorCisJcHVibGljIHZvaWQgcnVuKCkKKwl7CisJCWxvbmcgdjAwID0gMCwgdjAxID0gMCwgdjAyID0gMCwgdjAzID0gMCwgdjA0ID0gMCwgdjA1ID0gMCwgdjA2ID0gMCwgdjA3ID0gMCwgdjA4ID0gMCwgdjA5ID0gMDsKKwkJbG9uZyB2MTAgPSAwLCB2MTEgPSAwLCB2MTIgPSAwLCB2MTMgPSAwLCB2MTQgPSAwLCB2MTUgPSAwLCB2MTYgPSAwLCB2MTcgPSAwLCB2MTggPSAwLCB2MTkgPSAwOworCQlsb25nIHYyMCA9IDAsIHYyMSA9IDAsIHYyMiA9IDAsIHYyMyA9IDAsIHYyNCA9IDAsIHYyNSA9IDAsIHYyNiA9IDAsIHYyNyA9IDAsIHYyOCA9IDAsIHYyOSA9IDA7CisJCWxvbmcgdjMwID0gMCwgdjMxID0gMCwgdjMyID0gMCwgdjMzID0gMCwgdjM0ID0gMCwgdjM1ID0gMCwgdjM2ID0gMCwgdjM3ID0gMCwgdjM4ID0gMCwgdjM5ID0gMDsKKwkJbG9uZyB2NDAgPSAwLCB2NDEgPSAwLCB2NDIgPSAwLCB2NDMgPSAwLCB2NDQgPSAwLCB2NDUgPSAwLCB2NDYgPSAwLCB2NDcgPSAwLCB2NDggPSAwLCB2NDkgPSAwOworCQlsb25nIHY1MCA9IDAsIHY1MSA9IDAsIHY1MiA9IDAsIHY1MyA9IDAsIHY1NCA9IDAsIHY1NSA9IDAsIHY1NiA9IDAsIHY1NyA9IDAsIHY1OCA9IDAsIHY1OSA9IDA7CisJCWxvbmcgdjYwID0gMCwgdjYxID0gMCwgdjYyID0gMCwgdjYzID0gMCwgdjY0ID0gMCwgdjY1ID0gMCwgdjY2ID0gMCwgdjY3ID0gMCwgdjY4ID0gMCwgdjY5ID0gMDsKKwkJbG9uZyB2NzAgPSAwLCB2NzEgPSAwLCB2NzIgPSAwLCB2NzMgPSAwLCB2NzQgPSAwLCB2NzUgPSAwLCB2NzYgPSAwLCB2NzcgPSAwLCB2NzggPSAwLCB2NzkgPSAwOworCQlsb25nIHY4MCA9IDAsIHY4MSA9IDAsIHY4MiA9IDAsIHY4MyA9IDAsIHY4NCA9IDAsIHY4NSA9IDAsIHY4NiA9IDAsIHY4NyA9IDAsIHY4OCA9IDAsIHY4OSA9IDA7CisJCWxvbmcgdjkwID0gMCwgdjkxID0gMCwgdjkyID0gMCwgdjkzID0gMCwgdjk0ID0gMCwgdjk1ID0gMCwgdjk2ID0gMCwgdjk3ID0gMCwgdjk4ID0gMCwgdjk5ID0gMDsKKworCQlkdW1teSh2MDAsIHYwMSwgdjAyLCB2MDMsIHYwNCwgdjA1LCB2MDYsIHYwNywgdjA4LCB2MDksIHYxMCwKKwkJCXYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwKKwkJCXYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwKKwkJCXYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwKKwkJCXY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDksIHY1MCwKKwkJCXY1MSwgdjUyLCB2NTMsIHY1NCwgdjU1LCB2NTYsIHY1NywgdjU4LCB2NTksIHY2MCwKKwkJCXY2MSwgdjYyLCB2NjMsIHY2NCwgdjY1LCB2NjYsIHY2NywgdjY4LCB2NjksIHY3MCwKKwkJCXY3MSwgdjcyLCB2NzMsIHY3NCwgdjc1LCB2NzYsIHY3Nywgdjc4LCB2NzksIHY4MCwKKwkJCXY4MSwgdjgyLCB2ODMsIHY4NCwgdjg1LCB2ODYsIHY4Nywgdjg4LCB2ODksIHY5MCwKKwkJCXY5MSwgdjkyLCB2OTMsIHY5NCwgdjk1LCB2OTYsIHY5Nywgdjk4LCB2OTkpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIgcnVubmluZy4uLiIpOworLyoKKwkJT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMTAwXTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgMTAwOyArK2kpCisJCQlvW2ldID0gbmV3IE9iamVjdCgpOworCisJCWZvciAoaW50IGk9MDsgaSA8IDEwMDsgKytpKSB7CisJCQlzeW5jaHJvbml6ZWQob1tpXSkgeworCQkJCW9baV0ubm90aWZ5KCk7CisJCQl9CisJCX0KKyovCQkKKwkJZG9faXQoKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIgc3RvcHBlZC4iKTsKKwl9CisJCisJdm9pZCBkb19pdCgpCisJeworLy8JCWxvbmcgdjAxID0gMCwgdjAyID0gMCwgdjAzID0gMCwgdjA0ID0gMCwgdjA1ID0gMCwgdjA2ID0gMCwgdjA3ID0gMCwgdjA4ID0gMCwgdjA5ID0gMCwgdjEwID0gMCwgdjExID0gMCwgdjEyID0gMCwgdjEzID0gMCwgdjE0ID0gMCwgdjE1ID0gMCwgdjE2ID0gMCwgdjE3ID0gMCwgdjE4ID0gMCwgdjE5ID0gMCwgdjIwID0gMCwgdjIxID0gMCwgdjIyID0gMCwgdjIzID0gMCwgdjI0ID0gMCwgdjI1ID0gMCwgdjI2ID0gMCwgdjI3ID0gMCwgdjI4ID0gMCwgdjI5ID0gMCwgdjMwID0gMCwgdjMxID0gMCwgdjMyID0gMCwgdjMzID0gMCwgdjM0ID0gMCwgdjM1ID0gMCwgdjM2ID0gMCwgdjM3ID0gMCwgdjM4ID0gMCwgdjM5ID0gMCwgdjQwID0gMCwgdjQxID0gMCwgdjQyID0gMCwgdjQzID0gMCwgdjQ0ID0gMCwgdjQ1ID0gMCwgdjQ2ID0gMCwgdjQ3ID0gMCwgdjQ4ID0gMCwgdjQ5ID0gMCwgdjUwID0gMCwgdjUxID0gMDsKKy8vCQlkdW1teSh2MDEsIHYwMiwgdjAzLCB2MDQsIHYwNSwgdjA2LCB2MDcsIHYwOCwgdjA5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDksIHY1MCwgdjUxKTsKKwkJCQkKKwkJd2hpbGUgKCF0ZXJtVGhyZWFkKSB7CisJCQlpZiAoYSA9PSBudWxsKQorCQkJCXNsZWVwKDEpOworCQkJZWxzZQorCQkJCWEuYSgpOworCisJCQlpZiAoYiA9PSBudWxsKQorCQkJCXNsZWVwKDEpOworCQkJZWxzZQorCQkJCWIuaGFuZGxlcigpOworCQl9CisJfQorCQorCXZvaWQgc2xlZXAobG9uZyBzZWMpCisJeworCQl0cnkgeworCQkJVGhyZWFkLnNsZWVwKHNlYyAqIDEwMDApOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge2UucHJpbnRTdGFja1RyYWNlKCk7fQorCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRS9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkUvYnVuZGxlLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2FiMDAKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkUvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLU5hbWU6IFRlc3RzIEUNCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdHMuRQ0KK0V4cG9ydC1QYWNrYWdlOiB0ZXN0cy5FDQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5FL3NyYy90ZXN0cy9FL0UuamF2YSBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRS9zcmMvdGVzdHMvRS9FLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhZGZhMwotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRS9zcmMvdGVzdHMvRS9FLmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIHRlc3RzLkU7CisKK3B1YmxpYyBpbnRlcmZhY2UgRQoreworCXB1YmxpYyB2b2lkIGUoKTsKK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRkltcGwvYnVuZGxlLm1hbmlmZXN0IGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5GSW1wbC9idW5kbGUubWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhOTE4YwotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRkltcGwvYnVuZGxlLm1hbmlmZXN0CkBAIC0wLDAgKzEsOCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLU5hbWU6IFRlc3RzIEYgSW1wbA0KK0J1bmRsZS1BY3RpdmF0b3I6IHRlc3RzLkZJbXBsLkFjdGl2YXRvcg0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitJbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrLCB0ZXN0cy5FLCBvcmcub3NnaS51dGlsLnRyYWNrZXINCitCdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0cy5GSW1wbA0KKw0KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRkltcGwvc3JjL3Rlc3RzL0ZJbXBsL0FjdGl2YXRvci5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5GSW1wbC9zcmMvdGVzdHMvRkltcGwvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuRkltcGwvc3JjL3Rlc3RzL0ZJbXBsL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgdGVzdHMuRkltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7CisKK2ltcG9ydCB0ZXN0cy5FLkU7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IKKwlpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvcgoreworCUJ1bmRsZUNvbnRleHQgY29udGV4dDsKKwlTZXJ2aWNlVHJhY2tlcjxFLCBFPiBzZXJ2aWNlVHJhY2tlckU7CisKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KKwl7CQorCQljb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKKwkJCisJCXNlcnZpY2VUcmFja2VyRSA9IG5ldyBTZXJ2aWNlVHJhY2tlcjxFLCBFPihjb250ZXh0LCBFLmNsYXNzLCBudWxsKTsKKwkJc2VydmljZVRyYWNrZXJFLm9wZW4oKTsKKwkJCisJCWhlYXZ5SW5pdGlhbGl6YXRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCisJCQkrICIgY29uc3VtZXMgIiArIEUuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCisJCXNlcnZpY2VUcmFja2VyRS5jbG9zZSgpOworCX0KKwkKKwl2b2lkIGhlYXZ5SW5pdGlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFIGUgPSBzZXJ2aWNlVHJhY2tlckUuZ2V0U2VydmljZSgpOworCQlpZiAoZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2VydmljZSBub3QgZm91bmQ6ICIgKyBFLmNsYXNzLmdldE5hbWUoKSk7CisJCQorCQlBcnJheUxpc3Q8RG91YmxlPiBUID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCWZvciAoaW50IGk9MDsgaSA8IDQ5OTsgKytpKQorCQkJVC5hZGQobmV3IERvdWJsZShNYXRoLnJhbmRvbSgpKSk7CisJCQorCQllLmUoKTsJCisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5HSW1wbC9idW5kbGUubWFuaWZlc3QgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkdJbXBsL2J1bmRsZS5tYW5pZmVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc2YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5HSW1wbC9idW5kbGUubWFuaWZlc3QKQEAgLTAsMCArMSw4IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtVmVyc2lvbjogMS4wLjANCitCdW5kbGUtTmFtZTogVGVzdHMgRyBJbXBsDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1BY3RpdmF0b3I6IHRlc3RzLkdJbXBsLkFjdGl2YXRvcg0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3RzLkdJbXBsDQorSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yaywgdGVzdHMuRSwgdGVzdHMuQg0KKw0KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuR0ltcGwvc3JjL3Rlc3RzL0dJbXBsL0FjdGl2YXRvci5qYXZhIGIvdm1raXQvb3NnaS90ZXN0cy90ZXN0cy5HSW1wbC9zcmMvdGVzdHMvR0ltcGwvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwNjdmNAotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuR0ltcGwvc3JjL3Rlc3RzL0dJbXBsL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgdGVzdHMuR0ltcGw7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCitpbXBvcnQgdGVzdHMuRS5FOworCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IKK3sKKwlCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisJRUltcGwgZTsKKworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7CisJCQorCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKKwkJCSsgIiBwcm92aWRlcyAiICsgRS5jbGFzcy5nZXROYW1lKCkpOworCisJCWUgPSBuZXcgRUltcGwoY29udGV4dCk7CisJCWNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKEUuY2xhc3MsIGUsIG51bGwpOwkKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCisJCQkrICIgbm8gbW9yZSBwcm92aWRlcyAiICsgRS5jbGFzcy5nZXROYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L29zZ2kvdGVzdHMvdGVzdHMuR0ltcGwvc3JjL3Rlc3RzL0dJbXBsL0VJbXBsLmphdmEgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkdJbXBsL3NyYy90ZXN0cy9HSW1wbC9FSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmNjMTkKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC9vc2dpL3Rlc3RzL3Rlc3RzLkdJbXBsL3NyYy90ZXN0cy9HSW1wbC9FSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgdGVzdHMuR0ltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CisKK2ltcG9ydCB0ZXN0cy5FLkU7CitpbXBvcnQgdGVzdHMuQi5CRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBFSW1wbAorCWltcGxlbWVudHMgRQoreworCUJ1bmRsZUNvbnRleHQgY29udGV4dDsKKwkKKwlwdWJsaWMgRUltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0KQorCXsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwl9CisJCisJcHVibGljIHZvaWQgZSgpCisJeworCQl0cnkgeworCQkJc29tZVByb2Nlc3NpbmcoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc29tZVByb2Nlc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTZXJ2aWNlUmVmZXJlbmNlPEJFdmVudD4gcmVmQkV2ZW50ID0KKwkJCWNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShCRXZlbnQuY2xhc3MpOworCQkKKwkJaWYgKHJlZkJFdmVudCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2VydmljZSBub3QgZm91bmQ6ICIgKyBCRXZlbnQuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJCisJCUJFdmVudCBiID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZkJFdmVudCk7CisJCWlmIChiID09IG51bGwpCisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJTZXJ2aWNlIG5vdCBmb3VuZDogIiArIEJFdmVudC5jbGFzcy5nZXROYW1lKCkpOworCisJCUFycmF5TGlzdDxEb3VibGU+IFQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgNDk5OTsgKytpKQorCQkJVC5hZGQobmV3IERvdWJsZShNYXRoLnJhbmRvbSgpKSk7CisKKwkJYi5oYW5kbGVyKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvQW5ub3RhdGlvbkNsYXNzVGVzdC5qYXZhIGIvdm1raXQvdGVzdHMvQW5ub3RhdGlvbkNsYXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDM0NzRjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rlc3RzL0Fubm90YXRpb25DbGFzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLWltcG9ydCBqYXZhLmxhbmcuRGVwcmVjYXRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkNsYXNzVGVzdCB7Ci0KLQlATXlBbm5vdGF0aW9uIChwcm9wZXJ0eSA9IDEzLCBwcm9wZXJ0eTQgPSBTeXN0ZW0uY2xhc3MpCi0gIHN0YXRpYyBjbGFzcyBTYW1wbGUgewotICAgIEBEZXByZWNhdGVkCi0gICAgQE15QW5ub3RhdGlvbiAocHJvcGVydHk9NSwgcHJvcGVydHk0PVN0cmluZy5jbGFzcykKLSAgICBwdWJsaWMgaW50IHg7Ci0gICAgCi0gICAgQE15QW5ub3RhdGlvbiAocHJvcGVydHk9NywgcHJvcGVydHk0PVN0cmluZy5jbGFzcykKLSAgICBwdWJsaWMgaW50IHkoKSB7Ci0gICAgCXJldHVybiB4Kng7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmllbGQgZiA9IFNhbXBsZS5jbGFzcy5nZXRGaWVsZCgieCIpOwotICAgIE1ldGhvZCBtID0gU2FtcGxlLmNsYXNzLmdldE1ldGhvZCgieSIpOwotICAgIFNhbXBsZSBzYW1wbGUgPSBuZXcgU2FtcGxlKCk7Ci0gICAgc2FtcGxlLnggPSAxNDsKLSAgICAKLSAgICBBbm5vdGF0aW9uIFtdIGZBbm5vID0gZi5nZXREZWNsYXJlZEFubm90YXRpb25zKCk7Ci0gICAgQW5ub3RhdGlvbiBbXSBtQW5ubyA9IG0uZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICBBbm5vdGF0aW9uIFtdIGNBbm5vID0gU2FtcGxlLmNsYXNzLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKLQotICAgIE15QW5ub3RhdGlvbiB4eCA9IChNeUFubm90YXRpb24pZi5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7Ci0JCU15QW5ub3RhdGlvbiB5eSA9IChNeUFubm90YXRpb24pbS5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7Ci0JCQotCQkKLQotICAgIGNoZWNrKGYuZ2V0SW50KHNhbXBsZSkgPT0gMTQpOwotICAgIGYuc2V0SW50KHNhbXBsZSwgMTcpOwotICAgIGNoZWNrKGYuZ2V0SW50KHNhbXBsZSkgPT0gMTcpOwotICAgIGNoZWNrKHh4ICE9IG51bGwpOwotICAgIGNoZWNrKHl5ICE9IG51bGwpOwotICAgIGNoZWNrKG1Bbm5vLmxlbmd0aCA9PSAxKTsKLQkJY2hlY2soZkFubm8ubGVuZ3RoID09IDIpOwotCQljaGVjayhjQW5ubyAhPSBudWxsICYmIGNBbm5vLmxlbmd0aCA9PSAxICYmIGNBbm5vWzBdIT0gbnVsbCk7Ci0gICAgLy9pbnQgcyA9IHl5LnByb3BlcnR5KCk7Ci0gICAgLy9jaGVjayhzID09IDUpOwotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVjayhib29sZWFuIGIpIHRocm93cyBFeGNlcHRpb24gewotICAgIGlmICghYikgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGVzdCBmYWlsZWQhISEiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvTXlBbm5vdGF0aW9uLmphdmEgYi92bWtpdC90ZXN0cy9NeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNjdlMS4uMDAwMDAwMAotLS0gYS92bWtpdC90ZXN0cy9NeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLio7Ci1AUmV0ZW50aW9uKHZhbHVlPVJldGVudGlvblBvbGljeS5SVU5USU1FKQotcHVibGljIEBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHsKLQlpbnQgcHJvcGVydHkoKTsKLQlpbnRbXSBwcmltZXMoKSBkZWZhdWx0IHsyLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5fTsKLQlTdHJpbmcgcHJvcGVydHkzKCkgZGVmYXVsdCAiRGVmYXVsdCB2YWx1ZSI7Ci0JQ2xhc3MgcHJvcGVydHk0KCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy9kYWNhcG8vMjAwNi0xMC1NUjIvTWFrZWZpbGUgYi92bWtpdC90ZXN0cy9kYWNhcG8vMjAwNi0xMC1NUjIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ODJmZgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL2RhY2Fwby8yMDA2LTEwLU1SMi9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisKK0xFVkVMICAgICAgICAgICAgIDo9IC4uCitEQUNBUE9fVkVSU0lPTiAgICA6PSAyMDA2LTEwLU1SMgorREFDQVBPX0FSR1MgICAgICAgOj0gLXMgZGVmYXVsdAorCitpZm5kZWYgREVDQVBPX0JFTkNITUFSS1MKKyAgICBERUNBUE9fQkVOQ0hNQVJLUyA6PSBhbnRsciBibG9hdCBjaGFydCBlY2xpcHNlIGZvcCBoc3FsZGIganl0aG9uIGx1aW5kZXggbHVzZWFyY2ggcG1kIHhhbGFuCitlbmRpZgorCitpbmNsdWRlIC4uL01ha2VmaWxlLmluYwpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvZGFjYXBvL01ha2VmaWxlLmluYyBiL3Zta2l0L3Rlc3RzL2RhY2Fwby9NYWtlZmlsZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyYzc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL2RhY2Fwby9NYWtlZmlsZS5pbmMKQEAgLTAsMCArMSw0MCBAQAorCitpZmRlZiBERUJVRworICAgIEJVSUxEX01PREUgOj0gRGVidWcrQXNzZXJ0cworZWxzZQorICAgIEJVSUxEX01PREUgOj0gUmVsZWFzZStBc3NlcnRzCitlbmRpZgorCitpZm5kZWYgQkVOQ0hNQVJLX1JFUEVBVFMKKyAgICBCRU5DSE1BUktfUkVQRUFUUyA6PSAxMgorZW5kaWYKKworaWZuZGVmIFZFUkJPU0UKKyAgICBRVUlFVCA6PSBACitlbmRpZgorCitEQUNBUE9fSkFSICAgIDo9ICQoYWJzcGF0aCAkKFBXRCkvJChMRVZFTCkvamFycy9kYWNhcG8tJChEQUNBUE9fVkVSU0lPTikuamFyKQorSlZNX1BBVEggICAgICA6PSAkKGFic3BhdGggJChQV0QpLyQoTEVWRUwpLy4uLy4uLyQoQlVJTERfTU9ERSkvYmluL2ozKQorV09SS19ESVIgICAgICA6PSAkKEhPTUUpL2RhY2Fwb19iZW5jaG1hcmtzCitUTVBfRElSICAgICAgIDo9ICQoc2hlbGwgbWtkaXIgLXAgJChXT1JLX0RJUikgMj4vZGV2L251bGwgOyBta3RlbXAgLWQgLS1zdWZmaXg9LiQoREFDQVBPX1ZFUlNJT04pIC0tdG1wZGlyPSQoV09SS19ESVIpKQorREVQUyAgICAgICAgICA6PSAkKHNoZWxsIGZvciBpIGluICQoREVDQVBPX0JFTkNITUFSS1MpOyBkbyBzZXEgLWYgImRhY2Fwb0JlbmNobWFya18lZ18kJGkiICQoQkVOQ0hNQVJLX1JFUEVBVFMpOyBkb25lKQorCithbGw6IF9QUklOVF9UTVBfRElSICQoREVQUykKKworX1BSSU5UX1RNUF9ESVI6CisJJChRVUlFVCkgZWNobyAiVGFyZ2V0IGRpcjogIiAkKFRNUF9ESVIpCisKKyQoREVQUyk6OiAkKERBQ0FQT19KQVIpCisKKyQoREFDQVBPX0pBUik6CisJJChRVUlFVCkgd2dldCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9kYWNhcG9iZW5jaC9maWxlcy9hcmNoaXZlLzIwMDYtMTAtTVIyL2RhY2Fwby0yMDA2LTEwLU1SMi5qYXIvZG93bmxvYWQiIC1PICIkKERBQ0FQT19KQVIpIgorCitkYWNhcG9CZW5jaG1hcmtfJToKKwkkKGV2YWwgQkVOQ0hfQ09VTlRfJEAgOj0gJCQoc2hlbGwgZWNobyAkQCB8IGN1dCAtZCAnXycgLWYgMikpCisJJChldmFsIEJFTkNIX05BTUVfJEAgOj0gJCQoc2hlbGwgZWNobyAkQCB8IGN1dCAtZCAnXycgLWYgMy0pKQorCSQoZXZhbCBURU1QX0RJUl8kQCA6PSAkKFRNUF9ESVIpLyQoQkVOQ0hfTkFNRV8kQCkvJChCRU5DSF9DT1VOVF8kQCkpCisJJChRVUlFVCkgbWtkaXIgLXAgIiQoVEVNUF9ESVJfJEApIiAyPi9kZXYvbnVsbAorCSQoUVVJRVQpIGNkICIkKFRFTVBfRElSXyRAKSIgJiYgIiQoSlZNX1BBVEgpIiAtamFyICIkKERBQ0FQT19KQVIpIiAkKERBQ0FQT19BUkdTKSAiJChCRU5DSF9OQU1FXyRAKSIgPiAiJChUTVBfRElSKS8kKEJFTkNIX05BTUVfJEApLiQoQkVOQ0hfQ09VTlRfJEApLmxvZyIgMj4mMQorCitjbGVhbjoKKwkkKFFVSUVUKSAtcm0gLXJmICQoV09SS19ESVIpL3RtcC4qICQoV09SS19ESVIpLyoubG9nIDI+L2Rldi9udWxsCmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy9kYWNhcG8vY29tcGFyZS1kYWNhcG8tc3ludGhlc2l6ZWQtbG9ncy5wbG90IGIvdm1raXQvdGVzdHMvZGFjYXBvL2NvbXBhcmUtZGFjYXBvLXN5bnRoZXNpemVkLWxvZ3MucGxvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTEyZTNmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvZGFjYXBvL2NvbXBhcmUtZGFjYXBvLXN5bnRoZXNpemVkLWxvZ3MucGxvdApAQCAtMCwwICsxLDQwIEBACisjIS91c3IvYmluL2dudXBsb3QgLXAKKworc2V0IGRhdGFmaWxlIHNlcGFyYXRvciAiLCIKK3NldCBkYXRhZmlsZSBtaXNzaW5nICdfJworc2V0IGRhdGFmaWxlIGNvbW1lbnRzY2hhcnMgIiMiCisKK3NldCB5bGFiZWwgIkF2ZXJhZ2UgcmVsYXRpdmUgb3ZlcmhlYWQgKGxvd2VyIGlzIGJldHRlcikiCitzZXQgeXRpY3MgYm9yZGVyIG5vbWlycm9yCitzZXQgZ3JpZCB5dGljcworc2V0IGZvcm1hdCB5ICIlLjBmICUlIgorCitzZXQgc3R5bGUgZGF0YSBoaXN0b2dyYW0KK3NldCBzdHlsZSBoaXN0b2dyYW0gY2x1c3RlcmVkIGdhcCAxCitzZXQgYmFycyBmdWxsd2lkdGgKK3NldCBzdHlsZSBmaWxsIHNvbGlkIGJvcmRlciAwCitzZXQgYm94d2lkdGggMQorCisjIHNldCB0aXRsZSAiTW9uaXRvcmluZyBvdmVyaGVhZCBpbiBEYWNhcG8gYmVuY2htYXJrcyIKKworc2V0IHh0aWNzIGF4aXMgbm9taXJyb3IKK3NldCBib3JkZXIgMworCitzZXQgdGVybSBwbmcgc2l6ZSA5MDAsIDYwMAorc2V0IG91dHB1dCAib3ZlcmhlYWQucG5nIgorcGxvdAlcCisJJy9ob21lL2tvdXRoZWlyL2RhY2Fwb19iZW5jaG1hcmtzL292ZXJoZWFkLTAtMS5jc3YnIHVzaW5nIDM6eHRpYygxKSBsaW5lY29sb3IgcmdiICIjZTVlNWU1IiB0aXRsZSAiMCB2cyAxIiwJIFwKKwknL2hvbWUva291dGhlaXIvZGFjYXBvX2JlbmNobWFya3Mvb3ZlcmhlYWQtMC02LmNzdicgdXNpbmcgMzp4dGljKDEpIGxpbmVjb2xvciByZ2IgIiNiMmIyYjIiIHRpdGxlICIwIHZzIDYiLAkgXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy9vdmVyaGVhZC0wLTcuY3N2JyB1c2luZyAzOnh0aWMoMSkgbGluZWNvbG9yIHJnYiAiIzdmN2Y3ZiIgdGl0bGUgIjAgdnMgNyIKKworc2V0IG91dHB1dCAib3ZlcmhlYWQtMC0xLnBuZyIKK3Bsb3QJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy9vdmVyaGVhZC0wLTEuY3N2JyB1c2luZyAzOnh0aWMoMSkgbGluZWNvbG9yIHJnYiAiIzgwODA4MCIgdGl0bGUgIjAgdnMgMSIKKworc2V0IG91dHB1dCAib3ZlcmhlYWQtMC02LnBuZyIKK3Bsb3QJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy9vdmVyaGVhZC0wLTYuY3N2JyB1c2luZyAzOnh0aWMoMSkgbGluZWNvbG9yIHJnYiAiIzgwODA4MCIgdGl0bGUgIjAgdnMgNiIKKworc2V0IG91dHB1dCAib3ZlcmhlYWQtMC03LnBuZyIKK3Bsb3QJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy9vdmVyaGVhZC0wLTcuY3N2JyB1c2luZyAzOnh0aWMoMSkgbGluZWNvbG9yIHJnYiAiIzgwODA4MCIgdGl0bGUgIjAgdnMgNyIKZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL2RhY2Fwby9jb21wYXJlLWRhY2Fwby1zeW50aGVzaXplZC1sb2dzLnNoIGIvdm1raXQvdGVzdHMvZGFjYXBvL2NvbXBhcmUtZGFjYXBvLXN5bnRoZXNpemVkLWxvZ3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2YWFjNgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL2RhY2Fwby9jb21wYXJlLWRhY2Fwby1zeW50aGVzaXplZC1sb2dzLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKK3N5bnRoX2ZpbGVfMT0kMQorc3ludGhfZmlsZV8yPSQyCisKK2lmIFsgXCggLXogIiRzeW50aF9maWxlXzEiIFwpIC1vIFwoIC16ICIkc3ludGhfZmlsZV8yIiBcKSBdOyB0aGVuCisJZXhpdCAxCitmaQorCitlY2hvICcjYmVuY2htYXJrLG1pbl9kdXJhdGlvbl9vdmVyaGVhZCxhdmVyYWdlX2R1cmF0aW9uX292ZXJoZWFkLG1heF9kdXJhdGlvbl9vdmVyaGVhZCxzdGRfZGV2X2R1cmF0aW9uX292ZXJoZWFkJworCit3aGlsZSByZWFkIC1yIGxpbmUgOyBkbworCWlmICEgZWNobyAkbGluZSB8IGdyZXAgJ14jJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJY3VyX2JlbmNoPSQoZWNobyAkbGluZSB8IGN1dCAtZCAnLCcgLWYgMSkKKwkJbWluX2R1cmF0aW9uXzE9JChlY2hvICRsaW5lIHwgY3V0IC1kICcsJyAtZiAyKQorCQlhdmVyYWdlX2R1cmF0aW9uXzE9JChlY2hvICRsaW5lIHwgY3V0IC1kICcsJyAtZiAzKQorCQltYXhfZHVyYXRpb25fMT0kKGVjaG8gJGxpbmUgfCBjdXQgLWQgJywnIC1mIDQpCisJCXN0ZF9kZXZfZHVyYXRpb25fMT0kKGVjaG8gJGxpbmUgfCBjdXQgLWQgJywnIC1mIDUpCisJCQorCQlsaW5lXzI9JChncmVwICJeJGN1cl9iZW5jaCwiICIkc3ludGhfZmlsZV8yIikKKwkJbWluX2R1cmF0aW9uXzI9JChlY2hvICRsaW5lXzIgfCBjdXQgLWQgJywnIC1mIDIpCisJCWF2ZXJhZ2VfZHVyYXRpb25fMj0kKGVjaG8gJGxpbmVfMiB8IGN1dCAtZCAnLCcgLWYgMykKKwkJbWF4X2R1cmF0aW9uXzI9JChlY2hvICRsaW5lXzIgfCBjdXQgLWQgJywnIC1mIDQpCisJCXN0ZF9kZXZfZHVyYXRpb25fMj0kKGVjaG8gJGxpbmVfMiB8IGN1dCAtZCAnLCcgLWYgNSkKKwkJCisJCW1pbl9kdXJhdGlvbl9vdmVyaGVhZD0kKGVjaG8gInNjYWxlPTQ7IDEwMC4wICogKCgkbWluX2R1cmF0aW9uXzIgLyAkbWluX2R1cmF0aW9uXzEpIC0gMS4wKSIgfCBiYyAtcSAyPi9kZXYvbnVsbCkKKwkJYXZlcmFnZV9kdXJhdGlvbl9vdmVyaGVhZD0kKGVjaG8gInNjYWxlPTQ7IDEwMC4wICogKCgkYXZlcmFnZV9kdXJhdGlvbl8yIC8gJGF2ZXJhZ2VfZHVyYXRpb25fMSkgLSAxLjApIiB8IGJjIC1xIDI+L2Rldi9udWxsKQorCQltYXhfZHVyYXRpb25fb3ZlcmhlYWQ9JChlY2hvICJzY2FsZT00OyAxMDAuMCAqICgoJG1heF9kdXJhdGlvbl8yIC8gJG1heF9kdXJhdGlvbl8xKSAtIDEuMCkiIHwgYmMgLXEgMj4vZGV2L251bGwpCisJCXN0ZF9kZXZfZHVyYXRpb25fb3ZlcmhlYWQ9JChlY2hvICJzY2FsZT00OyAxMDAuMCAqICgoJHN0ZF9kZXZfZHVyYXRpb25fMiAvICRzdGRfZGV2X2R1cmF0aW9uXzEpIC0gMS4wKSIgfCBiYyAtcSAyPi9kZXYvbnVsbCkKKwkJCisJCXByaW50ZiAiJXMsJS4yZiwlLjJmLCUuMmYsJS4yZlxuIiAiJGN1cl9iZW5jaCIgIiRtaW5fZHVyYXRpb25fb3ZlcmhlYWQiICIkYXZlcmFnZV9kdXJhdGlvbl9vdmVyaGVhZCIgIiRtYXhfZHVyYXRpb25fb3ZlcmhlYWQiICIkc3RkX2Rldl9kdXJhdGlvbl9vdmVyaGVhZCIKKwlmaQorZG9uZSA8ICIkc3ludGhfZmlsZV8xIgpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvZGFjYXBvL2phcnMvZG93bmxvYWQuc2ggYi92bWtpdC90ZXN0cy9kYWNhcG8vamFycy9kb3dubG9hZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDFhNjgxCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvZGFjYXBvL2phcnMvZG93bmxvYWQuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKKword2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RhY2Fwb2JlbmNoL2ZpbGVzL2FyY2hpdmUvMjAwNi0xMC1NUjIvZGFjYXBvLTIwMDYtMTAtTVIyLmphci9kb3dubG9hZCAtTyBkYWNhcG8tMjAwNi0xMC1NUjIuamFyCisjd2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RhY2Fwb2JlbmNoL2ZpbGVzL2FyY2hpdmUvMjAwNi0xMC9kYWNhcG8tMjAwNi0xMC5qYXIvZG93bmxvYWQgLU8gZGFjYXBvLTIwMDYtMTAuamFyCisjd2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RhY2Fwb2JlbmNoL2ZpbGVzLzkuMTItYmFjaC9kYWNhcG8tOS4xMi1iYWNoLmphci9kb3dubG9hZCAtTyBkYWNhcG8tOS4xMi1iYWNoLmphcgpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvZGFjYXBvL3N5bnRoLWRhY2Fwby1sb2dzLnBsb3QgYi92bWtpdC90ZXN0cy9kYWNhcG8vc3ludGgtZGFjYXBvLWxvZ3MucGxvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzg1YjdjCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvZGFjYXBvL3N5bnRoLWRhY2Fwby1sb2dzLnBsb3QKQEAgLTAsMCArMSwzMiBAQAorIyEvdXNyL2Jpbi9nbnVwbG90IC1wCisKK3NldCBkYXRhZmlsZSBzZXBhcmF0b3IgIiwiCitzZXQgZGF0YWZpbGUgbWlzc2luZyAnXycKK3NldCBkYXRhZmlsZSBjb21tZW50c2NoYXJzICIjIgorCitzZXQgeWxhYmVsICJEdXJhdGlvbiAobG93ZXIgaXMgYmV0dGVyKSIKK3NldCB5dGljcyBib3JkZXIgbm9taXJyb3IKK3NldCBncmlkIHl0aWNzCitzZXQgeXJhbmdlIFswOipdCitzZXQgeWRhdGEgdGltZQorc2V0IHRpbWVmbXQgIiVTIgorc2V0IGZvcm1hdCB5ICIlTTolUyIKKworc2V0IHh0aWNzIGF4aXMgbm9taXJyb3IKK3NldCBib3JkZXIgMworCitzZXQgc3R5bGUgZGF0YSBoaXN0b2dyYW0KK3NldCBzdHlsZSBoaXN0b2dyYW0gZXJyb3JiYXJzIGdhcCAxIGx3IDEKK3NldCBiYXJzIGZ1bGx3aWR0aAorc2V0IHN0eWxlIGZpbGwgc29saWQgYm9yZGVyIDAKK3NldCBib3h3aWR0aCAxCisKKyMgc2V0IHRpdGxlICJNb25pdG9yaW5nIG92ZXJoZWFkIGluIERhY2FwbyBiZW5jaG1hcmtzIgorCitzZXQgdGVybSBwbmcgc2l6ZSA5MDAsIDYwMAorc2V0IG91dHB1dCAiZGFjYXBvLnBuZyIKK3Bsb3QJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy8wLmNzdicgdXNpbmcgKGNvbHVtbigzKS8xMDAwLjApOihjb2x1bW4oNSkvMTAwMC4wKTp4dGljKDEpIGxpbmVjb2xvciByZ2IgIiNlNWU1ZTUiIHRpdGxlICIwIiwJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy8xLmNzdicgdXNpbmcgKGNvbHVtbigzKS8xMDAwLjApOihjb2x1bW4oNSkvMTAwMC4wKTp4dGljKDEpIGxpbmVjb2xvciByZ2IgIiNiMmIyYjIiIHRpdGxlICIxIiwJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy82LmNzdicgdXNpbmcgKGNvbHVtbigzKS8xMDAwLjApOihjb2x1bW4oNSkvMTAwMC4wKTp4dGljKDEpIGxpbmVjb2xvciByZ2IgIiM3ZjdmN2YiIHRpdGxlICI2IiwJXAorCScvaG9tZS9rb3V0aGVpci9kYWNhcG9fYmVuY2htYXJrcy83LmNzdicgdXNpbmcgKGNvbHVtbigzKS8xMDAwLjApOihjb2x1bW4oNSkvMTAwMC4wKTp4dGljKDEpIGxpbmVjb2xvciByZ2IgIiM0YzRjNGMiIHRpdGxlICI3IgpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvZGFjYXBvL3N5bnRoLWRhY2Fwby1sb2dzLnNoIGIvdm1raXQvdGVzdHMvZGFjYXBvL3N5bnRoLWRhY2Fwby1sb2dzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTYyMGEKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC90ZXN0cy9kYWNhcG8vc3ludGgtZGFjYXBvLWxvZ3Muc2gKQEAgLTAsMCArMSw4MyBAQAorIyEvYmluL2Jhc2gKKworbG9nX2Rpcj0kMQorCitpZiBbIC16ICIkbG9nX2RpciIgXTsgdGhlbgorCWV4aXQgMQorZmkKKworc3RhZ2UxX2ZpbGU9L3RtcC8kMC4kJC5zdGFnZTEKK3N0YWdlMl9maWxlPS90bXAvJDAuJCQuc3RhZ2UyCitzdGFnZTNfZmlsZT0vdG1wLyQwLiQkLnN0YWdlMworCitybSAtZiAiJHN0YWdlMV9maWxlIiAiJHN0YWdlMl9maWxlIiAiJHN0YWdlM19maWxlIgorCisjIEZpbHRlciBzdWNjZXNzZnVsIHJlc3VsdHMgYW5kIHByaW50IHRoZW0gaW4gdGhlIGZvcm1hdDogYmVuY2htYXJrLGR1cmF0aW9uCitncmVwICdePT09PT0gRGFDYXBvIFtBLVphLXpdXCsgUEFTU0VEJyAkbG9nX2Rpci8qLmxvZyB8IHNlZCAicy9eLio6PT09PT0gRGFDYXBvIC8vZyA7IHMvIG1zZWMgPT09PT0vL2cgOyBzLyBQQVNTRUQgaW4gLywvZyIgfCBzb3J0ID4gJHN0YWdlMV9maWxlCisKKyMgQ2FsY3VsYXRlIG1pbmltdW0sIG1heGltdW0gYW5kIGF2ZXJhZ2UgZHVyYXRpb25zCisKK2NvdW50PTAKK3doaWxlIHJlYWQgLXIgbGluZSA7IGRvCisJY3VyX2JlbmNoPSQoZWNobyAkbGluZSB8IGN1dCAtZCAnLCcgLWYgMSkKKwljdXJfZHVyYXRpb249JChlY2hvICRsaW5lIHwgY3V0IC1kICcsJyAtZiAyKQorCQorCWlmIFsgLXogIiRsYXN0X2JlbmNoIiBdOyB0aGVuCisJCWxhc3RfYmVuY2g9JGN1cl9iZW5jaAorCQljb3VudD0xCisJCWF2ZXJhZ2VfZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCQltaW5fZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCQltYXhfZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCWVsc2UKKwkJaWYgWyAiJGxhc3RfYmVuY2giID09ICIkY3VyX2JlbmNoIiBdOyB0aGVuCisJCQljb3VudD0kKCgkY291bnQgKyAxKSkKKwkJCWF2ZXJhZ2VfZHVyYXRpb249JCgoJGF2ZXJhZ2VfZHVyYXRpb24gKyAkY3VyX2R1cmF0aW9uKSkKKwkJCWlmIFsgIiRjdXJfZHVyYXRpb24iIC1sdCAiJG1pbl9kdXJhdGlvbiIgXTsgdGhlbgorCQkJCW1pbl9kdXJhdGlvbj0kY3VyX2R1cmF0aW9uCisJCQlmaQorCQkJaWYgWyAiJGN1cl9kdXJhdGlvbiIgLWd0ICIkbWF4X2R1cmF0aW9uIiBdOyB0aGVuCisJCQkJbWF4X2R1cmF0aW9uPSRjdXJfZHVyYXRpb24KKwkJCWZpCisJCWVsc2UKKwkJCWF2ZXJhZ2VfZHVyYXRpb249JCgoJGF2ZXJhZ2VfZHVyYXRpb24gLyAkY291bnQpKQorCQkJZWNobyAiJGxhc3RfYmVuY2gsJG1pbl9kdXJhdGlvbiwkYXZlcmFnZV9kdXJhdGlvbiwkbWF4X2R1cmF0aW9uIiA+PiAkc3RhZ2UyX2ZpbGUKKwkJCQorCQkJbGFzdF9iZW5jaD0kY3VyX2JlbmNoCisJCQljb3VudD0xCisJCQlhdmVyYWdlX2R1cmF0aW9uPSRjdXJfZHVyYXRpb24KKwkJCW1pbl9kdXJhdGlvbj0kY3VyX2R1cmF0aW9uCisJCQltYXhfZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCQlmaQorCWZpCitkb25lIDwgJHN0YWdlMV9maWxlCisKK2lmIFsgIiRjb3VudCIgLWd0IDAgXTsgdGhlbgorCWF2ZXJhZ2VfZHVyYXRpb249JCgoJGF2ZXJhZ2VfZHVyYXRpb24gLyAkY291bnQpKQorCWVjaG8gIiRsYXN0X2JlbmNoLCRtaW5fZHVyYXRpb24sJGF2ZXJhZ2VfZHVyYXRpb24sJG1heF9kdXJhdGlvbiIgPj4gJHN0YWdlMl9maWxlCitmaQorCitlY2hvICcjYmVuY2htYXJrLG1pbl9kdXJhdGlvbl9tcyxhdmVyYWdlX2R1cmF0aW9uX21zLG1heF9kdXJhdGlvbl9tcyxzdGRfZGV2X2R1cmF0aW9uX21zJworCisjIENhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uCit3aGlsZSByZWFkIC1yIGxpbmUgOyBkbworCWN1cl9iZW5jaD0kKGVjaG8gJGxpbmUgfCBjdXQgLWQgJywnIC1mIDEpCisJY3VyX2F2ZXJhZ2U9JChlY2hvICRsaW5lIHwgY3V0IC1kICcsJyAtZiAzKQorCQorCWdyZXAgIl4kY3VyX2JlbmNoLCIgIiRzdGFnZTFfZmlsZSIgPiAiJHN0YWdlM19maWxlIgorCQorCWNvdW50PTAKKwlzdGRfZGV2PSdzcXJ0KCgwJworCQorCXdoaWxlIHJlYWQgLXIgbGluZTIgOyBkbworCQljdXJfZHVyYXRpb249JChlY2hvICRsaW5lMiB8IGN1dCAtZCAnLCcgLWYgMikKKwkJCisJCXN0ZF9kZXYrPSIrKCgkY3VyX2R1cmF0aW9uIC0gJGN1cl9hdmVyYWdlKV4yKSIKKwkJY291bnQ9JCgoJGNvdW50KzEpKQorCWRvbmUgPCAiJHN0YWdlM19maWxlIgorCQorCXN0ZF9kZXYrPSIpLyRjb3VudCkiCisJc3RkX2Rldj0kKGVjaG8gInNjYWxlPTA7ICRzdGRfZGV2IiB8IGJjIC1xIDI+L2Rldi9udWxsKQorCWVjaG8gIiRsaW5lLCRzdGRfZGV2IgorZG9uZSA8ICRzdGFnZTJfZmlsZQorCitybSAtZiAiJHN0YWdlMV9maWxlIiAiJHN0YWdlMl9maWxlIiAiJHN0YWdlM19maWxlIgpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvZGVidWcudHh0IGIvdm1raXQvdGVzdHMvZGVidWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDJiZGQKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC90ZXN0cy9kZWJ1Zy50eHQKQEAgLTAsMCArMSw3MCBAQAorLVg6Z2M6dmVyYm9zZT0wIC1qYXIgZnJhbWV3b3JrLmphciAteGFyZ3MgL2hvbWUva291dGhlaXIvUGhEL1ZNS2l0L2luY2luZXJhdG9yL2luY2luZXJhdG9yL3Rlc3RzL21pbmltYWwuYnVnLnhhcmdzCitmcmFtZXdvcmsgY2FsbCBqMy5KM01nciBzZXRCdW5kbGVTdGFsZVJlZmVyZW5jZUNvcnJlY3RlZCBpanZtLnRlc3RzLkFJbXBsIHllcworZnJhbWV3b3JrIGNhbGwgajMuSjNNZ3Igc2V0QnVuZGxlU3RhbGVSZWZlcmVuY2VDb3JyZWN0ZWQgaWp2bS50ZXN0cy5CSW1wbCB5ZXMKK2ZyYW1ld29yayBjYWxsIGozLkozTWdyIHNldEJ1bmRsZVN0YWxlUmVmZXJlbmNlQ29ycmVjdGVkIGlqdm0udGVzdHMuQ0ltcGwgeWVzCitzdG9wIDEyCitzdG9wIDEzCitzdG9wIDE0CisKK3N0YXJ0IDEyIDEzIDE0CitzdG9wIDEyCisKK2ZyYW1ld29yayBjYWxsIGozLkozTWdyIGlzQnVuZGxlU3RhbGVSZWZlcmVuY2VDb3JyZWN0ZWQgMzkKK2ZyYW1ld29yayBjYWxsIGozLkozTWdyIHNldEJ1bmRsZVN0YWxlUmVmZXJlbmNlQ29ycmVjdGVkIDggeWVzCisKK2VudGVyIGZyYW1ld29yaworY2FsbCBqMy5KM01nciBpc0J1bmRsZVN0YWxlUmVmZXJlbmNlQ29ycmVjdGVkIDE0CitjYWxsIGozLkozTWdyIHNldEJ1bmRsZVN0YWxlUmVmZXJlbmNlQ29ycmVjdGVkIDE0IHllcwordXBkYXRlIDE0CisKK2ZyYW1ld29yayBjYWxsIGozLkozTWdyIGR1bXBDbGFzc0xvYWRlckJ1bmRsZXMKKworc3RvcCA4Cit1bmluc3RhbGwgOAorcmVmcmVzaAorbWVtaW5mbyAtZ2MKK2NhbGwgajMuSjNNZ3Igc2V0QnVuZGxlU3RhbGVSZWZlcmVuY2VDb3JyZWN0ZWQgMTQgeWVzCitjYWxsIGozLkozTWdyIGR1bXBSZWZlcmVuY2VzVG9PYmplY3QgMHg1MTkzNGFiNAorCityZWZyZXNoCittZW1pbmZvIC1nYworCisKK2VudGVyIGZyYW1ld29yaworY2FsbCBqMy5KM01nciBzZXRCdW5kbGVTdGFsZVJlZmVyZW5jZUNvcnJlY3RlZCAxMSBubworbWVtaW5mbyAtZ2MKK3VwZGF0ZSAxMQorcmVmcmVzaAorbWVtaW5mbyAtZ2MKKworU1RBTEUgPSB7aHR0cC9odHRwX2FsbC0zLjEuMi5qYXIsIHVzZXJhZG1pbi91c2VyYWRtaW5fYWxsLTMuMC4zLmphciwgZGV2aWNlL2RldmljZV9hbGwtMy4wLjAuamFyLCBreG1sL2t4bWwtMi4zLjAua2YzLmphcn0KKworY2FsbCBqMy5KM01nciBmb3JjZVN0YWxlUmVmZXJlbmNlU2Nhbm5pbmcKKworZnJvbXVwZGF0ZSAxNSBmaWxlOi9tZWRpYS9EYXRhL0RvY3VtZW50cy9QaEQvVk1LaXQvaW5jaW5lcmF0b3IvaW5jaW5lcmF0b3IvdGVzdHMvaWp2bS50ZXN0cy5BbGFybV92Mi4wL291dC9panZtLnRlc3RzLkFsYXJtX3YyLjAtMi4wLjAuamFyCisKK2VudGVyIGZyYW1ld29yaworY2FsbCBqMy5KM01nciBsb2FkVGllckNvbmZpZ0ZpbGUgL2hvbWUva291dGhlaXIvUGhEL1ZNS2l0L3Zta2l0LW1vbml0b3IvdGVzdHMvdGllci5kZXNjcmlwdGlvbgoraW5zdGFsbCBpanZtLnRlc3RzLkEvb3V0L2lqdm0udGVzdHMuQS0xLjAuMC5qYXIKK2luc3RhbGwgaWp2bS50ZXN0cy5DL291dC9panZtLnRlc3RzLkMtMS4wLjAuamFyCitpbnN0YWxsIGlqdm0udGVzdHMuQUltcGwvb3V0L2lqdm0udGVzdHMuQUltcGwtMS4wLjAuamFyCitpbnN0YWxsIGlqdm0udGVzdHMuQkltcGwvb3V0L2lqdm0udGVzdHMuQkltcGwtMS4wLjAuamFyCitpbnN0YWxsIGlqdm0udGVzdHMuQ0ltcGwvb3V0L2lqdm0udGVzdHMuQ0ltcGwtMS4wLjAuamFyCitpbnN0YWxsIGlqdm0udGVzdHMuREltcGwvb3V0L2lqdm0udGVzdHMuREltcGwtMS4wLjAuamFyCityZXNvbHZlIDExIDEyIDEzIDE0IDE1IDE2CisKK2VudGVyIGZyYW1ld29yaworY2FsbCBqMy5KM01nciBkdW1wVGllclN0YXRzCisKK2VudGVyIGZyYW1ld29yaworcmVzb2x2ZSAxNCAxNQorc3RhcnQgMTUKK2NhbGwgajMuSjNNZ3IgZHVtcFRpZXJTdGF0cworc3RhcnQgMTQKK2NhbGwgajMuSjNNZ3IgZHVtcFRpZXJTdGF0cworCitlbnRlciBmcmFtZXdvcmsKK3N0YXJ0IDE0IDE3CityZXNvbHZlIDE2CitjYWxsIGozLkozTWdyIGR1bXBUaWVyU3RhdHMgMgorc3RhcnQgMTYKZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL2Z1bGwueGFyZ3MgYi92bWtpdC90ZXN0cy9mdWxsLnhhcmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTI1NTkKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC90ZXN0cy9mdWxsLnhhcmdzCkBAIC0wLDAgKzEsODggQEAKKy1Eb3JnLm9zZ2kuZnJhbWV3b3JrLmRpcj0vdG1wL2Z3ZGlyDQorIy1Eb3JnLmtub3BmbGVyZmlzaC5mcmFtZXdvcmsuYnVuZGxlc3RvcmFnZT1tZW1vcnkNCistRG9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLnN5c3RlbS5leHBvcnQuYWxsXzEzPWZhbHNlDQorLURvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yay52ZXJib3NpdHk9MA0KKw0KKy1Gb3JnLmtub3BmbGVyZmlzaC5mcmFtZXdvcmsuZGVidWcuZXJyb3JzPXRydWUNCistRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmRlYnVnLnBhY2thZ2VzPWZhbHNlDQorLUZvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yay5kZWJ1Zy5jbGFzc2xvYWRlcj1mYWxzZQ0KKyMtRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmRlYnVnLnBlcm1pc3Npb25zPWZhbHNlDQorDQorIy1Gb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcy5leHRyYT0NCisNCistRm9yZy5rbm9wZmxlcmZpc2guaHR0cC5kbnNsb29rdXA9dHJ1ZQ0KKy1Gb3JnLm9zZ2kuc2VydmljZS5odHRwLnBvcnQ9ODA4MA0KKw0KKyMtRGh0dHAucHJveHlIb3N0PXByb3h5DQorIy1EaHR0cC5wcm94eVBvcnQ9MzEyOA0KKw0KKyMtRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmFsbF9zaWduZWQ9ZmFsc2UNCisNCistRG9yZy5rbm9wZmxlcmZpc2guZ29zZy5qYXJzPWZpbGU6Ly8vaG9tZS9rb3V0aGVpci9QaEQvVk1LaXQva25vcGZsZXJmaXNoL29zZ2kvamFycy87ZmlsZTovLy9ob21lL2tvdXRoZWlyL1BoRC9WTUtpdC9pbmNpbmVyYXRvci9pbmNpbmVyYXRvci90ZXN0cy9wbHVnaW5zLw0KKw0KKy1Gb3JnLmtub3BmbGVyZmlzaC5zdGFydGxldmVsLnVzZT10cnVlDQorDQorLWluaXQNCisNCistaW5zdGFsbCBsb2cvbG9nX2FsbC0zLjEuMy5qYXINCistaW5zdGFsbCBjbS9jbV9hbGwtMy4wLjQuamFyDQorLWluc3RhbGwgdXRpbC91dGlsLTIuMC4xLmphcg0KKy1pc3RhcnQgY29uc29sZS9jb25zb2xlX2FsbC0zLjAuNC5qYXINCistaXN0YXJ0IGZyYW1ld29ya2NvbW1hbmRzL2ZyYW1ld29ya2NvbW1hbmRzLTMuMi4wLmphcg0KKy1pc3RhcnQgbG9nY29tbWFuZHMvbG9nY29tbWFuZHMtMy4xLjEuamFyDQorLWlzdGFydCBjbV9jbWQvY21fY21kLTMuMC4yLmphcg0KKy1pc3RhcnQgY29uc29sZXR0eS9jb25zb2xldHR5LTMuMC4xLmphcg0KKy1pc3RhcnQgdXNlcmFkbWluL3VzZXJhZG1pbl9hcGktMy4wLjMuamFyDQorLWlzdGFydCB1dGlsL3V0aWwtMi4wLjEuamFyDQorDQorLWxhdW5jaA0KKw0KKy1pc3RhcnQgIGozbWdyLTEuMC4wLmphcg0KKw0KKyMtaXN0YXJ0ICBpanZtLnRlc3RzLkEtMS4wLjAuamFyDQorIy1pc3RhcnQgIGlqdm0udGVzdHMuQy0xLjAuMC5qYXINCisjLWlzdGFydCAgaWp2bS50ZXN0cy5BSW1wbC0xLjAuMC5qYXINCisjLWlzdGFydCAgaWp2bS50ZXN0cy5CSW1wbC0xLjAuMC5qYXINCisjLWlzdGFydCAgaWp2bS50ZXN0cy5DSW1wbC0xLjAuMC5qYXINCisjLWlzdGFydCAgaWp2bS50ZXN0cy5ESW1wbC0xLjAuMC5qYXINCisjLWluc3RhbGwgaWp2bS50ZXN0cy5SdW5uZXItMS4wLjAuamFyDQorLWluc3RhbGwgQnVuZGxlUmVsb2FkZXItMS4wLjAuamFyDQorDQorLWluc3RhbGwgZGVza3RvcC9kZXNrdG9wX2FsbC0zLjIuNS5qYXINCistaW5zdGFsbCBjb21tLWxpbnV4L2NvbW0tbGludXhfYWxsLTIuMC4wLmphcg0KKy1pbnN0YWxsIGNvbW1hbmQvY29tbWFuZF9hbGwtMC4xLmphcg0KKy1pbnN0YWxsIGpzZGsvanNka19hcGktMi41LjAua2YzLTIuamFyDQorDQorLWlzdGFydCBreG1sL2t4bWwtMi4zLjAua2YzLmphcg0KKy1pc3RhcnQgbWV0YXR5cGUvbWV0YXR5cGUtMy4wLjAuamFyDQorLWlzdGFydCBrZl9tZXRhdHlwZS9rZl9tZXRhdHlwZV9hbGwtMy4wLjIuamFyDQorLWlzdGFydCBjb21wb25lbnQvY29tcG9uZW50X2FsbC0zLjEuMTQuamFyDQorLWlzdGFydCBldmVudC9ldmVudF9hbGwtMy4wLjguamFyDQorLWlzdGFydCBjbV9kZXNrdG9wL2NtX2Rlc2t0b3BfYWxsLTMuMC4wLmphcg0KKy1pc3RhcnQgdGhyZWFkaW8vdGhyZWFkaW9fYWxsLTAuMS4wLmphcg0KKy1pc3RhcnQgY29uc29sZXRjcC9jb25zb2xldGNwX2FsbC0yLjAuMC5qYXINCistaXN0YXJ0IHNvYXBvYmplY3Qvc29hcG9iamVjdF9hbGwtMC4wLjIuamFyDQorLWlzdGFydCBjcmltc29uL2NyaW1zb24tMi4xLjAua2YzLmphcg0KKy1pc3RhcnQgbWVhc3VyZW1lbnQvbWVhc3VyZW1lbnQtMy4wLjEuamFyDQorLWlzdGFydCBwb3NpdGlvbi9wb3NpdGlvbi0zLjAuMS5qYXINCistaXN0YXJ0IHNzbGoyc3Avc3NsajJzcC0yLjAuMC5qYXINCistaXN0YXJ0IHhlcmNlcy94ZXJjZXMtMi4xMC4xLmtmMy5qYXINCistaXN0YXJ0IHhtbC94bWwtMy4wLjEuamFyDQorLWlzdGFydCBjbS9jbV9hbGwtMy4wLjQuamFyDQorLWlzdGFydCBjb21tb25zLWxvZ2dpbmcvY29tbW9ucy1sb2dnaW5nX2FsbC0yLjAuMC5rZjMuamFyDQorLWlzdGFydCBjb25zb2xlL2NvbnNvbGVfYWxsLTMuMC40Lmphcg0KKy1pc3RhcnQgcHJlZnMvcHJlZnNfYWxsLTMuMC4xLmphcg0KKy1pc3RhcnQgaW8vaW9fYWxsLTMuMC4xLmphcg0KKy1pc3RhcnQgZGV2aWNlL2RldmljZV9hbGwtMy4wLjAuamFyDQorLWlzdGFydCB4YWxhbi94YWxhbi0yLjcuMS5rZjNfMDEuamFyDQorLWlzdGFydCBiYXNpY2RyaXZlcmxvY2F0b3IvYmFzaWNkcml2ZXJsb2NhdG9yX2FsbC0zLjAuMC5qYXINCistaXN0YXJ0IGNvbm5lY3RvcnMvY29ubmVjdG9yc19hbGwtMi4wLjEuamFyDQorIy1pc3RhcnQgaHR0cC9odHRwX2FsbC0zLjEuMi5qYXINCisjLWlzdGFydCBodHRwY29uc29sZS9odHRwY29uc29sZV9hbGwtMy4wLjIuamFyDQorIy1pc3RhcnQgaHR0cHJvb3QvaHR0cHJvb3QtMy4wLjEuamFyDQorLWlzdGFydCB1c2VyYWRtaW4vdXNlcmFkbWluX2FsbC0zLjAuMy5qYXINCistaXN0YXJ0IHNjcmNvbW1hbmRzL3NjcmNvbW1hbmRzLTEuMS4wLmphcg0KKy1pc3RhcnQgc2VyaWFscG9ydGRldmljZS9zZXJpYWxwb3J0ZGV2aWNlX2FsbC0yLjAuMS5qYXINCistaXN0YXJ0IGJ1bmRsZXJlcG9zaXRvcnkvYnVuZGxlcmVwb3NpdG9yeV9hbGwtMy4xLjIuamFyDQorLWlzdGFydCBjb21tYW5kdHR5L2NvbW1hbmR0dHktMi4wLjAuamFyDQorLWlzdGFydCBjb25zb2xlMmNvbW1hbmQvY29uc29sZTJjb21tYW5kLTEuMC4wLmphcg0KZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL2phdmEtZ3JhbnQtYWxsLnBvbGljeSBiL3Zta2l0L3Rlc3RzL2phdmEtZ3JhbnQtYWxsLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYwMGEzCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvamF2YS1ncmFudC1hbGwucG9saWN5CkBAIC0wLDAgKzEgQEAKK2dyYW50IHsgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247IH07CmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy9taW4ueGFyZ3MgYi92bWtpdC90ZXN0cy9taW4ueGFyZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2NzU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL21pbi54YXJncwpAQCAtMCwwICsxLDQ3IEBACistRG9yZy5vc2dpLmZyYW1ld29yay5kaXI9L3RtcC9md2RpcgorLURvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yay5zeXN0ZW0uZXhwb3J0LmFsbF8xMz1mYWxzZQorLURvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yay52ZXJib3NpdHk9MAorCistRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmRlYnVnLmVycm9ycz10cnVlCistRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmRlYnVnLnBhY2thZ2VzPWZhbHNlCistRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmRlYnVnLmNsYXNzbG9hZGVyPWZhbHNlCisjLUZvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yay5kZWJ1Zy5wZXJtaXNzaW9ucz1mYWxzZQorCisjLUZvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzLmV4dHJhPQorCistRm9yZy5rbm9wZmxlcmZpc2guaHR0cC5kbnNsb29rdXA9dHJ1ZQorLUZvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydD04MDgwCisKKy1EaHR0cC5wcm94eUhvc3Q9cHJveHkKKy1EaHR0cC5wcm94eVBvcnQ9MzEyOAorCisjLUZvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yay5hbGxfc2lnbmVkPWZhbHNlCisKKy1Eb3JnLmtub3BmbGVyZmlzaC5nb3NnLmphcnM9ZmlsZTovLy9ob21lL2tvdXRoZWlyL1BoRC9WTUtpdC9rbm9wZmxlcmZpc2gudm1raXQvb3NnaS9qYXJzLztmaWxlOi8vL2hvbWUva291dGhlaXIvUGhEL1ZNS2l0L3Zta2l0LW1vbml0b3Ivb3NnaS9qM21nci9vdXQvO2ZpbGU6Ly8vaG9tZS9rb3V0aGVpci9QaEQvVk1LaXQvdm1raXQtbW9uaXRvci9vc2dpL3Rlc3RzLworCistRm9yZy5rbm9wZmxlcmZpc2guc3RhcnRsZXZlbC51c2U9dHJ1ZQorCistaW5pdAorCistaXN0YXJ0IGozbWdyLTEuMC4wLmphcgorCistaXN0YXJ0IGxvZy9sb2dfYWxsLTUuMC4wLmphcgorLWlzdGFydCBjbS9jbV9hbGwtNS4wLjAuamFyCistaXN0YXJ0IHV0aWwvdXRpbC00LjEuMC5qYXIKKy1pc3RhcnQgY29uc29sZS9jb25zb2xlX2FsbC00LjAuMS5qYXIKKy1pc3RhcnQgZnJhbWV3b3JrY29tbWFuZHMvZnJhbWV3b3JrY29tbWFuZHMtNC4wLjEuamFyCistaXN0YXJ0IGxvZ2NvbW1hbmRzL2xvZ2NvbW1hbmRzLTUuMC4wLmphcgorLWlzdGFydCBjbV9jbWQvY21fY21kLTUuMC4xLmphcgorLWlzdGFydCBjb25zb2xldHR5L2NvbnNvbGV0dHktNC4wLjEuamFyCistaXN0YXJ0IHVzZXJhZG1pbi91c2VyYWRtaW5fYXBpLTQuMC4wLmphcgorLWlzdGFydCB1dGlsL3V0aWwtNC4xLjAuamFyCisKKy1sYXVuY2gKKworLWluc3RhbGwgaWp2bS50ZXN0cy5BL291dC9panZtLnRlc3RzLkEtMS4wLjAuamFyCistaW5zdGFsbCBpanZtLnRlc3RzLkMvb3V0L2lqdm0udGVzdHMuQy0xLjAuMC5qYXIKKworLWluc3RhbGwgaWp2bS50ZXN0cy5BSW1wbC9vdXQvaWp2bS50ZXN0cy5BSW1wbC0xLjAuMC5qYXIKKy1pbnN0YWxsIGlqdm0udGVzdHMuQkltcGwvb3V0L2lqdm0udGVzdHMuQkltcGwtMS4wLjAuamFyCistaW5zdGFsbCBpanZtLnRlc3RzLkNJbXBsL291dC9panZtLnRlc3RzLkNJbXBsLTEuMC4wLmphcgorIy1pbnN0YWxsIGlqdm0udGVzdHMuREltcGwvb3V0L2lqdm0udGVzdHMuREltcGwtMS4wLjAuamFyCmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL01ha2VmaWxlIGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg1ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ0IEBACitpZm5kZWYgSjNfUk9PVF9QQVRICisgICAgSjNfUk9PVF9QQVRIIDo9IC9ob21lL2tvdXRoZWlyL3BoZC92bWtpdC92bWtpdC1tb25pdG9yCitlbmRpZgorCitpZm5kZWYgQkVOQ0hNQVJLX05BTUVTCisgICAgQkVOQ0hNQVJLX05BTUVTIDo9IE1ldGhvZENhbGxCZW5jaG1hcmsgU21hbGxPYmplY3RzQmVuY2htYXJrCitlbmRpZgorCitpZmRlZiBERUJVRworICAgIEJVSUxEX01PREUgOj0gRGVidWcrQXNzZXJ0cworZWxzZQorICAgIEJVSUxEX01PREUgOj0gUmVsZWFzZStBc3NlcnRzCitlbmRpZgorCitpZm5kZWYgQkVOQ0hNQVJLX1JFUEVBVFMKKyAgICBCRU5DSE1BUktfUkVQRUFUUyA6PSA0CitlbmRpZgorCitpZm5kZWYgVkVSQk9TRQorICAgIFFVSUVUIDo9IEAKK2VuZGlmCisKK0JFTkNITUFSS19DTEFTU1BBVEggOj0gJChhYnNwYXRoICQoUFdEKS9iaW4pCitKM19QQVRIICAgICAgOj0gJChhYnNwYXRoICQoSjNfUk9PVF9QQVRIKS8kKEJVSUxEX01PREUpL2Jpbi9qMykKK1dPUktfRElSICAgICAgOj0gJChIT01FKS92bWtpdF9tb25pdG9yX2JlbmNobWFya3MKK1RNUF9ESVIgICAgICAgOj0gJChzaGVsbCBta2RpciAtcCAkKFdPUktfRElSKSAyPi9kZXYvbnVsbCA7IG1rdGVtcCAtZCAtLXN1ZmZpeD0ubW9uaXRvci1iZW5jaCAtLXRtcGRpcj0kKFdPUktfRElSKSkKK0RFUFMgICAgICAgICAgOj0gJChzaGVsbCBmb3IgaSBpbiAkKEJFTkNITUFSS19OQU1FUyk7IGRvIHNlcSAtZiAiaW5zdGFuY2VzT2ZCZW5jaG1hcmtfJWdfJCRpIiAkKEJFTkNITUFSS19SRVBFQVRTKTsgZG9uZSkKKworYWxsOiBfUFJJTlRfVE1QX0RJUiAkKERFUFMpCisKK19QUklOVF9UTVBfRElSOgorCSQoUVVJRVQpIGVjaG8gIlRhcmdldCBkaXI6ICIgJChUTVBfRElSKQorCiskKERFUFMpOjogJChCRU5DSE1BUktfQ0xBU1NQQVRIKS9Nb25pdG9yQmVuY2gvTWFpbi5jbGFzcworCitpbnN0YW5jZXNPZkJlbmNobWFya18lOgorCSQoZXZhbCBCRU5DSF9DT1VOVF8kQCA6PSAkJChzaGVsbCBlY2hvICRAIHwgY3V0IC1kICdfJyAtZiAyKSkKKwkkKGV2YWwgQkVOQ0hfTkFNRV8kQCA6PSAkJChzaGVsbCBlY2hvICRAIHwgY3V0IC1kICdfJyAtZiAzLSkpCisJJChldmFsIFRFTVBfRElSXyRAIDo9ICQoVE1QX0RJUikvJChCRU5DSF9OQU1FXyRAKS8kKEJFTkNIX0NPVU5UXyRAKSkKKwkkKFFVSUVUKSBta2RpciAtcCAiJChURU1QX0RJUl8kQCkiIDI+L2Rldi9udWxsCisJJChRVUlFVCkgY2QgIiQoVEVNUF9ESVJfJEApIiAmJiAiJChKM19QQVRIKSIgLWNwICIkKEJFTkNITUFSS19DTEFTU1BBVEgpIiAiTW9uaXRvckJlbmNoLk1haW4iICIkKEJFTkNIX05BTUVfJEApIiA+ICIkKFRNUF9ESVIpLyQoQkVOQ0hfTkFNRV8kQCkuJChCRU5DSF9DT1VOVF8kQCkubG9nIiAyPiYxCisKK2NsZWFuOgorCSQoUVVJRVQpIC1ybSAtcmYgJChXT1JLX0RJUikvdG1wLiogJChXT1JLX0RJUikvKi5sb2cgMj4vZGV2L251bGwKZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvbWljcm8tYmVuY2htYXJrcy1NZXRob2RDYWxsQmVuY2htYXJrLnBuZyBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvbWljcm8tYmVuY2htYXJrcy1NZXRob2RDYWxsQmVuY2htYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVmZTliCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9taWNyby1iZW5jaG1hcmtzLU1ldGhvZENhbGxCZW5jaG1hcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvbWljcm8tYmVuY2htYXJrcy1TbWFsbE9iamVjdHNCZW5jaG1hcmsucG5nIGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9taWNyby1iZW5jaG1hcmtzLVNtYWxsT2JqZWN0c0JlbmNobWFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwODA1NAotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvbWljcm8tYmVuY2htYXJrcy1TbWFsbE9iamVjdHNCZW5jaG1hcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9CZW5jaG1hcmsuamF2YSBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI1NDdmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9zcmMvTW9uaXRvckJlbmNoL0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKK3BhY2thZ2UgTW9uaXRvckJlbmNoOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmVuY2htYXJrCisJaW1wbGVtZW50cyBSdW5uYWJsZQoreworCVN0cmluZyBuYW1lOworCWludCByZXN1bHQ7CisJCisJcHJvdGVjdGVkIEJlbmNobWFyayhTdHJpbmcgbmFtZV8pCisJeworCQluYW1lID0gbmFtZV87CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7cmV0dXJuIG5hbWU7fQorCQorCXB1YmxpYyBpbnQgZ2V0UmVzdWx0KCkge3JldHVybiByZXN1bHQ7fQorCXByb3RlY3RlZCBpbnQgc2V0UmVzdWx0KGludCByKSB7cmVzdWx0ID0gcjsgcmV0dXJuIHJlc3VsdDt9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBsaXN0QmVuY2htYXJrTmFtZXMoKQorCXsKKwkJaW50IGNvdW50ID0gMiwgaSA9IDA7CisJCQorCQlTdHJpbmdbXSByID0gbmV3IFN0cmluZ1tjb3VudF07CisJCXJbaSsrXSA9IE1ldGhvZENhbGxCZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCQlyW2krK10gPSBTbWFsbE9iamVjdHNCZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCQkKKwkJcmV0dXJuIHI7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQmVuY2htYXJrTmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCVN0cmluZ1tdIGxpc3QgPSBsaXN0QmVuY2htYXJrTmFtZXMoKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkKKwkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UobGlzdFtpXSkpCisJCQkJcmV0dXJuIHRydWU7CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgQmVuY2htYXJrIGNyZWF0ZShTdHJpbmcgbmFtZSkKKwl7CisJCWlmIChNZXRob2RDYWxsQmVuY2htYXJrLmNsYXNzLmdldFNpbXBsZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorCQkJcmV0dXJuIG5ldyBNZXRob2RDYWxsQmVuY2htYXJrKCk7CisJCWVsc2UgaWYgKFNtYWxsT2JqZWN0c0JlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKwkJCXJldHVybiBuZXcgU21hbGxPYmplY3RzQmVuY2htYXJrKCk7CisJCWVsc2UKKwkJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9CZW5jaG1hcmtSdW5uZXIuamF2YSBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9CZW5jaG1hcmtSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E4MjUzCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9zcmMvTW9uaXRvckJlbmNoL0JlbmNobWFya1J1bm5lci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgTW9uaXRvckJlbmNoOworCitwdWJsaWMgY2xhc3MgQmVuY2htYXJrUnVubmVyCisJaW1wbGVtZW50cyBSdW5uYWJsZQoreworCXZvbGF0aWxlIEJlbmNobWFyayBiZW5jaDsKKwl2b2xhdGlsZSBsb25nIGR1cmF0aW9uTVM7CisJdm9sYXRpbGUgaW50IHJlc3VsdDsKKwl2b2xhdGlsZSBib29sZWFuIHJ1bm5pbmc7CisJdm9sYXRpbGUgT2JqZWN0IHJ1bm5pbmdFdmVudDsKKworCXB1YmxpYyBCZW5jaG1hcmtSdW5uZXIoKQorCXsKKwkJcnVubmluZ0V2ZW50ID0gbmV3IE9iamVjdCgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBzZXRCZW5jaG1hcmsoQmVuY2htYXJrIGIpCisJeworCQlpZiAocnVubmluZykgcmV0dXJuIGZhbHNlOworCQkKKwkJYmVuY2ggPSBiOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gd2FpdEJlbmNobWFyaygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCXsKKwkJaWYgKCFydW5uaW5nKSByZXR1cm4gZmFsc2U7CisJCQorCQlzeW5jaHJvbml6ZWQocnVubmluZ0V2ZW50KSB7CisJCQl3aGlsZSAocnVubmluZykKKwkJCQlydW5uaW5nRXZlbnQud2FpdCgpOworCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgcnVuKCkKKwl7CisJCXJ1bm5pbmcgPSB0cnVlOworCQkKKwkJbG9uZyBzdGFydFRpbWU7CisJCWR1cmF0aW9uTVMgPSAwOworCQlyZXN1bHQgPSAwOworCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJCRU5DSE1BUksgU1RBUlRFRDogIiArIGJlbmNoLnRvU3RyaW5nKCkpOworCQkKKwkJc3RhcnRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCWJlbmNoLnJ1bigpOworCQlkdXJhdGlvbk1TID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQorCQlkdXJhdGlvbk1TIC09IHN0YXJ0VGltZTsKKwkJZHVyYXRpb25NUyAvPSAxMDAwMDAwOyAvLyBucyA9PT4gbXMKKwkJCisJCXJlc3VsdCA9IGJlbmNoLmdldFJlc3VsdCgpOworCisJCWlmIChyZXN1bHQgPT0gMCkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQkVOQ0hNQVJLIFNVQ0NFRURFRCBbIiArIGR1cmF0aW9uTVMgKyAiIG1zXTogIiArIGJlbmNoLnRvU3RyaW5nKCkpOworCQllbHNlCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJFTkNITUFSSyBGQUlMRUQgWyIgKyByZXN1bHQgKyAiXTogIiArIGJlbmNoLnRvU3RyaW5nKCkpOworCQkKKwkJcnVubmluZyA9IGZhbHNlOworCQkKKwkJc3luY2hyb25pemVkIChydW5uaW5nRXZlbnQpIHsKKwkJCXJ1bm5pbmdFdmVudC5ub3RpZnkoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBiZW5jaG1hcmtSdW5uaW5nKCkge3JldHVybiBydW5uaW5nO30KKwkKKwlwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHtyZXR1cm4gZHVyYXRpb25NUzt9CisJCisJcHVibGljIGxvbmcgZ2V0QmVuY2htYXJrUmVzdWx0KCkge3JldHVybiByZXN1bHQ7fQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9zcmMvTW9uaXRvckJlbmNoL01haW4uamF2YSBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MzczNQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9NYWluLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBNb25pdG9yQmVuY2g7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW52YWxpZE5hbWVFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBNYWluCit7CisJc3RhdGljIFN0cmluZyBiZW5jaG1hcmtOYW1lOworCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmICghcGFyc2VDb21tYW5kTGluZShhcmdzKSkgcmV0dXJuOworCQkKKwkJQmVuY2htYXJrUnVubmVyIGJyID0gbmV3IEJlbmNobWFya1J1bm5lcigpOworCQlCZW5jaG1hcmsgYmVuY2ggPSBCZW5jaG1hcmsuY3JlYXRlKGJlbmNobWFya05hbWUpOworCQkKKwkJYnIuc2V0QmVuY2htYXJrKGJlbmNoKTsKKwkJYnIucnVuKCk7CisJfQorCQorCXN0YXRpYyBib29sZWFuIHBhcnNlQ29tbWFuZExpbmUoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpCisJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigiVXNhZ2U6IG1vbml0b3ItYmVuY2ggey1oIHwgLS1oZWxwIHwgLWwgfCAtLWxpc3QgfCBiZW5jaG1hcmtfbmFtZX0iKTsKKwkJCisJCWlmIChhcmdzWzBdLnN0YXJ0c1dpdGgoIi0iKSkgeworCQkJaWYgKGFyZ3NbMF0uZXF1YWxzKCItaCIpIHx8IGFyZ3NbMF0uZXF1YWxzKCItLWhlbHAiKSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IG1vbml0b3ItYmVuY2ggey1oIHwgLS1oZWxwIHwgLWwgfCAtLWxpc3QgfCBiZW5jaG1hcmtfbmFtZX0iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKGFyZ3NbMF0uZXF1YWxzKCItbCIpIHx8IGFyZ3NbMF0uZXF1YWxzKCItLWxpc3QiKSkgeworCQkJCVN0cmluZ1tdIGxpc3QgPSBCZW5jaG1hcmsubGlzdEJlbmNobWFya05hbWVzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdFtpXSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHBhcmFtZXRlcjogIiArIGFyZ3NbMF0pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFCZW5jaG1hcmsuaXNWYWxpZEJlbmNobWFya05hbWUoYXJnc1swXSkpCisJCQkJdGhyb3cgbmV3IEludmFsaWROYW1lRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYmVuY2htYXJrIG5hbWU6ICIgKyBhcmdzWzBdKTsKKwkJCWJlbmNobWFya05hbWUgPSBhcmdzWzBdOworCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsgLy8gUHJvY2VlZAorCX0KK30KZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9NZXRob2RDYWxsQmVuY2htYXJrLmphdmEgYi92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3NyYy9Nb25pdG9yQmVuY2gvTWV0aG9kQ2FsbEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTlmNWIKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3NyYy9Nb25pdG9yQmVuY2gvTWV0aG9kQ2FsbEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2UgTW9uaXRvckJlbmNoOworCitwdWJsaWMgY2xhc3MgTWV0aG9kQ2FsbEJlbmNobWFyaworCWV4dGVuZHMgQmVuY2htYXJrCit7CisJcHJpdmF0ZSBpbnRlcmZhY2UgRHVtbXlJbnRlcmZhY2UKKwl7CisJCXB1YmxpYyB2b2lkIGR1bW15KCk7CisJfQorCQorCXByaXZhdGUgY2xhc3MgRHVtbXlDbGFzcyBpbXBsZW1lbnRzIER1bW15SW50ZXJmYWNlCisJeworCQlwdWJsaWMgdm9pZCBkdW1teSgpCisJCXsKKwkJCXRyeSB7CisJCQkJU3lzdGVtLm5hbm9UaW1lKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWUudG9TdHJpbmcoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgRHVtbXlDbGFzczIgaW1wbGVtZW50cyBEdW1teUludGVyZmFjZQorCXsKKwkJcHVibGljIHZvaWQgZHVtbXkoKQorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF2b2lkIHNvbWUgaGV1cmlzdGljcyIpOworCQl9CisJfQorCQorCUR1bW15SW50ZXJmYWNlIGR1bW15X2ludDsKKwkKKwlwdWJsaWMgTWV0aG9kQ2FsbEJlbmNobWFyaygpCisJeworCQlzdXBlcigiTWV0aG9kIENhbGwgQmVuY2htYXJrIik7CisJCQorCQlpZiAoU3lzdGVtLm5hbm9UaW1lKCkgJSAyID09IDMpCisJCQlkdW1teV9pbnQgPSBuZXcgRHVtbXlDbGFzczIoKTsJLy8gVW5yZWFjaGFibGUgKHNlZSBjb25kaXRpb24gYWJvdmUpCisJCWVsc2UKKwkJCWR1bW15X2ludCA9IG5ldyBEdW1teUNsYXNzKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bigpCisJeworCQlmb3IgKGludCBjb3VudCA9IDEwMDAwMDAwMDsgY291bnQgIT0gMDsgLS1jb3VudCkgeworCQkJZHVtbXlfaW50LmR1bW15KCk7CisJCX0KKwkJCisJCXNldFJlc3VsdCgwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3NyYy9Nb25pdG9yQmVuY2gvU21hbGxPYmplY3RzQmVuY2htYXJrLmphdmEgYi92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3NyYy9Nb25pdG9yQmVuY2gvU21hbGxPYmplY3RzQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiOTIzYQotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3JjL01vbml0b3JCZW5jaC9TbWFsbE9iamVjdHNCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIE1vbml0b3JCZW5jaDsKKworcHVibGljIGNsYXNzIFNtYWxsT2JqZWN0c0JlbmNobWFyaworCWV4dGVuZHMgQmVuY2htYXJrCit7CisJaW50IGNvdW50ID0gMzAwMDAwMDsKKwlPYmplY3RbXSBvYmplY3RzOworCQorCXB1YmxpYyBTbWFsbE9iamVjdHNCZW5jaG1hcmsoKQorCXsKKwkJc3VwZXIoIlNtYWxsIE9iamVjdHMgQmVuY2htYXJrIik7CisJCQorCQlvYmplY3RzID0gbmV3IE9iamVjdFtjb3VudF07IAorCX0KKworCXB1YmxpYyB2b2lkIHJ1bigpCisJeworCQlmb3IgKGludCBpPTA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlvYmplY3RzW2ldID0gbmV3IFN0cmluZygpOworCQl9CisJCQorCQlzZXRSZXN1bHQoMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9zeW50aC5wbG90IGIvdm1raXQvdGVzdHMvbW9uaXRvci1iZW5jaC9zeW50aC5wbG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDkxZjEKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3N5bnRoLnBsb3QKQEAgLTAsMCArMSwzNSBAQAorIyEvdXNyL2Jpbi9nbnVwbG90IC1wCisKK3NldCBkYXRhZmlsZSBzZXBhcmF0b3IgIiwiCitzZXQgZGF0YWZpbGUgbWlzc2luZyAnXycKK3NldCBkYXRhZmlsZSBjb21tZW50c2NoYXJzICIjIgorCitzZXQgeWxhYmVsICJEdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMgKGxvd2VyIGlzIGJldHRlcikiCitzZXQgeXRpY3MgYm9yZGVyIG5vbWlycm9yCitzZXQgZ3JpZCB5dGljcworc2V0IHlyYW5nZSBbMDoqXQorIyBzZXQgeWRhdGEgdGltZQorIyBzZXQgdGltZWZtdCAiJVMiCisjIHNldCBmb3JtYXQgeSAiJU06JVMiCisKK3NldCB4dGljcyBheGlzIG5vbWlycm9yCitzZXQgYm9yZGVyIDMKKworc2V0IHN0eWxlIGRhdGEgaGlzdG9ncmFtCitzZXQgc3R5bGUgaGlzdG9ncmFtIGVycm9yYmFycyBnYXAgMSBsdyAxCitzZXQgYmFycyBmdWxsd2lkdGgKK3NldCBzdHlsZSBmaWxsIHNvbGlkIGJvcmRlciAwCitzZXQgYm94d2lkdGggMQorCisjIHNldCB0aXRsZSAiTW9uaXRvcmluZyBvdmVyaGVhZCBpbiBtaWNyby1iZW5jaG1hcmtzIgorCisjIHNldCB0ZXJtIHd4dCAwCitzZXQgdGVybSBwbmcgc2l6ZSA4MDAsIDYwMAorCitzZXQgb3V0cHV0ICJtaWNyby1iZW5jaG1hcmtzLU1ldGhvZENhbGxCZW5jaG1hcmsucG5nIgorcGxvdAlcCisJJy9ob21lL2tvdXRoZWlyL3Zta2l0X21vbml0b3JfYmVuY2htYXJrcy9NZXRob2RDYWxsQmVuY2htYXJrLmNzdicgdXNpbmcgKGNvbHVtbigzKSk6KGNvbHVtbig1KSk6eHRpYygxKSBsaW5lY29sb3IgcmdiICJvcmFuZ2UiIHRpdGxlICJNZXRob2RDYWxsQmVuY2htYXJrIgorCitzZXQgb3V0cHV0ICJtaWNyby1iZW5jaG1hcmtzLVNtYWxsT2JqZWN0c0JlbmNobWFyay5wbmciCitwbG90CVwKKwknL2hvbWUva291dGhlaXIvdm1raXRfbW9uaXRvcl9iZW5jaG1hcmtzL1NtYWxsT2JqZWN0c0JlbmNobWFyay5jc3YnIHVzaW5nIChjb2x1bW4oMykpOihjb2x1bW4oNSkpOnh0aWMoMSkgbGluZWNvbG9yIHJnYiAiYmx1ZSIgdGl0bGUgIlNtYWxsT2JqZWN0c0JlbmNobWFyayIKZGlmZiAtLWdpdCBhL3Zta2l0L3Rlc3RzL21vbml0b3ItYmVuY2gvc3ludGguc2ggYi92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3N5bnRoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGNjZTcKLS0tIC9kZXYvbnVsbAorKysgYi92bWtpdC90ZXN0cy9tb25pdG9yLWJlbmNoL3N5bnRoLnNoCkBAIC0wLDAgKzEsODMgQEAKKyMhL2Jpbi9iYXNoCisKK2xvZ19kaXI9JDEKKworaWYgWyAteiAiJGxvZ19kaXIiIF07IHRoZW4KKwlleGl0IDEKK2ZpCisKK3N0YWdlMV9maWxlPS90bXAvJDAuJCQuc3RhZ2UxCitzdGFnZTJfZmlsZT0vdG1wLyQwLiQkLnN0YWdlMgorc3RhZ2UzX2ZpbGU9L3RtcC8kMC4kJC5zdGFnZTMKKworcm0gLWYgIiRzdGFnZTFfZmlsZSIgIiRzdGFnZTJfZmlsZSIgIiRzdGFnZTNfZmlsZSIKKworIyBGaWx0ZXIgc3VjY2Vzc2Z1bCByZXN1bHRzIGFuZCBwcmludCB0aGVtIGluIHRoZSBmb3JtYXQ6IGJlbmNobWFyayxkdXJhdGlvbgorY2QgJGxvZ19kaXIgJiYgZ3JlcCAnXkJFTkNITUFSSyBTVUNDRUVERUQnICoubG9nIHwgc2VkICdzL1wuWzAtOV1cKy5sb2c6QkVOQ0hNQVJLIFNVQ0NFRURFRCBcWy8sL2cgOyBzLyBtc1xdOi4qJC8vZycgfCBzb3J0ID4gJHN0YWdlMV9maWxlCisKKyMgQ2FsY3VsYXRlIG1pbmltdW0sIG1heGltdW0gYW5kIGF2ZXJhZ2UgZHVyYXRpb25zCisKK2NvdW50PTAKK3doaWxlIHJlYWQgLXIgbGluZSA7IGRvCisJY3VyX2JlbmNoPSQoZWNobyAkbGluZSB8IGN1dCAtZCAnLCcgLWYgMSkKKwljdXJfZHVyYXRpb249JChlY2hvICRsaW5lIHwgY3V0IC1kICcsJyAtZiAyKQorCQorCWlmIFsgLXogIiRsYXN0X2JlbmNoIiBdOyB0aGVuCisJCWxhc3RfYmVuY2g9JGN1cl9iZW5jaAorCQljb3VudD0xCisJCWF2ZXJhZ2VfZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCQltaW5fZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCQltYXhfZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCWVsc2UKKwkJaWYgWyAiJGxhc3RfYmVuY2giID09ICIkY3VyX2JlbmNoIiBdOyB0aGVuCisJCQljb3VudD0kKCgkY291bnQgKyAxKSkKKwkJCWF2ZXJhZ2VfZHVyYXRpb249JCgoJGF2ZXJhZ2VfZHVyYXRpb24gKyAkY3VyX2R1cmF0aW9uKSkKKwkJCWlmIFsgIiRjdXJfZHVyYXRpb24iIC1sdCAiJG1pbl9kdXJhdGlvbiIgXTsgdGhlbgorCQkJCW1pbl9kdXJhdGlvbj0kY3VyX2R1cmF0aW9uCisJCQlmaQorCQkJaWYgWyAiJGN1cl9kdXJhdGlvbiIgLWd0ICIkbWF4X2R1cmF0aW9uIiBdOyB0aGVuCisJCQkJbWF4X2R1cmF0aW9uPSRjdXJfZHVyYXRpb24KKwkJCWZpCisJCWVsc2UKKwkJCWF2ZXJhZ2VfZHVyYXRpb249JCgoJGF2ZXJhZ2VfZHVyYXRpb24gLyAkY291bnQpKQorCQkJZWNobyAiJGxhc3RfYmVuY2gsJG1pbl9kdXJhdGlvbiwkYXZlcmFnZV9kdXJhdGlvbiwkbWF4X2R1cmF0aW9uIiA+PiAkc3RhZ2UyX2ZpbGUKKwkJCQorCQkJbGFzdF9iZW5jaD0kY3VyX2JlbmNoCisJCQljb3VudD0xCisJCQlhdmVyYWdlX2R1cmF0aW9uPSRjdXJfZHVyYXRpb24KKwkJCW1pbl9kdXJhdGlvbj0kY3VyX2R1cmF0aW9uCisJCQltYXhfZHVyYXRpb249JGN1cl9kdXJhdGlvbgorCQlmaQorCWZpCitkb25lIDwgJHN0YWdlMV9maWxlCisKK2lmIFsgIiRjb3VudCIgLWd0IDAgXTsgdGhlbgorCWF2ZXJhZ2VfZHVyYXRpb249JCgoJGF2ZXJhZ2VfZHVyYXRpb24gLyAkY291bnQpKQorCWVjaG8gIiRsYXN0X2JlbmNoLCRtaW5fZHVyYXRpb24sJGF2ZXJhZ2VfZHVyYXRpb24sJG1heF9kdXJhdGlvbiIgPj4gJHN0YWdlMl9maWxlCitmaQorCitlY2hvICcjYmVuY2htYXJrLG1pbl9kdXJhdGlvbl9tcyxhdmVyYWdlX2R1cmF0aW9uX21zLG1heF9kdXJhdGlvbl9tcyxzdGRfZGV2X2R1cmF0aW9uX21zJworCisjIENhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uCit3aGlsZSByZWFkIC1yIGxpbmUgOyBkbworCWN1cl9iZW5jaD0kKGVjaG8gJGxpbmUgfCBjdXQgLWQgJywnIC1mIDEpCisJY3VyX2F2ZXJhZ2U9JChlY2hvICRsaW5lIHwgY3V0IC1kICcsJyAtZiAzKQorCQorCWdyZXAgIl4kY3VyX2JlbmNoLCIgIiRzdGFnZTFfZmlsZSIgPiAiJHN0YWdlM19maWxlIgorCQorCWNvdW50PTAKKwlzdGRfZGV2PSdzcXJ0KCgwJworCQorCXdoaWxlIHJlYWQgLXIgbGluZTIgOyBkbworCQljdXJfZHVyYXRpb249JChlY2hvICRsaW5lMiB8IGN1dCAtZCAnLCcgLWYgMikKKwkJCisJCXN0ZF9kZXYrPSIrKCgkY3VyX2R1cmF0aW9uIC0gJGN1cl9hdmVyYWdlKV4yKSIKKwkJY291bnQ9JCgoJGNvdW50KzEpKQorCWRvbmUgPCAiJHN0YWdlM19maWxlIgorCQorCXN0ZF9kZXYrPSIpLyRjb3VudCkiCisJc3RkX2Rldj0kKGVjaG8gInNjYWxlPTA7ICRzdGRfZGV2IiB8IGJjIC1xIDI+L2Rldi9udWxsKQorCWVjaG8gIiRsaW5lLCRzdGRfZGV2IgorZG9uZSA8ICRzdGFnZTJfZmlsZQorCitybSAtZiAiJHN0YWdlMV9maWxlIiAiJHN0YWdlMl9maWxlIiAiJHN0YWdlM19maWxlIgpkaWZmIC0tZ2l0IGEvdm1raXQvdGVzdHMvbW9uaXRvci54YXJncyBiL3Zta2l0L3Rlc3RzL21vbml0b3IueGFyZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyMDlmNgotLS0gL2Rldi9udWxsCisrKyBiL3Zta2l0L3Rlc3RzL21vbml0b3IueGFyZ3MKQEAgLTAsMCArMSw0NyBAQAorLURvcmcub3NnaS5mcmFtZXdvcmsuc3RvcmFnZT0vdG1wL2Z3ZGlyCistRG9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLnN5c3RlbS5leHBvcnQuYWxsXzEzPWZhbHNlCistRG9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLnZlcmJvc2l0eT0wCisKKy1Gb3JnLmtub3BmbGVyZmlzaC5mcmFtZXdvcmsuZGVidWcuZXJyb3JzPXRydWUKKy1Gb3JnLmtub3BmbGVyZmlzaC5mcmFtZXdvcmsuZGVidWcucGFja2FnZXM9ZmFsc2UKKy1Gb3JnLmtub3BmbGVyZmlzaC5mcmFtZXdvcmsuZGVidWcuY2xhc3Nsb2FkZXI9ZmFsc2UKKyMtRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmRlYnVnLnBlcm1pc3Npb25zPWZhbHNlCisKKyMtRm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMuZXh0cmE9CisKKy1Gb3JnLmtub3BmbGVyZmlzaC5odHRwLmRuc2xvb2t1cD10cnVlCistRm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5wb3J0PTgwODAKKworLURodHRwLnByb3h5SG9zdD1wcm94eQorLURodHRwLnByb3h5UG9ydD0zMTI4CisKKyMtRm9yZy5rbm9wZmxlcmZpc2guZnJhbWV3b3JrLmFsbF9zaWduZWQ9ZmFsc2UKKworLURvcmcua25vcGZsZXJmaXNoLmdvc2cuamFycz1maWxlOi8vL2hvbWUva291dGhlaXIvcGhkL3Zta2l0L2tub3BmbGVyZmlzaC52bWtpdC9vc2dpL2phcnMvO2ZpbGU6Ly8vaG9tZS9rb3V0aGVpci9waGQvdm1raXQvdm1raXQtbW9uaXRvci9vc2dpL2ozbWdyL291dC87ZmlsZTovLy9ob21lL2tvdXRoZWlyL3BoZC92bWtpdC92bWtpdC1tb25pdG9yL29zZ2kvdGVzdHMvCisKKy1Gb3JnLmtub3BmbGVyZmlzaC5zdGFydGxldmVsLnVzZT10cnVlCisKKy1pbml0CisKKy1pc3RhcnQgajNtZ3ItMS4wLjAuamFyCisKKy1pc3RhcnQgbG9nL2xvZ19hbGwtNS4wLjAuamFyCistaXN0YXJ0IGNtL2NtX2FsbC01LjAuMC5qYXIKKy1pc3RhcnQgdXRpbC91dGlsLTQuMS4wLmphcgorLWlzdGFydCBjb25zb2xlL2NvbnNvbGVfYWxsLTQuMC4xLmphcgorLWlzdGFydCBmcmFtZXdvcmtjb21tYW5kcy9mcmFtZXdvcmtjb21tYW5kcy00LjAuMS5qYXIKKy1pc3RhcnQgbG9nY29tbWFuZHMvbG9nY29tbWFuZHMtNS4wLjAuamFyCistaXN0YXJ0IGNtX2NtZC9jbV9jbWQtNS4wLjEuamFyCistaXN0YXJ0IGNvbnNvbGV0dHkvY29uc29sZXR0eS00LjAuMS5qYXIKKy1pc3RhcnQgdXNlcmFkbWluL3VzZXJhZG1pbl9hcGktNC4wLjAuamFyCistaXN0YXJ0IHV0aWwvdXRpbC00LjEuMC5qYXIKKworLWxhdW5jaAorCistaW5zdGFsbCB0ZXN0cy5BL291dC90ZXN0cy5BLTEuMC4wLmphcgorLWluc3RhbGwgdGVzdHMuQi9vdXQvdGVzdHMuQi0xLjAuMC5qYXIKKy1pbnN0YWxsIHRlc3RzLkUvb3V0L3Rlc3RzLkUtMS4wLjAuamFyCistaW5zdGFsbCB0ZXN0cy5BSW1wbC9vdXQvdGVzdHMuQUltcGwtMS4wLjAuamFyCistaW5zdGFsbCB0ZXN0cy5CSW1wbC9vdXQvdGVzdHMuQkltcGwtMS4wLjAuamFyCistaW5zdGFsbCB0ZXN0cy5GSW1wbC9vdXQvdGVzdHMuRkltcGwtMS4wLjAuamFyCistaW5zdGFsbCB0ZXN0cy5HSW1wbC9vdXQvdGVzdHMuR0ltcGwtMS4wLjAuamFyCmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy9tb25pdG9yaW5nLnJ1bGVzIGIvdm1raXQvdGVzdHMvbW9uaXRvcmluZy5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY3MDdlCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvbW9uaXRvcmluZy5ydWxlcwpAQCAtMCwwICsxLDM5IEBACit0aWVyIDEgeyBvcmcua25vcGZsZXJmaXNoLmZyYW1ld29yayB9CisKK3RpZXIgMTEgeworCW9yZy5rbm9wZmxlcmZpc2guYnVuZGxlLmNtLAorCW9yZy5rbm9wZmxlcmZpc2guYnVuZGxlLnV0aWwtTElCLAorCW9yZy5rbm9wZmxlcmZpc2guYnVuZGxlLmNvbnNvbGUsCisJb3JnLmtub3BmbGVyZmlzaC5idW5kbGUuZnJhbWV3b3JrY29tbWFuZHMtSU1QTCwKKwlvcmcua25vcGZsZXJmaXNoLmJ1bmRsZS5sb2djb21tYW5kcy1JTVBMLAorCW9yZy5rbm9wZmxlcmZpc2guYnVuZGxlLmNtX2NtZC1JTVBMLAorCW9yZy5rbm9wZmxlcmZpc2guYnVuZGxlLmNvbnNvbGV0dHktSU1QTCwKKwlvcmcua25vcGZsZXJmaXNoLmJ1bmRsZS51c2VyYWRtaW4tQVBJCit9Cit0aWVyIDEyIHsgb3JnLmtub3BmbGVyZmlzaC5sb2cgfQorCit0aWVyIDIwIHsgdGVzdHMuQSB9Cit0aWVyIDMwIHsgdGVzdHMuQiB9Cit0aWVyIDQwIHsgdGVzdHMuRSB9Cit0aWVyIDUwIHsgdGVzdHMuQUltcGwgfQordGllciA2MCB7IHRlc3RzLkJJbXBsIH0KK3RpZXIgNzAgeyB0ZXN0cy5GSW1wbCB9Cit0aWVyIDgwIHsgdGVzdHMuR0ltcGwgfQorCit0aWVyIDIwMCB7IGozbWdyIH0KKworYWNjb3VudCB7IDAsIDEsIGNhbGxlZCB9CithY2NvdW50IHsgMSwgMCwgY2FsbGVyIH0KK2FjY291bnQgeyAqLCAxLCBjYWxsZXIgfQorYWNjb3VudCB7IDEsICosIGNhbGxlZCB9CisKK2FjY291bnQgeyAqLCAqL18vb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciwgY2FsbGVkIH0KKworYWNjb3VudCB7IDAsIDAvXy9qYXZhLmxhbmcuUnVubmFibGUvcnVuLCBjYWxsZWQgfQorYWNjb3VudCB7IDAsIDAvXy9qYXZhLmxhbmcuVGhyZWFkL3J1biwgICBjYWxsZWQgfQorYWNjb3VudCB7IDAsIDAvXy9qYXZhLmxhbmcuVk1UaHJlYWQvcnVuLCBjYWxsZWQgfQorCithY2NvdW50IHsgKiwgMjAwL2ozbWdyL2ozLkozTWdyLCBjYWxsZXIgfQorCithY2NvdW50IHsgKiwgMjAvdGVzdHMuQS90ZXN0cy5BLkEsIGNhbGxlciB9CisjIGFjY291bnQgeyAqLCAqL18vdGVzdHMuQi5CRXZlbnQsIGNhbGxlZCB9CmRpZmYgLS1naXQgYS92bWtpdC90ZXN0cy90aWVyLmRlc2NyaXB0aW9uIGIvdm1raXQvdGVzdHMvdGllci5kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc4MWVmCi0tLSAvZGV2L251bGwKKysrIGIvdm1raXQvdGVzdHMvdGllci5kZXNjcmlwdGlvbgpAQCAtMCwwICsxLDE1IEBACit0aWVyIDEgeyBpanZtLnRlc3RzLkJJbXBsLCBpanZtLnRlc3RzLkRJbXBsIH0KK3RpZXIgMiB7IGlqdm0udGVzdHMuQSwgaWp2bS50ZXN0cy5BSW1wbCB9Cit0aWVyIDMgeyBpanZtLnRlc3RzLkMsIGlqdm0udGVzdHMuQ0ltcGwgfQorCithY2NvdW50IHsgMCwgKiwgY2FsbGVlIH0KK2FjY291bnQgeyAqLCAwLCBjYWxsZXIgfQorCithY2NvdW50IHsgMSwgMiwgY2FsbGVyIH0KK2FjY291bnQgeyAxLCAzLCBjYWxsZXIgfQorCithY2NvdW50IHsgMiwgMSwgY2FsbGVlIH0KK2FjY291bnQgeyAyLCAzLCBjYWxsZWUgfQorCithY2NvdW50IHsgMywgMSwgY2FsbGVyIH0KK2FjY291bnQgeyAzLCAyLCBjYWxsZXIgfQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvajMvTWFpbi5jcHAgYi92bWtpdC90b29scy9qMy9NYWluLmNwcAppbmRleCA4MzVmYzdlLi4zNjEwYTBmIDEwMDY0NAotLS0gYS92bWtpdC90b29scy9qMy9NYWluLmNwcAorKysgYi92bWtpdC90b29scy9qMy9NYWluLmNwcApAQCAtNDAsNiArNDAsNyBAQAogICAvLyBSdW4gdGhlIGFwcGxpY2F0aW9uLiAKICAgdm0tPnJ1bkFwcGxpY2F0aW9uKGFyZ2MsIGFyZ3YpOwogICB2bS0+d2FpdEZvckV4aXQoKTsKKwogICBTeXN0ZW06OkV4aXQoMCk7CiAKICAgLy8gRGVzdHJveSBldmVyeW9uZS4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9nZXRfc3RhcnRlZC5odG1sIGIvdm1raXQvd3d3L2dldF9zdGFydGVkLmh0bWwKaW5kZXggNzNmZTM0My4uMTFjODIwMSAxMDA2NDQKLS0tIGEvdm1raXQvd3d3L2dldF9zdGFydGVkLmh0bWwKKysrIGIvdm1raXQvd3d3L2dldF9zdGFydGVkLmh0bWwKQEAgLTEzLDE5ICsxMyw2IEBACiAKIDxkaXYgaWQ9ImNvbnRlbnQiPgogCi0gIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KLSAgPGgxIHN0eWxlPSJiYWNrZ3JvdW5kOnJlZCI+PGNlbnRlcj5UaGUgVk1LaXQgcHJvamVjdCBpcyByZXRpcmVkPC9jZW50ZXI+PC9oMT4KLSAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgotCi0JPGZvbnQgY29sb3I9InJlZCI+Ci0JCTxwPllvdSBjYW4gc3RpbGwgcGxheSB3aXRoIHRoZSBsYXN0IFZNS2l0IHJlbGVhc2UsIGJ1dCB0aGUgcHJvamVjdCBpcyBub3QgbW9yZSBtYWludGFpbmVkLgotCQlNb3Jlb3ZlciwgdGhlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHBhZ2VzIG1heSBiZSBvdXQgb2YgZGF0ZS48L3A+Ci0KLQkJPHA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHJlc3RhcnRpbmcgdGhlIHByb2plY3QsIAotCQkJcGxlYXNlIGNvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOmdhZWwudGhvbWFzMDBAZ21haWwuY29tIj5HYetsIFRob21hczwvYT48L3A+Ci0JPC9mb250PgotCi0KIDxoMT5HZXR0aW5nIFN0YXJ0ZWQ6IEJ1aWxkaW5nIGFuZCBSdW5uaW5nIFZNS2l0PC9oMT4KIAogCkBAIC0zOSw5ICsyNiw5IEBACiA8cD5JZiB5b3Ugd291bGQgbGlrZSB0byBjaGVjayBvdXQgYW5kIGJ1aWxkIHRoZSBwcm9qZWN0LCB0aGUgY3VycmVudCBzY2hlbWUKIGlzOjwvcD4KIAotPCEtLSA8cD48Yj5QcmVyZXF1aXNpdGVzPC9iPjxici8+IC0tPgotPCEtLSBZb3Ugd2lsbCBoYXZlIHRvIGluc3RhbGwgYSBDKysgY29tcGlsZXIgYW5kIEphdmEgMS41IG9yIG1vcmUgaW4gb3JkZXIgdG8gLS0+Ci08IS0tIGNvbXBpbGUgdm1raXQyPC9wPiAtLT4KKzxwPjxiPlByZXJlcXVpc2l0ZXM8L2I+PGJyLz4KK1lvdSB3aWxsIGhhdmUgdG8gaW5zdGFsbCBhIEMrKyBjb21waWxlciBhbmQgSmF2YSAxLjUgb3IgbW9yZSBpbiBvcmRlciB0bworY29tcGlsZSB2bWtpdDI8L3A+CiAKIDxvbD4KICAgPGxpPkRvd25sb2FkIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9yZWxlYXNlcy8zLjMvbGx2bS0zLjMuc3JjLnRhci5neiI+CkBAIC01Miw1MyArMzksNTEgQEAKIAogICA8dWw+CiAgICAgPGxpPjx0dD50YXIgenh2ZiBsbHZtLTMuMy5zcmMudGFyLmd6PC90dD48L2xpPgotICAgIDxsaT48dHQ+Y2QgbGx2bS0zLjMuc3JjL3Rvb2xzPC9saT48L3R0PgorICAgIDxsaT48dHQ+Y2QgbGx2bS0zLjIuc3JjL3Rvb2xzPC9saT48L3R0PgogICAgIDxsaT48dHQ+dGFyIHp4dmYgLi4vLi4vY2ZlLTMuMy5zcmMudGFyLmd6PC90dD48L2xpPgogICAgIDxsaT48dHQ+bXYgY2ZlLTMuMy5zcmMgY2xhbmc8L2xpPjwvdHQ+CiAgICAgPGxpPjx0dD5jZCAuLjwvbGk+PC90dD4KICAgICA8bGk+PHR0Pi4vY29uZmlndXJlIC0tZW5hYmxlLW9wdGltaXplZDsgbWFrZTwvdHQ+PC9saT4KICAgPC91bD4KICAgPGJyPk5vdGU6IFRvIGNvbXBpbGUgTExWTSBhbmQgVk1LaXQgd2l0aCBSVFRJIGVuYWJsZWQsIG9uZSBjYW4gcGFzcyB0aGUgcGFyYW1ldGVyCi1SRVFVSVJFU19SVFRJPTEgdG8gbGx2bSBtYWtlLiBQYXNzaW5nIHRoaXMgYXJndW1lbnQgcmVtb3ZlcyB0aGUgZmxhZyAtZm5vLXJ0dGkgZnJvbQorUkVRVUlSRVNfUlRUST0xIHRvIG1ha2UuIFBhc3NpbmcgdGhpcyBhcmd1bWVudCByZW1vdmVzIHRoZSBmbGFnIC1mbm8tcnR0aSBmcm9tCiB0aGUgY29tcGlsZXIgb3B0aW9ucy4gRXg6ICQgbWFrZSBSRVFVSVJFU19SVFRJPTEKLQkKLQk8cD4KLQk8bGk+RG93bmxvYWQsIGNvbXBpbGUgYW5kIGluc3RhbGwgPGEgaHJlZj0iaHR0cDovL29wZW5qZGsuamF2YS5uZXQvIj5PcGVuamRrPC9hPiB2ZXJzaW9uIDZ1MjMKLTwhLS0gICA8cD48Yj5Ta2lwIHRoZSBDbGFzc3BhdGggc3RlcHMgaWYgeW91IHBsYW4gdG8gdXNlIE9wZW5KREsuPC9iPjxici8+IC0tPgotPCEtLSAgIDxsaT48YSBocmVmPSJmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvY2xhc3NwYXRoL2NsYXNzcGF0aC0wLjk5LnRhci5neiI+RG93bmxvYWQgLS0+Ci08IS0tICAgIEdOVSBDbGFzc3BhdGggMC45OTwvYT46PC9saT4gLS0+CiAKLTwhLS0gICA8dWw+IC0tPgotPCEtLSAgICAgPGxpPjx0dD50YXIgenh2ZiBjbGFzc3BhdGgtMC45OS50YXIuZ3o8L3R0PjwvbGk+IC0tPgotPCEtLSAgICAgPGxpPjx0dD5jZCBjbGFzc3BhdGgtMC45OTwvdHQ+PC9saT4gLS0+Ci08IS0tICAgICA8bGk+PHR0Pi4vY29uZmlndXJlIC0tZGlzYWJsZS1wbHVnaW4gLS1kaXNhYmxlLWV4YW1wbGVzIC0tZGlzYWJsZS1XZXJyb3I7IC0tPgotPCEtLSAgICAgbWFrZTwvdHQ+PC9saT4gLS0+Ci08IS0tICAgICA8bGk+PHR0PmNkIGxpYjwvbGk+PC90dD4gLS0+Ci08IS0tICAgICA8bGk+PHR0PklmIHlvdSBhcmUgcnVubmluZyBvbiBMaW51eDo8L2xpPjwvdHQ+IC0tPgotPCEtLSAgICAgPHVsPiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2d0ay1wZWVyLy5saWJzL2xpYmd0a3BlZXIuc287PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2djb25mLXBlZXIvLmxpYnMvbGliZ2NvbmZwZWVyLnNvOzwvbGk+PC90dD4gLS0+Ci08IS0tICAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWlvLy5saWJzL2xpYmphdmFpby5zbzs8L2xpPjwvdHQ+IC0tPgotPCEtLSAgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1sYW5nLy5saWJzL2xpYmphdmFsYW5ncmVmbGVjdC5zbzs8L2xpPiAtLT4KLTwhLS0gICAgICAgPC90dD4gLS0+Ci08IS0tICAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmcuc287PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmV0Ly5saWJzL2xpYmphdmFuZXQuc287PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmlvLy5saWJzL2xpYmphdmFuaW8uc287PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtdXRpbC8ubGlicy9saWJqYXZhdXRpbC5zbzs8L2xpPjwvdHQ+IC0tPgotPCEtLSAgICAgPC91bD4gLS0+Ci08IS0tICAgICA8bGk+PHR0PklmIHlvdSBhcmUgcnVubmluZyBvbiBNYWNPUzo8L2xpPjwvdHQ+IC0tPgotPCEtLSAgICAgPHVsPiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2d0ay1wZWVyLy5saWJzL2xpYmd0a3BlZXIuZHlsaWI7PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2djb25mLXBlZXIvLmxpYnMvbGliZ2NvbmZwZWVyLmR5bGliOzwvbGk+PC90dD4gLS0+Ci08IS0tICAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWlvLy5saWJzL2xpYmphdmFpby5keWxpYjs8L2xpPjwvdHQ+IC0tPgotPCEtLSAgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1sYW5nLy5saWJzL2xpYmphdmFsYW5ncmVmbGVjdC5keWxpYjsgLS0+Ci08IS0tICAgICAgIDwvbGk+PC90dD4gLS0+Ci08IS0tICAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmcuZHlsaWI7PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmV0Ly5saWJzL2xpYmphdmFuZXQuZHlsaWI7PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmlvLy5saWJzL2xpYmphdmFuaW8uZHlsaWI7PC9saT48L3R0PiAtLT4KLTwhLS0gICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtdXRpbC8ubGlicy9saWJqYXZhdXRpbC5keWxpYjs8L2xpPjwvdHQ+IC0tPgotPCEtLSAgICAgPC91bD4gLS0+Ci08IS0tICAgPC91bD4gLS0+CisgIDxwPjxiPlNraXAgdGhlIENsYXNzcGF0aCBzdGVwcyBpZiB5b3UgcGxhbiB0byB1c2UgT3BlbkpESy48L2I+PGJyLz4KKyAgPGxpPjxhIGhyZWY9ImZ0cDovL2Z0cC5nbnUub3JnL2dudS9jbGFzc3BhdGgvY2xhc3NwYXRoLTAuOTkudGFyLmd6Ij5Eb3dubG9hZAorICAgR05VIENsYXNzcGF0aCAwLjk5PC9hPjo8L2xpPgorCisgIDx1bD4KKyAgICA8bGk+PHR0PnRhciB6eHZmIGNsYXNzcGF0aC0wLjk5LnRhci5nejwvdHQ+PC9saT4KKyAgICA8bGk+PHR0PmNkIGNsYXNzcGF0aC0wLjk5PC90dD48L2xpPgorICAgIDxsaT48dHQ+Li9jb25maWd1cmUgLS1kaXNhYmxlLXBsdWdpbiAtLWRpc2FibGUtZXhhbXBsZXMgLS1kaXNhYmxlLVdlcnJvcjsKKyAgICBtYWtlPC90dD48L2xpPgorICAgIDxsaT48dHQ+Y2QgbGliPC9saT48L3R0PgorICAgIDxsaT48dHQ+SWYgeW91IGFyZSBydW5uaW5nIG9uIExpbnV4OjwvbGk+PC90dD4KKyAgICA8dWw+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvZ3RrLXBlZXIvLmxpYnMvbGliZ3RrcGVlci5zbzs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvZ2NvbmYtcGVlci8ubGlicy9saWJnY29uZnBlZXIuc287PC9saT48L3R0PgorICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtaW8vLmxpYnMvbGliamF2YWlvLnNvOzwvbGk+PC90dD4KKyAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmdyZWZsZWN0LnNvOzwvbGk+CisgICAgICA8L3R0PgorICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZy5zbzs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uZXQvLmxpYnMvbGliamF2YW5ldC5zbzs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uaW8vLmxpYnMvbGliamF2YW5pby5zbzs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS11dGlsLy5saWJzL2xpYmphdmF1dGlsLnNvOzwvbGk+PC90dD4KKyAgICA8L3VsPgorICAgIDxsaT48dHQ+SWYgeW91IGFyZSBydW5uaW5nIG9uIE1hY09TOjwvbGk+PC90dD4KKyAgICA8dWw+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvZ3RrLXBlZXIvLmxpYnMvbGliZ3RrcGVlci5keWxpYjs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvZ2NvbmYtcGVlci8ubGlicy9saWJnY29uZnBlZXIuZHlsaWI7PC9saT48L3R0PgorICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtaW8vLmxpYnMvbGliamF2YWlvLmR5bGliOzwvbGk+PC90dD4KKyAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmdyZWZsZWN0LmR5bGliOworICAgICAgPC9saT48L3R0PgorICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZy5keWxpYjs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uZXQvLmxpYnMvbGliamF2YW5ldC5keWxpYjs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uaW8vLmxpYnMvbGliamF2YW5pby5keWxpYjs8L2xpPjwvdHQ+CisgICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS11dGlsLy5saWJzL2xpYmphdmF1dGlsLmR5bGliOzwvbGk+PC90dD4KKyAgICA8L3VsPgorICA8L3VsPgogICAKICAgPGxpPkNoZWNrb3V0IHZta2l0OjwvbGk+CiAgIDx1bD4KQEAgLTEyMywxNSArMTA4LDMyIEBACiAgICAgICAgICAgPGxpPjx0dD5vcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5pbW1peC5HZW5JbW1peDwvdHQ+PC9saT4KICAgICAgICAgPC91bD4KICAgICAgIDwvZGQ+Ci0gICAgICA8ZHQ+Ci0gICAgICAgIDx0dD4tLXdpdGgtY2xhc3NwYXRoLWltcGw9b3BlbmpkazwvdHQ+Ci0gICAgICA8L2R0PgotICAgICAgPGRkPlRlbGwgdm1raXQgdG8gdXNlIE9wZW5KREsgY2xhc3NwYXRoIGltcGxlbWVudGF0aW9uLjwvZGQ+Ci0gICAgICA8YnIvPgotICAgICAgPGR0PgotICAgICAgICA8dHQ+LS13aXRoLW9wZW5qZGstcGF0aD0mbHQ7ZGlyZWN0b3J5Jmd0OzwvdHQ+Ci0gICAgICA8L2R0PgotICAgICAgPGRkPlRlbGwgdm1raXQgd2hlcmUgT3BlbkpESyBpcyBsb2NhdGVkLjwvZGQ+CisgICAgICA8dWw+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8cD55b3UgY2FuIHVzZSBHTlUgQ2xhc3NwYXRoIGJ5IGNvbmZpZ3VyaW5nIHRoZSBmb2xsb3dpbmcgOjwvcD4KKyAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICA8dHQ+LS13aXRoLWdudS1jbGFzc3BhdGgtZ2xpYmo9Jmx0O3BhdGgvdG8vZmlsZS9nbGliai56aXAmZ3Q7PC90dD4KKyAgICAgICAgICA8L2R0PgorICAgICAgICAgIDxkZD5UZWxsIHZta2l0IHdoZXJlIEdOVSBDbGFzc3BhdGggZ2xpYmouemlwIGlzIGxvY2F0ZWQuPC9kZD4KKyAgICAgICAgICA8YnIvPgorICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgIDx0dD4tLXdpdGgtZ251LWNsYXNzcGF0aC1saWJzPSZsdDtwYXRoL3RvL2xpYnMvZGlyZWN0b3J5Jmd0OzwvdHQ+CisgICAgICAgICAgPC9kdD4KKyAgICAgICAgICA8ZGQ+VGVsbCB2bWtpdCB3aGVyZSBHTlUgQ2xhc3NwYXRoIGxpYnMgYXJlIGxvY2F0ZWQuPC9kZD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxwPm9yIE9wZW5KREsgYnkgY29uZmlndXJpbmcgOjwvcD4KKyAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICA8dHQ+LS13aXRoLWNsYXNzcGF0aC1pbXBsPW9wZW5qZGs8L3R0PgorICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgPGRkPlRlbGwgdm1raXQgdG8gdXNlIE9wZW5KREsgY2xhc3NwYXRoIGltcGxlbWVudGF0aW9uLjwvZGQ+CisgICAgICAgICAgPGJyLz4KKyAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICA8dHQ+LS13aXRoLW9wZW5qZGstcGF0aD0mbHQ7ZGlyZWN0b3J5Jmd0OzwvdHQ+CisgICAgICAgICAgPC9kdD4KKyAgICAgICAgICA8ZGQ+VGVsbCB2bWtpdCB3aGVyZSBPcGVuSkRLIGlzIGxvY2F0ZWQuPC9kZD4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvdWw+CiAgICAgPC9kbD4KICAgPC91bD4KIApkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L2luZGV4Lmh0bWwgYi92bWtpdC93d3cvaW5kZXguaHRtbAppbmRleCBiMjA5Y2EyLi45ZWIyMmRmIDEwMDY0NAotLS0gYS92bWtpdC93d3cvaW5kZXguaHRtbAorKysgYi92bWtpdC93d3cvaW5kZXguaHRtbApAQCAtMTIsMTggKzEyLDYgQEAKIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJtZW51Lmh0bWwuaW5jbCItLT4NCiA8ZGl2IGlkPSJjb250ZW50Ij4NCiAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCi0gIDxoMSBzdHlsZT0iYmFja2dyb3VuZDpyZWQiPjxjZW50ZXI+VGhlIFZNS2l0IHByb2plY3QgaXMgcmV0aXJlZDwvY2VudGVyPjwvaDE+DQotICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+DQotDQotCTxmb250IGNvbG9yPSJyZWQiPg0KLQkJPHA+WW91IGNhbiBzdGlsbCBwbGF5IHdpdGggdGhlIGxhc3QgVk1LaXQgcmVsZWFzZSwgYnV0IHRoZSBwcm9qZWN0IGlzIG5vdCBtb3JlIG1haW50YWluZWQuDQotCQlNb3Jlb3ZlciwgdGhlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHBhZ2VzIG1heSBiZSBvdXQgb2YgZGF0ZS48L3A+DQotCQkNCi0JCTxwPklmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiByZXN0YXJ0aW5nIHRoZSBwcm9qZWN0LCANCi0JCQlwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86Z2FlbC50aG9tYXMwMEBnbWFpbC5jb20iPkdh62wgVGhvbWFzPC9hPjwvcD4NCi0JPC9mb250Pg0KLQ0KLSAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KICAgPGgxPlZNS2l0OiBhIHN1YnN0cmF0ZSBmb3IgdmlydHVhbCBtYWNoaW5lczwvaDE+DQogICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+DQogDQpkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L21lbnUuaHRtbC5pbmNsIGIvdm1raXQvd3d3L21lbnUuaHRtbC5pbmNsCmluZGV4IDZhOGNmMTguLjFiMjA3MmYgMTAwNjQ0Ci0tLSBhL3Zta2l0L3d3dy9tZW51Lmh0bWwuaW5jbAorKysgYi92bWtpdC93d3cvbWVudS5odG1sLmluY2wKQEAgLTE2LDcgKzE2LDcgQEAKICAgICA8bGFiZWw+UXVpY2sgTGlua3M8L2xhYmVsPgogICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL2xsdm1kZXYiPmxsdm0tZGV2PC9hPgogICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL3Zta2l0LWNvbW1pdHMiPnZta2l0LWNvbW1pdHM8L2E+Ci08IS0tICAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1ZyBSZXBvcnRzPC9hPiAtLT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1ZyBSZXBvcnRzPC9hPgogICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L3Zta2l0L3RydW5rLyI+QnJvd3NlIFNvdXJjZTwvYT4KICAgPC9kaXY+CiA8L2Rpdj4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy90dXRvL3RveS12bS1iYXNlLnRhci5neiBiL3Zta2l0L3d3dy90dXRvL3RveS12bS1iYXNlLnRhci5negppbmRleCA2NGM2M2E4Li4xMjhmNzIzIDEwMDY0NAotLS0gYS92bWtpdC93d3cvdHV0by90b3ktdm0tYmFzZS50YXIuZ3oKKysrIGIvdm1raXQvd3d3L3R1dG8vdG95LXZtLWJhc2UudGFyLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIK